You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
305 lines
5.9 KiB
305 lines
5.9 KiB
# 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
|