| #!amber |
| |
| SHADER compute test GLSL TARGET_ENV spv1.3 |
| #version 450 core |
| #extension GL_KHR_shader_subgroup_basic : enable |
| #extension GL_KHR_shader_subgroup_ballot : enable |
| #extension GL_EXT_subgroup_uniform_control_flow : enable |
| layout(local_size_x = 119, local_size_y = 2, local_size_z = 1) in; |
| |
| layout(set=0, binding=0) coherent buffer A { uint a[]; } a; |
| layout(set=0, binding=1) coherent buffer B { uint b[]; } b; |
| layout(set=0, binding=2) coherent buffer C { uint c[]; } c; |
| layout(set=0, binding=3) volatile buffer D { uint d[]; } d; |
| |
| void main() |
| [[subgroup_uniform_control_flow]] |
| { |
| uint idx = gl_SubgroupID * gl_SubgroupSize + gl_SubgroupInvocationID; |
| for (uint i = 0; i < c.c[idx]; ++i) { |
| if (a.a[gl_SubgroupID] % 2 == 0) |
| return; |
| |
| atomicAdd(d.d[idx], 1); |
| if (i == gl_SubgroupID % 4) |
| break; |
| } |
| |
| b.b[idx] = subgroupElect() ? 1 : 0; |
| } |
| END |
| |
| SHADER compute fill GLSL TARGET_ENV spv1.3 |
| #version 450 core |
| #extension GL_KHR_shader_subgroup_basic : enable |
| #extension GL_KHR_shader_subgroup_ballot : enable |
| layout(local_size_x = 119, local_size_y = 2, local_size_z = 1) in; |
| |
| layout(set=0, binding=0) coherent buffer A { uint a[]; } a; |
| layout(set=0, binding=1) coherent buffer C { uint c[]; } c; |
| layout(set=0, binding=2) coherent buffer COMPARE { uint x[]; } compare; |
| |
| void main() |
| { |
| uint idx = gl_SubgroupID * gl_SubgroupSize + gl_SubgroupInvocationID; |
| uint a_val = subgroupElect() ? 1 : 0; |
| if (a.a[gl_SubgroupID] % 2 == 0) { |
| a_val = 4; |
| } |
| compare.x[idx] = a_val; |
| } |
| END |
| |
| BUFFER a DATA_TYPE uint32 SIZE 238 SERIES_FROM 0 INC_BY 1 |
| BUFFER b DATA_TYPE uint32 SIZE 238 FILL 4 |
| BUFFER c DATA_TYPE uint32 SIZE 238 FILL 4 |
| BUFFER d DATA_TYPE uint32 SIZE 238 FILL 0 |
| BUFFER compare DATA_TYPE uint32 SIZE 238 FILL 4 |
| |
| PIPELINE compute fill_pipe |
| ATTACH fill |
| BIND BUFFER a AS storage DESCRIPTOR_SET 0 BINDING 0 |
| BIND BUFFER c AS storage DESCRIPTOR_SET 0 BINDING 1 |
| BIND BUFFER compare AS storage DESCRIPTOR_SET 0 BINDING 2 |
| END |
| |
| PIPELINE compute test_pipe |
| ATTACH test |
| BIND BUFFER a AS storage DESCRIPTOR_SET 0 BINDING 0 |
| BIND BUFFER b AS storage DESCRIPTOR_SET 0 BINDING 1 |
| BIND BUFFER c AS storage DESCRIPTOR_SET 0 BINDING 2 |
| BIND BUFFER d AS storage DESCRIPTOR_SET 0 BINDING 3 |
| END |
| |
| RUN fill_pipe 1 1 1 |
| RUN test_pipe 1 1 1 |
| |
| EXPECT compare IDX 0 EQ 4 4 4 4 |
| EXPECT b EQ_BUFFER compare |
| |