blob: 49eaa3bd4ed247e4ec16bcc06cd833abae7f921c [file] [log] [blame]
# 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