| # https://github.com/KhronosGroup/WebGL/blob/master/sdk/tests/conformance2/glsl3/vector-dynamic-indexing.html |
| group moredynamic "More dynamic indexing tests" |
| |
| case matrix_twice |
| version 300 es |
| values { output float f = 1.0; } |
| both "" |
| #version 300 es |
| precision mediump float; |
| ${DECLARATIONS} |
| |
| uniform int u_zero; |
| void main() { |
| mat2 m = mat2(0.0, 0.0, 0.0, 1.0); |
| f = m[u_zero + 1][u_zero + 1]; |
| ${OUTPUT} |
| } |
| "" |
| end |
| |
| case with_value_from_indexing_expression |
| version 300 es |
| values { output float f = 1.0; } |
| both "" |
| #version 300 es |
| precision mediump float; |
| ${DECLARATIONS} |
| |
| uniform int u_zero; |
| void main() { |
| ivec2 i = ivec2(0, 2); |
| vec4 v = vec4(0.0, 0.2, 1.0, 0.4); |
| f = v[i[u_zero + 1]]; |
| ${OUTPUT} |
| } |
| "" |
| end |
| |
| case lvalue |
| version 300 es |
| values { output float f = 1.0; } |
| both "" |
| #version 300 es |
| precision mediump float; |
| ${DECLARATIONS} |
| |
| uniform int u_zero; |
| void main() { |
| vec4 v = vec4(1.0, 2.0, 3.0, 4.0); |
| v[u_zero + 1] = 5.0; |
| vec4 expected = vec4(1.0, 5.0, 3.0, 4.0); |
| f = 1.0 - distance(v, expected); |
| ${OUTPUT} |
| } |
| "" |
| end |
| |
| case lvalue_with_value_from_indexing_expression |
| version 300 es |
| values { output float f = 1.0; } |
| both "" |
| #version 300 es |
| precision mediump float; |
| ${DECLARATIONS} |
| |
| uniform int u_zero; |
| void main() { |
| ivec2 i = ivec2(0, 2); |
| vec4 v = vec4(1.0, 2.0, 3.0, 4.0); |
| v[i[u_zero + 1]] = 5.0; |
| vec4 expected = vec4(1.0, 2.0, 5.0, 4.0); |
| f = 1.0 - distance(v, expected); |
| ${OUTPUT} |
| } |
| "" |
| end |
| |
| case builtin_fncall_out_parameter |
| version 300 es |
| values { output float f = 1.0; } |
| both "" |
| #version 300 es |
| precision mediump float; |
| ${DECLARATIONS} |
| |
| uniform int u_zero; |
| void main() { |
| vec4 v = vec4(1.0, 2.0, 3.0, 4.0); |
| modf(5.5, v[u_zero + 3]); |
| vec4 expected = vec4(1.0, 2.0, 3.0, 5.0); |
| f = 1.0 - distance(v, expected); |
| ${OUTPUT} |
| } |
| "" |
| end |
| |
| case user_defined_fncall_out_parameter |
| version 300 es |
| values { output float f = 1.0; } |
| both "" |
| #version 300 es |
| precision mediump float; |
| ${DECLARATIONS} |
| |
| uniform int u_zero; |
| void foo(out float f) { |
| modf(5.5, f); |
| } |
| void main() { |
| vec4 v = vec4(1.0, 2.0, 3.0, 4.0); |
| foo(v[u_zero + 3]); |
| vec4 expected = vec4(1.0, 2.0, 3.0, 5.0); |
| f = 1.0 - distance(v, expected); |
| ${OUTPUT} |
| } |
| "" |
| end |
| |
| case user_defined_fncall_inout_parameter |
| version 300 es |
| values { output float f = 1.0; } |
| both "" |
| #version 300 es |
| precision mediump float; |
| ${DECLARATIONS} |
| |
| uniform int u_zero; |
| void foo(inout float f) { |
| float g = f + 2.5; |
| modf(g, f); |
| } |
| void main() { |
| vec4 v = vec4(1.0, 2.0, 3.0, 4.0); |
| foo(v[u_zero + 2]); |
| vec4 expected = vec4(1.0, 2.0, 5.0, 4.0); |
| f = 1.0 - distance(v, expected); |
| ${OUTPUT} |
| } |
| "" |
| end |
| |
| case with_side_effects |
| version 300 es |
| values { output float f = 1.0; } |
| both "" |
| #version 300 es |
| precision mediump float; |
| ${DECLARATIONS} |
| |
| uniform int u_zero; |
| int sideEffectCounter = 0; |
| int funcWithSideEffects() { |
| sideEffectCounter++; |
| return 2; |
| } |
| void main() { |
| vec4 v = vec4(1.0, 2.0, 3.0, 4.0); |
| v[funcWithSideEffects()] = 5.0; |
| vec4 expected = vec4(1.0, 2.0, 5.0, 4.0); |
| f = 1.0 - distance(v, expected); |
| if (sideEffectCounter != 1) { |
| f = 0.0; |
| } |
| ${OUTPUT} |
| } |
| "" |
| end |
| |
| case inout_with_side_effects |
| version 300 es |
| values { output float f = 1.0; } |
| both "" |
| #version 300 es |
| precision mediump float; |
| ${DECLARATIONS} |
| |
| uniform int u_zero; |
| int sideEffectCounter = 0; |
| int funcWithSideEffects() { |
| sideEffectCounter++; |
| return 2; |
| } |
| void main() { |
| vec4 v = vec4(1.0, 2.0, 3.0, 4.0); |
| v[funcWithSideEffects()]++; |
| vec4 expected = vec4(1.0, 2.0, 4.0, 4.0); |
| f = 1.0 - distance(v, expected); |
| if (sideEffectCounter != 1) { |
| f = 0.0; |
| } |
| ${OUTPUT} |
| } |
| "" |
| end |
| |
| case user_defined_fncall_inout_parameter_with_index_with_side_effects |
| version 300 es |
| values { output float f = 1.0; } |
| both "" |
| #version 300 es |
| precision mediump float; |
| ${DECLARATIONS} |
| |
| uniform int u_zero; |
| int sideEffectCounter = 0; |
| void foo(inout float f) { |
| float g = f + 2.5; |
| modf(g, f); |
| } |
| int funcWithSideEffects() { |
| sideEffectCounter++; |
| return 2; |
| } |
| void main() { |
| vec4 v = vec4(1.0, 2.0, 3.0, 4.0); |
| foo(v[funcWithSideEffects()]); |
| vec4 expected = vec4(1.0, 2.0, 5.0, 4.0); |
| f = 1.0 - distance(v, expected); |
| if (sideEffectCounter != 1) { |
| f = 0.0; |
| } |
| ${OUTPUT} |
| } |
| "" |
| end |
| |
| case lvalue_with_uint |
| version 300 es |
| values { output float f = 1.0; } |
| both "" |
| #version 300 es |
| precision mediump float; |
| ${DECLARATIONS} |
| |
| uniform int u_zero; |
| void main() { |
| vec4 v = vec4(1.0, 2.0, 3.0, 4.0); |
| v[u_zero] = 5.0; |
| vec4 expected = vec4(5.0, 2.0, 3.0, 4.0); |
| f = 1.0 - distance(v, expected); |
| ${OUTPUT} |
| } |
| "" |
| end |
| |
| case uniform |
| version 300 es |
| values { output float f = 0.0; } |
| both "" |
| #version 300 es |
| precision mediump float; |
| ${DECLARATIONS} |
| |
| uniform vec4 u_zeroVec; |
| uniform int u_zero; |
| void main() { |
| f = u_zeroVec[u_zero]; |
| ${OUTPUT} |
| } |
| "" |
| end |
| |
| case sequence_vector_lvalue |
| version 300 es |
| values { output bool success = true; } |
| both "" |
| #version 300 es |
| precision mediump float; |
| ${DECLARATIONS} |
| |
| uniform int u_zero; |
| int sideEffectCounter = 0; |
| float func() { |
| ++sideEffectCounter; |
| return -1.0; |
| } |
| void main() { |
| vec4 v = vec4(0.0, 2.0, 4.0, 6.0); |
| float f = (func(), (++v[u_zero + sideEffectCounter])); |
| success = (abs(f - 3.0) < 0.01 && abs(v[1] - 3.0) < 0.01 && sideEffectCounter == 1); |
| ${OUTPUT} |
| } |
| "" |
| end |
| |
| case matrix_twice_in_lvalue |
| version 300 es |
| values { output float f = 1.0; } |
| both "" |
| #version 300 es |
| precision mediump float; |
| ${DECLARATIONS} |
| |
| uniform int u_zero; |
| void main() { |
| mat2 m = mat2(0.0, 0.0, 0.0, 0.0); |
| m[u_zero + 1][u_zero + 1] = float(u_zero + 1); |
| f = m[1][1]; |
| ${OUTPUT} |
| } |
| "" |
| end |
| |
| end # moredynamic |