gfx_hal/buffer.rs
1//! Memory buffers.
2//!
3//! Buffers interpret memory slices as linear contiguous data array.
4//!
5//! They can be used as shader resources, vertex buffers, index buffers or for
6//! specifying the action commands for indirect execution.
7
8use crate::{device::OutOfMemory, format::Format};
9
10/// An offset inside a buffer, in bytes.
11pub type Offset = u64;
12
13/// An stride between elements inside a buffer, in bytes.
14pub type Stride = u32;
15
16/// A subrange of the buffer.
17#[derive(Clone, Debug, Default, Hash, PartialEq, Eq)]
18#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
19pub struct SubRange {
20 /// Offset to the subrange.
21 pub offset: Offset,
22 /// Size of the subrange, or None for the remaining size of the buffer.
23 pub size: Option<Offset>,
24}
25
26impl SubRange {
27 /// Whole buffer subrange.
28 pub const WHOLE: Self = SubRange {
29 offset: 0,
30 size: None,
31 };
32
33 /// Return the stored size, if present, or computed size based on the limit.
34 pub fn size_to(&self, limit: Offset) -> Offset {
35 self.size.unwrap_or(limit - self.offset)
36 }
37}
38
39/// Buffer state.
40pub type State = Access;
41
42/// Error creating a buffer.
43#[derive(Clone, Debug, PartialEq, thiserror::Error)]
44pub enum CreationError {
45 /// Out of either host or device memory.
46 #[error(transparent)]
47 OutOfMemory(#[from] OutOfMemory),
48 /// Requested buffer usage is not supported.
49 ///
50 /// Older GL version don't support constant buffers or multiple usage flags.
51 #[error("Unsupported usage: {0:?}")]
52 UnsupportedUsage(Usage),
53}
54
55/// Error creating a buffer view.
56#[derive(Clone, Debug, PartialEq, thiserror::Error)]
57pub enum ViewCreationError {
58 /// Out of either host or device memory.
59 #[error(transparent)]
60 OutOfMemory(#[from] OutOfMemory),
61 /// Buffer view format is not supported.
62 #[error("Unsupported format: {0:?}")]
63 UnsupportedFormat(Option<Format>),
64}
65
66bitflags!(
67 /// Buffer usage flags.
68 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
69 pub struct Usage: u32 {
70 ///
71 const TRANSFER_SRC = 0x1;
72 ///
73 const TRANSFER_DST = 0x2;
74 ///
75 const UNIFORM_TEXEL = 0x4;
76 ///
77 const STORAGE_TEXEL = 0x8;
78 ///
79 const UNIFORM = 0x10;
80 ///
81 const STORAGE = 0x20;
82 ///
83 const INDEX = 0x40;
84 ///
85 const VERTEX = 0x80;
86 ///
87 const INDIRECT = 0x100;
88 }
89);
90
91bitflags!(
92 /// Buffer create flags.
93 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
94 pub struct CreateFlags: u32 {
95 /// Specifies the view will be backed using sparse memory binding.
96 const SPARSE_BINDING = 0x0000_0001;
97 /// Specifies the view can be partially backed with sparse memory binding.
98 /// Must have `SPARSE_BINDING` enabled.
99 const SPARSE_RESIDENCY = 0x0000_0002;
100 /// Specifies the view will be backed using sparse memory binding with memory bindings that
101 /// might alias other data. Must have `SPARSE_BINDING` enabled.
102 const SPARSE_ALIASED = 0x0000_0004;
103 }
104);
105
106impl Usage {
107 /// Returns if the buffer can be used in transfer operations.
108 pub fn can_transfer(&self) -> bool {
109 self.intersects(Usage::TRANSFER_SRC | Usage::TRANSFER_DST)
110 }
111}
112
113bitflags!(
114 /// Buffer access flags.
115 ///
116 /// Access of buffers by the pipeline or shaders.
117 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
118 pub struct Access: u32 {
119 /// Read commands instruction for indirect execution.
120 const INDIRECT_COMMAND_READ = 0x1;
121 /// Read index values for indexed draw commands.
122 ///
123 /// See [`draw_indexed`](../command/trait.RawCommandBuffer.html#tymethod.draw_indexed)
124 /// and [`draw_indexed_indirect`](../command/trait.RawCommandBuffer.html#tymethod.draw_indexed_indirect).
125 const INDEX_BUFFER_READ = 0x2;
126 /// Read vertices from vertex buffer for draw commands in the [`VERTEX_INPUT`](
127 /// ../pso/struct.PipelineStage.html#associatedconstant.VERTEX_INPUT) stage.
128 const VERTEX_BUFFER_READ = 0x4;
129 ///
130 const UNIFORM_READ = 0x8;
131 ///
132 const SHADER_READ = 0x20;
133 ///
134 const SHADER_WRITE = 0x40;
135 ///
136 const TRANSFER_READ = 0x800;
137 ///
138 const TRANSFER_WRITE = 0x1000;
139 ///
140 const HOST_READ = 0x2000;
141 ///
142 const HOST_WRITE = 0x4000;
143 ///
144 const MEMORY_READ = 0x8000;
145 ///
146 const MEMORY_WRITE = 0x10000;
147 }
148);