xref: /aosp_15_r20/external/angle/third_party/glslang/src/Test/spv.460.subgroupEXT.task (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1#version 460
2
3
4#define BARRIER() \
5    memoryBarrierShared(); \
6    barrier();
7
8#extension GL_EXT_mesh_shader : enable
9
10layout(local_size_x = 32, local_size_y=1, local_size_z=1) in;
11
12// test use of shared memory in task shaders:
13layout(binding=0) writeonly uniform image2D uni_image;
14uniform block0 {
15    uint uni_value;
16};
17shared vec4 mem[10];
18
19// test use of task memory in task shaders:
20struct Task {
21    vec2 dummy;
22    vec2 submesh[3];
23};
24
25taskPayloadSharedEXT Task mytask;
26void main()
27{
28    uint iid = gl_LocalInvocationID.x;
29    uint gid = gl_WorkGroupID.x;
30
31    // 1. shared memory load and stores
32    for (uint i = 0; i < 10; ++i) {
33        mem[i] = vec4(i + uni_value);
34    }
35    imageStore(uni_image, ivec2(iid), mem[gid]);
36    imageStore(uni_image, ivec2(iid), mem[gid+1]);
37
38    BARRIER();
39
40    // 2. task memory stores
41
42    mytask.dummy      = vec2(30.0, 31.0);
43    mytask.submesh[0] = vec2(32.0, 33.0);
44    mytask.submesh[1] = vec2(34.0, 35.0);
45    mytask.submesh[2] = mytask.submesh[gid%2];
46
47    BARRIER();
48
49    // 3. emit task count under uniform control flow
50    EmitMeshTasksEXT(3U, 1U, 1U);
51}
52
53#extension GL_KHR_shader_subgroup_basic: enable
54void basic_works (void)
55{
56  gl_SubgroupSize;
57  gl_SubgroupInvocationID;
58  subgroupBarrier();
59  subgroupMemoryBarrier();
60  subgroupMemoryBarrierBuffer();
61  subgroupMemoryBarrierImage();
62  subgroupElect();
63  gl_NumSubgroups;                  // allowed in task
64  gl_SubgroupID;                    // allowed in task
65  subgroupMemoryBarrierShared();    // allowed in task
66}
67
68#extension GL_KHR_shader_subgroup_ballot: enable
69void ballot_works(vec4 f4) {
70  gl_SubgroupEqMask;
71  gl_SubgroupGeMask;
72  gl_SubgroupGtMask;
73  gl_SubgroupLeMask;
74  gl_SubgroupLtMask;
75  subgroupBroadcast(f4, 0);
76  subgroupBroadcastFirst(f4);
77  uvec4 ballot = subgroupBallot(false);
78  subgroupInverseBallot(uvec4(0x1));
79  subgroupBallotBitExtract(ballot, 0);
80  subgroupBallotBitCount(ballot);
81  subgroupBallotInclusiveBitCount(ballot);
82  subgroupBallotExclusiveBitCount(ballot);
83  subgroupBallotFindLSB(ballot);
84  subgroupBallotFindMSB(ballot);
85}
86
87#extension GL_KHR_shader_subgroup_vote: enable
88void vote_works(vec4 f4)
89{
90  subgroupAll(true);
91  subgroupAny(false);
92  subgroupAllEqual(f4);
93}
94
95#extension GL_KHR_shader_subgroup_shuffle: enable
96#extension GL_KHR_shader_subgroup_shuffle_relative: enable
97void shuffle_works(vec4 f4)
98{
99  subgroupShuffle(f4, 0);
100  subgroupShuffleXor(f4, 0x1);
101  subgroupShuffleUp(f4, 1);
102  subgroupShuffleDown(f4, 1);
103}
104
105#extension GL_KHR_shader_subgroup_arithmetic: enable
106void arith_works(vec4 f4)
107{
108  uvec4 ballot;
109  subgroupAdd(f4);
110  subgroupMul(f4);
111  subgroupMin(f4);
112  subgroupMax(f4);
113  subgroupAnd(ballot);
114  subgroupOr(ballot);
115  subgroupXor(ballot);
116  subgroupInclusiveAdd(f4);
117  subgroupInclusiveMul(f4);
118  subgroupInclusiveMin(f4);
119  subgroupInclusiveMax(f4);
120  subgroupInclusiveAnd(ballot);
121  subgroupInclusiveOr(ballot);
122  subgroupInclusiveXor(ballot);
123  subgroupExclusiveAdd(f4);
124  subgroupExclusiveMul(f4);
125  subgroupExclusiveMin(f4);
126  subgroupExclusiveMax(f4);
127  subgroupExclusiveAnd(ballot);
128  subgroupExclusiveOr(ballot);
129  subgroupExclusiveXor(ballot);
130}
131
132#extension GL_KHR_shader_subgroup_clustered: enable
133void clustered_works(vec4 f4)
134{
135  uvec4 ballot = uvec4(0x55,0,0,0);
136  subgroupClusteredAdd(f4, 2);
137  subgroupClusteredMul(f4, 2);
138  subgroupClusteredMin(f4, 2);
139  subgroupClusteredMax(f4, 2);
140  subgroupClusteredAnd(ballot, 2);
141  subgroupClusteredOr(ballot, 2);
142  subgroupClusteredXor(ballot, 2);
143}
144
145#extension GL_KHR_shader_subgroup_quad: enable
146void quad_works(vec4 f4)
147{
148  subgroupQuadBroadcast(f4, 0);
149  subgroupQuadSwapHorizontal(f4);
150  subgroupQuadSwapVertical(f4);
151  subgroupQuadSwapDiagonal(f4);
152}
153
154