xref: /aosp_15_r20/external/deqp/data/gles3/shaders/indexing.test (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker# https://github.com/KhronosGroup/WebGL/blob/main/sdk/tests/conformance2/glsl3/vector-dynamic-indexing.html
2*35238bceSAndroid Build Coastguard Workergroup moredynamic "More dynamic indexing tests"
3*35238bceSAndroid Build Coastguard Worker
4*35238bceSAndroid Build Coastguard Worker    case matrix_twice
5*35238bceSAndroid Build Coastguard Worker        version 300 es
6*35238bceSAndroid Build Coastguard Worker        values { output float f = 1.0; }
7*35238bceSAndroid Build Coastguard Worker        both ""
8*35238bceSAndroid Build Coastguard Worker            #version 300 es
9*35238bceSAndroid Build Coastguard Worker            precision mediump float;
10*35238bceSAndroid Build Coastguard Worker            ${DECLARATIONS}
11*35238bceSAndroid Build Coastguard Worker
12*35238bceSAndroid Build Coastguard Worker            uniform int u_zero;
13*35238bceSAndroid Build Coastguard Worker            void main() {
14*35238bceSAndroid Build Coastguard Worker                mat2 m = mat2(0.0, 0.0, 0.0, 1.0);
15*35238bceSAndroid Build Coastguard Worker                f = m[u_zero + 1][u_zero + 1];
16*35238bceSAndroid Build Coastguard Worker                ${OUTPUT}
17*35238bceSAndroid Build Coastguard Worker            }
18*35238bceSAndroid Build Coastguard Worker        ""
19*35238bceSAndroid Build Coastguard Worker    end
20*35238bceSAndroid Build Coastguard Worker
21*35238bceSAndroid Build Coastguard Worker    case with_value_from_indexing_expression
22*35238bceSAndroid Build Coastguard Worker        version 300 es
23*35238bceSAndroid Build Coastguard Worker        values { output float f = 1.0; }
24*35238bceSAndroid Build Coastguard Worker        both ""
25*35238bceSAndroid Build Coastguard Worker            #version 300 es
26*35238bceSAndroid Build Coastguard Worker            precision mediump float;
27*35238bceSAndroid Build Coastguard Worker            ${DECLARATIONS}
28*35238bceSAndroid Build Coastguard Worker
29*35238bceSAndroid Build Coastguard Worker            uniform int u_zero;
30*35238bceSAndroid Build Coastguard Worker            void main() {
31*35238bceSAndroid Build Coastguard Worker                ivec2 i = ivec2(0, 2);
32*35238bceSAndroid Build Coastguard Worker                vec4 v = vec4(0.0, 0.2, 1.0, 0.4);
33*35238bceSAndroid Build Coastguard Worker                f = v[i[u_zero + 1]];
34*35238bceSAndroid Build Coastguard Worker                ${OUTPUT}
35*35238bceSAndroid Build Coastguard Worker            }
36*35238bceSAndroid Build Coastguard Worker        ""
37*35238bceSAndroid Build Coastguard Worker    end
38*35238bceSAndroid Build Coastguard Worker
39*35238bceSAndroid Build Coastguard Worker    case lvalue
40*35238bceSAndroid Build Coastguard Worker        version 300 es
41*35238bceSAndroid Build Coastguard Worker        values { output float f = 1.0; }
42*35238bceSAndroid Build Coastguard Worker        both ""
43*35238bceSAndroid Build Coastguard Worker            #version 300 es
44*35238bceSAndroid Build Coastguard Worker            precision mediump float;
45*35238bceSAndroid Build Coastguard Worker            ${DECLARATIONS}
46*35238bceSAndroid Build Coastguard Worker
47*35238bceSAndroid Build Coastguard Worker            uniform int u_zero;
48*35238bceSAndroid Build Coastguard Worker            void main() {
49*35238bceSAndroid Build Coastguard Worker                vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
50*35238bceSAndroid Build Coastguard Worker                v[u_zero + 1] = 5.0;
51*35238bceSAndroid Build Coastguard Worker                vec4 expected = vec4(1.0, 5.0, 3.0, 4.0);
52*35238bceSAndroid Build Coastguard Worker                f = 1.0 - distance(v, expected);
53*35238bceSAndroid Build Coastguard Worker                ${OUTPUT}
54*35238bceSAndroid Build Coastguard Worker            }
55*35238bceSAndroid Build Coastguard Worker        ""
56*35238bceSAndroid Build Coastguard Worker    end
57*35238bceSAndroid Build Coastguard Worker
58*35238bceSAndroid Build Coastguard Worker    case lvalue_with_value_from_indexing_expression
59*35238bceSAndroid Build Coastguard Worker        version 300 es
60*35238bceSAndroid Build Coastguard Worker        values { output float f = 1.0; }
61*35238bceSAndroid Build Coastguard Worker        both ""
62*35238bceSAndroid Build Coastguard Worker            #version 300 es
63*35238bceSAndroid Build Coastguard Worker            precision mediump float;
64*35238bceSAndroid Build Coastguard Worker            ${DECLARATIONS}
65*35238bceSAndroid Build Coastguard Worker
66*35238bceSAndroid Build Coastguard Worker            uniform int u_zero;
67*35238bceSAndroid Build Coastguard Worker            void main() {
68*35238bceSAndroid Build Coastguard Worker                ivec2 i = ivec2(0, 2);
69*35238bceSAndroid Build Coastguard Worker                vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
70*35238bceSAndroid Build Coastguard Worker                v[i[u_zero + 1]] = 5.0;
71*35238bceSAndroid Build Coastguard Worker                vec4 expected = vec4(1.0, 2.0, 5.0, 4.0);
72*35238bceSAndroid Build Coastguard Worker                f = 1.0 - distance(v, expected);
73*35238bceSAndroid Build Coastguard Worker                ${OUTPUT}
74*35238bceSAndroid Build Coastguard Worker            }
75*35238bceSAndroid Build Coastguard Worker        ""
76*35238bceSAndroid Build Coastguard Worker    end
77*35238bceSAndroid Build Coastguard Worker
78*35238bceSAndroid Build Coastguard Worker    case builtin_fncall_out_parameter
79*35238bceSAndroid Build Coastguard Worker        version 300 es
80*35238bceSAndroid Build Coastguard Worker        values { output float f = 1.0; }
81*35238bceSAndroid Build Coastguard Worker        both ""
82*35238bceSAndroid Build Coastguard Worker            #version 300 es
83*35238bceSAndroid Build Coastguard Worker            precision mediump float;
84*35238bceSAndroid Build Coastguard Worker            ${DECLARATIONS}
85*35238bceSAndroid Build Coastguard Worker
86*35238bceSAndroid Build Coastguard Worker            uniform int u_zero;
87*35238bceSAndroid Build Coastguard Worker            void main() {
88*35238bceSAndroid Build Coastguard Worker                vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
89*35238bceSAndroid Build Coastguard Worker                modf(5.5, v[u_zero + 3]);
90*35238bceSAndroid Build Coastguard Worker                vec4 expected = vec4(1.0, 2.0, 3.0, 5.0);
91*35238bceSAndroid Build Coastguard Worker                f = 1.0 - distance(v, expected);
92*35238bceSAndroid Build Coastguard Worker                ${OUTPUT}
93*35238bceSAndroid Build Coastguard Worker            }
94*35238bceSAndroid Build Coastguard Worker        ""
95*35238bceSAndroid Build Coastguard Worker    end
96*35238bceSAndroid Build Coastguard Worker
97*35238bceSAndroid Build Coastguard Worker    case user_defined_fncall_out_parameter
98*35238bceSAndroid Build Coastguard Worker        version 300 es
99*35238bceSAndroid Build Coastguard Worker        values { output float f = 1.0; }
100*35238bceSAndroid Build Coastguard Worker        both ""
101*35238bceSAndroid Build Coastguard Worker            #version 300 es
102*35238bceSAndroid Build Coastguard Worker            precision mediump float;
103*35238bceSAndroid Build Coastguard Worker            ${DECLARATIONS}
104*35238bceSAndroid Build Coastguard Worker
105*35238bceSAndroid Build Coastguard Worker            uniform int u_zero;
106*35238bceSAndroid Build Coastguard Worker            void foo(out float f) {
107*35238bceSAndroid Build Coastguard Worker                modf(5.5, f);
108*35238bceSAndroid Build Coastguard Worker            }
109*35238bceSAndroid Build Coastguard Worker            void main() {
110*35238bceSAndroid Build Coastguard Worker                vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
111*35238bceSAndroid Build Coastguard Worker                foo(v[u_zero + 3]);
112*35238bceSAndroid Build Coastguard Worker                vec4 expected = vec4(1.0, 2.0, 3.0, 5.0);
113*35238bceSAndroid Build Coastguard Worker                f = 1.0 - distance(v, expected);
114*35238bceSAndroid Build Coastguard Worker                ${OUTPUT}
115*35238bceSAndroid Build Coastguard Worker            }
116*35238bceSAndroid Build Coastguard Worker        ""
117*35238bceSAndroid Build Coastguard Worker    end
118*35238bceSAndroid Build Coastguard Worker
119*35238bceSAndroid Build Coastguard Worker    case user_defined_fncall_inout_parameter
120*35238bceSAndroid Build Coastguard Worker        version 300 es
121*35238bceSAndroid Build Coastguard Worker        values { output float f = 1.0; }
122*35238bceSAndroid Build Coastguard Worker        both ""
123*35238bceSAndroid Build Coastguard Worker            #version 300 es
124*35238bceSAndroid Build Coastguard Worker            precision mediump float;
125*35238bceSAndroid Build Coastguard Worker            ${DECLARATIONS}
126*35238bceSAndroid Build Coastguard Worker
127*35238bceSAndroid Build Coastguard Worker            uniform int u_zero;
128*35238bceSAndroid Build Coastguard Worker            void foo(inout float f) {
129*35238bceSAndroid Build Coastguard Worker                float g = f + 2.5;
130*35238bceSAndroid Build Coastguard Worker                modf(g, f);
131*35238bceSAndroid Build Coastguard Worker            }
132*35238bceSAndroid Build Coastguard Worker            void main() {
133*35238bceSAndroid Build Coastguard Worker                vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
134*35238bceSAndroid Build Coastguard Worker                foo(v[u_zero + 2]);
135*35238bceSAndroid Build Coastguard Worker                vec4 expected = vec4(1.0, 2.0, 5.0, 4.0);
136*35238bceSAndroid Build Coastguard Worker                f = 1.0 - distance(v, expected);
137*35238bceSAndroid Build Coastguard Worker                ${OUTPUT}
138*35238bceSAndroid Build Coastguard Worker            }
139*35238bceSAndroid Build Coastguard Worker        ""
140*35238bceSAndroid Build Coastguard Worker    end
141*35238bceSAndroid Build Coastguard Worker
142*35238bceSAndroid Build Coastguard Worker    case with_side_effects
143*35238bceSAndroid Build Coastguard Worker        version 300 es
144*35238bceSAndroid Build Coastguard Worker        values { output float f = 1.0; }
145*35238bceSAndroid Build Coastguard Worker        both ""
146*35238bceSAndroid Build Coastguard Worker            #version 300 es
147*35238bceSAndroid Build Coastguard Worker            precision mediump float;
148*35238bceSAndroid Build Coastguard Worker            ${DECLARATIONS}
149*35238bceSAndroid Build Coastguard Worker
150*35238bceSAndroid Build Coastguard Worker            uniform int u_zero;
151*35238bceSAndroid Build Coastguard Worker            int sideEffectCounter = 0;
152*35238bceSAndroid Build Coastguard Worker            int funcWithSideEffects() {
153*35238bceSAndroid Build Coastguard Worker                sideEffectCounter++;
154*35238bceSAndroid Build Coastguard Worker                return 2;
155*35238bceSAndroid Build Coastguard Worker            }
156*35238bceSAndroid Build Coastguard Worker            void main() {
157*35238bceSAndroid Build Coastguard Worker                vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
158*35238bceSAndroid Build Coastguard Worker                v[funcWithSideEffects()] = 5.0;
159*35238bceSAndroid Build Coastguard Worker                vec4 expected = vec4(1.0, 2.0, 5.0, 4.0);
160*35238bceSAndroid Build Coastguard Worker                f = 1.0 - distance(v, expected);
161*35238bceSAndroid Build Coastguard Worker                if (sideEffectCounter != 1) {
162*35238bceSAndroid Build Coastguard Worker                    f = 0.0;
163*35238bceSAndroid Build Coastguard Worker                }
164*35238bceSAndroid Build Coastguard Worker                ${OUTPUT}
165*35238bceSAndroid Build Coastguard Worker            }
166*35238bceSAndroid Build Coastguard Worker        ""
167*35238bceSAndroid Build Coastguard Worker    end
168*35238bceSAndroid Build Coastguard Worker
169*35238bceSAndroid Build Coastguard Worker    case inout_with_side_effects
170*35238bceSAndroid Build Coastguard Worker        version 300 es
171*35238bceSAndroid Build Coastguard Worker        values { output float f = 1.0; }
172*35238bceSAndroid Build Coastguard Worker        both ""
173*35238bceSAndroid Build Coastguard Worker            #version 300 es
174*35238bceSAndroid Build Coastguard Worker            precision mediump float;
175*35238bceSAndroid Build Coastguard Worker            ${DECLARATIONS}
176*35238bceSAndroid Build Coastguard Worker
177*35238bceSAndroid Build Coastguard Worker            uniform int u_zero;
178*35238bceSAndroid Build Coastguard Worker            int sideEffectCounter = 0;
179*35238bceSAndroid Build Coastguard Worker            int funcWithSideEffects() {
180*35238bceSAndroid Build Coastguard Worker                sideEffectCounter++;
181*35238bceSAndroid Build Coastguard Worker                return 2;
182*35238bceSAndroid Build Coastguard Worker            }
183*35238bceSAndroid Build Coastguard Worker            void main() {
184*35238bceSAndroid Build Coastguard Worker                vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
185*35238bceSAndroid Build Coastguard Worker                v[funcWithSideEffects()]++;
186*35238bceSAndroid Build Coastguard Worker                vec4 expected = vec4(1.0, 2.0, 4.0, 4.0);
187*35238bceSAndroid Build Coastguard Worker                f = 1.0 - distance(v, expected);
188*35238bceSAndroid Build Coastguard Worker                if (sideEffectCounter != 1) {
189*35238bceSAndroid Build Coastguard Worker                    f = 0.0;
190*35238bceSAndroid Build Coastguard Worker                }
191*35238bceSAndroid Build Coastguard Worker                ${OUTPUT}
192*35238bceSAndroid Build Coastguard Worker            }
193*35238bceSAndroid Build Coastguard Worker        ""
194*35238bceSAndroid Build Coastguard Worker    end
195*35238bceSAndroid Build Coastguard Worker
196*35238bceSAndroid Build Coastguard Worker    case user_defined_fncall_inout_parameter_with_index_with_side_effects
197*35238bceSAndroid Build Coastguard Worker        version 300 es
198*35238bceSAndroid Build Coastguard Worker        values { output float f = 1.0; }
199*35238bceSAndroid Build Coastguard Worker        both ""
200*35238bceSAndroid Build Coastguard Worker            #version 300 es
201*35238bceSAndroid Build Coastguard Worker            precision mediump float;
202*35238bceSAndroid Build Coastguard Worker            ${DECLARATIONS}
203*35238bceSAndroid Build Coastguard Worker
204*35238bceSAndroid Build Coastguard Worker            uniform int u_zero;
205*35238bceSAndroid Build Coastguard Worker            int sideEffectCounter = 0;
206*35238bceSAndroid Build Coastguard Worker            void foo(inout float f) {
207*35238bceSAndroid Build Coastguard Worker                float g = f + 2.5;
208*35238bceSAndroid Build Coastguard Worker                modf(g, f);
209*35238bceSAndroid Build Coastguard Worker            }
210*35238bceSAndroid Build Coastguard Worker            int funcWithSideEffects() {
211*35238bceSAndroid Build Coastguard Worker                sideEffectCounter++;
212*35238bceSAndroid Build Coastguard Worker                return 2;
213*35238bceSAndroid Build Coastguard Worker            }
214*35238bceSAndroid Build Coastguard Worker            void main() {
215*35238bceSAndroid Build Coastguard Worker                vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
216*35238bceSAndroid Build Coastguard Worker                foo(v[funcWithSideEffects()]);
217*35238bceSAndroid Build Coastguard Worker                vec4 expected = vec4(1.0, 2.0, 5.0, 4.0);
218*35238bceSAndroid Build Coastguard Worker                f = 1.0 - distance(v, expected);
219*35238bceSAndroid Build Coastguard Worker                if (sideEffectCounter != 1) {
220*35238bceSAndroid Build Coastguard Worker                    f = 0.0;
221*35238bceSAndroid Build Coastguard Worker                }
222*35238bceSAndroid Build Coastguard Worker                ${OUTPUT}
223*35238bceSAndroid Build Coastguard Worker            }
224*35238bceSAndroid Build Coastguard Worker        ""
225*35238bceSAndroid Build Coastguard Worker    end
226*35238bceSAndroid Build Coastguard Worker
227*35238bceSAndroid Build Coastguard Worker    case lvalue_with_uint
228*35238bceSAndroid Build Coastguard Worker        version 300 es
229*35238bceSAndroid Build Coastguard Worker        values { output float f = 1.0; }
230*35238bceSAndroid Build Coastguard Worker        both ""
231*35238bceSAndroid Build Coastguard Worker            #version 300 es
232*35238bceSAndroid Build Coastguard Worker            precision mediump float;
233*35238bceSAndroid Build Coastguard Worker            ${DECLARATIONS}
234*35238bceSAndroid Build Coastguard Worker
235*35238bceSAndroid Build Coastguard Worker            uniform int u_zero;
236*35238bceSAndroid Build Coastguard Worker            void main() {
237*35238bceSAndroid Build Coastguard Worker                vec4 v = vec4(1.0, 2.0, 3.0, 4.0);
238*35238bceSAndroid Build Coastguard Worker                v[u_zero] = 5.0;
239*35238bceSAndroid Build Coastguard Worker                vec4 expected = vec4(5.0, 2.0, 3.0, 4.0);
240*35238bceSAndroid Build Coastguard Worker                f = 1.0 - distance(v, expected);
241*35238bceSAndroid Build Coastguard Worker                ${OUTPUT}
242*35238bceSAndroid Build Coastguard Worker            }
243*35238bceSAndroid Build Coastguard Worker        ""
244*35238bceSAndroid Build Coastguard Worker    end
245*35238bceSAndroid Build Coastguard Worker
246*35238bceSAndroid Build Coastguard Worker    case uniform
247*35238bceSAndroid Build Coastguard Worker        version 300 es
248*35238bceSAndroid Build Coastguard Worker        values { output float f = 0.0; }
249*35238bceSAndroid Build Coastguard Worker        both ""
250*35238bceSAndroid Build Coastguard Worker            #version 300 es
251*35238bceSAndroid Build Coastguard Worker            precision mediump float;
252*35238bceSAndroid Build Coastguard Worker            ${DECLARATIONS}
253*35238bceSAndroid Build Coastguard Worker
254*35238bceSAndroid Build Coastguard Worker            uniform vec4 u_zeroVec;
255*35238bceSAndroid Build Coastguard Worker            uniform int u_zero;
256*35238bceSAndroid Build Coastguard Worker            void main() {
257*35238bceSAndroid Build Coastguard Worker                f = u_zeroVec[u_zero];
258*35238bceSAndroid Build Coastguard Worker                ${OUTPUT}
259*35238bceSAndroid Build Coastguard Worker            }
260*35238bceSAndroid Build Coastguard Worker        ""
261*35238bceSAndroid Build Coastguard Worker    end
262*35238bceSAndroid Build Coastguard Worker
263*35238bceSAndroid Build Coastguard Worker    case sequence_vector_lvalue
264*35238bceSAndroid Build Coastguard Worker        version 300 es
265*35238bceSAndroid Build Coastguard Worker        values { output bool success = true; }
266*35238bceSAndroid Build Coastguard Worker        both ""
267*35238bceSAndroid Build Coastguard Worker            #version 300 es
268*35238bceSAndroid Build Coastguard Worker            precision mediump float;
269*35238bceSAndroid Build Coastguard Worker            ${DECLARATIONS}
270*35238bceSAndroid Build Coastguard Worker
271*35238bceSAndroid Build Coastguard Worker            uniform int u_zero;
272*35238bceSAndroid Build Coastguard Worker            int sideEffectCounter = 0;
273*35238bceSAndroid Build Coastguard Worker            float func() {
274*35238bceSAndroid Build Coastguard Worker                ++sideEffectCounter;
275*35238bceSAndroid Build Coastguard Worker                return -1.0;
276*35238bceSAndroid Build Coastguard Worker            }
277*35238bceSAndroid Build Coastguard Worker            void main() {
278*35238bceSAndroid Build Coastguard Worker                vec4 v = vec4(0.0, 2.0, 4.0, 6.0);
279*35238bceSAndroid Build Coastguard Worker                float f = (func(), (++v[u_zero + sideEffectCounter]));
280*35238bceSAndroid Build Coastguard Worker                success = (abs(f - 3.0) < 0.01 && abs(v[1] - 3.0) < 0.01 && sideEffectCounter == 1);
281*35238bceSAndroid Build Coastguard Worker                ${OUTPUT}
282*35238bceSAndroid Build Coastguard Worker            }
283*35238bceSAndroid Build Coastguard Worker        ""
284*35238bceSAndroid Build Coastguard Worker    end
285*35238bceSAndroid Build Coastguard Worker
286*35238bceSAndroid Build Coastguard Worker    case matrix_twice_in_lvalue
287*35238bceSAndroid Build Coastguard Worker        version 300 es
288*35238bceSAndroid Build Coastguard Worker        values { output float f = 1.0; }
289*35238bceSAndroid Build Coastguard Worker        both ""
290*35238bceSAndroid Build Coastguard Worker            #version 300 es
291*35238bceSAndroid Build Coastguard Worker            precision mediump float;
292*35238bceSAndroid Build Coastguard Worker            ${DECLARATIONS}
293*35238bceSAndroid Build Coastguard Worker
294*35238bceSAndroid Build Coastguard Worker            uniform int u_zero;
295*35238bceSAndroid Build Coastguard Worker            void main() {
296*35238bceSAndroid Build Coastguard Worker                mat2 m = mat2(0.0, 0.0, 0.0, 0.0);
297*35238bceSAndroid Build Coastguard Worker                m[u_zero + 1][u_zero + 1] = float(u_zero + 1);
298*35238bceSAndroid Build Coastguard Worker                f = m[1][1];
299*35238bceSAndroid Build Coastguard Worker                ${OUTPUT}
300*35238bceSAndroid Build Coastguard Worker            }
301*35238bceSAndroid Build Coastguard Worker        ""
302*35238bceSAndroid Build Coastguard Worker    end
303*35238bceSAndroid Build Coastguard Worker
304*35238bceSAndroid Build Coastguard Workerend # moredynamic
305