1617a3babSopenharmony_ci#version 310 es
2617a3babSopenharmony_ci
3617a3babSopenharmony_cilayout(local_size_x = 2) in;
4617a3babSopenharmony_cilayout(local_size_x = 16) in;     // ERROR, changing
5617a3babSopenharmony_cilayout(local_size_z = 4096) in;   // ERROR, too large
6617a3babSopenharmony_cilayout(local_size_x = 2) in;
7617a3babSopenharmony_cilayout(local_size_y = 0) in;      // ERROR, 0 not allowed
8617a3babSopenharmony_ciconst int total = gl_MaxComputeWorkGroupCount.y 
9617a3babSopenharmony_ci                + gl_MaxComputeUniformComponents
10617a3babSopenharmony_ci                + gl_MaxComputeTextureImageUnits
11617a3babSopenharmony_ci                + gl_MaxComputeImageUniforms
12617a3babSopenharmony_ci                + gl_MaxComputeAtomicCounters
13617a3babSopenharmony_ci                + gl_MaxComputeAtomicCounterBuffers;
14617a3babSopenharmony_ci
15617a3babSopenharmony_cibuffer ShaderStorageBlock
16617a3babSopenharmony_ci{
17617a3babSopenharmony_ci    int value;
18617a3babSopenharmony_ci    float values[];
19617a3babSopenharmony_ci};
20617a3babSopenharmony_ci
21617a3babSopenharmony_cibuffer InvalidShaderStorageBlock
22617a3babSopenharmony_ci{
23617a3babSopenharmony_ci    float values[];  // ERROR
24617a3babSopenharmony_ci    int value;
25617a3babSopenharmony_ci} invalid;
26617a3babSopenharmony_ci
27617a3babSopenharmony_civoid main()
28617a3babSopenharmony_ci{
29617a3babSopenharmony_ci    barrier();
30617a3babSopenharmony_ci    memoryBarrier();
31617a3babSopenharmony_ci    memoryBarrierAtomicCounter();
32617a3babSopenharmony_ci    memoryBarrierBuffer();
33617a3babSopenharmony_ci    memoryBarrierShared();
34617a3babSopenharmony_ci    memoryBarrierImage();
35617a3babSopenharmony_ci    groupMemoryBarrier();
36617a3babSopenharmony_ci    value = int(values[gl_LocalInvocationIndex]);
37617a3babSopenharmony_ci}
38617a3babSopenharmony_ci
39617a3babSopenharmony_cilayout(location = 2) in vec3 v3;      // ERROR
40617a3babSopenharmony_ciin float f;                           // ERROR
41617a3babSopenharmony_ciout float fo;                         // ERROR
42617a3babSopenharmony_ci
43617a3babSopenharmony_cishared vec4 s;
44617a3babSopenharmony_cilayout(location = 2) shared vec4 sl;  // ERROR
45617a3babSopenharmony_cishared float fs = 4.2;                // ERROR
46617a3babSopenharmony_ci
47617a3babSopenharmony_cilayout(local_size_x = 2, local_size_y = 3, local_size_z = 4) out;  // ERROR
48617a3babSopenharmony_ci
49617a3babSopenharmony_ciint arrX[gl_WorkGroupSize.x];
50617a3babSopenharmony_ciint arrY[gl_WorkGroupSize.y];
51617a3babSopenharmony_ciint arrZ[gl_WorkGroupSize.z];
52617a3babSopenharmony_ci
53617a3babSopenharmony_cireadonly buffer roblock
54617a3babSopenharmony_ci{
55617a3babSopenharmony_ci    int value;
56617a3babSopenharmony_ci    float values[];
57617a3babSopenharmony_ci} ro;
58617a3babSopenharmony_ci
59617a3babSopenharmony_civoid foo()
60617a3babSopenharmony_ci{
61617a3babSopenharmony_ci    ro.values[2] = 4.7;        // ERROR, readonly
62617a3babSopenharmony_ci    ro.values.length();
63617a3babSopenharmony_ci    ++s;
64617a3babSopenharmony_ci}
65617a3babSopenharmony_ci
66617a3babSopenharmony_cibuffer vec4 v;  // ERROR
67617a3babSopenharmony_ci
68617a3babSopenharmony_ciuniform usampler2D us2dbad;  // ERROR, default precision
69617a3babSopenharmony_ci
70617a3babSopenharmony_ciprecision highp usampler2D;
71617a3babSopenharmony_ciprecision highp iimage2DArray;
72617a3babSopenharmony_ciprecision highp iimage2D;
73617a3babSopenharmony_ci
74617a3babSopenharmony_ciuniform usampler2D us2d;
75617a3babSopenharmony_ci
76617a3babSopenharmony_ciuniform iimage2DArray ii2dabad;  // ERROR, not writeonly
77617a3babSopenharmony_ciuniform writeonly iimage2DArray ii2da;
78617a3babSopenharmony_ci
79617a3babSopenharmony_cilayout(r32i) uniform iimage2D iimg2D;
80617a3babSopenharmony_cilayout(rgba32i) uniform readonly iimage2D iimg2Drgba;
81617a3babSopenharmony_cilayout(rgba32f) uniform readonly image2D img2Drgba;   // ERROR, no default
82617a3babSopenharmony_cilayout(r32ui) uniform uimage2D uimg2D;                // ERROR, no default
83617a3babSopenharmony_ci
84617a3babSopenharmony_civoid qux()
85617a3babSopenharmony_ci{
86617a3babSopenharmony_ci    int i = 4;
87617a3babSopenharmony_ci    imageAtomicCompSwap(iimg2D, ivec2(i,i), i, i);// ERROR no longer in 310
88617a3babSopenharmony_ci    imageAtomicAdd(uimg2D, ivec2(i,i), uint(i));  // ERROR no longer in 310
89617a3babSopenharmony_ci    imageAtomicMin(iimg2Drgba, ivec2(i,i), i);    // ERROR no longer in 310  // ERROR iimg2Drgba does not have r32i layout
90617a3babSopenharmony_ci    imageAtomicMax(img2Drgba, ivec2(i,i), i);     // ERROR no longer in 310  // ERROR img2Drgba is not integer image
91617a3babSopenharmony_ci    ivec4 pos = imageLoad(iimg2D, ivec2(i,i));
92617a3babSopenharmony_ci    imageStore(ii2da, ivec3(i,i,i), ivec4(0));
93617a3babSopenharmony_ci    imageLoad(img2Drgba, ivec2(i,i));
94617a3babSopenharmony_ci    imageLoad(ii2da, ivec3(i,i,i));       // ERROR, drops writeonly
95617a3babSopenharmony_ci}
96617a3babSopenharmony_ci
97617a3babSopenharmony_civolatile float vol; // ERROR, not an image
98617a3babSopenharmony_cireadonly int vol2;  // ERROR, not an image
99617a3babSopenharmony_ci
100617a3babSopenharmony_civoid passr(coherent readonly iimage2D image)
101617a3babSopenharmony_ci{
102617a3babSopenharmony_ci}
103617a3babSopenharmony_ci
104617a3babSopenharmony_cilayout(r32i) coherent readonly uniform iimage2D qualim1;
105617a3babSopenharmony_cilayout(r32i) coherent restrict readonly uniform iimage2D qualim2;
106617a3babSopenharmony_ci
107617a3babSopenharmony_civoid passrc()
108617a3babSopenharmony_ci{
109617a3babSopenharmony_ci    passr(qualim1);   // ERROR, changing formats
110617a3babSopenharmony_ci    passr(qualim2);   // ERROR, drops restrict, ERROR, changing formats
111617a3babSopenharmony_ci    passr(iimg2D);    // ERROR, changing formats
112617a3babSopenharmony_ci}
113617a3babSopenharmony_ci
114617a3babSopenharmony_cihighp layout(rg8i)     uniform readonly uimage2D i1bad; // ERROR, type mismatch
115617a3babSopenharmony_cihighp layout(rgba32i)  uniform readonly image2D i2bad;  // ERROR, type mismatch
116617a3babSopenharmony_cihighp layout(rgba32f)  uniform readonly uimage2D i3bad; // ERROR, type mismatch
117617a3babSopenharmony_cilayout(r8_snorm) uniform readonly iimage2D i4bad; // ERROR, type mismatch
118617a3babSopenharmony_cilayout(rgba32ui) uniform readonly iimage2D i5bad; // ERROR, type mismatch
119617a3babSopenharmony_cilayout(r8ui)     uniform readonly iimage2D i6bad; // ERROR, type mismatch
120617a3babSopenharmony_ci
121617a3babSopenharmony_cilayout(binding = 0) uniform atomic_uint counter;
122617a3babSopenharmony_ci
123617a3babSopenharmony_ciuint func(atomic_uint c)
124617a3babSopenharmony_ci{
125617a3babSopenharmony_ci    return atomicCounterIncrement(c);
126617a3babSopenharmony_ci}
127617a3babSopenharmony_ci
128617a3babSopenharmony_ciuint func2(out atomic_uint c) // ERROR, output
129617a3babSopenharmony_ci{
130617a3babSopenharmony_ci    return counter;           // ERROR, type mismatch
131617a3babSopenharmony_ci    return atomicCounter(counter);
132617a3babSopenharmony_ci}
133617a3babSopenharmony_ci
134617a3babSopenharmony_civoid mainAC()
135617a3babSopenharmony_ci{
136617a3babSopenharmony_ci     atomic_uint non_uniform_counter; // ERROR
137617a3babSopenharmony_ci     uint val = atomicCounter(counter);
138617a3babSopenharmony_ci     atomicCounterDecrement(counter);
139617a3babSopenharmony_ci}
140617a3babSopenharmony_ci
141617a3babSopenharmony_cilayout(binding = 1) uniform mediump atomic_uint counterBad;  // ERROR, not highp
142617a3babSopenharmony_ci
143617a3babSopenharmony_cilayout(binding = 2, offset = 4) uniform atomic_uint countArr[4];
144617a3babSopenharmony_ciuniform int i;
145617a3babSopenharmony_ci
146617a3babSopenharmony_civoid opac()
147617a3babSopenharmony_ci{
148617a3babSopenharmony_ci    int a[3];
149617a3babSopenharmony_ci    a[counter];         // ERROR, non-integer
150617a3babSopenharmony_ci    countArr[2];
151617a3babSopenharmony_ci    countArr[i];
152617a3babSopenharmony_ci}
153617a3babSopenharmony_ci
154617a3babSopenharmony_cishared int atomi;
155617a3babSopenharmony_cishared uint atomu;
156617a3babSopenharmony_ci
157617a3babSopenharmony_civoid atoms()
158617a3babSopenharmony_ci{
159617a3babSopenharmony_ci    int origi = atomicAdd(atomi, 3);
160617a3babSopenharmony_ci    uint origu = atomicAnd(atomu, 7u);
161617a3babSopenharmony_ci    origi = atomicExchange(atomi, 4);
162617a3babSopenharmony_ci    origu = atomicCompSwap(atomu, 10u, 8u);
163617a3babSopenharmony_ci}
164617a3babSopenharmony_ci
165617a3babSopenharmony_ciprecision highp atomic_uint;
166617a3babSopenharmony_ciprecision lowp atomic_uint;   // ERROR
167617a3babSopenharmony_ci
168617a3babSopenharmony_ciprecise int pfoo;  // ERROR, reserved
169617a3babSopenharmony_ci
170617a3babSopenharmony_cidmat2x4 dm;                     // ERROR
171617a3babSopenharmony_ciuniform samplerCubeArray sca;   // ERROR
172617a3babSopenharmony_ciuniform iimage2DRect i2dr;      // ERROR
173617a3babSopenharmony_cihighp uniform image2DMS i2dms;  // ERROR
174617a3babSopenharmony_ciuniform uimage2DMSArray u2dmsa; // ERROR
175617a3babSopenharmony_ci
176617a3babSopenharmony_cihighp layout(r32f)  coherent volatile restrict readonly writeonly uniform  image2D okay1;
177617a3babSopenharmony_ci      layout(r32i)  coherent volatile restrict readonly           uniform iimage2D okay2;
178617a3babSopenharmony_cihighp layout(r32ui) coherent volatile restrict          writeonly uniform uimage2D okay3;
179617a3babSopenharmony_cihighp layout(r32f)  coherent volatile restrict                    uniform  image2D okay4;
180617a3babSopenharmony_ci 
181617a3babSopenharmony_cihighp layout(rgba32f)  coherent volatile restrict                 uniform  image2D badQ1;  // ERROR, bad qualifiers
182617a3babSopenharmony_ci      layout(rgba8i)   coherent volatile restrict                 uniform iimage2D badQ2;  // ERROR, bad qualifiers
183617a3babSopenharmony_cihighp layout(rgba16ui) coherent volatile restrict                 uniform uimage2D badQ3;  // ERROR, bad qualifiers
184617a3babSopenharmony_ci
185617a3babSopenharmony_ciwriteonly buffer woblock
186617a3babSopenharmony_ci{
187617a3babSopenharmony_ci    int value;
188617a3babSopenharmony_ci    float values[];
189617a3babSopenharmony_ci} wo;
190617a3babSopenharmony_ci
191617a3babSopenharmony_civoid foowo()
192617a3babSopenharmony_ci{
193617a3babSopenharmony_ci    float g;
194617a3babSopenharmony_ci    g = wo.values[2];            // ERROR, writeonly
195617a3babSopenharmony_ci    float f = wo.values[2];      // ERROR, writeonly
196617a3babSopenharmony_ci    ++wo.values[2];              // ERROR, writeonly
197617a3babSopenharmony_ci    wo.values[2]--;              // ERROR, writeonly
198617a3babSopenharmony_ci    f + wo.values[2];            // ERROR, writeonly
199617a3babSopenharmony_ci    wo.values[2] - f;            // ERROR, writeonly
200617a3babSopenharmony_ci    bool b;
201617a3babSopenharmony_ci    b ? f : wo.values[2];        // ERROR, writeonly
202617a3babSopenharmony_ci    b ? wo.values[2] : f;        // ERROR, writeonly
203617a3babSopenharmony_ci    if (f == wo.values[2])       // ERROR, writeonly
204617a3babSopenharmony_ci        ++f;
205617a3babSopenharmony_ci    if (f >= wo.values[2])       // ERROR, writeonly
206617a3babSopenharmony_ci        ++f;
207617a3babSopenharmony_ci    f = vec3(wo.values[2]).x;    // ERROR, writeonly
208617a3babSopenharmony_ci    ~wo.value;                   // ERROR, writeonly
209617a3babSopenharmony_ci    wo.values[2] = 3.4;
210617a3babSopenharmony_ci}
211617a3babSopenharmony_ci
212617a3babSopenharmony_cibuffer multioblock
213617a3babSopenharmony_ci{
214617a3babSopenharmony_ci    readonly int value;
215617a3babSopenharmony_ci    writeonly float values[];
216617a3babSopenharmony_ci} multio;
217617a3babSopenharmony_ci
218617a3babSopenharmony_civoid foomultio()
219617a3babSopenharmony_ci{
220617a3babSopenharmony_ci    float g;
221617a3babSopenharmony_ci    g = wo.values[2];            // ERROR, writeonly
222617a3babSopenharmony_ci    ~wo.value;
223617a3babSopenharmony_ci    wo.values[2] = 3.4;
224617a3babSopenharmony_ci    wo.value = 2;                // ERROR, readonly
225617a3babSopenharmony_ci}
226617a3babSopenharmony_ci
227617a3babSopenharmony_ciin inb {     // ERROR
228617a3babSopenharmony_ci    int a;
229617a3babSopenharmony_ci} inbi;
230617a3babSopenharmony_ci
231617a3babSopenharmony_ciout outb {     // ERROR
232617a3babSopenharmony_ci    int a;
233617a3babSopenharmony_ci} outbi;
234617a3babSopenharmony_ci
235617a3babSopenharmony_cifloat t__;  // ERROR, no __ until revision 310
236617a3babSopenharmony_ci
237617a3babSopenharmony_ci    // ERROR, no __ until revision 310
238617a3babSopenharmony_ci#define __D
239617a3babSopenharmony_ci
240617a3babSopenharmony_cishared vec4 arr[2][3][4];
241617a3babSopenharmony_ci
242617a3babSopenharmony_civoid devi()
243617a3babSopenharmony_ci{
244617a3babSopenharmony_ci    gl_DeviceIndex; // ERROR, no extension
245617a3babSopenharmony_ci    gl_ViewIndex;   // ERROR, never this stage
246617a3babSopenharmony_ci}
247617a3babSopenharmony_ci
248617a3babSopenharmony_ci#ifdef GL_EXT_device_group
249617a3babSopenharmony_ci#extension GL_EXT_device_group : enable
250617a3babSopenharmony_ci#endif
251617a3babSopenharmony_ci
252617a3babSopenharmony_civoid devie()
253617a3babSopenharmony_ci{
254617a3babSopenharmony_ci    gl_DeviceIndex;
255617a3babSopenharmony_ci    gl_ViewIndex;   // ERROR, never this stage
256617a3babSopenharmony_ci}
257