@@ -32,7 +32,8 @@ pub struct UniformBuffer<T: ShaderType> {
32
32
scratch : UniformBufferWrapper < Vec < u8 > > ,
33
33
buffer : Option < Buffer > ,
34
34
label : Option < String > ,
35
- label_changed : bool ,
35
+ changed : bool ,
36
+ buffer_usage : BufferUsages ,
36
37
}
37
38
38
39
impl < T : ShaderType > From < T > for UniformBuffer < T > {
@@ -42,7 +43,8 @@ impl<T: ShaderType> From<T> for UniformBuffer<T> {
42
43
scratch : UniformBufferWrapper :: new ( Vec :: new ( ) ) ,
43
44
buffer : None ,
44
45
label : None ,
45
- label_changed : false ,
46
+ changed : false ,
47
+ buffer_usage : BufferUsages :: COPY_DST | BufferUsages :: UNIFORM ,
46
48
}
47
49
}
48
50
}
@@ -54,7 +56,8 @@ impl<T: ShaderType + Default> Default for UniformBuffer<T> {
54
56
scratch : UniformBufferWrapper :: new ( Vec :: new ( ) ) ,
55
57
buffer : None ,
56
58
label : None ,
57
- label_changed : false ,
59
+ changed : false ,
60
+ buffer_usage : BufferUsages :: COPY_DST | BufferUsages :: UNIFORM ,
58
61
}
59
62
}
60
63
}
@@ -89,7 +92,7 @@ impl<T: ShaderType + WriteInto> UniformBuffer<T> {
89
92
let label = label. map ( str:: to_string) ;
90
93
91
94
if label != self . label {
92
- self . label_changed = true ;
95
+ self . changed = true ;
93
96
}
94
97
95
98
self . label = label;
@@ -99,6 +102,16 @@ impl<T: ShaderType + WriteInto> UniformBuffer<T> {
99
102
self . label . as_deref ( )
100
103
}
101
104
105
+ /// Set the buffer usage of the buffer.
106
+ ///
107
+ /// This method only allows addition of flags to the default usage flags.
108
+ ///
109
+ /// The default values for buffer usage are BufferUsages::COPY_DST and BufferUsages::UNIFORM.
110
+ pub fn set_usage ( & mut self , usage : BufferUsages ) {
111
+ self . buffer_usage |= usage;
112
+ self . changed = true ;
113
+ }
114
+
102
115
/// Queues writing of data from system RAM to VRAM using the [`RenderDevice`](crate::renderer::RenderDevice)
103
116
/// and the provided [`RenderQueue`](crate::renderer::RenderQueue), if a GPU-side backing buffer already exists.
104
117
///
@@ -107,13 +120,13 @@ impl<T: ShaderType + WriteInto> UniformBuffer<T> {
107
120
pub fn write_buffer ( & mut self , device : & RenderDevice , queue : & RenderQueue ) {
108
121
self . scratch . write ( & self . value ) . unwrap ( ) ;
109
122
110
- if self . label_changed || self . buffer . is_none ( ) {
123
+ if self . changed || self . buffer . is_none ( ) {
111
124
self . buffer = Some ( device. create_buffer_with_data ( & BufferInitDescriptor {
112
125
label : self . label . as_deref ( ) ,
113
- usage : BufferUsages :: COPY_DST | BufferUsages :: UNIFORM ,
126
+ usage : self . buffer_usage ,
114
127
contents : self . scratch . as_ref ( ) ,
115
128
} ) ) ;
116
- self . label_changed = false ;
129
+ self . changed = false ;
117
130
} else if let Some ( buffer) = & self . buffer {
118
131
queue. write_buffer ( buffer, 0 , self . scratch . as_ref ( ) ) ;
119
132
}
@@ -145,7 +158,8 @@ pub struct DynamicUniformBuffer<T: ShaderType> {
145
158
buffer : Option < Buffer > ,
146
159
capacity : usize ,
147
160
label : Option < String > ,
148
- label_changed : bool ,
161
+ changed : bool ,
162
+ buffer_usage : BufferUsages ,
149
163
}
150
164
151
165
impl < T : ShaderType > Default for DynamicUniformBuffer < T > {
@@ -156,7 +170,8 @@ impl<T: ShaderType> Default for DynamicUniformBuffer<T> {
156
170
buffer : None ,
157
171
capacity : 0 ,
158
172
label : None ,
159
- label_changed : false ,
173
+ changed : false ,
174
+ buffer_usage : BufferUsages :: COPY_DST | BufferUsages :: UNIFORM ,
160
175
}
161
176
}
162
177
}
@@ -198,7 +213,7 @@ impl<T: ShaderType + WriteInto> DynamicUniformBuffer<T> {
198
213
let label = label. map ( str:: to_string) ;
199
214
200
215
if label != self . label {
201
- self . label_changed = true ;
216
+ self . changed = true ;
202
217
}
203
218
204
219
self . label = label;
@@ -208,6 +223,16 @@ impl<T: ShaderType + WriteInto> DynamicUniformBuffer<T> {
208
223
self . label . as_deref ( )
209
224
}
210
225
226
+ /// Set the buffer usage of the buffer.
227
+ ///
228
+ /// This method only allows addition of flags to the default usage flags.
229
+ ///
230
+ /// The default values for buffer usage are BufferUsages::COPY_DST and BufferUsages::UNIFORM.
231
+ pub fn set_usage ( & mut self , usage : BufferUsages ) {
232
+ self . buffer_usage |= usage;
233
+ self . changed = true ;
234
+ }
235
+
211
236
/// Queues writing of data from system RAM to VRAM using the [`RenderDevice`](crate::renderer::RenderDevice)
212
237
/// and the provided [`RenderQueue`](crate::renderer::RenderQueue).
213
238
///
@@ -217,14 +242,14 @@ impl<T: ShaderType + WriteInto> DynamicUniformBuffer<T> {
217
242
pub fn write_buffer ( & mut self , device : & RenderDevice , queue : & RenderQueue ) {
218
243
let size = self . scratch . as_ref ( ) . len ( ) ;
219
244
220
- if self . capacity < size || self . label_changed {
245
+ if self . capacity < size || self . changed {
221
246
self . buffer = Some ( device. create_buffer_with_data ( & BufferInitDescriptor {
222
247
label : self . label . as_deref ( ) ,
223
- usage : BufferUsages :: COPY_DST | BufferUsages :: UNIFORM ,
248
+ usage : self . buffer_usage ,
224
249
contents : self . scratch . as_ref ( ) ,
225
250
} ) ) ;
226
251
self . capacity = size;
227
- self . label_changed = false ;
252
+ self . changed = false ;
228
253
} else if let Some ( buffer) = & self . buffer {
229
254
queue. write_buffer ( buffer, 0 , self . scratch . as_ref ( ) ) ;
230
255
}
0 commit comments