Skip to content

Commit 79f93a3

Browse files
committed
Updated the example & tests
1 parent 5a2bb01 commit 79f93a3

2 files changed

Lines changed: 169 additions & 0 deletions

File tree

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
enable wgpu_mesh_shader;
2+
3+
const positions = array(
4+
vec4(0., 1., 0., 1.),
5+
vec4(-1., -1., 0., 1.),
6+
vec4(1., -1., 0., 1.)
7+
);
8+
const colors = array(
9+
vec4(0., 1., 0., 1.),
10+
vec4(0., 0., 1., 1.),
11+
vec4(1., 0., 0., 1.)
12+
);
13+
struct TaskPayload {
14+
colorMask: vec4<f32>,
15+
visible: bool,
16+
}
17+
var<task_payload> taskPayload: TaskPayload;
18+
var<workgroup> workgroupData: f32;
19+
struct VertexOutput {
20+
@builtin(position) position: vec4<f32>,
21+
@location(0) color: vec4<f32>,
22+
}
23+
struct PrimitiveOutput {
24+
@builtin(triangle_indices) index: vec3<u32>,
25+
@builtin(cull_primitive) cull: bool,
26+
@per_primitive @location(1) colorMask: vec4<f32>,
27+
}
28+
struct PrimitiveInput {
29+
@per_primitive @location(1) colorMask: vec4<f32>,
30+
}
31+
32+
@task
33+
@payload(taskPayload)
34+
@workgroup_size(1)
35+
fn ts_main() -> @builtin(mesh_task_size) vec3<u32> {
36+
workgroupData = 1.0;
37+
taskPayload.colorMask = vec4(1.0, 1.0, 0.0, 1.0);
38+
taskPayload.visible = true;
39+
return vec3(3, 1, 1);
40+
}
41+
42+
struct MeshOutput {
43+
@builtin(vertices) vertices: array<VertexOutput, 3>,
44+
@builtin(primitives) primitives: array<PrimitiveOutput, 1>,
45+
@builtin(vertex_count) vertex_count: u32,
46+
@builtin(primitive_count) primitive_count: u32,
47+
}
48+
49+
var<workgroup> mesh_output: MeshOutput;
50+
@mesh(mesh_output)
51+
@payload(taskPayload)
52+
@workgroup_size(1)
53+
fn ms_main(@builtin(local_invocation_index) index: u32, @builtin(global_invocation_id) id: vec3<u32>) {
54+
mesh_output.vertex_count = 3;
55+
mesh_output.primitive_count = 1;
56+
workgroupData = 2.0;
57+
58+
mesh_output.vertices[0].position = positions[0];
59+
mesh_output.vertices[0].color = colors[0] * taskPayload.colorMask;
60+
61+
mesh_output.vertices[1].position = positions[1];
62+
mesh_output.vertices[1].color = colors[1] * taskPayload.colorMask;
63+
64+
mesh_output.vertices[2].position = positions[2];
65+
mesh_output.vertices[2].color = colors[2] * taskPayload.colorMask;
66+
67+
mesh_output.primitives[0].index = vec3<u32>(0, 1, 2);
68+
mesh_output.primitives[0].cull = !taskPayload.visible;
69+
mesh_output.primitives[0].colorMask = vec4<f32>(1.0, 0.0, 1.0, 1.0);
70+
}
71+
@fragment
72+
fn fs_main(vertex: VertexOutput, primitive: PrimitiveInput) -> @location(0) vec4<f32> {
73+
return vertex.color * primitive.colorMask;
74+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
enable wgpu_mesh_shader;
2+
3+
const positions = array(
4+
vec4(0., 1., 0., 1.),
5+
vec4(-1., -1., 0., 1.),
6+
vec4(1., -1., 0., 1.)
7+
);
8+
const colors = array(
9+
vec4(0., 1., 0., 1.),
10+
vec4(0., 0., 1., 1.),
11+
vec4(1., 0., 0., 1.)
12+
);
13+
struct TaskPayload {
14+
colorMask: vec4<f32>,
15+
visible: bool,
16+
}
17+
var<task_payload> taskPayload: TaskPayload;
18+
var<workgroup> workgroupData: f32;
19+
struct VertexOutput {
20+
@builtin(position) position: vec4<f32>,
21+
@location(0) color: vec4<f32>,
22+
}
23+
struct PrimitiveOutput {
24+
@builtin(triangle_indices) index: vec3<u32>,
25+
@builtin(cull_primitive) cull: bool,
26+
@per_primitive @location(1) colorMask: vec4<f32>,
27+
}
28+
struct PrimitiveInput {
29+
@per_primitive @location(1) colorMask: vec4<f32>,
30+
}
31+
32+
@task
33+
@payload(taskPayload)
34+
@workgroup_size(1)
35+
fn ts_main() -> @builtin(mesh_task_size) vec3<u32> {
36+
workgroupData = 1.0;
37+
taskPayload.colorMask = vec4(1.0, 1.0, 0.0, 1.0);
38+
taskPayload.visible = true;
39+
return vec3(3, 1, 1);
40+
}
41+
42+
struct MeshOutput {
43+
@builtin(vertices) vertices: array<VertexOutput, 3>,
44+
@builtin(primitives) primitives: array<PrimitiveOutput, 1>,
45+
@builtin(vertex_count) vertex_count: u32,
46+
@builtin(primitive_count) primitive_count: u32,
47+
}
48+
49+
var<workgroup> mesh_output: MeshOutput;
50+
@mesh(mesh_output)
51+
@payload(taskPayload)
52+
@workgroup_size(1)
53+
fn ms_main(@builtin(local_invocation_index) index: u32, @builtin(global_invocation_id) id: vec3<u32>) {
54+
mesh_output.vertex_count = 3;
55+
mesh_output.primitive_count = 1;
56+
workgroupData = 2.0;
57+
58+
mesh_output.vertices[0].position = positions[0];
59+
mesh_output.vertices[0].color = colors[0] * taskPayload.colorMask;
60+
61+
mesh_output.vertices[1].position = positions[1];
62+
mesh_output.vertices[1].color = colors[1] * taskPayload.colorMask;
63+
64+
mesh_output.vertices[2].position = positions[2];
65+
mesh_output.vertices[2].color = colors[2] * taskPayload.colorMask;
66+
67+
mesh_output.primitives[0].index = vec3<u32>(0, 1, 2);
68+
mesh_output.primitives[0].cull = !taskPayload.visible;
69+
mesh_output.primitives[0].colorMask = vec4<f32>(1.0, 0.0, 1.0, 1.0);
70+
}
71+
// Don't use task payload if no task shader is present
72+
@mesh(mesh_output)
73+
@workgroup_size(1)
74+
fn ms_no_ts(@builtin(local_invocation_index) index: u32, @builtin(global_invocation_id) id: vec3<u32>) {
75+
mesh_output.vertex_count = 3;
76+
mesh_output.primitive_count = 1;
77+
workgroupData = 2.0;
78+
79+
mesh_output.vertices[0].position = positions[0];
80+
mesh_output.vertices[0].color = colors[0];
81+
82+
mesh_output.vertices[1].position = positions[1];
83+
mesh_output.vertices[1].color = colors[1];
84+
85+
mesh_output.vertices[2].position = positions[2];
86+
mesh_output.vertices[2].color = colors[2];
87+
88+
mesh_output.primitives[0].index = vec3<u32>(0, 1, 2);
89+
mesh_output.primitives[0].cull = false;
90+
mesh_output.primitives[0].colorMask = vec4<f32>(1.0, 0.0, 1.0, 1.0);
91+
}
92+
@fragment
93+
fn fs_main(vertex: VertexOutput, primitive: PrimitiveInput) -> @location(0) vec4<f32> {
94+
return vertex.color * primitive.colorMask;
95+
}

0 commit comments

Comments
 (0)