diff options
author | 2024-03-30 23:49:26 +0100 | |
---|---|---|
committer | 2024-03-30 23:49:26 +0100 | |
commit | c7a4fad4a24dec8536f450d447a9852846f2d711 (patch) | |
tree | bcdf3d450dcaaf445a237d9dfac646dee78e838e /wgpu/src/image.rs | |
parent | 5071e3d231699f67347a11b829cc8c9e50e54370 (diff) | |
parent | 4c74bebc708f960f77d53526e7da4187f56967c9 (diff) | |
download | iced-c7a4fad4a24dec8536f450d447a9852846f2d711.tar.gz iced-c7a4fad4a24dec8536f450d447a9852846f2d711.tar.bz2 iced-c7a4fad4a24dec8536f450d447a9852846f2d711.zip |
Merge pull request #2357 from iced-rs/wgpu/use-staging-belt
Use a `StagingBelt` in `iced_wgpu` for regular buffer uploads
Diffstat (limited to 'wgpu/src/image.rs')
-rw-r--r-- | wgpu/src/image.rs | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/wgpu/src/image.rs b/wgpu/src/image.rs index 067b77ab..d0bf1182 100644 --- a/wgpu/src/image.rs +++ b/wgpu/src/image.rs @@ -83,21 +83,31 @@ impl Layer { fn prepare( &mut self, device: &wgpu::Device, - queue: &wgpu::Queue, + encoder: &mut wgpu::CommandEncoder, + belt: &mut wgpu::util::StagingBelt, nearest_instances: &[Instance], linear_instances: &[Instance], transformation: Transformation, ) { - queue.write_buffer( + let uniforms = Uniforms { + transform: transformation.into(), + }; + + let bytes = bytemuck::bytes_of(&uniforms); + + belt.write_buffer( + encoder, &self.uniforms, 0, - bytemuck::bytes_of(&Uniforms { - transform: transformation.into(), - }), - ); + (bytes.len() as u64).try_into().expect("Sized uniforms"), + device, + ) + .copy_from_slice(bytes); + + self.nearest + .upload(device, encoder, belt, nearest_instances); - self.nearest.upload(device, queue, nearest_instances); - self.linear.upload(device, queue, linear_instances); + self.linear.upload(device, encoder, belt, linear_instances); } fn render<'a>(&'a self, render_pass: &mut wgpu::RenderPass<'a>) { @@ -158,7 +168,8 @@ impl Data { fn upload( &mut self, device: &wgpu::Device, - queue: &wgpu::Queue, + encoder: &mut wgpu::CommandEncoder, + belt: &mut wgpu::util::StagingBelt, instances: &[Instance], ) { self.instance_count = instances.len(); @@ -168,7 +179,7 @@ impl Data { } let _ = self.instances.resize(device, instances.len()); - let _ = self.instances.write(queue, 0, instances); + let _ = self.instances.write(device, encoder, belt, 0, instances); } fn render<'a>(&'a self, render_pass: &mut wgpu::RenderPass<'a>) { @@ -383,8 +394,8 @@ impl Pipeline { pub fn prepare( &mut self, device: &wgpu::Device, - queue: &wgpu::Queue, encoder: &mut wgpu::CommandEncoder, + belt: &mut wgpu::util::StagingBelt, images: &[layer::Image], transformation: Transformation, _scale: f32, @@ -501,7 +512,8 @@ impl Pipeline { layer.prepare( device, - queue, + encoder, + belt, nearest_instances, linear_instances, transformation, |