diff options
Diffstat (limited to 'examples/integration/src/scene.rs')
| -rw-r--r-- | examples/integration/src/scene.rs | 109 | 
1 files changed, 42 insertions, 67 deletions
| diff --git a/examples/integration/src/scene.rs b/examples/integration/src/scene.rs index 22c6812a..03a338c6 100644 --- a/examples/integration/src/scene.rs +++ b/examples/integration/src/scene.rs @@ -2,91 +2,68 @@ use iced_wgpu::wgpu;  use iced_winit::Color;  pub struct Scene { -    pub background_color: Color,      pipeline: wgpu::RenderPipeline, -    bind_group: wgpu::BindGroup,  }  impl Scene {      pub fn new(device: &wgpu::Device) -> Scene { -        let (pipeline, bind_group) = build_pipeline(device); +        let pipeline = build_pipeline(device); -        Scene { -            background_color: Color::BLACK, -            pipeline, -            bind_group, -        } +        Scene { pipeline }      } -    pub fn draw( +    pub fn clear<'a>(          &self, -        encoder: &mut wgpu::CommandEncoder, -        target: &wgpu::TextureView, -    ) { -        let mut rpass = -            encoder.begin_render_pass(&wgpu::RenderPassDescriptor { -                color_attachments: &[ -                    wgpu::RenderPassColorAttachmentDescriptor { -                        attachment: target, -                        resolve_target: None, -                        load_op: wgpu::LoadOp::Clear, -                        store_op: wgpu::StoreOp::Store, -                        clear_color: { -                            let [r, g, b, a] = -                                self.background_color.into_linear(); +        target: &'a wgpu::TextureView, +        encoder: &'a mut wgpu::CommandEncoder, +        background_color: Color, +    ) -> wgpu::RenderPass<'a> { +        encoder.begin_render_pass(&wgpu::RenderPassDescriptor { +            color_attachments: &[wgpu::RenderPassColorAttachmentDescriptor { +                attachment: target, +                resolve_target: None, +                ops: wgpu::Operations { +                    load: wgpu::LoadOp::Clear({ +                        let [r, g, b, a] = background_color.into_linear(); -                            wgpu::Color { -                                r: r as f64, -                                g: g as f64, -                                b: b as f64, -                                a: a as f64, -                            } -                        }, -                    }, -                ], -                depth_stencil_attachment: None, -            }); +                        wgpu::Color { +                            r: r as f64, +                            g: g as f64, +                            b: b as f64, +                            a: a as f64, +                        } +                    }), +                    store: true, +                }, +            }], +            depth_stencil_attachment: None, +        }) +    } -        rpass.set_pipeline(&self.pipeline); -        rpass.set_bind_group(0, &self.bind_group, &[]); -        rpass.draw(0..3, 0..1); +    pub fn draw<'a>(&'a self, render_pass: &mut wgpu::RenderPass<'a>) { +        render_pass.set_pipeline(&self.pipeline); +        render_pass.draw(0..3, 0..1);      }  } -fn build_pipeline( -    device: &wgpu::Device, -) -> (wgpu::RenderPipeline, wgpu::BindGroup) { -    let vs = include_bytes!("shader/vert.spv"); -    let fs = include_bytes!("shader/frag.spv"); - -    let vs_module = device.create_shader_module( -        &wgpu::read_spirv(std::io::Cursor::new(&vs[..])).unwrap(), -    ); +fn build_pipeline(device: &wgpu::Device) -> wgpu::RenderPipeline { +    let vs_module = +        device.create_shader_module(wgpu::include_spirv!("shader/vert.spv")); -    let fs_module = device.create_shader_module( -        &wgpu::read_spirv(std::io::Cursor::new(&fs[..])).unwrap(), -    ); - -    let bind_group_layout = -        device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { -            label: None, -            bindings: &[], -        }); - -    let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { -        label: None, -        layout: &bind_group_layout, -        bindings: &[], -    }); +    let fs_module = +        device.create_shader_module(wgpu::include_spirv!("shader/frag.spv"));      let pipeline_layout =          device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { -            bind_group_layouts: &[&bind_group_layout], +            label: None, +            push_constant_ranges: &[], +            bind_group_layouts: &[],          });      let pipeline =          device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { -            layout: &pipeline_layout, +            label: None, +            layout: Some(&pipeline_layout),              vertex_stage: wgpu::ProgrammableStageDescriptor {                  module: &vs_module,                  entry_point: "main", @@ -98,9 +75,7 @@ fn build_pipeline(              rasterization_state: Some(wgpu::RasterizationStateDescriptor {                  front_face: wgpu::FrontFace::Ccw,                  cull_mode: wgpu::CullMode::None, -                depth_bias: 0, -                depth_bias_slope_scale: 0.0, -                depth_bias_clamp: 0.0, +                ..Default::default()              }),              primitive_topology: wgpu::PrimitiveTopology::TriangleList,              color_states: &[wgpu::ColorStateDescriptor { @@ -119,5 +94,5 @@ fn build_pipeline(              alpha_to_coverage_enabled: false,          }); -    (pipeline, bind_group) +    pipeline  } | 
