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