summaryrefslogtreecommitdiffstats
path: root/wgpu/src/geometry.rs
diff options
context:
space:
mode:
Diffstat (limited to 'wgpu/src/geometry.rs')
-rw-r--r--wgpu/src/geometry.rs215
1 files changed, 0 insertions, 215 deletions
diff --git a/wgpu/src/geometry.rs b/wgpu/src/geometry.rs
deleted file mode 100644
index f79e9c43..00000000
--- a/wgpu/src/geometry.rs
+++ /dev/null
@@ -1,215 +0,0 @@
-use crate::Transformation;
-use iced_native::{Geometry2D, Rectangle, Vertex2D};
-use std::mem;
-
-#[derive(Debug)]
-pub struct Pipeline {
- pipeline: wgpu::RenderPipeline,
- constants: wgpu::BindGroup,
- constants_buffer: wgpu::Buffer,
-}
-
-impl Pipeline {
- pub fn new(device: &mut wgpu::Device) -> Pipeline {
- let constant_layout =
- device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
- bindings: &[wgpu::BindGroupLayoutBinding {
- binding: 0,
- visibility: wgpu::ShaderStage::VERTEX,
- ty: wgpu::BindingType::UniformBuffer { dynamic: false },
- }],
- });
-
- let constants_buffer = device
- .create_buffer_mapped(
- 1,
- wgpu::BufferUsage::UNIFORM | wgpu::BufferUsage::COPY_DST,
- )
- .fill_from_slice(&[Uniforms::default()]);
-
- let constant_bind_group =
- device.create_bind_group(&wgpu::BindGroupDescriptor {
- layout: &constant_layout,
- bindings: &[wgpu::Binding {
- binding: 0,
- resource: wgpu::BindingResource::Buffer {
- buffer: &constants_buffer,
- range: 0..std::mem::size_of::<Uniforms>() as u64,
- },
- }],
- });
-
- let layout =
- device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
- bind_group_layouts: &[&constant_layout],
- });
-
- let vs = include_bytes!("shader/geom2d.vert.spv");
- let vs_module = device.create_shader_module(
- &wgpu::read_spirv(std::io::Cursor::new(&vs[..]))
- .expect("Read quad vertex shader as SPIR-V"),
- );
-
- let fs = include_bytes!("shader/geom2d.frag.spv");
- let fs_module = device.create_shader_module(
- &wgpu::read_spirv(std::io::Cursor::new(&fs[..]))
- .expect("Read quad fragment shader as SPIR-V"),
- );
-
- let pipeline =
- device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {
- layout: &layout,
- vertex_stage: wgpu::ProgrammableStageDescriptor {
- module: &vs_module,
- entry_point: "main",
- },
- fragment_stage: Some(wgpu::ProgrammableStageDescriptor {
- module: &fs_module,
- entry_point: "main",
- }),
- rasterization_state: Some(wgpu::RasterizationStateDescriptor {
- front_face: wgpu::FrontFace::Cw,
- cull_mode: wgpu::CullMode::None,
- depth_bias: 0,
- depth_bias_slope_scale: 0.0,
- depth_bias_clamp: 0.0,
- }),
- primitive_topology: wgpu::PrimitiveTopology::TriangleList,
- color_states: &[wgpu::ColorStateDescriptor {
- format: wgpu::TextureFormat::Bgra8UnormSrgb,
- color_blend: wgpu::BlendDescriptor {
- src_factor: wgpu::BlendFactor::SrcAlpha,
- dst_factor: wgpu::BlendFactor::OneMinusSrcAlpha,
- operation: wgpu::BlendOperation::Add,
- },
- alpha_blend: wgpu::BlendDescriptor {
- src_factor: wgpu::BlendFactor::One,
- dst_factor: wgpu::BlendFactor::OneMinusSrcAlpha,
- operation: wgpu::BlendOperation::Add,
- },
- write_mask: wgpu::ColorWrite::ALL,
- }],
- depth_stencil_state: None,
- index_format: wgpu::IndexFormat::Uint16,
- vertex_buffers: &[wgpu::VertexBufferDescriptor {
- stride: mem::size_of::<Vertex2D>() as u64,
- step_mode: wgpu::InputStepMode::Vertex,
- attributes: &[
- // Position
- wgpu::VertexAttributeDescriptor {
- shader_location: 0,
- format: wgpu::VertexFormat::Float2,
- offset: 0,
- },
- // Color
- wgpu::VertexAttributeDescriptor {
- shader_location: 1,
- format: wgpu::VertexFormat::Float4,
- offset: 4 * 2,
- },
- ],
- }],
- sample_count: 1,
- sample_mask: !0,
- alpha_to_coverage_enabled: false,
- });
-
- Pipeline {
- pipeline,
- constants: constant_bind_group,
- constants_buffer,
- }
- }
-
- pub fn draw(
- &mut self,
- device: &mut wgpu::Device,
- encoder: &mut wgpu::CommandEncoder,
- target: &wgpu::TextureView,
- transformation: Transformation,
- scale: f32,
- geometries: &Vec<Geometry2D>,
- bounds: Rectangle<u32>,
- ) {
- let uniforms = Uniforms {
- transform: transformation.into(),
- scale,
- };
-
- let constants_buffer = device
- .create_buffer_mapped(1, wgpu::BufferUsage::COPY_SRC)
- .fill_from_slice(&[uniforms]);
-
- encoder.copy_buffer_to_buffer(
- &constants_buffer,
- 0,
- &self.constants_buffer,
- 0,
- std::mem::size_of::<Uniforms>() as u64,
- );
-
- for geom in geometries {
- let vertices_buffer = device
- .create_buffer_mapped(
- geom.vertices.len(),
- wgpu::BufferUsage::VERTEX,
- )
- .fill_from_slice(&geom.vertices);
-
- let indices_buffer = device
- .create_buffer_mapped(
- geom.indices.len(),
- wgpu::BufferUsage::INDEX,
- )
- .fill_from_slice(&geom.indices);
-
- let mut render_pass =
- encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
- color_attachments: &[
- wgpu::RenderPassColorAttachmentDescriptor {
- attachment: target,
- resolve_target: None,
- load_op: wgpu::LoadOp::Load,
- store_op: wgpu::StoreOp::Store,
- clear_color: wgpu::Color {
- r: 0.0,
- g: 0.0,
- b: 0.0,
- a: 0.0,
- },
- },
- ],
- depth_stencil_attachment: None,
- });
-
- render_pass.set_pipeline(&self.pipeline);
- render_pass.set_bind_group(0, &self.constants, &[]);
- render_pass.set_index_buffer(&indices_buffer, 0);
- render_pass.set_vertex_buffers(0, &[(&vertices_buffer, 0)]);
- render_pass.set_scissor_rect(
- bounds.x,
- bounds.y,
- bounds.width,
- bounds.height,
- );
-
- render_pass.draw_indexed(0..geom.indices.len() as u32, 0, 0..1);
- }
- }
-}
-
-#[repr(C)]
-#[derive(Debug, Clone, Copy)]
-struct Uniforms {
- transform: [f32; 16],
- scale: f32,
-}
-
-impl Default for Uniforms {
- fn default() -> Self {
- Self {
- transform: *Transformation::identity().as_ref(),
- scale: 1.0,
- }
- }
-}