Merge pull request #3031 from rg3igalia/sub-group-size-arb-flat-fix
[platform/upstream/glslang.git] / Test / spv.460.subgroupEXT.task
1 #version 460
2
3
4 #define BARRIER() \
5     memoryBarrierShared(); \
6     barrier();
7
8 #extension GL_EXT_mesh_shader : enable
9
10 layout(local_size_x = 32, local_size_y=1, local_size_z=1) in;
11
12 // test use of shared memory in task shaders:
13 layout(binding=0) writeonly uniform image2D uni_image;
14 uniform block0 {
15     uint uni_value;
16 };
17 shared vec4 mem[10];
18
19 // test use of task memory in task shaders:
20 struct Task {
21     vec2 dummy;
22     vec2 submesh[3];
23 };
24
25 taskPayloadSharedEXT Task mytask;
26 void 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
54 void 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
69 void 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
88 void 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
97 void 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
106 void 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
133 void 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
146 void quad_works(vec4 f4)
147 {
148   subgroupQuadBroadcast(f4, 0);
149   subgroupQuadSwapHorizontal(f4);
150   subgroupQuadSwapVertical(f4);
151   subgroupQuadSwapDiagonal(f4);
152 }
153