diff options
author | 2023-05-30 01:33:50 +0200 | |
---|---|---|
committer | 2023-05-30 01:33:50 +0200 | |
commit | ef547469fdc8fe4faaa9902d9a8c920684f07189 (patch) | |
tree | ed4545b020a52219f97f6fced31a4bd67c47ec3f /wgpu | |
parent | 5fdc5affceca9345661ea2d213ccbce99721d09b (diff) | |
download | iced-ef547469fdc8fe4faaa9902d9a8c920684f07189.tar.gz iced-ef547469fdc8fe4faaa9902d9a8c920684f07189.tar.bz2 iced-ef547469fdc8fe4faaa9902d9a8c920684f07189.zip |
Improve boundaries between `quad` submodules in `iced_wgpu`
Diffstat (limited to 'wgpu')
-rw-r--r-- | wgpu/src/quad.rs | 27 | ||||
-rw-r--r-- | wgpu/src/quad/gradient.rs | 50 | ||||
-rw-r--r-- | wgpu/src/quad/solid.rs | 53 |
3 files changed, 75 insertions, 55 deletions
diff --git a/wgpu/src/quad.rs b/wgpu/src/quad.rs index deb6d59a..9c5ed05f 100644 --- a/wgpu/src/quad.rs +++ b/wgpu/src/quad.rs @@ -116,21 +116,23 @@ impl Pipeline { for (kind, count) in &quads.order { match kind { Kind::Solid => { - render_pass.set_pipeline(&self.solid.pipeline); - layer.solid.draw( - &layer.constants, + self.solid.render( render_pass, + &layer.constants, + &layer.solid, solid_offset..(solid_offset + count), ); + solid_offset += count; } Kind::Gradient => { - render_pass.set_pipeline(&self.gradient.pipeline); - layer.gradient.draw( - &layer.constants, + self.gradient.render( render_pass, + &layer.constants, + &layer.gradient, gradient_offset..(gradient_offset + count), ); + gradient_offset += count; } } @@ -199,17 +201,8 @@ impl Layer { bytemuck::bytes_of(&uniforms), ); - let _ = self.solid.instances.resize(device, quads.solids.len()); - let _ = self - .gradient - .instances - .resize(device, quads.gradients.len()); - - let _ = self.solid.instances.write(queue, 0, &quads.solids); - let _ = self.gradient.instances.write(queue, 0, &quads.gradients); - - self.solid.instance_count = quads.solids.len(); - self.gradient.instance_count = quads.gradients.len(); + self.solid.prepare(device, queue, &quads.solids); + self.gradient.prepare(device, queue, &quads.gradients); } } diff --git a/wgpu/src/quad/gradient.rs b/wgpu/src/quad/gradient.rs index 2729afdf..d3884ce1 100644 --- a/wgpu/src/quad/gradient.rs +++ b/wgpu/src/quad/gradient.rs @@ -24,13 +24,13 @@ unsafe impl Zeroable for Gradient {} #[derive(Debug)] pub struct Pipeline { - pub pipeline: wgpu::RenderPipeline, + pipeline: wgpu::RenderPipeline, } #[derive(Debug)] pub struct Layer { - pub instances: Buffer<Gradient>, - pub instance_count: usize, + instances: Buffer<Gradient>, + instance_count: usize, } impl Layer { @@ -48,23 +48,16 @@ impl Layer { } } - pub fn draw<'a>( - &'a self, - constants: &'a wgpu::BindGroup, - render_pass: &mut wgpu::RenderPass<'a>, - range: Range<usize>, + pub fn prepare( + &mut self, + device: &wgpu::Device, + queue: &wgpu::Queue, + instances: &[Gradient], ) { - #[cfg(feature = "tracing")] - let _ = tracing::info_span!("Wgpu::Quad::Gradient", "DRAW").entered(); - - render_pass.set_bind_group(0, constants, &[]); - render_pass.set_vertex_buffer(1, self.instances.slice(..)); + let _ = self.instances.resize(device, instances.len()); + let _ = self.instances.write(queue, 0, instances); - render_pass.draw_indexed( - 0..quad::INDICES.len() as u32, - 0, - range.start as u32..range.end as u32, - ); + self.instance_count = instances.len(); } } @@ -158,4 +151,25 @@ impl Pipeline { Self { pipeline } } + + pub fn render<'a>( + &'a self, + render_pass: &mut wgpu::RenderPass<'a>, + constants: &'a wgpu::BindGroup, + layer: &'a Layer, + range: Range<usize>, + ) { + #[cfg(feature = "tracing")] + let _ = tracing::info_span!("Wgpu::Quad::Gradient", "DRAW").entered(); + + render_pass.set_pipeline(&self.pipeline); + render_pass.set_bind_group(0, constants, &[]); + render_pass.set_vertex_buffer(1, layer.instances.slice(..)); + + render_pass.draw_indexed( + 0..quad::INDICES.len() as u32, + 0, + range.start as u32..range.end as u32, + ); + } } diff --git a/wgpu/src/quad/solid.rs b/wgpu/src/quad/solid.rs index 3540ce3a..a3a7a0af 100644 --- a/wgpu/src/quad/solid.rs +++ b/wgpu/src/quad/solid.rs @@ -17,13 +17,13 @@ pub struct Solid { #[derive(Debug)] pub struct Pipeline { - pub pipeline: wgpu::RenderPipeline, + pipeline: wgpu::RenderPipeline, } #[derive(Debug)] pub struct Layer { - pub instances: Buffer<quad::Solid>, - pub instance_count: usize, + instances: Buffer<Solid>, + instance_count: usize, } impl Layer { @@ -41,23 +41,16 @@ impl Layer { } } - pub fn draw<'a>( - &'a self, - constants: &'a wgpu::BindGroup, - render_pass: &mut wgpu::RenderPass<'a>, - range: Range<usize>, + pub fn prepare( + &mut self, + device: &wgpu::Device, + queue: &wgpu::Queue, + instances: &[Solid], ) { - #[cfg(feature = "tracing")] - let _ = tracing::info_span!("Wgpu::Quad::Solid", "DRAW").entered(); - - render_pass.set_bind_group(0, constants, &[]); - render_pass.set_vertex_buffer(1, self.instances.slice(..)); + let _ = self.instances.resize(device, instances.len()); + let _ = self.instances.write(queue, 0, instances); - render_pass.draw_indexed( - 0..quad::INDICES.len() as u32, - 0, - range.start as u32..range.end as u32, - ); + self.instance_count = instances.len(); } } @@ -92,8 +85,7 @@ impl Pipeline { buffers: &[ quad::Vertex::buffer_layout(), wgpu::VertexBufferLayout { - array_stride: std::mem::size_of::<quad::Solid>() - as u64, + array_stride: std::mem::size_of::<Solid>() as u64, step_mode: wgpu::VertexStepMode::Instance, attributes: &wgpu::vertex_attr_array!( // Color @@ -133,4 +125,25 @@ impl Pipeline { Self { pipeline } } + + pub fn render<'a>( + &'a self, + render_pass: &mut wgpu::RenderPass<'a>, + constants: &'a wgpu::BindGroup, + layer: &'a Layer, + range: Range<usize>, + ) { + #[cfg(feature = "tracing")] + let _ = tracing::info_span!("Wgpu::Quad::Solid", "DRAW").entered(); + + render_pass.set_pipeline(&self.pipeline); + render_pass.set_bind_group(0, constants, &[]); + render_pass.set_vertex_buffer(1, layer.instances.slice(..)); + + render_pass.draw_indexed( + 0..quad::INDICES.len() as u32, + 0, + range.start as u32..range.end as u32, + ); + } } |