wgpu_examples/mesh_shader/
mod.rs

1pub struct Example {
2    pipeline: wgpu::RenderPipeline,
3}
4impl crate::framework::Example for Example {
5    fn init(
6        config: &wgpu::SurfaceConfiguration,
7        _adapter: &wgpu::Adapter,
8        device: &wgpu::Device,
9        _queue: &wgpu::Queue,
10    ) -> Self {
11        let shader = device.create_shader_module(wgpu::include_wgsl!("shader.wgsl"));
12        let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
13            label: None,
14            bind_group_layouts: &[],
15            immediate_size: 0,
16        });
17        let pipeline = device.create_mesh_pipeline(&wgpu::MeshPipelineDescriptor {
18            label: None,
19            layout: Some(&pipeline_layout),
20            task: Some(wgpu::TaskState {
21                module: &shader,
22                entry_point: Some("ts_main"),
23                compilation_options: Default::default(),
24            }),
25            mesh: wgpu::MeshState {
26                module: &shader,
27                entry_point: Some("ms_main"),
28                compilation_options: Default::default(),
29            },
30            fragment: Some(wgpu::FragmentState {
31                module: &shader,
32                entry_point: Some("fs_main"),
33                compilation_options: Default::default(),
34                targets: &[Some(config.view_formats[0].into())],
35            }),
36            primitive: wgpu::PrimitiveState {
37                cull_mode: Some(wgpu::Face::Back),
38                ..Default::default()
39            },
40            depth_stencil: None,
41            multisample: Default::default(),
42            multiview: None,
43            cache: None,
44        });
45        Self { pipeline }
46    }
47    fn render(&mut self, view: &wgpu::TextureView, device: &wgpu::Device, queue: &wgpu::Queue) {
48        let mut encoder =
49            device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None });
50        {
51            let mut rpass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
52                label: None,
53                color_attachments: &[Some(wgpu::RenderPassColorAttachment {
54                    view,
55                    resolve_target: None,
56                    ops: wgpu::Operations {
57                        load: wgpu::LoadOp::Clear(wgpu::Color {
58                            r: 0.1,
59                            g: 0.2,
60                            b: 0.3,
61                            a: 1.0,
62                        }),
63                        store: wgpu::StoreOp::Store,
64                    },
65                    depth_slice: None,
66                })],
67                depth_stencil_attachment: None,
68                timestamp_writes: None,
69                occlusion_query_set: None,
70                multiview_mask: None,
71            });
72            rpass.push_debug_group("Prepare data for draw.");
73            rpass.set_pipeline(&self.pipeline);
74            rpass.pop_debug_group();
75            rpass.insert_debug_marker("Draw!");
76            rpass.draw_mesh_tasks(1, 1, 1);
77        }
78        queue.submit(Some(encoder.finish()));
79    }
80    fn required_downlevel_capabilities() -> wgpu::DownlevelCapabilities {
81        Default::default()
82    }
83    fn required_features() -> wgpu::Features {
84        wgpu::Features::EXPERIMENTAL_MESH_SHADER | wgpu::Features::PASSTHROUGH_SHADERS
85    }
86    fn required_limits() -> wgpu::Limits {
87        wgpu::Limits::defaults().using_recommended_minimum_mesh_shader_values()
88    }
89    fn resize(
90        &mut self,
91        _config: &wgpu::SurfaceConfiguration,
92        _device: &wgpu::Device,
93        _queue: &wgpu::Queue,
94    ) {
95        // empty
96    }
97    fn update(&mut self, _event: winit::event::WindowEvent) {
98        // empty
99    }
100}
101
102pub fn main() {
103    crate::framework::run::<Example>("mesh_shader");
104}
105
106#[cfg(test)]
107#[wgpu_test::gpu_test]
108pub static TEST: crate::framework::ExampleTestParams = crate::framework::ExampleTestParams {
109    name: "mesh_shader",
110    image_path: "/examples/features/src/mesh_shader/screenshot.png",
111    width: 1024,
112    height: 768,
113    optional_features: wgpu::Features::default(),
114    base_test_parameters: wgpu_test::TestParameters::default()
115        .features(wgpu::Features::EXPERIMENTAL_MESH_SHADER | wgpu::Features::PASSTHROUGH_SHADERS)
116        .instance_flags(wgpu::InstanceFlags::advanced_debugging())
117        .limits(wgpu::Limits::defaults().using_recommended_minimum_mesh_shader_values())
118        .skip(wgpu_test::FailureCase {
119            backends: None,
120            // Skip Mesa because LLVMPIPE has what is believed to be a driver bug
121            vendor: Some(0x10005),
122            adapter: None,
123            driver: None,
124            reasons: vec![],
125            behavior: wgpu_test::FailureBehavior::Ignore,
126        }),
127    comparisons: &[wgpu_test::ComparisonType::Mean(0.005)],
128    _phantom: std::marker::PhantomData::<Example>,
129};