Improve boundaries between quad submodules in iced_wgpu

This commit is contained in:
Héctor Ramón Jiménez 2023-05-30 01:33:50 +02:00
parent 5fdc5affce
commit ef547469fd
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
3 changed files with 75 additions and 55 deletions

View file

@ -116,21 +116,23 @@ impl Pipeline {
for (kind, count) in &quads.order { for (kind, count) in &quads.order {
match kind { match kind {
Kind::Solid => { Kind::Solid => {
render_pass.set_pipeline(&self.solid.pipeline); self.solid.render(
layer.solid.draw(
&layer.constants,
render_pass, render_pass,
&layer.constants,
&layer.solid,
solid_offset..(solid_offset + count), solid_offset..(solid_offset + count),
); );
solid_offset += count; solid_offset += count;
} }
Kind::Gradient => { Kind::Gradient => {
render_pass.set_pipeline(&self.gradient.pipeline); self.gradient.render(
layer.gradient.draw(
&layer.constants,
render_pass, render_pass,
&layer.constants,
&layer.gradient,
gradient_offset..(gradient_offset + count), gradient_offset..(gradient_offset + count),
); );
gradient_offset += count; gradient_offset += count;
} }
} }
@ -199,17 +201,8 @@ impl Layer {
bytemuck::bytes_of(&uniforms), bytemuck::bytes_of(&uniforms),
); );
let _ = self.solid.instances.resize(device, quads.solids.len()); self.solid.prepare(device, queue, &quads.solids);
let _ = self self.gradient.prepare(device, queue, &quads.gradients);
.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();
} }
} }

View file

@ -24,13 +24,13 @@ unsafe impl Zeroable for Gradient {}
#[derive(Debug)] #[derive(Debug)]
pub struct Pipeline { pub struct Pipeline {
pub pipeline: wgpu::RenderPipeline, pipeline: wgpu::RenderPipeline,
} }
#[derive(Debug)] #[derive(Debug)]
pub struct Layer { pub struct Layer {
pub instances: Buffer<Gradient>, instances: Buffer<Gradient>,
pub instance_count: usize, instance_count: usize,
} }
impl Layer { impl Layer {
@ -48,23 +48,16 @@ impl Layer {
} }
} }
pub fn draw<'a>( pub fn prepare(
&'a self, &mut self,
constants: &'a wgpu::BindGroup, device: &wgpu::Device,
render_pass: &mut wgpu::RenderPass<'a>, queue: &wgpu::Queue,
range: Range<usize>, instances: &[Gradient],
) { ) {
#[cfg(feature = "tracing")] let _ = self.instances.resize(device, instances.len());
let _ = tracing::info_span!("Wgpu::Quad::Gradient", "DRAW").entered(); let _ = self.instances.write(queue, 0, instances);
render_pass.set_bind_group(0, constants, &[]); self.instance_count = instances.len();
render_pass.set_vertex_buffer(1, self.instances.slice(..));
render_pass.draw_indexed(
0..quad::INDICES.len() as u32,
0,
range.start as u32..range.end as u32,
);
} }
} }
@ -158,4 +151,25 @@ impl Pipeline {
Self { 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,
);
}
} }

View file

@ -17,13 +17,13 @@ pub struct Solid {
#[derive(Debug)] #[derive(Debug)]
pub struct Pipeline { pub struct Pipeline {
pub pipeline: wgpu::RenderPipeline, pipeline: wgpu::RenderPipeline,
} }
#[derive(Debug)] #[derive(Debug)]
pub struct Layer { pub struct Layer {
pub instances: Buffer<quad::Solid>, instances: Buffer<Solid>,
pub instance_count: usize, instance_count: usize,
} }
impl Layer { impl Layer {
@ -41,23 +41,16 @@ impl Layer {
} }
} }
pub fn draw<'a>( pub fn prepare(
&'a self, &mut self,
constants: &'a wgpu::BindGroup, device: &wgpu::Device,
render_pass: &mut wgpu::RenderPass<'a>, queue: &wgpu::Queue,
range: Range<usize>, instances: &[Solid],
) { ) {
#[cfg(feature = "tracing")] let _ = self.instances.resize(device, instances.len());
let _ = tracing::info_span!("Wgpu::Quad::Solid", "DRAW").entered(); let _ = self.instances.write(queue, 0, instances);
render_pass.set_bind_group(0, constants, &[]); self.instance_count = instances.len();
render_pass.set_vertex_buffer(1, self.instances.slice(..));
render_pass.draw_indexed(
0..quad::INDICES.len() as u32,
0,
range.start as u32..range.end as u32,
);
} }
} }
@ -92,8 +85,7 @@ impl Pipeline {
buffers: &[ buffers: &[
quad::Vertex::buffer_layout(), quad::Vertex::buffer_layout(),
wgpu::VertexBufferLayout { wgpu::VertexBufferLayout {
array_stride: std::mem::size_of::<quad::Solid>() array_stride: std::mem::size_of::<Solid>() as u64,
as u64,
step_mode: wgpu::VertexStepMode::Instance, step_mode: wgpu::VertexStepMode::Instance,
attributes: &wgpu::vertex_attr_array!( attributes: &wgpu::vertex_attr_array!(
// Color // Color
@ -133,4 +125,25 @@ impl Pipeline {
Self { 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,
);
}
} }