wgpu_examples/mesh_shader/
mod.rs1pub 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 }
97 fn update(&mut self, _event: winit::event::WindowEvent) {
98 }
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 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};