diff --git a/simulator/src/main.rs b/simulator/src/main.rs index 4cb7c0b..541f248 100644 --- a/simulator/src/main.rs +++ b/simulator/src/main.rs @@ -75,6 +75,8 @@ struct State<'a> { size: PhysicalSize, window: Arc, + + render_pipeline: wgpu::RenderPipeline, } impl<'a> State<'a> { @@ -89,6 +91,8 @@ impl<'a> State<'a> { let config = Self::create_surface_config(size, surface_caps); surface.configure(&device, &config); + let render_pipeline = Self::create_render_pipeline(&device, &config); + Self { surface, device, @@ -96,6 +100,8 @@ impl<'a> State<'a> { config, size, window: window_arc, + + render_pipeline, } } @@ -106,6 +112,61 @@ impl<'a> State<'a> { fn update(&mut self) { // TODO: Update logic here } + + fn create_render_pipeline(device: &Device, config: &wgpu::SurfaceConfiguration) -> wgpu::RenderPipeline { + let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor { + label: Some("Shader"), + source: wgpu::ShaderSource::Wgsl(include_str!("shader.wgsl").into()), + }); + + let render_pipeline_layout = + device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: Some("Render Pipeline Layout"), + bind_group_layouts: &[], + push_constant_ranges: &[], + }); + + device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("Render Pipeline"), + layout: Some(&render_pipeline_layout), + vertex: wgpu::VertexState { + module: &shader, + entry_point: Some("vs_main"), + buffers: &[], + compilation_options: wgpu::PipelineCompilationOptions::default(), + }, + fragment: Some(wgpu::FragmentState { + module: &shader, + entry_point: Some("fs_main"), + targets: &[Some(wgpu::ColorTargetState { + format: config.format, + blend: Some(wgpu::BlendState::REPLACE), + write_mask: wgpu::ColorWrites::ALL, + })], + compilation_options: wgpu::PipelineCompilationOptions::default(), + }), + primitive: wgpu::PrimitiveState { + topology: wgpu::PrimitiveTopology::TriangleList, // 1. + strip_index_format: None, + front_face: wgpu::FrontFace::Ccw, + cull_mode: Some(wgpu::Face::Back), + // Setting this to anything other than Fill requires Features::NON_FILL_POLYGON_MODE + polygon_mode: wgpu::PolygonMode::Fill, + // Requires Features::DEPTH_CLIP_CONTROL + unclipped_depth: false, + // Requires Features::CONSERVATIVE_RASTERIZATION + conservative: false, + }, + depth_stencil: None, + multisample: wgpu::MultisampleState { + count: 1, + mask: !0, + alpha_to_coverage_enabled: false, + }, + multiview: None, + cache: None, + }) + } fn create_surface_config(size: PhysicalSize, capabilities: SurfaceCapabilities) -> wgpu::SurfaceConfiguration { let surface_format = capabilities.formats.iter() @@ -173,7 +234,7 @@ impl<'a> State<'a> { }); { - let _render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + let mut _render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { label: Some("Render Pass"), color_attachments: &[Some(wgpu::RenderPassColorAttachment { view: &view, @@ -192,6 +253,9 @@ impl<'a> State<'a> { occlusion_query_set: None, timestamp_writes: None, }); + + _render_pass.set_pipeline(&self.render_pipeline); + _render_pass.draw(0..3, 0..1); } self.queue.submit(std::iter::once(encoder.finish())); diff --git a/simulator/src/shader.wgsl b/simulator/src/shader.wgsl index 7b23763..f5a0eae 100644 --- a/simulator/src/shader.wgsl +++ b/simulator/src/shader.wgsl @@ -1,22 +1,19 @@ -struct VertexInput { - @location(0) position: vec2, - @location(1) color: vec3, -}; - struct VertexOutput { - @builtin(position) position: vec4, - @location(0) color: vec3, + @builtin(position) clip_position: vec4, }; @vertex -fn vs_main(input: VertexInput) -> VertexOutput { - var output: VertexOutput; - output.position = vec4(input.position, 0.0, 1.0); - output.color = input.color; - return output; +fn vs_main( + @builtin(vertex_index) in_vertex_index: u32, +) -> VertexOutput { + var out: VertexOutput; + let x = f32(1 - i32(in_vertex_index)) * 0.5; + let y = f32(i32(in_vertex_index & 1u) * 2 - 1) * 0.5; + out.clip_position = vec4(x, y, 0.0, 1.0); + return out; } @fragment -fn fs_main(input: VertexOutput) -> @location(0) vec4 { - return vec4(input.color, 1.0); -} +fn fs_main(in: VertexOutput) -> @location(0) vec4 { + return vec4(0.3, 0.2, 0.1, 1.0); +} \ No newline at end of file