group varying "Default block varying matching" case missing_input version 310 es desc "Variable has no matching input" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} out mediump float v_val; out mediump float v_val_no_such_input; void main() { v_val = float(gl_VertexID); v_val_no_such_input = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in mediump float v_val; void main() { ${FRAG_COLOR} = vec4(v_val); } "" end end case missing_output version 310 es desc "Variable has no matching output" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} out mediump float v_val; void main() { v_val = float(gl_VertexID); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in mediump float v_val; in mediump float v_val_no_such_output; void main() { ${FRAG_COLOR} = vec4(v_val + v_val_no_such_output); } "" end end case mismatch_type version 310 es desc "Variable type mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} out mediump vec3 v_val; void main() { v_val = vec3(float(gl_VertexID)); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in mediump vec4 v_val; void main() { ${FRAG_COLOR} = v_val; } "" end end case mismatch_precision version 310 es desc "Variable precision mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} out mediump float v_val; void main() { v_val = float(gl_VertexID); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in highp float v_val; void main() { ${FRAG_COLOR} = vec4(v_val); } "" end end case mismatch_explicit_location_type version 310 es desc "Variable type mismatch, explicit varying locations" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} layout(location = 3) out mediump vec4 v_val; void main() { v_val = vec4(float(gl_VertexID)); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} layout(location = 3) in mediump vec2 v_val; void main() { ${FRAG_COLOR} = v_val.xxyy; } "" end end case mismatch_explicit_location_precision version 310 es desc "Variable precision mismatch, explicit varying locations" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} layout(location = 3) out mediump float v_val; void main() { v_val = float(gl_VertexID); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} layout(location = 3) in highp float v_val; void main() { ${FRAG_COLOR} = vec4(v_val); } "" end end case mismatch_explicit_location version 310 es desc "Variable location mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} layout(location = 3) out mediump float v_val; void main() { v_val = float(gl_VertexID); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} layout(location = 4) in mediump float v_val; void main() { ${FRAG_COLOR} = vec4(v_val); } "" end end case mismatch_implicit_explicit_location_1 version 310 es desc "Variable location mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} out mediump float v_val; void main() { v_val = float(gl_VertexID); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} layout(location = 3) in mediump float v_val; void main() { ${FRAG_COLOR} = vec4(v_val); } "" end end case mismatch_implicit_explicit_location_2 version 310 es desc "Variable location mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} layout(location = 3) out mediump float v_val; void main() { v_val = float(gl_VertexID); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in mediump float v_val; layout(location = 3) in mediump float v_val_other_name; void main() { ${FRAG_COLOR} = vec4(v_val + v_val_other_name); } "" end end case mismatch_implicit_explicit_location_3 version 310 es desc "Variable location mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} out mediump float v_val; layout(location = 3) out mediump float v_val_other_name; void main() { v_val = float(gl_VertexID); v_val_other_name = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} layout(location = 3) in mediump float v_val; void main() { ${FRAG_COLOR} = vec4(v_val); } "" end end case mismatch_different_struct_names version 310 es desc "Variable struct names different but otherwise identical" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} struct StructureNameA { mediump float member; }; out StructureNameA v_val; void main() { v_val.member = float(gl_VertexID); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} struct StructureNameB { mediump float member; }; in StructureNameB v_val; void main() { // should always produce white ${FRAG_COLOR} = (v_val.member > -1.0) ? (vec4(1.0)) : (vec4(0.0)); } "" end end case mismatch_struct_member_name version 310 es desc "Struct member name mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} struct StructureName { mediump float member; }; out StructureName v_val; void main() { v_val.member = float(gl_VertexID); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} struct StructureName { mediump float member_different_name; }; in StructureName v_val; void main() { ${FRAG_COLOR} = vec4(v_val.member_different_name); } "" end end case mismatch_struct_member_type version 310 es desc "Struct member type mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} struct StructureName { mediump float member; }; out StructureName v_val; void main() { v_val.member = float(gl_VertexID); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} struct StructureName { mediump vec2 member; }; in StructureName v_val; void main() { ${FRAG_COLOR} = vec4(v_val.member.x); } "" end end case mismatch_struct_member_precision version 310 es desc "Struct member precision mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} struct StructureName { mediump float member; }; out StructureName v_val; void main() { v_val.member = float(gl_VertexID); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} struct StructureName { highp float member; }; in StructureName v_val; void main() { ${FRAG_COLOR} = vec4(v_val.member); } "" end end case mismatch_struct_member_order version 310 es desc "Struct member order mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} struct StructureName { mediump float memberA; mediump float memberB; }; out StructureName v_val; void main() { v_val.memberA = float(gl_VertexID); v_val.memberB = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} struct StructureName { mediump float memberB; mediump float memberA; }; in StructureName v_val; void main() { ${FRAG_COLOR} = vec4(v_val.memberA + v_val.memberB); } "" end end case mismatch_array_element_type version 310 es desc "Array element type mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} out mediump float v_val[2]; void main() { v_val[0] = 1.0; v_val[1] = 2.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in mediump vec2 v_val[2]; void main() { ${FRAG_COLOR} = vec4(v_val[0].x + v_val[1].y); } "" end end case mismatch_array_length version 310 es desc "Array length mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} out mediump float v_val[2]; void main() { v_val[0] = 1.0; v_val[1] = 2.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in mediump float v_val[3]; void main() { ${FRAG_COLOR} = vec4(v_val[0] + v_val[1] + v_val[2]); } "" end end case mismatch_array_precision version 310 es desc "Array length mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} out mediump float v_val[2]; void main() { v_val[0] = 1.0; v_val[1] = 2.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in highp float v_val[2]; void main() { ${FRAG_COLOR} = vec4(v_val[0] + v_val[1]); } "" end end case mismatch_qualifier_vertex_flat_fragment_none version 310 es desc "Interpolation qualifier mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} out flat highp vec4 v_val; void main() { v_val = vec4(float(gl_VertexID)); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in highp vec4 v_val; void main() { ${FRAG_COLOR} = v_val; } "" end end case mismatch_qualifier_vertex_flat_fragment_smooth version 310 es desc "Interpolation qualifier mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} out flat highp vec4 v_val; void main() { v_val = vec4(float(gl_VertexID)); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in smooth highp vec4 v_val; void main() { ${FRAG_COLOR} = v_val; } "" end end case mismatch_qualifier_vertex_flat_fragment_centroid version 310 es desc "Interpolation qualifier mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} out flat highp vec4 v_val; void main() { v_val = vec4(float(gl_VertexID)); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in centroid highp vec4 v_val; void main() { ${FRAG_COLOR} = v_val; } "" end end case mismatch_qualifier_vertex_smooth_fragment_flat version 310 es desc "Interpolation qualifier mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} out smooth highp vec4 v_val; void main() { v_val = vec4(float(gl_VertexID)); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in flat highp vec4 v_val; void main() { ${FRAG_COLOR} = v_val; } "" end end case mismatch_qualifier_vertex_centroid_fragment_flat version 310 es desc "Interpolation qualifier mismatch" expect validation_fail pipeline_program active_stages {vertex} vertex "" #version 310 es ${VERTEX_DECLARATIONS} out centroid highp vec4 v_val; void main() { v_val = vec4(float(gl_VertexID)); ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in flat highp vec4 v_val; void main() { ${FRAG_COLOR} = v_val; } "" end end end group io_blocks "shader io blocks" case missing_input version 310 es desc "Missing input block" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} out IOBlockName { mediump float v_val; }; void main() { v_val = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} void main() { ${FRAG_COLOR} = vec4(1.0); } "" end end case missing_output version 310 es desc "Missing output block" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} void main() { ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in IOBlockName { mediump float v_val; }; void main() { ${FRAG_COLOR} = vec4(v_val); } "" end end case mismatch_number_of_declarations version 310 es desc "IO-blocks do not match due to mismatch in number of declarations" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} out IOBlockName { mediump float v_valA; mediump float v_valB; }; void main() { v_valA = 1.0; v_valB = 2.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in IOBlockName { mediump float v_valA; }; void main() { ${FRAG_COLOR} = vec4(v_valA); } "" end end case mismatch_member_order version 310 es desc "IO-blocks do not match due to mismatch with member declaration order" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} out IOBlockName { mediump float v_valA; mediump float v_valB; }; void main() { v_valA = 1.0; v_valB = 2.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in IOBlockName { mediump float v_valB; mediump float v_valA; }; void main() { ${FRAG_COLOR} = vec4(v_valA+v_valB); } "" end end case mismatch_member_type version 310 es desc "IO-blocks do not match due to mismatch with member types" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} out IOBlockName { mediump float v_valA; }; void main() { v_valA = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in IOBlockName { mediump vec2 v_valA; }; void main() { ${FRAG_COLOR} = vec4(v_valA.xyxy); } "" end end case mismatch_member_name version 310 es desc "IO-blocks do not match due to mismatch with member names" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} out IOBlockName { mediump float v_valA; }; void main() { v_valA = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in IOBlockName { mediump vec2 v_valB; }; void main() { ${FRAG_COLOR} = vec4(v_valB.y); } "" end end case mismatch_member_precision version 310 es desc "IO-blocks do not match due to mismatch with member precisions" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} out IOBlockName { mediump float v_valA; }; void main() { v_valA = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in IOBlockName { highp float v_valA; }; void main() { ${FRAG_COLOR} = vec4(v_valA); } "" end end case mismatch_different_member_interpolation version 310 es desc "IO-block members do not match due to different interpolation qualifiers" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} out IOBlockName { smooth out mediump float v_val; }; void main() { v_val = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in IOBlockName { flat in mediump float v_val; }; void main() { ${FRAG_COLOR} = vec4(v_val); } "" end end case mismatch_member_array_size version 310 es desc "IO-blocks do not match due to mismatch with member array size" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} out IOBlockName { mediump float v_val_arr[2]; }; void main() { v_val_arr[0] = 1.0; v_val_arr[1] = 2.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in IOBlockName { mediump float v_val_arr[1]; }; void main() { ${FRAG_COLOR} = vec4(v_val_arr[0]); } "" end end case mismatch_different_member_struct_names version 310 es desc "IO-blocks match with structs with different names" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} struct StructNameA { mediump float v; }; out IOBlockName { StructNameA v_val; }; void main() { v_val.v = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} struct StructNameB { mediump float v; }; in IOBlockName { StructNameB v_val; }; void main() { ${FRAG_COLOR} = vec4(v_val.v); } "" end end case mismatch_member_struct_member_name version 310 es desc "IO-blocks do not match due to mismatch with member structs" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} struct StructName { mediump float v; }; out IOBlockName { StructName v_val; }; void main() { v_val.v = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} struct StructName { mediump float v_alt_name; }; in IOBlockName { StructName v_val; }; void main() { ${FRAG_COLOR} = vec4(v_val.v_alt_name); } "" end end case mismatch_member_struct_member_type version 310 es desc "IO-blocks do not match due to mismatch with member structs" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} struct StructName { mediump float v; }; out IOBlockName { StructName v_val; }; void main() { v_val.v = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} struct StructName { mediump vec2 v; }; in IOBlockName { StructName v_val; }; void main() { ${FRAG_COLOR} = vec4(v_val.v.x); } "" end end case mismatch_member_struct_member_precision version 310 es desc "IO-blocks do not match due to mismatch with member structs" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} struct StructName { mediump float v; }; out IOBlockName { StructName v_val; }; void main() { v_val.v = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} struct StructName { highp float v; }; in IOBlockName { StructName v_val; }; void main() { ${FRAG_COLOR} = vec4(v_val.v); } "" end end case mismatch_member_struct_member_order version 310 es desc "IO-blocks do not match due to mismatch with member structs" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} struct StructName { mediump float v_a; mediump float v_b; }; out IOBlockName { StructName v_val; }; void main() { v_val.v_a = 1.0; v_val.v_b = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} struct StructName { mediump float v_b; mediump float v_a; }; in IOBlockName { StructName v_val; }; void main() { ${FRAG_COLOR} = vec4(v_val.v_a); } "" end end case mismatch_array_size version 310 es desc "IO-blocks do not match due to mismatch with array sizes" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} out IOBlockName { mediump float v_val; } ioBlock[2]; void main() { ioBlock[0].v_val = 1.0; ioBlock[1].v_val = 2.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in IOBlockName { mediump float v_val; } ioBlock[1]; void main() { ${FRAG_COLOR} = vec4(ioBlock[0].v_val); } "" end end case mismatch_variable_and_block_member_1 version 310 es desc "IO-block does not match with variable" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} out IOBlockName { mediump float v_val; }; void main() { v_val = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in mediump float v_val; void main() { ${FRAG_COLOR} = vec4(v_val); } "" end end case mismatch_variable_and_block_member_2 version 310 es desc "IO-block does not match with variable" expect validation_fail pipeline_program active_stages {vertex} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { vertex } vertex "" #version 310 es ${VERTEX_DECLARATIONS} out VariableAndBlockName { mediump float v_val; }; void main() { v_val = 1.0; ${VERTEX_OUTPUT} } "" end pipeline_program active_stages {fragment} require extension { "GL_OES_shader_io_blocks" | "GL_EXT_shader_io_blocks" } in { fragment } fragment "" #version 310 es ${FRAGMENT_DECLARATIONS} in mediump float VariableAndBlockName; void main() { ${FRAG_COLOR} = vec4(VariableAndBlockName); } "" end end end