diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index 204c44c3bd45a..b5e7d95ed9e94 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -741,7 +741,7 @@ impl Default for SkinnedMeshUniform { pub fn prepare_skinned_meshes( render_device: Res, render_queue: Res, - extracted_joints: Res, + mut extracted_joints: ResMut, mut skinned_mesh_uniform: ResMut, ) { if extracted_joints.buffer.is_empty() { @@ -752,9 +752,10 @@ pub fn prepare_skinned_meshes( skinned_mesh_uniform .buffer .reserve(extracted_joints.buffer.len(), &render_device); - for joint in &extracted_joints.buffer { - skinned_mesh_uniform.buffer.push(*joint); - } + skinned_mesh_uniform + .buffer + .swap(&mut extracted_joints.buffer); + extracted_joints.buffer.clear(); skinned_mesh_uniform .buffer .write_buffer(&render_device, &render_queue); diff --git a/crates/bevy_render/src/render_resource/buffer_vec.rs b/crates/bevy_render/src/render_resource/buffer_vec.rs index 6e2deb3009018..e991b6ab73375 100644 --- a/crates/bevy_render/src/render_resource/buffer_vec.rs +++ b/crates/bevy_render/src/render_resource/buffer_vec.rs @@ -3,6 +3,8 @@ use crate::{ renderer::{RenderDevice, RenderQueue}, }; use bevy_core::{cast_slice, Pod}; +#[cfg(feature = "trace")] +use bevy_utils::tracing::info_span; use copyless::VecHelper; use wgpu::BufferUsages; @@ -51,6 +53,11 @@ impl BufferVec { index } + /// Swaps the internal [`Vec`] with another of the same type. + pub fn swap(&mut self, other: &mut Vec) { + std::mem::swap(&mut self.values, other); + } + pub fn reserve(&mut self, capacity: usize, device: &RenderDevice) { if capacity > self.capacity { self.capacity = capacity; @@ -72,6 +79,8 @@ impl BufferVec { if let Some(buffer) = &self.buffer { let range = 0..self.item_size * self.values.len(); let bytes: &[u8] = cast_slice(&self.values); + #[cfg(feature = "trace")] + let _span = info_span!("BufferVec: write buffer").entered(); queue.write_buffer(buffer, 0, &bytes[range]); } } diff --git a/crates/bevy_render/src/render_resource/storage_buffer.rs b/crates/bevy_render/src/render_resource/storage_buffer.rs index 96c24a2c090eb..fca6b5ffa2070 100644 --- a/crates/bevy_render/src/render_resource/storage_buffer.rs +++ b/crates/bevy_render/src/render_resource/storage_buffer.rs @@ -1,5 +1,7 @@ use super::Buffer; use crate::renderer::{RenderDevice, RenderQueue}; +#[cfg(feature = "trace")] +use bevy_utils::tracing::info_span; use encase::{ internal::WriteInto, DynamicStorageBuffer as DynamicStorageBufferWrapper, ShaderType, StorageBuffer as StorageBufferWrapper, @@ -73,6 +75,8 @@ impl StorageBuffer { })); self.capacity = size; } else if let Some(buffer) = &self.buffer { + #[cfg(feature = "trace")] + let _span = info_span!("StorageBuffer: write buffer").entered(); queue.write_buffer(buffer, 0, self.scratch.as_ref()); } } @@ -140,6 +144,8 @@ impl DynamicStorageBuffer { })); self.capacity = size; } else if let Some(buffer) = &self.buffer { + #[cfg(feature = "trace")] + let _span = info_span!("DynamicStorageBuffer: write buffer").entered(); 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 6f9ad642dcc48..e0f01c566608e 100644 --- a/crates/bevy_render/src/render_resource/uniform_buffer.rs +++ b/crates/bevy_render/src/render_resource/uniform_buffer.rs @@ -2,6 +2,8 @@ use crate::{ render_resource::Buffer, renderer::{RenderDevice, RenderQueue}, }; +#[cfg(feature = "trace")] +use bevy_utils::tracing::info_span; use encase::{ internal::WriteInto, DynamicUniformBuffer as DynamicUniformBufferWrapper, ShaderType, UniformBuffer as UniformBufferWrapper, @@ -63,7 +65,11 @@ impl UniformBuffer { self.scratch.write(&self.value).unwrap(); match &self.buffer { - Some(buffer) => queue.write_buffer(buffer, 0, self.scratch.as_ref()), + Some(buffer) => { + #[cfg(feature = "trace")] + let _span = info_span!("UniformBuffer: write buffer").entered(); + queue.write_buffer(buffer, 0, self.scratch.as_ref()); + } None => { self.buffer = Some(device.create_buffer_with_data(&BufferInitDescriptor { label: None, @@ -137,6 +143,8 @@ impl DynamicUniformBuffer { })); self.capacity = size; } else if let Some(buffer) = &self.buffer { + #[cfg(feature = "trace")] + let _span = info_span!("DynamicUniformBuffer: write buffer").entered(); queue.write_buffer(buffer, 0, self.scratch.as_ref()); } }