| |
| group varying "Varying linkage" |
| group rules "Rules" |
| |
| case type_mismatch |
| version 310 es |
| desc "Tessellation output and geometry input type mismatch" |
| expect link_fail |
| require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } |
| require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry } |
| values |
| { |
| input float in0 = 1.0; |
| output float out0 = 1.0; |
| } |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float vtx_out; |
| void main() |
| { |
| vtx_out = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| tessellation_control "" |
| #version 310 es |
| ${TESSELLATION_CONTROL_DECLARATIONS} |
| in mediump float vtx_out[]; |
| out mediump float tc_out[]; |
| void main() |
| { |
| tc_out[gl_InvocationID] = vtx_out[gl_InvocationID]; |
| ${TESSELLATION_CONTROL_OUTPUT} |
| } |
| "" |
| tessellation_evaluation "" |
| #version 310 es |
| ${TESSELLATION_EVALUATION_DECLARATIONS} |
| in mediump float tc_out[]; |
| out mediump float te_out; |
| void main() |
| { |
| te_out = tc_out[2]; |
| ${TESSELLATION_EVALUATION_OUTPUT} |
| } |
| "" |
| geometry "" |
| #version 310 es |
| ${GEOMETRY_DECLARATIONS} |
| in mediump vec2 te_out[]; |
| out mediump float geo_out; |
| void main() |
| { |
| for (int ndx = 0; ndx < gl_in.length(); ++ndx) |
| { |
| geo_out = te_out[ndx].y; |
| gl_Position = gl_in[ndx].gl_Position; |
| EmitVertex(); |
| } |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float geo_out; |
| void main() |
| { |
| out0 = geo_out; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case different_precision |
| version 310 es |
| desc "Tessellation output and geometry input precisions are different" |
| require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } |
| require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry } |
| values |
| { |
| input float in0 = 1.0; |
| output float out0 = 1.0; |
| } |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float vtx_out; |
| void main() |
| { |
| vtx_out = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| tessellation_control "" |
| #version 310 es |
| ${TESSELLATION_CONTROL_DECLARATIONS} |
| in mediump float vtx_out[]; |
| out mediump float tc_out[]; |
| void main() |
| { |
| tc_out[gl_InvocationID] = vtx_out[gl_InvocationID]; |
| ${TESSELLATION_CONTROL_OUTPUT} |
| } |
| "" |
| tessellation_evaluation "" |
| #version 310 es |
| ${TESSELLATION_EVALUATION_DECLARATIONS} |
| in mediump float tc_out[]; |
| out mediump float te_out; |
| void main() |
| { |
| te_out = tc_out[2]; |
| ${TESSELLATION_EVALUATION_OUTPUT} |
| } |
| "" |
| geometry "" |
| #version 310 es |
| ${GEOMETRY_DECLARATIONS} |
| in highp float te_out[]; |
| out mediump float geo_out; |
| void main() |
| { |
| for (int ndx = 0; ndx < gl_in.length(); ++ndx) |
| { |
| geo_out = te_out[ndx]; |
| gl_Position = gl_in[ndx].gl_Position; |
| EmitVertex(); |
| } |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float geo_out; |
| void main() |
| { |
| out0 = geo_out; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case no_output_declaration |
| version 310 es |
| desc "Geometry input has no matching output" |
| expect link_fail |
| require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } |
| require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry } |
| values |
| { |
| input float in0 = 1.0; |
| output float out0 = 1.0; |
| } |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float vtx_out; |
| void main() |
| { |
| vtx_out = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| tessellation_control "" |
| #version 310 es |
| ${TESSELLATION_CONTROL_DECLARATIONS} |
| in mediump float vtx_out[]; |
| out mediump float tc_out[]; |
| void main() |
| { |
| tc_out[gl_InvocationID] = vtx_out[gl_InvocationID]; |
| ${TESSELLATION_CONTROL_OUTPUT} |
| } |
| "" |
| tessellation_evaluation "" |
| #version 310 es |
| ${TESSELLATION_EVALUATION_DECLARATIONS} |
| in mediump float tc_out[]; |
| out mediump float te_out; |
| void main() |
| { |
| te_out = tc_out[2]; |
| ${TESSELLATION_EVALUATION_OUTPUT} |
| } |
| "" |
| geometry "" |
| #version 310 es |
| ${GEOMETRY_DECLARATIONS} |
| in mediump float te_out[]; |
| in mediump float te_out_nonexistent[]; |
| out mediump float geo_out; |
| void main() |
| { |
| for (int ndx = 0; ndx < gl_in.length(); ++ndx) |
| { |
| geo_out = te_out[ndx] + te_out_nonexistent[ndx]; |
| gl_Position = gl_in[ndx].gl_Position; |
| EmitVertex(); |
| } |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float geo_out; |
| void main() |
| { |
| out0 = geo_out; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case superfluous_output_declaration |
| version 310 es |
| desc "Tessellation shader output is never used" |
| require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } |
| require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry } |
| values |
| { |
| input float in0 = 1.0; |
| output float out0 = 1.0; |
| } |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float vtx_out; |
| void main() |
| { |
| vtx_out = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| tessellation_control "" |
| #version 310 es |
| ${TESSELLATION_CONTROL_DECLARATIONS} |
| in mediump float vtx_out[]; |
| out mediump float tc_out[]; |
| void main() |
| { |
| tc_out[gl_InvocationID] = vtx_out[gl_InvocationID]; |
| ${TESSELLATION_CONTROL_OUTPUT} |
| } |
| "" |
| tessellation_evaluation "" |
| #version 310 es |
| ${TESSELLATION_EVALUATION_DECLARATIONS} |
| in mediump float tc_out[]; |
| out mediump float te_out; |
| out mediump float te_out_nonexistent; |
| void main() |
| { |
| te_out = tc_out[2]; |
| te_out_nonexistent = tc_out[0]; |
| ${TESSELLATION_EVALUATION_OUTPUT} |
| } |
| "" |
| geometry "" |
| #version 310 es |
| ${GEOMETRY_DECLARATIONS} |
| in mediump float te_out[]; |
| out mediump float geo_out; |
| void main() |
| { |
| for (int ndx = 0; ndx < gl_in.length(); ++ndx) |
| { |
| geo_out = te_out[ndx]; |
| gl_Position = gl_in[ndx].gl_Position; |
| EmitVertex(); |
| } |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float geo_out; |
| void main() |
| { |
| out0 = geo_out; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case vertex_geometry_same_varying_name_1 |
| version 310 es |
| desc "Vertex output and geometry input share the same name" |
| require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } |
| require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry } |
| values |
| { |
| input float in0 = 1.0; |
| output float out0 = 1.0; |
| } |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float sharedVaringName; |
| void main() |
| { |
| sharedVaringName = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| tessellation_control "" |
| #version 310 es |
| ${TESSELLATION_CONTROL_DECLARATIONS} |
| in mediump float sharedVaringName[]; |
| out mediump float tc_out[]; |
| void main() |
| { |
| tc_out[gl_InvocationID] = sharedVaringName[gl_InvocationID]; |
| ${TESSELLATION_CONTROL_OUTPUT} |
| } |
| "" |
| tessellation_evaluation "" |
| #version 310 es |
| ${TESSELLATION_EVALUATION_DECLARATIONS} |
| in mediump float tc_out[]; |
| out mediump float sharedVaringName; |
| void main() |
| { |
| sharedVaringName = tc_out[2]; |
| ${TESSELLATION_EVALUATION_OUTPUT} |
| } |
| "" |
| geometry "" |
| #version 310 es |
| ${GEOMETRY_DECLARATIONS} |
| in mediump float sharedVaringName[]; |
| out mediump float geo_out; |
| void main() |
| { |
| for (int ndx = 0; ndx < gl_in.length(); ++ndx) |
| { |
| geo_out = sharedVaringName[ndx]; |
| gl_Position = gl_in[ndx].gl_Position; |
| EmitVertex(); |
| } |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float geo_out; |
| void main() |
| { |
| out0 = geo_out; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case vertex_geometry_same_varying_name_2 |
| version 310 es |
| desc "Vertex output and geometry input share the same name" |
| require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } |
| require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry } |
| values |
| { |
| input vec2 in0 = vec2(1.0, 1.0); |
| output float out0 = 1.0; |
| } |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| out mediump vec2 sharedVaringName; |
| void main() |
| { |
| sharedVaringName = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| tessellation_control "" |
| #version 310 es |
| ${TESSELLATION_CONTROL_DECLARATIONS} |
| in mediump vec2 sharedVaringName[]; |
| out mediump float tc_out[]; |
| void main() |
| { |
| tc_out[gl_InvocationID] = 2.0 * sharedVaringName[gl_InvocationID].x - sharedVaringName[gl_InvocationID].y; |
| ${TESSELLATION_CONTROL_OUTPUT} |
| } |
| "" |
| tessellation_evaluation "" |
| #version 310 es |
| ${TESSELLATION_EVALUATION_DECLARATIONS} |
| in mediump float tc_out[]; |
| out mediump float sharedVaringName; |
| void main() |
| { |
| sharedVaringName = tc_out[2]; |
| ${TESSELLATION_EVALUATION_OUTPUT} |
| } |
| "" |
| geometry "" |
| #version 310 es |
| ${GEOMETRY_DECLARATIONS} |
| in mediump float sharedVaringName[]; |
| out mediump float geo_out; |
| void main() |
| { |
| for (int ndx = 0; ndx < gl_in.length(); ++ndx) |
| { |
| geo_out = sharedVaringName[ndx]; |
| gl_Position = gl_in[ndx].gl_Position; |
| EmitVertex(); |
| } |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float geo_out; |
| void main() |
| { |
| out0 = geo_out; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case io_block |
| version 310 es |
| desc "Use of io block between tessellation and geometry shaders" |
| require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } |
| require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry } |
| values |
| { |
| input float in0 = 1.0; |
| output float out0 = 1.0; |
| } |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float vtx_out; |
| void main() |
| { |
| vtx_out = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| tessellation_control "" |
| #version 310 es |
| ${TESSELLATION_CONTROL_DECLARATIONS} |
| in mediump float vtx_out[]; |
| out mediump float tc_out[]; |
| void main() |
| { |
| tc_out[gl_InvocationID] = vtx_out[gl_InvocationID]; |
| ${TESSELLATION_CONTROL_OUTPUT} |
| } |
| "" |
| tessellation_evaluation "" |
| #version 310 es |
| ${TESSELLATION_EVALUATION_DECLARATIONS} |
| in mediump float tc_out[]; |
| out IOBlockName { mediump float val; } instanceName; |
| void main() |
| { |
| instanceName.val = tc_out[2]; |
| ${TESSELLATION_EVALUATION_OUTPUT} |
| } |
| "" |
| geometry "" |
| #version 310 es |
| ${GEOMETRY_DECLARATIONS} |
| in IOBlockName { mediump float val; } instanceName[]; |
| out mediump float geo_out; |
| void main() |
| { |
| geo_out = instanceName[0].val; |
| gl_Position = gl_in[0].gl_Position; |
| EmitVertex(); |
| |
| geo_out = instanceName[1].val; |
| gl_Position = gl_in[1].gl_Position; |
| EmitVertex(); |
| |
| geo_out = instanceName[2].val; |
| gl_Position = gl_in[2].gl_Position; |
| EmitVertex(); |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float geo_out; |
| void main() |
| { |
| out0 = geo_out; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| |
| case array_in_io_block |
| version 310 es |
| desc "Float array in a io block between tessellation and geometry shaders" |
| require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } |
| require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry } |
| values |
| { |
| input float in0 = 1.0; |
| output float out0 = 1.0; |
| } |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| out mediump float vtx_out; |
| void main() |
| { |
| vtx_out = in0; |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| tessellation_control "" |
| #version 310 es |
| ${TESSELLATION_CONTROL_DECLARATIONS} |
| in mediump float vtx_out[]; |
| out mediump float tc_out[]; |
| void main() |
| { |
| tc_out[gl_InvocationID] = vtx_out[gl_InvocationID]; |
| ${TESSELLATION_CONTROL_OUTPUT} |
| } |
| "" |
| tessellation_evaluation "" |
| #version 310 es |
| ${TESSELLATION_EVALUATION_DECLARATIONS} |
| in mediump float tc_out[]; |
| out IOBlockName { mediump float val[2]; } instanceName; |
| void main() |
| { |
| instanceName.val[0] = tc_out[2] + 1.0; |
| instanceName.val[1] = -1.0; |
| ${TESSELLATION_EVALUATION_OUTPUT} |
| } |
| "" |
| geometry "" |
| #version 310 es |
| ${GEOMETRY_DECLARATIONS} |
| in IOBlockName { mediump float val[2]; } instanceName[]; |
| out mediump float geo_out; |
| void main() |
| { |
| geo_out = instanceName[0].val[0] + instanceName[0].val[1]; |
| gl_Position = gl_in[0].gl_Position; |
| EmitVertex(); |
| |
| geo_out = instanceName[1].val[0] + instanceName[1].val[1]; |
| gl_Position = gl_in[1].gl_Position; |
| EmitVertex(); |
| |
| geo_out = instanceName[2].val[0] + instanceName[2].val[1]; |
| gl_Position = gl_in[2].gl_Position; |
| EmitVertex(); |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float geo_out; |
| void main() |
| { |
| out0 = geo_out; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| end |
| |
| import "linkage_tessellation_geometry_varying_types.test" |
| end |
| |
| group uniform "Uniform linkage" |
| group rules "Rules" |
| case type_mismatch_1 |
| version 310 es |
| desc "Uniform type mismatch" |
| require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } |
| require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry } |
| expect link_fail |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| tessellation_control "" |
| #version 310 es |
| ${TESSELLATION_CONTROL_DECLARATIONS} |
| void main() |
| { |
| ${TESSELLATION_CONTROL_OUTPUT} |
| } |
| "" |
| tessellation_evaluation "" |
| #version 310 es |
| ${TESSELLATION_EVALUATION_DECLARATIONS} |
| uniform mediump float u_value; |
| out mediump float te_out; |
| void main() |
| { |
| te_out = u_value; |
| ${TESSELLATION_EVALUATION_OUTPUT} |
| } |
| "" |
| geometry "" |
| #version 310 es |
| ${GEOMETRY_DECLARATIONS} |
| uniform mediump vec2 u_value; |
| in mediump float te_out[]; |
| out mediump float geo_out; |
| void main() |
| { |
| for (int ndx = 0; ndx < gl_in.length(); ++ndx) |
| { |
| geo_out = te_out[ndx] + u_value.y; |
| gl_Position = gl_in[ndx].gl_Position; |
| EmitVertex(); |
| } |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float geo_out; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(geo_out); |
| } |
| "" |
| end |
| |
| case precision_mismatch_1 |
| version 310 es |
| desc "Uniform precision mismatch" |
| require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } |
| require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry } |
| expect link_fail |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| tessellation_control "" |
| #version 310 es |
| ${TESSELLATION_CONTROL_DECLARATIONS} |
| void main() |
| { |
| ${TESSELLATION_CONTROL_OUTPUT} |
| } |
| "" |
| tessellation_evaluation "" |
| #version 310 es |
| ${TESSELLATION_EVALUATION_DECLARATIONS} |
| uniform mediump float u_value; |
| out mediump float te_out; |
| void main() |
| { |
| te_out = u_value; |
| ${TESSELLATION_EVALUATION_OUTPUT} |
| } |
| "" |
| geometry "" |
| #version 310 es |
| ${GEOMETRY_DECLARATIONS} |
| uniform highp float u_value; |
| in mediump float te_out[]; |
| out mediump float geo_out; |
| void main() |
| { |
| for (int ndx = 0; ndx < gl_in.length(); ++ndx) |
| { |
| geo_out = te_out[ndx] + u_value; |
| gl_Position = gl_in[ndx].gl_Position; |
| EmitVertex(); |
| } |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float geo_out; |
| void main() |
| { |
| ${FRAG_COLOR} = vec4(geo_out); |
| } |
| "" |
| end |
| |
| case struct_partial_usage |
| version 310 es |
| desc "Uniform precision mismatch" |
| require extension { "GL_OES_tessellation_shader" | "GL_EXT_tessellation_shader" } in { tessellation_control, tessellation_evaluation } |
| require extension { "GL_OES_geometry_shader" | "GL_EXT_geometry_shader" } in { geometry } |
| values |
| { |
| uniform float u_value.teVal = 1.0; |
| uniform float u_value.geoVal = 2.0; |
| output float out0 = 5.0; |
| } |
| vertex "" |
| #version 310 es |
| ${VERTEX_DECLARATIONS} |
| void main() |
| { |
| ${VERTEX_OUTPUT} |
| } |
| "" |
| tessellation_control "" |
| #version 310 es |
| ${TESSELLATION_CONTROL_DECLARATIONS} |
| void main() |
| { |
| ${TESSELLATION_CONTROL_OUTPUT} |
| } |
| "" |
| tessellation_evaluation "" |
| #version 310 es |
| ${TESSELLATION_EVALUATION_DECLARATIONS} |
| struct S |
| { |
| mediump float teVal; |
| mediump float geoVal; |
| }; |
| uniform S u_value; |
| out mediump float te_out; |
| void main() |
| { |
| te_out = u_value.teVal; |
| ${TESSELLATION_EVALUATION_OUTPUT} |
| } |
| "" |
| geometry "" |
| #version 310 es |
| ${GEOMETRY_DECLARATIONS} |
| struct S |
| { |
| mediump float teVal; |
| mediump float geoVal; |
| }; |
| uniform S u_value; |
| in mediump float te_out[]; |
| out mediump float geo_out; |
| void main() |
| { |
| for (int ndx = 0; ndx < gl_in.length(); ++ndx) |
| { |
| geo_out = te_out[ndx] + 2.0 * u_value.geoVal; |
| gl_Position = gl_in[ndx].gl_Position; |
| EmitVertex(); |
| } |
| } |
| "" |
| fragment "" |
| #version 310 es |
| precision mediump float; |
| ${FRAGMENT_DECLARATIONS} |
| in mediump float geo_out; |
| void main() |
| { |
| out0 = geo_out; |
| ${FRAGMENT_OUTPUT} |
| } |
| "" |
| end |
| end |
| end |