| |
| # Varying tests |
| group varying "Varying linkage" |
| |
| # Linking rules |
| group rules "Varying linking rules" |
| # not declared in vertex shader, declared in fragment shader |
| case fragment_declare |
| version 300 es |
| desc "varying declared in fragment shader, no reference in vertex shader" |
| values { output float out0 = 1.0; } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| in mediump float var; |
| ${FRAGMENT_DECLARATIONS} |
| void main() |
| { |
| out0 = 1.0; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| # declared in vertex shader, no reference in frag shader |
| case vertex_declare |
| version 300 es |
| desc "varying declared in vertex shader, no reference in fragment shader" |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float var; |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(1.0); |
| } |
| "" |
| end |
| |
| # declared in vertex shader, declared in frag shader |
| case both_declare |
| version 300 es |
| desc "varying declared in both vertex and fragment shader, but not used" |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float var; |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| in mediump float var; |
| ${FRAGMENT_DECLARATIONS} |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(1.0); |
| } |
| "" |
| end |
| |
| # declared in vertex shader, static use in frag shader |
| case vertex_declare_fragment_use |
| version 300 es |
| desc "varying declared in both shaders, statically used in fragment shader" |
| values { uniform bool u_false = false; } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float var; |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| in mediump float var; |
| ${FRAGMENT_DECLARATIONS} |
| void main() |
| { |
| if (u_false) |
| ${FRAG_COLOR} = vec4(var); |
| else |
| ${FRAG_COLOR} = vec4(1.0); |
| } |
| "" |
| end |
| |
| # static use in vertex shader, no reference in fragment shader |
| case vertex_use_fragment_declare |
| version 300 es |
| desc "varying declared and statically used in vertex shader, no reference in fragment shader" |
| values { uniform bool u_false = false; } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float var; |
| void main() |
| { |
| if (u_false) |
| var = 1.0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(1.0); |
| } |
| "" |
| end |
| |
| # static use in vertex shader, declared in fragment shader |
| case vertex_use_declare_fragment |
| version 300 es |
| desc "varying declared and statically used in vertex shader, only declared in fragment shader" |
| values { uniform bool u_false = false; } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float var; |
| void main() |
| { |
| if (u_false) |
| var = 1.0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| in mediump float var; |
| ${FRAGMENT_DECLARATIONS} |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(1.0); |
| } |
| "" |
| end |
| |
| # static use in vertex shader, used in fragment shader |
| case vertex_use_fragment_use |
| version 300 es |
| desc "varying statically used in both vertex and fragment shader" |
| values { uniform bool u_false = false; } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float var; |
| void main() |
| { |
| if (u_false) |
| var = 1.0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float var; |
| void main() |
| { |
| if (u_false) |
| ${FRAG_COLOR} = vec4(var); |
| else |
| ${FRAG_COLOR} = vec4(1.0); |
| } |
| "" |
| end |
| |
| # differing precision tests |
| case differing_precision_1 |
| version 300 es |
| desc "varying declared as highp in vertex shader, but mediump in fragment shader" |
| values |
| { |
| input float in0 = [ -1.25 | -25.55 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| output float out0 = [ -1.25 | -25.55 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| } |
| |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out highp float var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| # differing precision tests |
| case differing_precision_2 |
| version 300 es |
| desc "varying declared as highp in vertex shader, but lowp in fragment shader" |
| values |
| { |
| input float in0 = [ -1.25 | -25.56 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| output float out0 = [ -1.25 | -25.56 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| } |
| |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out highp vec2 var; |
| void main() |
| { |
| var = vec2(in0, 2.0*in0); |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in lowp vec2 var; |
| void main() |
| { |
| out0 = var.y - var.x; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| # differing precision tests |
| case differing_precision_3 |
| version 300 es |
| desc "varying declared as lowp in vertex shader, but mediump in fragment shader" |
| values |
| { |
| input float in0 = [ -1.25 | -25.0 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| output float out0 = [ -1.25 | -25.0 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| } |
| |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out lowp vec4 var; |
| void main() |
| { |
| var = vec4(in0, 2.0*in0, -in0, -in0); |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump vec4 var; |
| void main() |
| { |
| out0 = var.x + var.y + var.z + var.w; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| # mismatched type, static use but no runtime use in the fragment shader |
| case type_mismatch_1 |
| version 300 es |
| desc "varying type mismatch (float vs. vec2), static use but no runtime use in the fragment shader" |
| expect link_fail |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float var; |
| void main() |
| { |
| var = 2.0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| in mediump vec2 var; |
| void main() |
| { |
| if (false) |
| { |
| ${FRAG_COLOR} = vec4(var.y); |
| } |
| else |
| { |
| ${FRAG_COLOR} = vec4(1.0); |
| } |
| } |
| "" |
| end |
| |
| # mismatched type, varyings used |
| case type_mismatch_2 |
| version 300 es |
| desc "varying type mismatch (float vs. vec2)" |
| expect link_fail |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float var; |
| void main() |
| { |
| var = 2.0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| in mediump vec2 var; |
| void main() |
| { |
| ${FRAG_COLOR} = var.xyyx; |
| } |
| "" |
| end |
| |
| # mismatched type, varyings used |
| case type_mismatch_3 |
| version 300 es |
| desc "varying type mismatch (int vs. uint)" |
| expect link_fail |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| flat out mediump int var; |
| void main() |
| { |
| var = 2; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| flat in mediump uint var; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(var); |
| } |
| "" |
| end |
| |
| # mismatched type, varyings used |
| case struct_type_mismatch_1 |
| version 300 es |
| desc "struct member mismatch" |
| expect link_fail |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { highp float a; highp vec2 b; }; |
| out S var; |
| void main() |
| { |
| var.a = 2.0; |
| var.b = vec2(1.0, 0.0); |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| struct S { highp float a; highp vec3 b; }; |
| in S var; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(var.a, var.b); |
| } |
| "" |
| end |
| |
| # mismatched type, varyings unused in fragment shader (runtime) |
| case struct_type_mismatch_2 |
| version 300 es |
| desc "struct member mismatch" |
| expect link_fail |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { highp float a; highp vec2 b; }; |
| out S var; |
| void main() |
| { |
| var.a = 2.0; |
| var.b = vec2(1.0, 0.0); |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| struct S { highp float a; highp vec3 b; }; |
| in S var; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(var.a); |
| if (false) |
| ${FRAG_COLOR}.yzw = var.b; |
| } |
| "" |
| end |
| |
| # mismatched type, varyings unused in both (runtime) |
| case struct_type_mismatch_3 |
| version 300 es |
| desc "struct member mismatch" |
| expect link_fail |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { highp float a; highp vec2 b; }; |
| out S var; |
| void main() |
| { |
| var.a = 2.0; |
| if (false) |
| var.b = vec2(1.0, 0.0); |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| struct S { highp float a; highp vec3 b; }; |
| in S var; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(var.a); |
| if (false) |
| ${FRAG_COLOR}.yzw = var.b; |
| } |
| "" |
| end |
| |
| # interpolation_mismatch |
| case interpolation_mismatch_1 |
| version 300 es |
| desc "varying interpolation different (flat vs. smooth)" |
| expect link_fail |
| |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| in highp float in0; |
| flat out mediump float var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float var; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(var); |
| } |
| "" |
| end |
| |
| # different interpolation |
| case differing_interpolation_2 |
| version 300 es |
| desc "varying interpolation different (smooth vs. centroid)" |
| values |
| { |
| input float in0 = [ -1.25 | -25.0 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| output float out0 = [ -1.25 | -25.0 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| } |
| |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| smooth out mediump float var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| centroid in mediump float var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| # no declaration in vertex shader, but static use in fragment |
| case illegal_usage_1 |
| version 300 es |
| desc "varying not declared in vertex shader, but statically used in fragment shader" |
| expect link_fail |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float var; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(var); |
| } |
| "" |
| end |
| |
| # non-flat integer varyings not allowed |
| case invalid_type_int |
| version 300 es |
| desc "integer varying used" |
| expect compile_fail |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump int var; |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| in mediump int var; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(1.0); |
| } |
| "" |
| end |
| |
| # non-flat integer varyings not allowed |
| case invalid_type_uint |
| version 300 es |
| desc "integer varying used" |
| expect compile_fail |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump uint var; |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| in mediump uint var; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(1.0); |
| } |
| "" |
| end |
| |
| # bool varyings not allowed |
| case invalid_type_bool |
| version 300 es |
| desc "boolean varying used" |
| expect compile_fail |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out bool var; |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| in bool var; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(1.0); |
| } |
| "" |
| end |
| |
| case invalid_type_struct_array |
| version 300 es |
| desc "float array inside struct" |
| expect compile_fail |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump float a[3]; }; |
| out S var; |
| void main() |
| { |
| var.a[0] = 1.0; |
| var.a[1] = 1.0; |
| var.a[2] = 1.0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump float a[3]; }; |
| in S var; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(1.0); |
| } |
| "" |
| end |
| |
| case invalid_type_struct_struct |
| version 300 es |
| desc "struct inside struct" |
| expect compile_fail |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump float a; }; |
| struct T { S s; }; |
| out T var; |
| void main() |
| { |
| var.s.a = 1.0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump float a; }; |
| struct T { S s; }; |
| in T var; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(1.0); |
| } |
| "" |
| end |
| |
| case invalid_type_array_struct |
| version 300 es |
| desc "array of structs" |
| expect compile_fail |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump int a; }; |
| flat out S var[2]; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var[0].a = 1; |
| var[1].a = 1; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump int a; }; |
| flat in S var[2]; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(1.0); |
| } |
| "" |
| end |
| |
| case invalid_type_array_array |
| version 300 es |
| desc "array of arrays" |
| expect compile_fail |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float var[2][2]; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var[0][0] = 1.0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float var[2][2]; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(1.0); |
| } |
| "" |
| end |
| end |
| |
| group basic_types "Basic varying types" |
| case float |
| version 300 es |
| desc "varying of type float" |
| values |
| { |
| input float in0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| output float out0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in float var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case vec2 |
| version 300 es |
| desc "varying of type vec2" |
| values |
| { |
| input vec2 in0 = [ vec2(-1.25, 1.25) | vec2(-25.65, -7.25) | vec2(0.0, 1.0) | vec2(2.25, 2.25) | vec2(3.4, 9.5) | vec2(16.0, 32.0) ]; |
| output vec2 out0 = [ vec2(-1.25, 1.25) | vec2(-25.65, -7.25) | vec2(0.0, 1.0) | vec2(2.25, 2.25) | vec2(3.4, 9.5) | vec2(16.0, 32.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump vec2 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in vec2 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case vec3 |
| version 300 es |
| desc "varying of type vec3" |
| values |
| { |
| input vec3 in0 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; |
| output vec3 out0 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump vec3 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in vec3 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case vec4 |
| version 300 es |
| desc "varying of type vec4" |
| values |
| { |
| input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; |
| output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump vec4 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in vec4 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat2 |
| version 300 es |
| desc "varying of type mat2" |
| values |
| { |
| input mat2 in0 = [ mat2(1.0, 1.0, 1.0, 1.0) | mat2(-1.25, 1.25, -9.5, -12.2) | mat2(-25.65, -7.25, 14.21, -77.7) | mat2(0.0, 1.0, -1.0, 2.0) | mat2(2.25, 2.25, 22.5, 225.0) | mat2(3.4, 9.5, 19.5, 29.5) | mat2(16.0, 32.0, -64.0, -128.0) ]; |
| output mat2 out0 = [ mat2(1.0, 1.0, 1.0, 1.0) | mat2(-1.25, 1.25, -9.5, -12.2) | mat2(-25.65, -7.25, 14.21, -77.7) | mat2(0.0, 1.0, -1.0, 2.0) | mat2(2.25, 2.25, 22.5, 225.0) | mat2(3.4, 9.5, 19.5, 29.5) | mat2(16.0, 32.0, -64.0, -128.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump mat2 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mat2 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat2x3 |
| version 300 es |
| desc "varying of type mat2x3" |
| values |
| { |
| input mat2x3 in0 = [ mat2x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; |
| output mat2x3 out0 = [ mat2x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump mat2x3 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mat2x3 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat2x4 |
| version 300 es |
| desc "varying of type mat2x4" |
| values |
| { |
| input mat2x4 in0 = [ mat2x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; |
| output mat2x4 out0 = [ mat2x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump mat2x4 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mat2x4 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat3x2 |
| version 300 es |
| desc "varying of type mat3x2" |
| values |
| { |
| input mat3x2 in0 = [ mat3x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; |
| output mat3x2 out0 = [ mat3x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump mat3x2 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mat3x2 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat3 |
| version 300 es |
| desc "varying of type mat3" |
| values |
| { |
| input mat3 in0 = [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) | mat3(0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0, -9.9) | mat3(3.4, 9.5, 19.5, 29.5, 16.0, 32.0, -64.0, -128.0, 256.0) ]; |
| output mat3 out0 = [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) | mat3(0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0, -9.9) | mat3(3.4, 9.5, 19.5, 29.5, 16.0, 32.0, -64.0, -128.0, 256.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump mat3 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mat3 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat3x4 |
| version 300 es |
| desc "varying of type mat3x4" |
| values |
| { |
| input mat3x4 in0 = [ mat3x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; |
| output mat3x4 out0 = [ mat3x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump mat3x4 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mat3x4 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat4x2 |
| version 300 es |
| desc "varying of type mat4x2" |
| values |
| { |
| input mat4x2 in0 = [ mat4x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; |
| output mat4x2 out0 = [ mat4x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump mat4x2 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mat4x2 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat4x3 |
| version 300 es |
| desc "varying of type mat4x3" |
| values |
| { |
| input mat4x3 in0 = [ mat4x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; |
| output mat4x3 out0 = [ mat4x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump mat4x3 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mat4x3 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat4 |
| version 300 es |
| desc "varying of type mat4" |
| values |
| { |
| input mat4 in0 = [ mat4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0) ]; |
| output mat4 out0 = [ mat4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| out mediump mat4 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mat4 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case int |
| version 300 es |
| desc "varying of type int" |
| values |
| { |
| input int in0 = [ -1 | -25 | 1 | 2 | 3 | 16 ]; |
| output int out0 = [ -1 | -25 | 1 | 2 | 3 | 16 ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| flat out mediump int var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| flat in int var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case ivec2 |
| version 300 es |
| desc "varying of type ivec2" |
| values |
| { |
| input ivec2 in0 = [ ivec2(-1, 1) | ivec2(-25, 25) | ivec2(1, 1) | ivec2(2, 3) | ivec2(16, 17) ]; |
| output ivec2 out0 = [ ivec2(-1, 1) | ivec2(-25, 25) | ivec2(1, 1) | ivec2(2, 3) | ivec2(16, 17) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| flat out mediump ivec2 var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| flat in ivec2 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case ivec3 |
| version 300 es |
| desc "varying of type ivec3" |
| values |
| { |
| input ivec3 in0 = [ ivec3(-1, 1, -2) | ivec3(-25, 25, -3) | ivec3(1, 1, 1) | ivec3(2, 3, 4) | ivec3(16, 17, 18) ]; |
| output ivec3 out0 = [ ivec3(-1, 1, -2) | ivec3(-25, 25, -3) | ivec3(1, 1, 1) | ivec3(2, 3, 4) | ivec3(16, 17, 18) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| flat out mediump ivec3 var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| flat in ivec3 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case ivec4 |
| version 300 es |
| desc "varying of type ivec4" |
| values |
| { |
| input ivec4 in0 = [ ivec4(-1, 1, -2, 2) | ivec4(-25, 25, -3, 3) | ivec4(1, 1, 1, 1) | ivec4(2, 3, 4, 5) | ivec4(16, 17, 18, 19) ]; |
| output ivec4 out0 = [ ivec4(-1, 1, -2, 2) | ivec4(-25, 25, -3, 3) | ivec4(1, 1, 1, 1) | ivec4(2, 3, 4, 5) | ivec4(16, 17, 18, 19) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| flat out mediump ivec4 var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| flat in ivec4 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case uint |
| version 300 es |
| desc "varying of type int" |
| values |
| { |
| input uint in0 = [ 1 | 2 | 3 | 16 ]; |
| output uint out0 = [ 1 | 2 | 3 | 16 ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| flat out mediump uint var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| flat in uint var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case uvec2 |
| version 300 es |
| desc "varying of type uvec2" |
| values |
| { |
| input uvec2 in0 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) ]; |
| output uvec2 out0 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| flat out mediump uvec2 var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| flat in uvec2 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case uvec3 |
| version 300 es |
| desc "varying of type uvec3" |
| values |
| { |
| input uvec3 in0 = [ uvec3(1, 1, 2) | uvec3(25, 25, 3) | uvec3(1, 1, 1) | uvec3(2, 3, 4) | uvec3(16, 17, 18) ]; |
| output uvec3 out0 = [ uvec3(1, 1, 2) | uvec3(25, 25, 3) | uvec3(1, 1, 1) | uvec3(2, 3, 4) | uvec3(16, 17, 18) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| flat out mediump uvec3 var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| flat in uvec3 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case uvec4 |
| version 300 es |
| desc "varying of type uvec4" |
| values |
| { |
| input uvec4 in0 = [ uvec4(1, 1, 2, 2) | uvec4(25, 25, 3, 3) | uvec4(1, 1, 1, 1) | uvec4(2, 3, 4, 5) | uvec4(16, 17, 18, 19) ]; |
| output uvec4 out0 = [ uvec4(1, 1, 2, 2) | uvec4(25, 25, 3, 3) | uvec4(1, 1, 1, 1) | uvec4(2, 3, 4, 5) | uvec4(16, 17, 18, 19) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| flat out mediump uvec4 var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| flat in uvec4 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| end |
| |
| group struct "Structure varyings" |
| case float |
| version 300 es |
| desc "varying of type float inside struct" |
| values |
| { |
| input float in0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| output float out0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump float a; }; |
| out S var; |
| void main() |
| { |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump float a; }; |
| in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case vec2 |
| version 300 es |
| desc "varying of type vec2 inside struct" |
| values |
| { |
| input vec2 in0 = [ vec2(-1.25, 1.25) | vec2(-25.65, -7.25) | vec2(0.0, 1.0) | vec2(2.25, 2.25) | vec2(3.4, 9.5) | vec2(16.0, 32.0) ]; |
| output vec2 out0 = [ vec2(-1.25, 1.25) | vec2(-25.65, -7.25) | vec2(0.0, 1.0) | vec2(2.25, 2.25) | vec2(3.4, 9.5) | vec2(16.0, 32.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump vec2 a; }; |
| out S var; |
| void main() |
| { |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump vec2 a; }; |
| in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case vec3 |
| version 300 es |
| desc "varying of type vec3 inside struct" |
| values |
| { |
| input vec3 in0 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; |
| output vec3 out0 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump vec3 a; }; |
| out S var; |
| void main() |
| { |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump vec3 a; }; |
| in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case vec4 |
| version 300 es |
| desc "varying of type vec4 inside struct" |
| values |
| { |
| input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; |
| output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump vec4 a; }; |
| out S var; |
| void main() |
| { |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump vec4 a; }; |
| in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat2 |
| version 300 es |
| desc "varying of type mat2 inside struct" |
| values |
| { |
| input mat2 in0 = [ mat2(1.0, 1.0, 1.0, 1.0) | mat2(-1.25, 1.25, -9.5, -12.2) | mat2(-25.65, -7.25, 14.21, -77.7) | mat2(0.0, 1.0, -1.0, 2.0) | mat2(2.25, 2.25, 22.5, 225.0) | mat2(3.4, 9.5, 19.5, 29.5) | mat2(16.0, 32.0, -64.0, -128.0) ]; |
| output mat2 out0 = [ mat2(1.0, 1.0, 1.0, 1.0) | mat2(-1.25, 1.25, -9.5, -12.2) | mat2(-25.65, -7.25, 14.21, -77.7) | mat2(0.0, 1.0, -1.0, 2.0) | mat2(2.25, 2.25, 22.5, 225.0) | mat2(3.4, 9.5, 19.5, 29.5) | mat2(16.0, 32.0, -64.0, -128.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump mat2 a; }; |
| out S var; |
| void main() |
| { |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump mat2 a; }; |
| in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat2x3 |
| version 300 es |
| desc "varying of type mat2x3 inside struct" |
| values |
| { |
| input mat2x3 in0 = [ mat2x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; |
| output mat2x3 out0 = [ mat2x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump mat2x3 a; }; |
| out S var; |
| void main() |
| { |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump mat2x3 a; }; |
| in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat2x4 |
| version 300 es |
| desc "varying of type mat2x4 inside struct" |
| values |
| { |
| input mat2x4 in0 = [ mat2x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; |
| output mat2x4 out0 = [ mat2x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump mat2x4 a; }; |
| out S var; |
| void main() |
| { |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump mat2x4 a; }; |
| in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat3x2 |
| version 300 es |
| desc "varying of type mat3x2 inside struct" |
| values |
| { |
| input mat3x2 in0 = [ mat3x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; |
| output mat3x2 out0 = [ mat3x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump mat3x2 a; }; |
| out S var; |
| void main() |
| { |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump mat3x2 a; }; |
| in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat3 |
| version 300 es |
| desc "varying of type mat3 inside struct" |
| values |
| { |
| input mat3 in0 = [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) | mat3(0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0, -9.9) | mat3(3.4, 9.5, 19.5, 29.5, 16.0, 32.0, -64.0, -128.0, 256.0) ]; |
| output mat3 out0 = [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) | mat3(0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0, -9.9) | mat3(3.4, 9.5, 19.5, 29.5, 16.0, 32.0, -64.0, -128.0, 256.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump mat3 a; }; |
| out S var; |
| void main() |
| { |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump mat3 a; }; |
| in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat3x4 |
| version 300 es |
| desc "varying of type mat3x4 inside struct" |
| values |
| { |
| input mat3x4 in0 = [ mat3x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; |
| output mat3x4 out0 = [ mat3x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump mat3x4 a; }; |
| out S var; |
| void main() |
| { |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump mat3x4 a; }; |
| in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat4x2 |
| version 300 es |
| desc "varying of type mat4x2 inside struct" |
| values |
| { |
| input mat4x2 in0 = [ mat4x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; |
| output mat4x2 out0 = [ mat4x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump mat4x2 a; }; |
| out S var; |
| void main() |
| { |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump mat4x2 a; }; |
| in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat4x3 |
| version 300 es |
| desc "varying of type mat4x3 inside struct" |
| values |
| { |
| input mat4x3 in0 = [ mat4x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; |
| output mat4x3 out0 = [ mat4x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump mat4x3 a; }; |
| out S var; |
| void main() |
| { |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump mat4x3 a; }; |
| in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case mat4 |
| version 300 es |
| desc "varying of type mat4 inside struct" |
| values |
| { |
| input mat4 in0 = [ mat4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0) ]; |
| output mat4 out0 = [ mat4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 0.0, 1.0, -1.0, 2.0, 2.25, 2.25, 22.5, 225.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump mat4 a; }; |
| out S var; |
| void main() |
| { |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump mat4 a; }; |
| in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case int |
| version 300 es |
| desc "varying of type int inside struct" |
| values |
| { |
| input int in0 = [ -1 | -25 | 1 | 2 | 3 | 16 ]; |
| output int out0 = [ -1 | -25 | 1 | 2 | 3 | 16 ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump int a; }; |
| flat out S var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump int a; }; |
| flat in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case ivec2 |
| version 300 es |
| desc "varying of type ivec2 inside struct" |
| values |
| { |
| input ivec2 in0 = [ ivec2(-1, 1) | ivec2(-25, 25) | ivec2(1, 1) | ivec2(2, 3) | ivec2(16, 17) ]; |
| output ivec2 out0 = [ ivec2(-1, 1) | ivec2(-25, 25) | ivec2(1, 1) | ivec2(2, 3) | ivec2(16, 17) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump ivec2 a; }; |
| flat out S var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump ivec2 a; }; |
| flat in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case ivec3 |
| version 300 es |
| desc "varying of type ivec3 inside struct" |
| values |
| { |
| input ivec3 in0 = [ ivec3(-1, 1, -2) | ivec3(-25, 25, -3) | ivec3(1, 1, 1) | ivec3(2, 3, 4) | ivec3(16, 17, 18) ]; |
| output ivec3 out0 = [ ivec3(-1, 1, -2) | ivec3(-25, 25, -3) | ivec3(1, 1, 1) | ivec3(2, 3, 4) | ivec3(16, 17, 18) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump ivec3 a; }; |
| flat out S var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump ivec3 a; }; |
| flat in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case ivec4 |
| version 300 es |
| desc "varying of type ivec4 inside struct" |
| values |
| { |
| input ivec4 in0 = [ ivec4(-1, 1, -2, 2) | ivec4(-25, 25, -3, 3) | ivec4(1, 1, 1, 1) | ivec4(2, 3, 4, 5) | ivec4(16, 17, 18, 19) ]; |
| output ivec4 out0 = [ ivec4(-1, 1, -2, 2) | ivec4(-25, 25, -3, 3) | ivec4(1, 1, 1, 1) | ivec4(2, 3, 4, 5) | ivec4(16, 17, 18, 19) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump ivec4 a; }; |
| flat out S var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump ivec4 a; }; |
| flat in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case uint |
| version 300 es |
| desc "varying of type uint in struct" |
| values |
| { |
| input uint in0 = [ 1 | 2 | 3 | 16 ]; |
| output uint out0 = [ 1 | 2 | 3 | 16 ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump uint a; }; |
| flat out S var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump uint a; }; |
| flat in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case uvec2 |
| version 300 es |
| desc "varying of type uvec2 inside struct" |
| values |
| { |
| input uvec2 in0 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) ]; |
| output uvec2 out0 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump uvec2 a; }; |
| flat out S var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump uvec2 a; }; |
| flat in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case uvec3 |
| version 300 es |
| desc "varying of type uvec3 inside struct" |
| values |
| { |
| input uvec3 in0 = [ uvec3(1, 1, 2) | uvec3(25, 25, 3) | uvec3(1, 1, 1) | uvec3(2, 3, 4) | uvec3(16, 17, 18) ]; |
| output uvec3 out0 = [ uvec3(1, 1, 2) | uvec3(25, 25, 3) | uvec3(1, 1, 1) | uvec3(2, 3, 4) | uvec3(16, 17, 18) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump uvec3 a; }; |
| flat out S var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump uvec3 a; }; |
| flat in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case uvec4 |
| version 300 es |
| desc "varying of type uvec4 inside struct" |
| values |
| { |
| input uvec4 in0 = [ uvec4(1, 1, 2, 2) | uvec4(25, 25, 3, 3) | uvec4(1, 1, 1, 1) | uvec4(2, 3, 4, 5) | uvec4(16, 17, 18, 19) ]; |
| output uvec4 out0 = [ uvec4(1, 1, 2, 2) | uvec4(25, 25, 3, 3) | uvec4(1, 1, 1, 1) | uvec4(2, 3, 4, 5) | uvec4(16, 17, 18, 19) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump uvec4 a; }; |
| flat out S var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var.a = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump uvec4 a; }; |
| flat in S var; |
| void main() |
| { |
| out0 = var.a; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case float_vec3 |
| version 300 es |
| desc "varyings of type float and vec3 inside struct" |
| values |
| { |
| input float in0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| output float out0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| input vec3 in1 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; |
| output vec3 out1 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump float a; highp vec3 b; }; |
| out S var; |
| void main() |
| { |
| var.a = in0; |
| var.b = in1; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump float a; highp vec3 b; }; |
| in S var; |
| void main() |
| { |
| out0 = var.a; |
| out1 = var.b; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case float_uvec2_vec3 |
| version 300 es |
| desc "varyings of type float and vec3 inside struct" |
| values |
| { |
| input float in0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| output float out0 = [ -1.25 | -25.65 | 1.0 | 2.25 | 3.4 | 16.0 ]; |
| input uvec2 in1 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) | uvec2(8, 7) ]; |
| output uvec2 out1 = [ uvec2(1, 1) | uvec2(25, 25) | uvec2(1, 1) | uvec2(2, 3) | uvec2(16, 17) | uvec2(8, 7) ]; |
| input vec3 in2 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; |
| output vec3 out2 = [ vec3(-1.25, 1.25, -9.5) | vec3(-25.65, -7.25, 14.21) | vec3(0.0, 1.0, -1.0) | vec3(2.25, 2.25, 22.5) | vec3(3.4, 9.5, 19.5) | vec3(16.0, 32.0, -64.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| struct S { mediump float a; highp uvec2 b; highp vec3 c; }; |
| flat out S var; |
| void main() |
| { |
| ${VERTEX_SETUP} |
| var.a = in0; |
| var.b = in1; |
| var.c = in2; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| struct S { mediump float a; highp uvec2 b; highp vec3 c; }; |
| flat in S var; |
| void main() |
| { |
| out0 = var.a; |
| out1 = var.b; |
| out2 = var.c; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| end |
| |
| group interpolation "Varying interpolation modes" |
| case smooth |
| version 300 es |
| desc "varying of type vec4" |
| values |
| { |
| input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; |
| output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| smooth out mediump vec4 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| smooth in vec4 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case centroid |
| version 300 es |
| desc "varying of type vec4" |
| values |
| { |
| input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; |
| output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| centroid out mediump vec4 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| centroid in vec4 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case flat |
| version 300 es |
| desc "varying of type vec4" |
| values |
| { |
| input vec4 in0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; |
| output vec4 out0 = [ vec4(-1.25, 1.25, -9.5, -12.2) | vec4(-25.65, -7.25, 14.21, -77.7) | vec4(0.0, 1.0, -1.0, 2.0) | vec4(2.25, 2.25, 22.5, 225.0) | vec4(3.4, 9.5, 19.5, 29.5) | vec4(16.0, 32.0, -64.0, -128.0) ]; |
| } |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| flat out mediump vec4 var; |
| void main() |
| { |
| var = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| flat in vec4 var; |
| void main() |
| { |
| out0 = var; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| end |
| |
| group usage "Varying usage in shaders" |
| case readback_1 |
| version 300 es |
| desc "read back (an already written) varying in the vertex shader" |
| values |
| { |
| input float in0 = [ 1.0 | 0.0 | -2.0 | 10.0 ]; |
| output float out0 = [ 3.0 | 0.0 | -6.0 | 30.0 ]; |
| } |
| vertex "" |
| #version 300 es |
| precision mediump float; |
| ${VERTEX_DECLARATIONS} |
| out float var1; |
| out float var2; |
| |
| void main() |
| { |
| var1 = in0; |
| var2 = var1 + in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in float var1; |
| in float var2; |
| |
| void main() |
| { |
| out0 = var1 + var2; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case writeback_1 |
| version 300 es |
| desc "write back a varying in the fragment shader" |
| values |
| { |
| input float in0 = [ 1.0 | 0.0 | -2.0 | 10.0 ]; |
| } |
| expect compile_fail |
| vertex "" |
| #version 300 es |
| precision mediump float; |
| ${VERTEX_DECLARATIONS} |
| out float var1; |
| out float var2; |
| |
| void main() |
| { |
| var1 = in0; |
| var2 = var1 + in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in float var1; |
| in float var2; |
| |
| void main() |
| { |
| var2 = var1; |
| out0 = var1; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| end |
| end |
| |
| group uniform "Uniform linkage" |
| group basic "Default block uniforms of scalar and vector types" |
| case precision_conflict_1 |
| version 300 es |
| desc "Vertex side uniform has highp, fragment side uniform mediump." |
| expect link_fail |
| values {output float out0 = 3.0;} |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| uniform highp float u_val; |
| out mediump float res; |
| void main() |
| { |
| res = u_val; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 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 300 es |
| desc "Vertex side uniform has highp, fragment side uniform mediump." |
| expect link_fail |
| values {output float out0 = 3.0;} |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| uniform highp float u_val; |
| out mediump float res; |
| void main() |
| { |
| res = u_val; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 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 300 es |
| desc "Vertex side uniform has lowp, fragment side uniform highp." |
| expect link_fail |
| values {output float out0 = 3.0;} |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| uniform lowp int u_val; |
| out mediump float res; |
| void main() |
| { |
| res = float(u_val); |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 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 300 es |
| desc "Vertex side uniform has lowp, fragment side uniform mediump." |
| expect link_fail |
| values {output float out0 = 3.0;} |
| vertex "" |
| #version 300 es |
| ${VERTEX_DECLARATIONS} |
| uniform lowp vec3 u_val; |
| out mediump float res; |
| void main() |
| { |
| res = u_val.y; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 es |
| ${VERTEX_DECLARATIONS} |
| struct Struct {mediump float a; mediump float b;}; |
| uniform Struct val; |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 es |
| ${VERTEX_DECLARATIONS} |
| struct Struct {mediump vec4 a; mediump vec4 b;}; |
| uniform Struct val; |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 es |
| ${VERTEX_DECLARATIONS} |
| struct Struct {mediump vec4 a; mediump vec3 b;}; |
| uniform Struct val; |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 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 300 es |
| ${VERTEX_DECLARATIONS} |
| struct Struct {mediump vec4 a; mediump float b;}; |
| uniform Struct val; |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| fragment "" |
| #version 300 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 300 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 300 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 300 es |
| precision mediump float; |
| struct Struct {mediump vec4 a; mediump float b;}; |
|