1563 lines
31 KiB
Plaintext
1563 lines
31 KiB
Plaintext
group basic "Default block uniforms of scalar and vector types"
|
|
case precision_conflict_1
|
|
version 310 es
|
|
desc "Vertex side uniform has highp, fragment side uniform mediump."
|
|
expect link_fail
|
|
values {output float out0 = 3.0;}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
uniform highp float u_val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = u_val;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
uniform float u_val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
out0 = u_val + res;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
case precision_conflict_2
|
|
version 310 es
|
|
desc "Vertex side uniform has highp, fragment side uniform mediump."
|
|
expect link_fail
|
|
values {output float out0 = 3.0;}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
uniform highp float u_val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = u_val;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision highp float;
|
|
uniform mediump float u_val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
out0 = u_val + res;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
case precision_conflict_3
|
|
version 310 es
|
|
desc "Vertex side uniform has lowp, fragment side uniform highp."
|
|
expect link_fail
|
|
values {output float out0 = 3.0;}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
uniform lowp int u_val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = float(u_val);
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision highp float;
|
|
uniform highp int u_val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
out0 = float(u_val) + res;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
case precision_conflict_4
|
|
version 310 es
|
|
desc "Vertex side uniform has lowp, fragment side uniform mediump."
|
|
expect link_fail
|
|
values {output float out0 = 3.0;}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
uniform lowp vec3 u_val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = u_val.y;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision highp float;
|
|
uniform mediump vec3 u_val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
out0 = u_val.z + res;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
end
|
|
|
|
group struct "Uniform structs"
|
|
# Struct linkage handling
|
|
case basic
|
|
version 310 es
|
|
desc "Same uniform struct in both shaders"
|
|
values {
|
|
uniform float val.a = 1.0;
|
|
uniform float val.b = 2.0;
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump float a; mediump float b;};
|
|
uniform Struct val;
|
|
out mediump float dummy;
|
|
void main()
|
|
{
|
|
dummy = val.a + val.b;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump float a; mediump float b;};
|
|
uniform Struct val;
|
|
in mediump float dummy;
|
|
${FRAGMENT_DECLARATIONS}
|
|
void main()
|
|
{
|
|
out0 = val.b + val.a;
|
|
out0 = out0 + dummy;
|
|
out0 = out0 - dummy;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case vertex_only
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used only in vertex."
|
|
values {
|
|
uniform float val.a = 1.0;
|
|
uniform float val.b = 2.0;
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump float a; mediump float b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a + val.b;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump float a; mediump float b;};
|
|
uniform Struct val;
|
|
in mediump float res;
|
|
${FRAGMENT_DECLARATIONS}
|
|
void main()
|
|
{
|
|
out0 = res;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case fragment_only
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used only in fragment."
|
|
values {
|
|
uniform float val.a = 1.0;
|
|
uniform float val.b = 2.0;
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump float a; mediump float b;};
|
|
uniform Struct val;
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump float a; mediump float b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
void main()
|
|
{
|
|
out0 = val.a + val.b;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case partial
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used partially in both."
|
|
values {
|
|
uniform float val.a = 1.0;
|
|
uniform float val.b = 2.0;
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump float a; mediump float b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump float a; mediump float b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
out0 = res + val.b;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case vec4
|
|
version 310 es
|
|
desc "Same uniform struct in both shaders. Datatype vec4"
|
|
values {
|
|
uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
|
|
uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0);
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec4 a; mediump vec4 b;};
|
|
uniform Struct val;
|
|
out mediump float dummy;
|
|
void main()
|
|
{
|
|
dummy = val.a.x + val.b.y;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec4 a; mediump vec4 b;};
|
|
uniform Struct val;
|
|
in mediump float dummy;
|
|
${FRAGMENT_DECLARATIONS}
|
|
void main()
|
|
{
|
|
out0 = val.b.y + val.a.x;
|
|
out0 = out0 + dummy;
|
|
out0 = out0 - dummy;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case vertex_only_vec4
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used only in vertex. Datatype vec4 "
|
|
values {
|
|
uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
|
|
uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0);
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec4 a; mediump vec4 b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a.x + val.b.y;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec4 a; mediump vec4 b;};
|
|
uniform Struct val;
|
|
in mediump float res;
|
|
${FRAGMENT_DECLARATIONS}
|
|
void main()
|
|
{ out0 = res;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case fragment_only_vec4
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used only in fragment. Datatype vec4"
|
|
values {
|
|
uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
|
|
uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0);
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec4 a; mediump vec4 b;};
|
|
uniform Struct val;
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec4 a; mediump vec4 b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
void main()
|
|
{ out0 = val.a.x + val.b.y;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case partial_vec4
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used partially in both. Datatype vec4"
|
|
values {
|
|
uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
|
|
uniform vec4 val.b = vec4(1.0, 2.0, 3.0, 4.0);
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec4 a; mediump vec4 b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a.x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec4 a; mediump vec4 b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = res + val.b.y;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case vec4_vec3
|
|
version 310 es
|
|
desc "Same uniform struct in both shaders. Datatype vec4 and vec3"
|
|
values {
|
|
uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
|
|
uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec4 a; mediump vec3 b;};
|
|
uniform Struct val;
|
|
out mediump float dummy;
|
|
void main()
|
|
{
|
|
dummy = val.a.x + val.b.y;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec4 a; mediump vec3 b;};
|
|
uniform Struct val;
|
|
in mediump float dummy;
|
|
${FRAGMENT_DECLARATIONS}
|
|
void main()
|
|
{ out0 = val.b.y + val.a.x;
|
|
out0 = out0 + dummy;
|
|
out0 = out0 - dummy;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case vertex_only_vec4_vec3
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used only in vertex. Datatype vec4 and vec3"
|
|
values {
|
|
uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
|
|
uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec4 a; mediump vec3 b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a.x + val.b.y;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec4 a; mediump vec3 b;};
|
|
uniform Struct val;
|
|
in mediump float res;
|
|
${FRAGMENT_DECLARATIONS}
|
|
void main()
|
|
{ out0 = res;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case fragment_only_vec4_vec3
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used only in fragment. Datatype vec4 and vec3"
|
|
values {
|
|
uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
|
|
uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec4 a; mediump vec3 b;};
|
|
uniform Struct val;
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec4 a; mediump vec3 b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
void main()
|
|
{ out0 = val.a.x + val.b.y;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case partial_vec4_vec3
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used partially in both. Datatype vec4 and vec3"
|
|
values {
|
|
uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
|
|
uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec4 a; mediump vec3 b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a.x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec4 a; mediump vec3 b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = res + val.b.y;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case vec4_float
|
|
version 310 es
|
|
desc "Same uniform struct in both shaders. Datatype vec4 and float"
|
|
values {
|
|
uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
|
|
uniform float val.b = 2.0;
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec4 a; mediump float b;};
|
|
uniform Struct val;
|
|
out mediump float dummy;
|
|
void main()
|
|
{
|
|
dummy = val.a.x + val.b;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec4 a; mediump float b;};
|
|
uniform Struct val;
|
|
in mediump float dummy;
|
|
${FRAGMENT_DECLARATIONS}
|
|
void main()
|
|
{ out0 = val.b + val.a.x;
|
|
out0 = out0 + dummy;
|
|
out0 = out0 - dummy;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case vertex_only_vec4_float
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used only in vertex. Datatype vec4 and float"
|
|
values {
|
|
uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
|
|
uniform float val.b = 2.0;
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec4 a; mediump float b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a.x + val.b;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec4 a; mediump float b;};
|
|
uniform Struct val;
|
|
in mediump float res;
|
|
${FRAGMENT_DECLARATIONS}
|
|
void main()
|
|
{ out0 = res;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case fragment_only_vec4_float
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used only in fragment. Datatype vec4 and float"
|
|
values {
|
|
uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
|
|
uniform float val.b = 2.0;
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec4 a; mediump float b;};
|
|
uniform Struct val;
|
|
void main()
|
|
{
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec4 a; mediump float b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
void main()
|
|
{ out0 = val.a.x + val.b;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case partial_vec4_float
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used partially in both. Datatype vec4 and float"
|
|
values {
|
|
uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
|
|
uniform float val.b = 2.0;
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec4 a; mediump float b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a.x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec4 a; mediump float b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = res + val.b;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case partial_vec4_struct
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used partially in both. Datatype vec4 and struct with vec4"
|
|
values {
|
|
uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
|
|
uniform vec4 val.b.c = vec4(1.0, 2.0, 3.0, 4.0);
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Inner {mediump vec4 c;};
|
|
struct Struct {mediump vec4 a; Inner b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a.x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Inner {mediump vec4 c;};
|
|
struct Struct {mediump vec4 a; Inner b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = res + val.b.c.y;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case partial_vec4_vec3_struct
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used partially in both. Datatype vec4 and struct with vec3"
|
|
values {
|
|
uniform vec4 val.a = vec4(1.0, 2.0, 3.0, 4.0);
|
|
uniform vec3 val.b.c = vec3(1.0, 2.0, 3.0);
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Inner {mediump vec3 c;};
|
|
struct Struct {mediump vec4 a; Inner b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a.x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Inner {mediump vec3 c;};
|
|
struct Struct {mediump vec4 a; Inner b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = res + val.b.c.y;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case partial_vec2_vec3
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used partially in both. Datatype vec2 and vec3"
|
|
values {
|
|
uniform vec2 val.a = vec2(1.0, 2.0);
|
|
uniform vec3 val.b = vec3(1.0, 2.0, 3.0);
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec2 a; mediump vec3 b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a.x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec2 a; mediump vec3 b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = res + val.b.y;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case partial_vec2_int
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used partially in both. Datatype vec2 and int"
|
|
values {
|
|
uniform vec2 val.a = vec2(1.0, 2.0);
|
|
uniform int val.b = 2;
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec2 a; mediump int b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a.x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec2 a; mediump int b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = res + float(val.b);
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case partial_int_float
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used partially in both. Datatype int and float"
|
|
values {
|
|
uniform float val.a = 1.0;
|
|
uniform int val.b = 2;
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump float a; mediump int b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump float a; mediump int b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = res + float(val.b);
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case partial_bvec2_vec2
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used partially in both. Datatype bvec2 and vec2"
|
|
values {
|
|
uniform bvec2 val.a = bvec2(true, true);
|
|
uniform vec2 val.b = vec2(1.0, 2.0);
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {bvec2 a; mediump vec2 b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = float(val.a.x);
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {bvec2 a; mediump vec2 b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = res + val.b.y;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case partial_ivec2_vec2
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used partially in both. Datatype ivec2 and vec2"
|
|
values {
|
|
uniform ivec2 val.a = ivec2(1, 2);
|
|
uniform vec2 val.b = vec2(1.0, 2.0);
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump ivec2 a; mediump vec2 b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = vec2(val.a).x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump ivec2 a; mediump vec2 b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = res + val.b.y;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case partial_ivec2_ivec2
|
|
version 310 es
|
|
desc "Uniform struct declared in both, used partially in both. Datatype ivec2 and ivec2"
|
|
values {
|
|
uniform ivec2 val.a = ivec2(1, 2);
|
|
uniform ivec2 val.b = ivec2(1, 2);
|
|
output float out0 = 3.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump ivec2 a; mediump ivec2 b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = vec2(val.a).x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump ivec2 a; mediump ivec2 b;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = res + vec2(val.b).y;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case type_conflict_1
|
|
version 310 es
|
|
desc "Fragment struct has one less member than fragment version"
|
|
expect link_fail
|
|
values {output float out0 = 3.0;}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump float a; mediump float b;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump float a;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = res + val.a;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case type_conflict_2
|
|
version 310 es
|
|
desc "Vertex struct has int, fragment struct has float."
|
|
expect link_fail
|
|
values {output float out0 = 3.0;}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump int a;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = float(val.a);
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump float a;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = val.a;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case type_conflict_3
|
|
version 310 es
|
|
desc "Vertex struct has vec3, fragment struct has vec4."
|
|
expect link_fail
|
|
values {output float out0 = 3.0;}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump vec3 a;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = float(val.a.x);
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump vec4 a;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = val.a.x;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case precision_conflict_1
|
|
version 310 es
|
|
desc "Vertex side struct has highp, fragment side struct mediump."
|
|
expect link_fail
|
|
values {output float out0 = 3.0;}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {highp float a;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump float a;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = val.a;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case precision_conflict_2
|
|
version 310 es
|
|
desc "Vertex side struct has mediump, fragment side struct lowp."
|
|
expect link_fail
|
|
values {output float out0 = 3.0;}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {mediump float a;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {lowp float a;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = val.a;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case precision_conflict_3
|
|
version 310 es
|
|
desc "Vertex side struct has lowp, fragment side struct mediump."
|
|
expect link_fail
|
|
values {output float out0 = 3.0;}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {lowp float a;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {mediump float a;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = val.a;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case precision_conflict_4
|
|
version 310 es
|
|
desc "Vertex side struct has lowp, fragment side struct implicit mediump."
|
|
expect link_fail
|
|
values {output float out0 = 3.0;}
|
|
vertex ""
|
|
#version 310 es
|
|
${VERTEX_DECLARATIONS}
|
|
struct Struct {lowp float a;};
|
|
uniform Struct val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.a;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Struct {float a;};
|
|
uniform Struct val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{ out0 = val.a;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case light_struct_highp
|
|
version 310 es
|
|
desc "Complex Light struct from use case tests."
|
|
values {
|
|
uniform float val.constantAttenuation = 1.0;
|
|
uniform float val.quadraticAttenuation = 1.0;
|
|
output float out0 = 2.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
struct Light
|
|
{
|
|
mediump vec3 color;
|
|
highp vec4 position;
|
|
highp vec3 direction;
|
|
mediump float constantAttenuation;
|
|
mediump float linearAttenuation;
|
|
mediump float quadraticAttenuation;
|
|
};
|
|
${VERTEX_DECLARATIONS}
|
|
uniform Light val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.constantAttenuation;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Light
|
|
{
|
|
mediump vec3 color;
|
|
highp vec4 position;
|
|
highp vec3 direction;
|
|
mediump float constantAttenuation;
|
|
mediump float linearAttenuation;
|
|
mediump float quadraticAttenuation;
|
|
};
|
|
struct Struct {float a;};
|
|
uniform Light val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
out0 = res + val.quadraticAttenuation;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
|
|
case light_struct_mediump
|
|
version 310 es
|
|
desc "Complex Light struct from use case tests, without highp usage"
|
|
values {
|
|
uniform float val.constantAttenuation = 1.0;
|
|
uniform float val.quadraticAttenuation = 1.0;
|
|
output float out0 = 2.0;
|
|
}
|
|
vertex ""
|
|
#version 310 es
|
|
struct Light
|
|
{
|
|
mediump vec3 color;
|
|
mediump vec4 position;
|
|
mediump vec3 direction;
|
|
mediump float constantAttenuation;
|
|
mediump float linearAttenuation;
|
|
mediump float quadraticAttenuation;
|
|
};
|
|
${VERTEX_DECLARATIONS}
|
|
uniform Light val;
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.constantAttenuation;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
precision mediump float;
|
|
struct Light
|
|
{
|
|
mediump vec3 color;
|
|
mediump vec4 position;
|
|
mediump vec3 direction;
|
|
mediump float constantAttenuation;
|
|
mediump float linearAttenuation;
|
|
mediump float quadraticAttenuation;
|
|
};
|
|
struct Struct {float a;};
|
|
uniform Light val;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
out0 = res + val.quadraticAttenuation;
|
|
${FRAGMENT_OUTPUT}
|
|
}
|
|
""
|
|
end
|
|
end
|
|
|
|
group block "Uniform blocks"
|
|
case differing_precision
|
|
version 310 es
|
|
expect build_successful
|
|
vertex ""
|
|
#version 310 es
|
|
|
|
uniform Block
|
|
{
|
|
highp vec4 val;
|
|
};
|
|
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
|
|
uniform Block
|
|
{
|
|
mediump vec4 val;
|
|
};
|
|
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
dEQP_FragColor = val;
|
|
}
|
|
""
|
|
end
|
|
|
|
case type_mismatch
|
|
version 310 es
|
|
expect link_fail
|
|
vertex ""
|
|
#version 310 es
|
|
|
|
uniform Block
|
|
{
|
|
highp vec4 val;
|
|
};
|
|
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
|
|
uniform Block
|
|
{
|
|
highp vec3 val;
|
|
};
|
|
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
dEQP_FragColor = vec4(val, 1.0);
|
|
}
|
|
""
|
|
end
|
|
|
|
case members_mismatch
|
|
version 310 es
|
|
expect link_fail
|
|
vertex ""
|
|
#version 310 es
|
|
|
|
uniform Block
|
|
{
|
|
highp vec4 val;
|
|
};
|
|
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
|
|
uniform Block
|
|
{
|
|
highp vec4 val;
|
|
lowp uint u;
|
|
};
|
|
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
dEQP_FragColor = vec4(val);
|
|
}
|
|
""
|
|
end
|
|
|
|
case layout_qualifier_mismatch_1
|
|
version 310 es
|
|
expect link_fail
|
|
vertex ""
|
|
#version 310 es
|
|
|
|
layout(std140) uniform Block
|
|
{
|
|
highp vec4 val;
|
|
};
|
|
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
|
|
uniform Block
|
|
{
|
|
highp vec4 val;
|
|
};
|
|
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
dEQP_FragColor = vec4(val);
|
|
}
|
|
""
|
|
end
|
|
|
|
case layout_qualifier_mismatch_2
|
|
version 310 es
|
|
expect link_fail
|
|
vertex ""
|
|
#version 310 es
|
|
|
|
layout(shared) uniform Block
|
|
{
|
|
highp vec4 val;
|
|
};
|
|
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
|
|
layout(packed) uniform Block
|
|
{
|
|
highp vec4 val;
|
|
};
|
|
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
dEQP_FragColor = vec4(val);
|
|
}
|
|
""
|
|
end
|
|
|
|
case layout_qualifier_mismatch_3
|
|
version 310 es
|
|
expect link_fail
|
|
vertex ""
|
|
#version 310 es
|
|
|
|
layout(row_major) uniform Block
|
|
{
|
|
highp vec4 val;
|
|
};
|
|
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val.x;
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
|
|
layout(column_major) uniform Block
|
|
{
|
|
highp vec4 val;
|
|
};
|
|
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
dEQP_FragColor = vec4(val);
|
|
}
|
|
""
|
|
end
|
|
|
|
case layout_qualifier_mismatch_4
|
|
version 310 es
|
|
expect link_fail
|
|
vertex ""
|
|
#version 310 es
|
|
|
|
layout(row_major) uniform Block
|
|
{
|
|
highp mat3 val;
|
|
};
|
|
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val[0][1];
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
|
|
layout(column_major) uniform Block
|
|
{
|
|
highp mat3 val;
|
|
};
|
|
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
dEQP_FragColor = vec4(val[2], 1.0);
|
|
}
|
|
""
|
|
end
|
|
|
|
case layout_qualifier_mismatch_5
|
|
version 310 es
|
|
expect link_fail
|
|
vertex ""
|
|
#version 310 es
|
|
|
|
uniform Block
|
|
{
|
|
layout(row_major) uniform highp mat3 val;
|
|
};
|
|
|
|
${VERTEX_DECLARATIONS}
|
|
out mediump float res;
|
|
void main()
|
|
{
|
|
res = val[0][1];
|
|
${VERTEX_OUTPUT}
|
|
}
|
|
""
|
|
fragment ""
|
|
#version 310 es
|
|
|
|
uniform Block
|
|
{
|
|
layout(column_major) uniform highp mat3 val;
|
|
};
|
|
|
|
precision mediump float;
|
|
${FRAGMENT_DECLARATIONS}
|
|
in mediump float res;
|
|
void main()
|
|
{
|
|
dEQP_FragColor = vec4(val[2], 1.0);
|
|
}
|
|
""
|
|
end
|
|
end
|