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