| 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 |