# -------------------------------------------------
# drawElements Quality Program OpenGL ES 3.2 Module
# -------------------------------------------------
#
# Copyright 2016 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


case mismatch_number_of_declarations
	version 320 es
	desc "Shader io block mismatch: different number of declarations"
	expect link_fail
	vertex ""
		#version 320 es
		${VERTEX_DECLARATIONS}
		out IOBlockName
		{
			mediump float variable1;
		};

		void main()
		{
			variable1 = float(gl_VertexID);
			${VERTEX_OUTPUT}
		}
	""
	fragment ""
		#version 320 es
		precision mediump float;
		${FRAGMENT_DECLARATIONS}
		in IOBlockName
		{
			mediump float variable1;
			mediump float variable2;
		};

		void main()
		{
			${FRAG_COLOR} = vec4(variable1 + variable2);
		}
	""
end

case mismatch_order
	version 320 es
	desc "Shader io block mismatch: different member declaration order"
	expect link_fail
	vertex ""
		#version 320 es
		${VERTEX_DECLARATIONS}
		out IOBlockName
		{
			mediump float variable1;
			mediump float variable2;
		};

		void main()
		{
			variable1 = float(gl_VertexID);
			${VERTEX_OUTPUT}
		}
	""
	fragment ""
		#version 320 es
		precision mediump float;
		${FRAGMENT_DECLARATIONS}
		in IOBlockName
		{
			mediump float variable2;
			mediump float variable1;
		};

		void main()
		{
			${FRAG_COLOR} = vec4(variable1 + variable2);
		}
	""
end

case mismatch_type
	version 320 es
	desc "Shader io block mismatch: different member type"
	expect link_fail
	vertex ""
		#version 320 es
		${VERTEX_DECLARATIONS}
		out IOBlockName
		{
			mediump vec2 variable;
		};

		void main()
		{
			variable.x = float(gl_VertexID);
			variable.y = float(gl_InstanceID);
			${VERTEX_OUTPUT}
		}
	""
	fragment ""
		#version 320 es
		precision mediump float;
		${FRAGMENT_DECLARATIONS}
		in IOBlockName
		{
			mediump float variable;
		};

		void main()
		{
			${FRAG_COLOR} = vec4(variable);
		}
	""
end

case mismatch_member_name
	version 320 es
	desc "Shader io block mismatch: different member name"
	expect link_fail
	vertex ""
		#version 320 es
		${VERTEX_DECLARATIONS}
		out IOBlockName
		{
			mediump float variable1;
		};

		void main()
		{
			variable1 = float(gl_VertexID);
			${VERTEX_OUTPUT}
		}
	""
	fragment ""
		#version 320 es
		precision mediump float;
		${FRAGMENT_DECLARATIONS}
		in IOBlockName
		{
			mediump float variable2;
		};

		void main()
		{
			${FRAG_COLOR} = vec4(variable2);
		}
	""
end

case mismatch_member_array_size
	version 320 es
	desc "Shader io block mismatch: different member array size"
	expect link_fail
	vertex ""
		#version 320 es
		${VERTEX_DECLARATIONS}
		out IOBlockName
		{
			mediump float variable[1];
		};

		void main()
		{
			variable[0] = float(gl_VertexID);
			${VERTEX_OUTPUT}
		}
	""
	fragment ""
		#version 320 es
		precision mediump float;
		${FRAGMENT_DECLARATIONS}
		in IOBlockName
		{
			mediump float variable[2];
		};

		void main()
		{
			${FRAG_COLOR} = vec4(variable[0] + variable[1]);
		}
	""
end

case with_and_without_instance_name
	version 320 es
	desc "Shader io block: with and without instance name"
	values
	{
		input float in0 = 1.0;
		output float out0 = 1.0;
	}
	vertex ""
		#version 320 es
		${VERTEX_DECLARATIONS}
		out IOBlockName
		{
			mediump float variable;
		} instanceName;

		void main()
		{
			instanceName.variable = in0;
			${VERTEX_OUTPUT}
		}
	""
	fragment ""
		#version 320 es
		precision mediump float;
		${FRAGMENT_DECLARATIONS}
		in IOBlockName
		{
			mediump float variable;
		};

		void main()
		{
			out0 = variable;
			${FRAGMENT_OUTPUT}
		}
	""
end

case mismatch_block_array_size
	version 320 es
	desc "Shader io block mismatch: different array size"
	expect link_fail
	vertex ""
		#version 320 es
		${VERTEX_DECLARATIONS}
		out IOBlockName
		{
			mediump float variable;
		} instanceName[1];

		void main()
		{
			instanceName[0].variable = float(gl_VertexID);
			${VERTEX_OUTPUT}
		}
	""
	fragment ""
		#version 320 es
		precision mediump float;
		${FRAGMENT_DECLARATIONS}
		in IOBlockName
		{
			mediump float variable;
		} instanceName[2];

		void main()
		{
			${FRAG_COLOR} = vec4(instanceName[0].variable + instanceName[1].variable);
		}
	""
end

case missing_output_block
	version 320 es
	desc "Shader io block mismatch: missing output block"
	expect link_fail
	vertex ""
		#version 320 es
		${VERTEX_DECLARATIONS}
		void main()
		{
			${VERTEX_OUTPUT}
		}
	""
	fragment ""
		#version 320 es
		precision mediump float;
		${FRAGMENT_DECLARATIONS}
		in IOBlockName
		{
			mediump float variable;
		};

		void main()
		{
			${FRAG_COLOR} = vec4(variable);
		}
	""
end

case ambiguous_variable_name_1
	version 320 es
	desc "Unnamed io block variable and global variable with identical names"
	expect compile_or_link_fail
	vertex ""
		#version 320 es
		${VERTEX_DECLARATIONS}
		float variable;
		out IOBlockName
		{
			mediump float variable;
		};

		void main()
		{
			variable = float(gl_VertexID);
			${VERTEX_OUTPUT}
		}
	""
	fragment ""
		#version 320 es
		precision mediump float;
		${FRAGMENT_DECLARATIONS}
		in IOBlockName
		{
			mediump float variable;
		};

		void main()
		{
			${FRAG_COLOR} = vec4(variable);
		}
	""
end

case ambiguous_variable_name_2
	version 320 es
	desc "Two unnamed io blocks with variables with identical names"
	expect compile_or_link_fail
	vertex ""
		#version 320 es
		${VERTEX_DECLARATIONS}
		out IOBlockNameA
		{
			mediump float variable;
		};
		out IOBlockNameB
		{
			mediump float variable;
		};

		void main()
		{
			variable = float(gl_VertexID);
			${VERTEX_OUTPUT}
		}
	""
	fragment ""
		#version 320 es
		precision mediump float;
		${FRAGMENT_DECLARATIONS}
		in IOBlockNameA
		{
			mediump float variable;
		};
		in IOBlockNameB
		{
			mediump float variable;
		};

		void main()
		{
			${FRAG_COLOR} = vec4(variable);
		}
	""
end
