Merge pull request #2892 from greg-lunarg/mb
[platform/upstream/glslang.git] / Test / glsl.450.subgroup.vert
1 #version 450\r
2 \r
3 vec4 undeclared_errors(vec4 f4)\r
4 {\r
5   vec4 result;\r
6   gl_SubgroupSize;               // ERROR, extension not enabled (basic)\r
7   gl_SubgroupInvocationID;       // ERROR, extension not enabled (basic)\r
8   subgroupBarrier();             // ERROR, extension not enabled (basic)\r
9   subgroupMemoryBarrier();       // ERROR, extension not enabled (basic)\r
10   subgroupMemoryBarrierBuffer(); // ERROR, extension not enabled (basic)\r
11   subgroupMemoryBarrierImage();  // ERROR, extension not enabled (basic)\r
12   subgroupElect();               // ERROR, extension not enabled (basic)\r
13   gl_NumSubgroups;               // ERROR, only defined in compute\r
14   gl_SubgroupID;                 // ERROR, only defined in compute\r
15   subgroupMemoryBarrierShared(); // ERROR, only defined in compute\r
16 \r
17   subgroupAll(true);        // ERROR extension not enabled (vote)\r
18   subgroupAny(false);       // ERROR extension not enabled (vote)\r
19   subgroupAllEqual(f4);     // ERROR extension not enabled (vote)\r
20 \r
21   gl_SubgroupEqMask;                        // ERROR extension not enabled (ballot)\r
22   gl_SubgroupGeMask;                        // ERROR extension not enabled (ballot)\r
23   gl_SubgroupGtMask;                        // ERROR extension not enabled (ballot)\r
24   gl_SubgroupLeMask;                        // ERROR extension not enabled (ballot)\r
25   gl_SubgroupLtMask;                        // ERROR extension not enabled (ballot)\r
26   subgroupBroadcast(f4, 0);                 // ERROR extension not enabled (ballot)\r
27   subgroupBroadcastFirst(f4);               // ERROR extension not enabled (ballot)\r
28   uvec4 ballot = subgroupBallot(false);     // ERROR extension not enabled (ballot)\r
29   subgroupInverseBallot(uvec4(0x1));        // ERROR extension not enabled (ballot)\r
30   subgroupBallotBitExtract(ballot, 0);      // ERROR extension not enabled (ballot)\r
31   subgroupBallotBitCount(ballot);           // ERROR extension not enabled (ballot)\r
32   subgroupBallotInclusiveBitCount(ballot);  // ERROR extension not enabled (ballot)\r
33   subgroupBallotExclusiveBitCount(ballot);  // ERROR extension not enabled (ballot)\r
34   subgroupBallotFindLSB(ballot);            // ERROR extension not enabled (ballot)\r
35   subgroupBallotFindMSB(ballot);            // ERROR extension not enabled (ballot)\r
36 \r
37   subgroupShuffle(f4, 0);           // ERROR extension not enabled (shuffle)\r
38   subgroupShuffleXor(f4, 0x1);      // ERROR extension not enabled (shuffle)\r
39   subgroupShuffleUp(f4, 1);         // ERROR extension not enabled (shuffle_relative)\r
40   subgroupShuffleDown(f4, 1);       // ERROR extension not enabled (shuffle_relative)\r
41 \r
42   result = subgroupAdd(f4);         // ERROR, extension not enabled (arith)\r
43   subgroupMul(f4);                  // ERROR, extension not enabled (arith)\r
44   subgroupMin(f4);                  // ERROR, extension not enabled (arith)\r
45   subgroupMax(f4);                  // ERROR, extension not enabled (arith)\r
46   subgroupAnd(ballot);              // ERROR, extension not enabled (arith)\r
47   subgroupOr(ballot);               // ERROR, extension not enabled (arith)\r
48   subgroupXor(ballot);              // ERROR, extension not enabled (arith)\r
49   subgroupInclusiveAdd(f4);         // ERROR, extension not enabled (arith)\r
50   subgroupInclusiveMul(f4);         // ERROR, extension not enabled (arith)\r
51   subgroupInclusiveMin(f4);         // ERROR, extension not enabled (arith)\r
52   subgroupInclusiveMax(f4);         // ERROR, extension not enabled (arith)\r
53   subgroupInclusiveAnd(ballot);     // ERROR, extension not enabled (arith)\r
54   subgroupInclusiveOr(ballot);      // ERROR, extension not enabled (arith)\r
55   subgroupInclusiveXor(ballot);     // ERROR, extension not enabled (arith)\r
56   subgroupExclusiveAdd(f4);         // ERROR, extension not enabled (arith)\r
57   subgroupExclusiveMul(f4);         // ERROR, extension not enabled (arith)\r
58   subgroupExclusiveMin(f4);         // ERROR, extension not enabled (arith)\r
59   subgroupExclusiveMax(f4);         // ERROR, extension not enabled (arith)\r
60   subgroupExclusiveAnd(ballot);     // ERROR, extension not enabled (arith)\r
61   subgroupExclusiveOr(ballot);      // ERROR, extension not enabled (arith)\r
62   subgroupExclusiveXor(ballot);     // ERROR, extension not enabled (arith)\r
63 \r
64   subgroupClusteredAdd(f4, 2);      // ERROR, extension not enabled (clustered)\r
65   subgroupClusteredMul(f4, 2);      // ERROR, extension not enabled (clustered)\r
66   subgroupClusteredMin(f4, 2);      // ERROR, extension not enabled (clustered)\r
67   subgroupClusteredMax(f4, 2);      // ERROR, extension not enabled (clustered)\r
68   subgroupClusteredAnd(ballot, 2);  // ERROR, extension not enabled (clustered)\r
69   subgroupClusteredOr(ballot, 2);   // ERROR, extension not enabled (clustered)\r
70   subgroupClusteredXor(ballot, 2);  // ERROR, extension not enabled (clustered)\r
71 \r
72   subgroupQuadBroadcast(f4, 0);     // ERROR, extension not enabled (quad)\r
73   subgroupQuadSwapHorizontal(f4);   // ERROR, extension not enabled (quad)\r
74   subgroupQuadSwapVertical(f4);     // ERROR, extension not enabled (quad)\r
75   subgroupQuadSwapDiagonal(f4);     // ERROR, extension not enabled (quad)\r
76 \r
77   uvec4 parti = subgroupPartitionNV(f4);                // ERROR, extension not enabled (partitioned)\r
78   subgroupPartitionedAddNV(f4, parti);                  // ERROR, extension not enabled (partitioned)\r
79   subgroupPartitionedMulNV(f4, parti);                  // ERROR, extension not enabled (partitioned)\r
80   subgroupPartitionedMinNV(f4, parti);                  // ERROR, extension not enabled (partitioned)\r
81   subgroupPartitionedMaxNV(f4, parti);                  // ERROR, extension not enabled (partitioned)\r
82   subgroupPartitionedAndNV(ballot, parti);              // ERROR, extension not enabled (partitioned)\r
83   subgroupPartitionedOrNV(ballot, parti);               // ERROR, extension not enabled (partitioned)\r
84   subgroupPartitionedXorNV(ballot, parti);              // ERROR, extension not enabled (partitioned)\r
85   subgroupPartitionedInclusiveAddNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
86   subgroupPartitionedInclusiveMulNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
87   subgroupPartitionedInclusiveMinNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
88   subgroupPartitionedInclusiveMaxNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
89   subgroupPartitionedInclusiveAndNV(ballot, parti);     // ERROR, extension not enabled (partitioned)\r
90   subgroupPartitionedInclusiveOrNV(ballot, parti);      // ERROR, extension not enabled (partitioned)\r
91   subgroupPartitionedInclusiveXorNV(ballot, parti);     // ERROR, extension not enabled (partitioned)\r
92   subgroupPartitionedExclusiveAddNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
93   subgroupPartitionedExclusiveMulNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
94   subgroupPartitionedExclusiveMinNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
95   subgroupPartitionedExclusiveMaxNV(f4, parti);         // ERROR, extension not enabled (partitioned)\r
96   subgroupPartitionedExclusiveAndNV(ballot, parti);     // ERROR, extension not enabled (partitioned)\r
97   subgroupPartitionedExclusiveOrNV(ballot, parti);      // ERROR, extension not enabled (partitioned)\r
98   subgroupPartitionedExclusiveXorNV(ballot, parti);     // ERROR, extension not enabled (partitioned)\r
99 \r
100   return result;\r
101 }\r
102 \r
103 #extension GL_KHR_shader_subgroup_basic: enable\r
104 layout(set = 0, binding = 0, std430) buffer Output\r
105 {\r
106   uvec4 result[];\r
107 };\r
108 \r
109 void main (void)\r
110 {\r
111   result[gl_VertexID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\r
112   subgroupBarrier();\r
113   subgroupMemoryBarrier();\r
114   subgroupMemoryBarrierBuffer();\r
115   subgroupMemoryBarrierImage();\r
116   subgroupElect();\r
117 }\r
118 \r
119 #extension GL_KHR_shader_subgroup_ballot: enable\r
120 void ballot_works(vec4 f4) {\r
121   gl_SubgroupEqMask;\r
122   gl_SubgroupGeMask;\r
123   gl_SubgroupGtMask;\r
124   gl_SubgroupLeMask;\r
125   gl_SubgroupLtMask;\r
126   subgroupBroadcast(f4, 0);\r
127   subgroupBroadcastFirst(f4);\r
128   uvec4 ballot = subgroupBallot(false);\r
129   subgroupInverseBallot(uvec4(0x1));\r
130   subgroupBallotBitExtract(ballot, 0);\r
131   subgroupBallotBitCount(ballot);\r
132   subgroupBallotInclusiveBitCount(ballot);\r
133   subgroupBallotExclusiveBitCount(ballot);\r
134   subgroupBallotFindLSB(ballot);\r
135   subgroupBallotFindMSB(ballot);\r
136 }\r
137 \r
138 #extension GL_KHR_shader_subgroup_vote: enable\r
139 void vote_works(vec4 f4)\r
140 {\r
141   subgroupAll(true);\r
142   subgroupAny(false);\r
143   subgroupAllEqual(f4);\r
144 }\r
145 \r
146 #extension GL_KHR_shader_subgroup_shuffle: enable\r
147 #extension GL_KHR_shader_subgroup_shuffle_relative: enable\r
148 void shuffle_works(vec4 f4)\r
149 {\r
150   subgroupShuffle(f4, 0);\r
151   subgroupShuffleXor(f4, 0x1);\r
152   subgroupShuffleUp(f4, 1);\r
153   subgroupShuffleDown(f4, 1);\r
154 }\r
155 \r
156 #extension GL_KHR_shader_subgroup_arithmetic: enable\r
157 void arith_works(vec4 f4)\r
158 {\r
159   uvec4 ballot;\r
160   subgroupAdd(f4);\r
161   subgroupMul(f4);\r
162   subgroupMin(f4);\r
163   subgroupMax(f4);\r
164   subgroupAnd(ballot);\r
165   subgroupOr(ballot);\r
166   subgroupXor(ballot);\r
167   subgroupInclusiveAdd(f4);\r
168   subgroupInclusiveMul(f4);\r
169   subgroupInclusiveMin(f4);\r
170   subgroupInclusiveMax(f4);\r
171   subgroupInclusiveAnd(ballot);\r
172   subgroupInclusiveOr(ballot);\r
173   subgroupInclusiveXor(ballot);\r
174   subgroupExclusiveAdd(f4);\r
175   subgroupExclusiveMul(f4);\r
176   subgroupExclusiveMin(f4);\r
177   subgroupExclusiveMax(f4);\r
178   subgroupExclusiveAnd(ballot);\r
179   subgroupExclusiveOr(ballot);\r
180   subgroupExclusiveXor(ballot);\r
181 }\r
182 \r
183 #extension GL_KHR_shader_subgroup_clustered: enable\r
184 void clustered_works(vec4 f4)\r
185 {\r
186   uvec4 ballot = uvec4(0x55,0,0,0);\r
187   subgroupClusteredAdd(f4, 2);\r
188   subgroupClusteredMul(f4, 2);\r
189   subgroupClusteredMin(f4, 2);\r
190   subgroupClusteredMax(f4, 2);\r
191   subgroupClusteredAnd(ballot, 2);\r
192   subgroupClusteredOr(ballot, 2);\r
193   subgroupClusteredXor(ballot, 2);\r
194 }\r
195 \r
196 #extension GL_KHR_shader_subgroup_quad: enable\r
197 void quad_works(vec4 f4)\r
198 {\r
199   subgroupQuadBroadcast(f4, 0);\r
200   subgroupQuadSwapHorizontal(f4);\r
201   subgroupQuadSwapVertical(f4);\r
202   subgroupQuadSwapDiagonal(f4);\r
203 }\r
204 \r
205 #extension GL_NV_shader_subgroup_partitioned: enable\r
206 void partitioned_works(vec4 f4)\r
207 {\r
208   uvec4 parti = subgroupPartitionNV(f4);\r
209   uvec4 ballot = uvec4(0x55,0,0,0);\r
210   subgroupPartitionedAddNV(f4, parti);\r
211   subgroupPartitionedMulNV(f4, parti);\r
212   subgroupPartitionedMinNV(f4, parti);\r
213   subgroupPartitionedMaxNV(f4, parti);\r
214   subgroupPartitionedAndNV(ballot, parti);\r
215   subgroupPartitionedOrNV(ballot, parti);\r
216   subgroupPartitionedXorNV(ballot, parti);\r
217   subgroupPartitionedInclusiveAddNV(f4, parti);\r
218   subgroupPartitionedInclusiveMulNV(f4, parti);\r
219   subgroupPartitionedInclusiveMinNV(f4, parti);\r
220   subgroupPartitionedInclusiveMaxNV(f4, parti);\r
221   subgroupPartitionedInclusiveAndNV(ballot, parti);\r
222   subgroupPartitionedInclusiveOrNV(ballot, parti);\r
223   subgroupPartitionedInclusiveXorNV(ballot, parti);\r
224   subgroupPartitionedExclusiveAddNV(f4, parti);\r
225   subgroupPartitionedExclusiveMulNV(f4, parti);\r
226   subgroupPartitionedExclusiveMinNV(f4, parti);\r
227   subgroupPartitionedExclusiveMaxNV(f4, parti);\r
228   subgroupPartitionedExclusiveAndNV(ballot, parti);\r
229   subgroupPartitionedExclusiveOrNV(ballot, parti);\r
230   subgroupPartitionedExclusiveXorNV(ballot, parti);\r
231 }\r
232 \r
233 // tests for NV_shader_sm_builtins\r
234 void sm_builtins_err()\r
235 {\r
236     gl_WarpsPerSMNV;    // ERROR, no extension\r
237     gl_SMCountNV;       // ERROR, no extension\r
238     gl_WarpIDNV;        // ERROR, no extension\r
239     gl_SMIDNV;          // ERROR, no extension\r
240 }\r
241 \r
242 #ifdef GL_NV_shader_sm_builtins\r
243 #extension GL_NV_shader_sm_builtins : enable\r
244 #endif\r
245 \r
246 void sm_builtins()\r
247 {\r
248     gl_WarpsPerSMNV;\r
249     gl_SMCountNV;\r
250     gl_WarpIDNV;\r
251     gl_SMIDNV;\r
252 }\r
253 \r