# -------------------------------------------------
# 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.


group types "Types"

	case float
		version 450
		desc "uniform of type float"
		values
		{
			uniform float val	= -1.25;
			output float out0	= -1.25;
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			out mediump float geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mediump float geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case vec2
		version 450
		desc "uniform of type vec2"
		values
		{
			uniform vec2 val	= vec2(-1.25, 1.25);
			output vec2 out0	= vec2(-1.25, 1.25);
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			out mediump vec2 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in vec2 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case vec3
		version 450
		desc "uniform of type vec3"
		values
		{
			uniform vec3 val	= vec3(-25.65, -7.25, 14.21);
			output vec3 out0	= vec3(-25.65, -7.25, 14.21);
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			out mediump vec3 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in vec3 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case vec4
		version 450
		desc "uniform of type vec4"
		values
		{
			uniform vec4 val	= vec4(-1.25, 1.25, -9.5, -12.2);
			output vec4 out0	= vec4(-1.25, 1.25, -9.5, -12.2);
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			out mediump vec4 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in vec4 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat2
		version 450
		desc "uniform of type mat2"
		values
		{
			uniform mat2 val	= mat2(-1.25, 1.25, -9.5, -12.2);
			output mat2 out0	= mat2(-1.25, 1.25, -9.5, -12.2);
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			out mediump mat2 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat2 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat2x3
		version 450
		desc "uniform of type mat2x3"
		values
		{
			uniform mat2x3 val	= [ 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 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			out mediump mat2x3 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat2x3 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat2x4
		version 450
		desc "uniform of type mat2x4"
		values
		{
			uniform mat2x4 val	= [ 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 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			out mediump mat2x4 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat2x4 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat3x2
		version 450
		desc "uniform of type mat3x2"
		values
		{
			uniform mat3x2 val	= [ 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 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			out mediump mat3x2 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat3x2 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat3
		version 450
		desc "uniform of type mat3"
		values
		{
			uniform mat3 val	= [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) ];
			output mat3 out0	= [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			out mediump mat3 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat3 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat3x4
		version 450
		desc "uniform of type mat3x4"
		values
		{
			uniform mat3x4 val	= [ 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 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			out mediump mat3x4 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat3x4 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat4x2
		version 450
		desc "uniform of type mat4x2"
		values
		{
			uniform mat4x2 val	= [ 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 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			out mediump mat4x2 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat4x2 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat4x3
		version 450
		desc "uniform of type mat4x3"
		values
		{
			uniform mat4x3 val	= [ 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 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			out mediump mat4x3 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat4x3 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat4
		version 450
		desc "uniform of type mat4"
		values
		{
			uniform mat4 val	= [ 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 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			out mediump mat4 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat4 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case int
		version 450
		desc "uniform of type int"
		values
		{
			uniform int val		= 3;
			output int out0		= 3;
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			flat out mediump int geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in int geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case ivec2
		version 450
		desc "uniform of type ivec2"
		values
		{
			uniform ivec2 val	= [ ivec2(-25, 25) ];
			output ivec2 out0	= [ ivec2(-25, 25) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			flat out mediump ivec2 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in ivec2 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case ivec3
		version 450
		desc "uniform of type ivec3"
		values
		{
			uniform ivec3 val	= [ ivec3(-25, 25, -3) ];
			output ivec3 out0	= [ ivec3(-25, 25, -3) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			flat out mediump ivec3 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in ivec3 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case ivec4
		version 450
		desc "uniform of type ivec4"
		values
		{
			uniform ivec4 val	= [ ivec4(-25, 25, -3, 3) ];
			output ivec4 out0	= [ ivec4(-25, 25, -3, 3) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			flat out mediump ivec4 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in ivec4 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case uint
		version 450
		desc "uniform of type int"
		values
		{
			uniform uint val		= [ 3 ];
			output uint out0		= [ 3 ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			flat out mediump uint geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in uint geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case uvec2
		version 450
		desc "uniform of type uvec2"
		values
		{
			uniform uvec2 val	= [ uvec2(16, 17) ];
			output uvec2 out0	= [ uvec2(16, 17) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			flat out mediump uvec2 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in uvec2 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case uvec3
		version 450
		desc "uniform of type uvec3"
		values
		{
			uniform uvec3 val	= [ uvec3(16, 17, 18) ];
			output uvec3 out0	= [ uvec3(16, 17, 18) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			flat out mediump uvec3 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in uvec3 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case uvec4
		version 450
		desc "uniform of type uvec4"
		values
		{
			uniform uvec4 val	= [ uvec4(16, 17, 18, 19) ];
			output uvec4 out0	= [ uvec4(16, 17, 18, 19) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			flat out mediump uvec4 geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in uvec4 geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case float_struct
		version 450
		desc "varying of struct type containing float"
		values
		{
			uniform float val.val	= [ 2.25 ];
			output float out0		= [ 2.25 ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		geometry ""
			#version 450
			${GEOMETRY_DECLARATIONS}
			struct S { mediump float val; };
			uniform S val;
			out mediump float geo_var;
			void main()
			{
				for (int ndx = 0; ndx < gl_in.length(); ++ndx)
				{
					geo_var = val.val;
					gl_Position = gl_in[ndx].gl_Position;
					EmitVertex();
				}
			}
		""
		fragment ""
			#version 450
			precision mediump float;
			${FRAGMENT_DECLARATIONS}
			in mediump float geo_var;
			void main()
			{
				out0 = geo_var;
				${FRAGMENT_OUTPUT}
			}
		""
	end
end
