Merge pull request #2913 from greg-lunarg/i2905
[platform/upstream/glslang.git] / Test / glsl.450.subgroup.tese
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(isolines) in;\r
105 layout(set = 0, binding = 0, std430) buffer Output\r
106 {\r
107   uvec4 result[];\r
108 };\r
109 \r
110 void main (void)\r
111 {\r
112   result[gl_PrimitiveID] = uvec4(gl_SubgroupSize, gl_SubgroupInvocationID, 0, 0);\r
113   subgroupBarrier();\r
114   subgroupMemoryBarrier();\r
115   subgroupMemoryBarrierBuffer();\r
116   subgroupMemoryBarrierImage();\r
117   subgroupElect();\r
118 }\r
119 \r
120 #extension GL_KHR_shader_subgroup_ballot: enable\r
121 void ballot_works(vec4 f4) {\r
122   gl_SubgroupEqMask;\r
123   gl_SubgroupGeMask;\r
124   gl_SubgroupGtMask;\r
125   gl_SubgroupLeMask;\r
126   gl_SubgroupLtMask;\r
127   subgroupBroadcast(f4, 0);\r
128   subgroupBroadcastFirst(f4);\r
129   uvec4 ballot = subgroupBallot(false);\r
130   subgroupInverseBallot(uvec4(0x1));\r
131   subgroupBallotBitExtract(ballot, 0);\r
132   subgroupBallotBitCount(ballot);\r
133   subgroupBallotInclusiveBitCount(ballot);\r
134   subgroupBallotExclusiveBitCount(ballot);\r
135   subgroupBallotFindLSB(ballot);\r
136   subgroupBallotFindMSB(ballot);\r
137 }\r
138 \r
139 #extension GL_KHR_shader_subgroup_vote: enable\r
140 void vote_works(vec4 f4)\r
141 {\r
142   subgroupAll(true);\r
143   subgroupAny(false);\r
144   subgroupAllEqual(f4);\r
145 }\r
146 \r
147 #extension GL_KHR_shader_subgroup_shuffle: enable\r
148 #extension GL_KHR_shader_subgroup_shuffle_relative: enable\r
149 void shuffle_works(vec4 f4)\r
150 {\r
151   subgroupShuffle(f4, 0);\r
152   subgroupShuffleXor(f4, 0x1);\r
153   subgroupShuffleUp(f4, 1);\r
154   subgroupShuffleDown(f4, 1);\r
155 }\r
156 \r
157 #extension GL_KHR_shader_subgroup_arithmetic: enable\r
158 void arith_works(vec4 f4)\r
159 {\r
160   uvec4 ballot;\r
161   subgroupAdd(f4);\r
162   subgroupMul(f4);\r
163   subgroupMin(f4);\r
164   subgroupMax(f4);\r
165   subgroupAnd(ballot);\r
166   subgroupOr(ballot);\r
167   subgroupXor(ballot);\r
168   subgroupInclusiveAdd(f4);\r
169   subgroupInclusiveMul(f4);\r
170   subgroupInclusiveMin(f4);\r
171   subgroupInclusiveMax(f4);\r
172   subgroupInclusiveAnd(ballot);\r
173   subgroupInclusiveOr(ballot);\r
174   subgroupInclusiveXor(ballot);\r
175   subgroupExclusiveAdd(f4);\r
176   subgroupExclusiveMul(f4);\r
177   subgroupExclusiveMin(f4);\r
178   subgroupExclusiveMax(f4);\r
179   subgroupExclusiveAnd(ballot);\r
180   subgroupExclusiveOr(ballot);\r
181   subgroupExclusiveXor(ballot);\r
182 }\r
183 \r
184 #extension GL_KHR_shader_subgroup_clustered: enable\r
185 void clustered_works(vec4 f4)\r
186 {\r
187   uvec4 ballot = uvec4(0x55,0,0,0);\r
188   subgroupClusteredAdd(f4, 2);\r
189   subgroupClusteredMul(f4, 2);\r
190   subgroupClusteredMin(f4, 2);\r
191   subgroupClusteredMax(f4, 2);\r
192   subgroupClusteredAnd(ballot, 2);\r
193   subgroupClusteredOr(ballot, 2);\r
194   subgroupClusteredXor(ballot, 2);\r
195 }\r
196 \r
197 #extension GL_KHR_shader_subgroup_quad: enable\r
198 void quad_works(vec4 f4)\r
199 {\r
200   subgroupQuadBroadcast(f4, 0);\r
201   subgroupQuadSwapHorizontal(f4);\r
202   subgroupQuadSwapVertical(f4);\r
203   subgroupQuadSwapDiagonal(f4);\r
204 }\r
205 \r
206 #extension GL_NV_shader_subgroup_partitioned: enable\r
207 void partitioned_works(vec4 f4)\r
208 {\r
209   uvec4 parti = subgroupPartitionNV(f4);\r
210   uvec4 ballot = uvec4(0x55,0,0,0);\r
211   subgroupPartitionedAddNV(f4, parti);\r
212   subgroupPartitionedMulNV(f4, parti);\r
213   subgroupPartitionedMinNV(f4, parti);\r
214   subgroupPartitionedMaxNV(f4, parti);\r
215   subgroupPartitionedAndNV(ballot, parti);\r
216   subgroupPartitionedOrNV(ballot, parti);\r
217   subgroupPartitionedXorNV(ballot, parti);\r
218   subgroupPartitionedInclusiveAddNV(f4, parti);\r
219   subgroupPartitionedInclusiveMulNV(f4, parti);\r
220   subgroupPartitionedInclusiveMinNV(f4, parti);\r
221   subgroupPartitionedInclusiveMaxNV(f4, parti);\r
222   subgroupPartitionedInclusiveAndNV(ballot, parti);\r
223   subgroupPartitionedInclusiveOrNV(ballot, parti);\r
224   subgroupPartitionedInclusiveXorNV(ballot, parti);\r
225   subgroupPartitionedExclusiveAddNV(f4, parti);\r
226   subgroupPartitionedExclusiveMulNV(f4, parti);\r
227   subgroupPartitionedExclusiveMinNV(f4, parti);\r
228   subgroupPartitionedExclusiveMaxNV(f4, parti);\r
229   subgroupPartitionedExclusiveAndNV(ballot, parti);\r
230   subgroupPartitionedExclusiveOrNV(ballot, parti);\r
231   subgroupPartitionedExclusiveXorNV(ballot, parti);\r
232 }\r
233 \r
234 // tests for NV_shader_sm_builtins\r
235 void sm_builtins_err()\r
236 {\r
237     gl_WarpsPerSMNV;    // ERROR, no extension\r
238     gl_SMCountNV;       // ERROR, no extension\r
239     gl_WarpIDNV;        // ERROR, no extension\r
240     gl_SMIDNV;          // ERROR, no extension\r
241 }\r
242 \r
243 #ifdef GL_NV_shader_sm_builtins\r
244 #extension GL_NV_shader_sm_builtins : enable\r
245 #endif\r
246 \r
247 void sm_builtins()\r
248 {\r
249     gl_WarpsPerSMNV;\r
250     gl_SMCountNV;\r
251     gl_WarpIDNV;\r
252     gl_SMIDNV;\r
253 }\r