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