diff --git a/crates/bevy_render/src/render_resource/buffer_vec.rs b/crates/bevy_render/src/render_resource/buffer_vec.rs index 7ae137001ede4..af4616427b8ca 100644 --- a/crates/bevy_render/src/render_resource/buffer_vec.rs +++ b/crates/bevy_render/src/render_resource/buffer_vec.rs @@ -33,6 +33,8 @@ pub struct BufferVec { capacity: usize, item_size: usize, buffer_usage: BufferUsages, + label: Option, + label_changed: bool, } impl BufferVec { @@ -43,6 +45,8 @@ impl BufferVec { capacity: 0, item_size: std::mem::size_of::(), buffer_usage, + label: None, + label_changed: false, } } @@ -72,6 +76,20 @@ impl BufferVec { index } + pub fn set_label(&mut self, label: Option<&str>) { + let label = label.map(str::to_string); + + if label != self.label { + self.label_changed = true; + } + + self.label = label; + } + + pub fn get_label(&self) -> Option<&str> { + self.label.as_deref() + } + /// Creates a [`Buffer`](crate::render_resource::Buffer) on the [`RenderDevice`](crate::renderer::RenderDevice) with size /// at least `std::mem::size_of::() * capacity`, unless a such a buffer already exists. /// @@ -84,15 +102,16 @@ impl BufferVec { /// the `BufferVec` was created, the buffer on the [`RenderDevice`](crate::renderer::RenderDevice) /// is marked as [`BufferUsages::COPY_DST`](crate::render_resource::BufferUsages). pub fn reserve(&mut self, capacity: usize, device: &RenderDevice) { - if capacity > self.capacity { + if capacity > self.capacity || self.label_changed { self.capacity = capacity; let size = self.item_size * capacity; self.buffer = Some(device.create_buffer(&wgpu::BufferDescriptor { - label: None, + label: self.label.as_deref(), size: size as wgpu::BufferAddress, usage: BufferUsages::COPY_DST | self.buffer_usage, mapped_at_creation: false, })); + self.label_changed = false; } } diff --git a/crates/bevy_render/src/render_resource/storage_buffer.rs b/crates/bevy_render/src/render_resource/storage_buffer.rs index 4579cd2d06a43..666b86667b908 100644 --- a/crates/bevy_render/src/render_resource/storage_buffer.rs +++ b/crates/bevy_render/src/render_resource/storage_buffer.rs @@ -32,6 +32,8 @@ pub struct StorageBuffer { scratch: StorageBufferWrapper>, buffer: Option, capacity: usize, + label: Option, + label_changed: bool, } impl From for StorageBuffer { @@ -41,6 +43,8 @@ impl From for StorageBuffer { scratch: StorageBufferWrapper::new(Vec::new()), buffer: None, capacity: 0, + label: None, + label_changed: false, } } } @@ -52,6 +56,8 @@ impl Default for StorageBuffer { scratch: StorageBufferWrapper::new(Vec::new()), buffer: None, capacity: 0, + label: None, + label_changed: false, } } } @@ -81,6 +87,20 @@ impl StorageBuffer { &mut self.value } + pub fn set_label(&mut self, label: Option<&str>) { + let label = label.map(str::to_string); + + if label != self.label { + self.label_changed = true; + } + + self.label = label; + } + + pub fn get_label(&self) -> Option<&str> { + self.label.as_deref() + } + /// Queues writing of data from system RAM to VRAM using the [`RenderDevice`](crate::renderer::RenderDevice) /// and the provided [`RenderQueue`](crate::renderer::RenderQueue). /// @@ -91,13 +111,14 @@ impl StorageBuffer { let size = self.scratch.as_ref().len(); - if self.capacity < size { + if self.capacity < size || self.label_changed { self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor { - label: None, + label: self.label.as_deref(), usage: BufferUsages::COPY_DST | BufferUsages::STORAGE, contents: self.scratch.as_ref(), })); self.capacity = size; + self.label_changed = false; } else if let Some(buffer) = &self.buffer { queue.write_buffer(buffer, 0, self.scratch.as_ref()); } @@ -130,6 +151,8 @@ pub struct DynamicStorageBuffer { scratch: DynamicStorageBufferWrapper>, buffer: Option, capacity: usize, + label: Option, + label_changed: bool, } impl Default for DynamicStorageBuffer { @@ -139,6 +162,8 @@ impl Default for DynamicStorageBuffer { scratch: DynamicStorageBufferWrapper::new(Vec::new()), buffer: None, capacity: 0, + label: None, + label_changed: false, } } } @@ -175,17 +200,32 @@ impl DynamicStorageBuffer { offset } + pub fn set_label(&mut self, label: Option<&str>) { + let label = label.map(str::to_string); + + if label != self.label { + self.label_changed = true; + } + + self.label = label; + } + + pub fn get_label(&self) -> Option<&str> { + self.label.as_deref() + } + #[inline] pub fn write_buffer(&mut self, device: &RenderDevice, queue: &RenderQueue) { let size = self.scratch.as_ref().len(); - if self.capacity < size { + if self.capacity < size || self.label_changed { self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor { - label: None, + label: self.label.as_deref(), usage: BufferUsages::COPY_DST | BufferUsages::STORAGE, contents: self.scratch.as_ref(), })); self.capacity = size; + self.label_changed = false; } else if let Some(buffer) = &self.buffer { queue.write_buffer(buffer, 0, self.scratch.as_ref()); } diff --git a/crates/bevy_render/src/render_resource/uniform_buffer.rs b/crates/bevy_render/src/render_resource/uniform_buffer.rs index c56294a2225a9..aa66ee08da278 100644 --- a/crates/bevy_render/src/render_resource/uniform_buffer.rs +++ b/crates/bevy_render/src/render_resource/uniform_buffer.rs @@ -31,6 +31,8 @@ pub struct UniformBuffer { value: T, scratch: UniformBufferWrapper>, buffer: Option, + label: Option, + label_changed: bool, } impl From for UniformBuffer { @@ -39,6 +41,8 @@ impl From for UniformBuffer { value, scratch: UniformBufferWrapper::new(Vec::new()), buffer: None, + label: None, + label_changed: false, } } } @@ -49,6 +53,8 @@ impl Default for UniformBuffer { value: T::default(), scratch: UniformBufferWrapper::new(Vec::new()), buffer: None, + label: None, + label_changed: false, } } } @@ -79,6 +85,20 @@ impl UniformBuffer { &mut self.value } + pub fn set_label(&mut self, label: Option<&str>) { + let label = label.map(str::to_string); + + if label != self.label { + self.label_changed = true; + } + + self.label = label; + } + + pub fn get_label(&self) -> Option<&str> { + self.label.as_deref() + } + /// Queues writing of data from system RAM to VRAM using the [`RenderDevice`](crate::renderer::RenderDevice) /// and the provided [`RenderQueue`](crate::renderer::RenderQueue), if a GPU-side backing buffer already exists. /// @@ -87,15 +107,15 @@ impl UniformBuffer { pub fn write_buffer(&mut self, device: &RenderDevice, queue: &RenderQueue) { self.scratch.write(&self.value).unwrap(); - match &self.buffer { - Some(buffer) => queue.write_buffer(buffer, 0, self.scratch.as_ref()), - None => { - self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor { - label: None, - usage: BufferUsages::COPY_DST | BufferUsages::UNIFORM, - contents: self.scratch.as_ref(), - })); - } + if self.label_changed || self.buffer.is_none() { + self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor { + label: self.label.as_deref(), + usage: BufferUsages::COPY_DST | BufferUsages::UNIFORM, + contents: self.scratch.as_ref(), + })); + self.label_changed = false; + } else if let Some(buffer) = &self.buffer { + queue.write_buffer(buffer, 0, self.scratch.as_ref()); } } } @@ -124,6 +144,8 @@ pub struct DynamicUniformBuffer { scratch: DynamicUniformBufferWrapper>, buffer: Option, capacity: usize, + label: Option, + label_changed: bool, } impl Default for DynamicUniformBuffer { @@ -133,6 +155,8 @@ impl Default for DynamicUniformBuffer { scratch: DynamicUniformBufferWrapper::new(Vec::new()), buffer: None, capacity: 0, + label: None, + label_changed: false, } } } @@ -170,6 +194,20 @@ impl DynamicUniformBuffer { offset } + pub fn set_label(&mut self, label: Option<&str>) { + let label = label.map(str::to_string); + + if label != self.label { + self.label_changed = true; + } + + self.label = label; + } + + pub fn get_label(&self) -> Option<&str> { + self.label.as_deref() + } + /// Queues writing of data from system RAM to VRAM using the [`RenderDevice`](crate::renderer::RenderDevice) /// and the provided [`RenderQueue`](crate::renderer::RenderQueue). /// @@ -179,13 +217,14 @@ impl DynamicUniformBuffer { pub fn write_buffer(&mut self, device: &RenderDevice, queue: &RenderQueue) { let size = self.scratch.as_ref().len(); - if self.capacity < size { + if self.capacity < size || self.label_changed { self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor { - label: None, + label: self.label.as_deref(), usage: BufferUsages::COPY_DST | BufferUsages::UNIFORM, contents: self.scratch.as_ref(), })); self.capacity = size; + self.label_changed = false; } else if let Some(buffer) = &self.buffer { queue.write_buffer(buffer, 0, self.scratch.as_ref()); }