Skip to content

Commit db24a80

Browse files
authored
Try #7423:
2 parents 4fd092f + 324d8e9 commit db24a80

File tree

2 files changed

+76
-26
lines changed

2 files changed

+76
-26
lines changed

crates/bevy_render/src/render_resource/storage_buffer.rs

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ pub struct StorageBuffer<T: ShaderType> {
3333
buffer: Option<Buffer>,
3434
capacity: usize,
3535
label: Option<String>,
36-
label_changed: bool,
36+
changed: bool,
37+
buffer_usage: BufferUsages,
3738
}
3839

3940
impl<T: ShaderType> From<T> for StorageBuffer<T> {
@@ -44,7 +45,8 @@ impl<T: ShaderType> From<T> for StorageBuffer<T> {
4445
buffer: None,
4546
capacity: 0,
4647
label: None,
47-
label_changed: false,
48+
changed: false,
49+
buffer_usage: BufferUsages::COPY_DST | BufferUsages::STORAGE,
4850
}
4951
}
5052
}
@@ -57,7 +59,8 @@ impl<T: ShaderType + Default> Default for StorageBuffer<T> {
5759
buffer: None,
5860
capacity: 0,
5961
label: None,
60-
label_changed: false,
62+
changed: false,
63+
buffer_usage: BufferUsages::COPY_DST | BufferUsages::STORAGE,
6164
}
6265
}
6366
}
@@ -91,7 +94,7 @@ impl<T: ShaderType + WriteInto> StorageBuffer<T> {
9194
let label = label.map(str::to_string);
9295

9396
if label != self.label {
94-
self.label_changed = true;
97+
self.changed = true;
9598
}
9699

97100
self.label = label;
@@ -101,6 +104,16 @@ impl<T: ShaderType + WriteInto> StorageBuffer<T> {
101104
self.label.as_deref()
102105
}
103106

107+
/// Set the buffer usage of the buffer.
108+
///
109+
/// This method only allows addition of flags to the default usage flags.
110+
///
111+
/// The default values for buffer usage are BufferUsages::COPY_DST and BufferUsages::STORAGE.
112+
pub fn set_usage(&mut self, usage: BufferUsages) {
113+
self.buffer_usage |= usage;
114+
self.changed = true;
115+
}
116+
104117
/// Queues writing of data from system RAM to VRAM using the [`RenderDevice`](crate::renderer::RenderDevice)
105118
/// and the provided [`RenderQueue`](crate::renderer::RenderQueue).
106119
///
@@ -111,14 +124,14 @@ impl<T: ShaderType + WriteInto> StorageBuffer<T> {
111124

112125
let size = self.scratch.as_ref().len();
113126

114-
if self.capacity < size || self.label_changed {
127+
if self.capacity < size || self.changed {
115128
self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor {
116129
label: self.label.as_deref(),
117-
usage: BufferUsages::COPY_DST | BufferUsages::STORAGE,
130+
usage: self.buffer_usage,
118131
contents: self.scratch.as_ref(),
119132
}));
120133
self.capacity = size;
121-
self.label_changed = false;
134+
self.changed = false;
122135
} else if let Some(buffer) = &self.buffer {
123136
queue.write_buffer(buffer, 0, self.scratch.as_ref());
124137
}
@@ -152,7 +165,8 @@ pub struct DynamicStorageBuffer<T: ShaderType> {
152165
buffer: Option<Buffer>,
153166
capacity: usize,
154167
label: Option<String>,
155-
label_changed: bool,
168+
changed: bool,
169+
buffer_usage: BufferUsages,
156170
}
157171

158172
impl<T: ShaderType> Default for DynamicStorageBuffer<T> {
@@ -163,7 +177,8 @@ impl<T: ShaderType> Default for DynamicStorageBuffer<T> {
163177
buffer: None,
164178
capacity: 0,
165179
label: None,
166-
label_changed: false,
180+
changed: false,
181+
buffer_usage: BufferUsages::COPY_DST | BufferUsages::STORAGE,
167182
}
168183
}
169184
}
@@ -204,7 +219,7 @@ impl<T: ShaderType + WriteInto> DynamicStorageBuffer<T> {
204219
let label = label.map(str::to_string);
205220

206221
if label != self.label {
207-
self.label_changed = true;
222+
self.changed = true;
208223
}
209224

210225
self.label = label;
@@ -214,18 +229,28 @@ impl<T: ShaderType + WriteInto> DynamicStorageBuffer<T> {
214229
self.label.as_deref()
215230
}
216231

232+
/// Set the buffer usage of the buffer.
233+
///
234+
/// This method only allows addition of flags to the default usage flags.
235+
///
236+
/// The default values for buffer usage are BufferUsages::COPY_DST and BufferUsages::STORAGE.
237+
pub fn set_usage(&mut self, usage: BufferUsages) {
238+
self.buffer_usage |= usage;
239+
self.changed = true;
240+
}
241+
217242
#[inline]
218243
pub fn write_buffer(&mut self, device: &RenderDevice, queue: &RenderQueue) {
219244
let size = self.scratch.as_ref().len();
220245

221-
if self.capacity < size || self.label_changed {
246+
if self.capacity < size || self.changed {
222247
self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor {
223248
label: self.label.as_deref(),
224-
usage: BufferUsages::COPY_DST | BufferUsages::STORAGE,
249+
usage: self.buffer_usage,
225250
contents: self.scratch.as_ref(),
226251
}));
227252
self.capacity = size;
228-
self.label_changed = false;
253+
self.changed = false;
229254
} else if let Some(buffer) = &self.buffer {
230255
queue.write_buffer(buffer, 0, self.scratch.as_ref());
231256
}

crates/bevy_render/src/render_resource/uniform_buffer.rs

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ pub struct UniformBuffer<T: ShaderType> {
3232
scratch: UniformBufferWrapper<Vec<u8>>,
3333
buffer: Option<Buffer>,
3434
label: Option<String>,
35-
label_changed: bool,
35+
changed: bool,
36+
buffer_usage: BufferUsages,
3637
}
3738

3839
impl<T: ShaderType> From<T> for UniformBuffer<T> {
@@ -42,7 +43,8 @@ impl<T: ShaderType> From<T> for UniformBuffer<T> {
4243
scratch: UniformBufferWrapper::new(Vec::new()),
4344
buffer: None,
4445
label: None,
45-
label_changed: false,
46+
changed: false,
47+
buffer_usage: BufferUsages::COPY_DST | BufferUsages::UNIFORM,
4648
}
4749
}
4850
}
@@ -54,7 +56,8 @@ impl<T: ShaderType + Default> Default for UniformBuffer<T> {
5456
scratch: UniformBufferWrapper::new(Vec::new()),
5557
buffer: None,
5658
label: None,
57-
label_changed: false,
59+
changed: false,
60+
buffer_usage: BufferUsages::COPY_DST | BufferUsages::UNIFORM,
5861
}
5962
}
6063
}
@@ -89,7 +92,7 @@ impl<T: ShaderType + WriteInto> UniformBuffer<T> {
8992
let label = label.map(str::to_string);
9093

9194
if label != self.label {
92-
self.label_changed = true;
95+
self.changed = true;
9396
}
9497

9598
self.label = label;
@@ -99,6 +102,16 @@ impl<T: ShaderType + WriteInto> UniformBuffer<T> {
99102
self.label.as_deref()
100103
}
101104

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+
102115
/// Queues writing of data from system RAM to VRAM using the [`RenderDevice`](crate::renderer::RenderDevice)
103116
/// and the provided [`RenderQueue`](crate::renderer::RenderQueue), if a GPU-side backing buffer already exists.
104117
///
@@ -107,13 +120,13 @@ impl<T: ShaderType + WriteInto> UniformBuffer<T> {
107120
pub fn write_buffer(&mut self, device: &RenderDevice, queue: &RenderQueue) {
108121
self.scratch.write(&self.value).unwrap();
109122

110-
if self.label_changed || self.buffer.is_none() {
123+
if self.changed || self.buffer.is_none() {
111124
self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor {
112125
label: self.label.as_deref(),
113-
usage: BufferUsages::COPY_DST | BufferUsages::UNIFORM,
126+
usage: self.buffer_usage,
114127
contents: self.scratch.as_ref(),
115128
}));
116-
self.label_changed = false;
129+
self.changed = false;
117130
} else if let Some(buffer) = &self.buffer {
118131
queue.write_buffer(buffer, 0, self.scratch.as_ref());
119132
}
@@ -145,7 +158,8 @@ pub struct DynamicUniformBuffer<T: ShaderType> {
145158
buffer: Option<Buffer>,
146159
capacity: usize,
147160
label: Option<String>,
148-
label_changed: bool,
161+
changed: bool,
162+
buffer_usage: BufferUsages,
149163
}
150164

151165
impl<T: ShaderType> Default for DynamicUniformBuffer<T> {
@@ -156,7 +170,8 @@ impl<T: ShaderType> Default for DynamicUniformBuffer<T> {
156170
buffer: None,
157171
capacity: 0,
158172
label: None,
159-
label_changed: false,
173+
changed: false,
174+
buffer_usage: BufferUsages::COPY_DST | BufferUsages::UNIFORM,
160175
}
161176
}
162177
}
@@ -198,7 +213,7 @@ impl<T: ShaderType + WriteInto> DynamicUniformBuffer<T> {
198213
let label = label.map(str::to_string);
199214

200215
if label != self.label {
201-
self.label_changed = true;
216+
self.changed = true;
202217
}
203218

204219
self.label = label;
@@ -208,6 +223,16 @@ impl<T: ShaderType + WriteInto> DynamicUniformBuffer<T> {
208223
self.label.as_deref()
209224
}
210225

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+
211236
/// Queues writing of data from system RAM to VRAM using the [`RenderDevice`](crate::renderer::RenderDevice)
212237
/// and the provided [`RenderQueue`](crate::renderer::RenderQueue).
213238
///
@@ -217,14 +242,14 @@ impl<T: ShaderType + WriteInto> DynamicUniformBuffer<T> {
217242
pub fn write_buffer(&mut self, device: &RenderDevice, queue: &RenderQueue) {
218243
let size = self.scratch.as_ref().len();
219244

220-
if self.capacity < size || self.label_changed {
245+
if self.capacity < size || self.changed {
221246
self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor {
222247
label: self.label.as_deref(),
223-
usage: BufferUsages::COPY_DST | BufferUsages::UNIFORM,
248+
usage: self.buffer_usage,
224249
contents: self.scratch.as_ref(),
225250
}));
226251
self.capacity = size;
227-
self.label_changed = false;
252+
self.changed = false;
228253
} else if let Some(buffer) = &self.buffer {
229254
queue.write_buffer(buffer, 0, self.scratch.as_ref());
230255
}

0 commit comments

Comments
 (0)