# -------------------------------------------------
# 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 val0	= -1.25;
			uniform float val1	= 1.0;
			output float out0	= 0.75;
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			out mediump float tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			in mediump float tc_out[];
			out mediump float te_out;
			void main()
			{
				te_out = tc_out[2] + 2.0 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mediump float te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case vec2
		version 450
		desc "uniform of type vec2"
		values
		{
			uniform vec2 val0	= [ vec2(-1.25, 1.25) ];
			uniform vec2 val1	= [ vec2(1.0, 1.5) ];
			output vec2 out0	= [ vec2(0.75, 4.25) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			out mediump vec2 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			in mediump vec2 tc_out[];
			out mediump vec2 te_out;
			void main()
			{
				te_out = tc_out[2] + 2.0 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in vec2 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case vec3
		version 450
		desc "uniform of type vec3"
		values
		{
			uniform vec3 val0	= [ vec3(-1.25, 1.25, -9.5) ];
			uniform vec3 val1	= [ vec3( 1.0, 1.5, 2.5) ];
			output vec3 out0	= [ vec3(0.75, 4.25, -4.5) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			out mediump vec3 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			in mediump vec3 tc_out[];
			out mediump vec3 te_out;
			void main()
			{
				te_out = tc_out[2] + 2.0 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in vec3 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case vec4
		version 450
		desc "uniform of type vec4"
		values
		{
			uniform vec4 val0	= [ vec4(-1.25, 1.25, -9.5, -12.2) ];
			uniform vec4 val1	= [ vec4(1.0, 1.5, 2.5, -1.0) ];
			output vec4 out0	= [ vec4(0.75, 4.25, -4.5, -14.2) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			out mediump vec4 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			in mediump vec4 tc_out[];
			out mediump vec4 te_out;
			void main()
			{
				te_out = tc_out[2] + 2.0 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in vec4 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat2
		version 450
		desc "uniform of type mat2"
		values
		{
			uniform mat2 val0	= [ mat2(-1.25, 1.25, -9.5, -12.2) ];
			uniform mat2 val1	= [ mat2(1.0, 1.5, 2.5, -1.0) ];
			output mat2 out0	= [ mat2(0.75, 4.25, -4.5, -14.2) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			out mediump mat2 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			in mediump mat2 tc_out[];
			out mediump mat2 te_out;
			void main()
			{
				te_out = tc_out[2] + 2.0 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat2 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat2x3
		version 450
		desc "uniform of type mat2x3"
		values
		{
			uniform mat2x3 val0	= [ mat2x3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ];
			uniform mat2x3 val1	= [ mat2x3(1.0, 1.5, 2.5, -1.0, 2.0, 1.0) ];
			output mat2x3 out0	= [ mat2x3(0.75, 4.25, -4.5, -14.2, -21.65, -5.25) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			out mediump mat2x3 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			in mediump mat2x3 tc_out[];
			out mediump mat2x3 te_out;
			void main()
			{
				te_out = tc_out[2] + 2.0 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat2x3 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat2x4
		version 450
		desc "uniform of type mat2x4"
		values
		{
			uniform mat2x4 val0	= [ mat2x4(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ];
			uniform mat2x4 val1	= [ mat2x4(1.0, 1.5, 2.5, -1.0, 2.0, 1.0, 3.0, 4.0) ];
			output mat2x4 out0	= [ mat2x4(0.75, 4.25, -4.5, -14.2, -21.65, -5.25, 20.21, -69.7) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			out mediump mat2x4 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			in mediump mat2x4 tc_out[];
			out mediump mat2x4 te_out;
			void main()
			{
				te_out = tc_out[2] + 2.0 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat2x4 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat3x2
		version 450
		desc "uniform of type mat3x2"
		values
		{
			uniform mat3x2 val0	= [ mat3x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25) ];
			uniform mat3x2 val1	= [ mat3x2(1.0, 1.5, 2.5, -1.0, 2.0, 1.0) ];
			output mat3x2 out0	= [ mat3x2(0.75, 4.25, -4.5, -14.2, -21.65, -5.25) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			out mediump mat3x2 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			in mediump mat3x2 tc_out[];
			out mediump mat3x2 te_out;
			void main()
			{
				te_out = tc_out[2] + 2.0 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat3x2 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat3
		version 450
		desc "uniform of type mat3"
		values
		{
			uniform mat3 val0	= [ mat3(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7, 9.9) ];
			uniform mat3 val1	= [ mat3(1.0, 1.5, 2.5, -1.0, 2.0, 1.0, 3.0, 4.0, -1.0) ];
			output mat3 out0	= [ mat3(0.75, 4.25, -4.5, -14.2, -21.65, -5.25, 20.21, -69.7, 7.9) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			out mediump mat3 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			in mediump mat3 tc_out[];
			out mediump mat3 te_out;
			void main()
			{
				te_out = tc_out[2] + 2.0 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat3 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat3x4
		version 450
		desc "uniform of type mat3x4"
		values
		{
			uniform mat3x4 val0	= [ 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) ];
			uniform mat3x4 val1	= [ mat3x4(1.0, 1.5, 2.5, -1.0, 2.0, 1.0, 3.0, 4.0, -1.0, 3.0, 4.5, -1.5) ];
			output mat3x4 out0	= [ mat3x4(0.75, 4.25, -4.5, -14.2, -21.65, -5.25, 20.21, -69.7, -2.0, 7.0, 8.0, -1.0) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			out mediump mat3x4 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			in mediump mat3x4 tc_out[];
			out mediump mat3x4 te_out;
			void main()
			{
				te_out = tc_out[2] + 2.0 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat3x4 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat4x2
		version 450
		desc "uniform of type mat4x2"
		values
		{
			uniform mat4x2 val0	= [ mat4x2(-1.25, 1.25, -9.5, -12.2, -25.65, -7.25, 14.21, -77.7) ];
			uniform mat4x2 val1	= [ mat4x2(1.0, 1.5, 2.5, -1.0, 2.0, 1.0, 3.0, 4.0) ];
			output mat4x2 out0	= [ mat4x2(0.75, 4.25, -4.5, -14.2, -21.65, -5.25, 20.21, -69.7) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			out mediump mat4x2 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			in mediump mat4x2 tc_out[];
			out mediump mat4x2 te_out;
			void main()
			{
				te_out = tc_out[2] + 2.0 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat4x2 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat4x3
		version 450
		desc "uniform of type mat4x3"
		values
		{
			uniform mat4x3 val0	= [ 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) ];
			uniform mat4x3 val1	= [ mat4x3(1.0, 1.5, 2.5, -1.0, 2.0, 1.0, 3.0, 4.0, -1.0, 3.0, 4.5, -1.5) ];
			output mat4x3 out0	= [ mat4x3(0.75, 4.25, -4.5, -14.2, -21.65, -5.25, 20.21, -69.7, -2.0, 7.0, 8.0, -1.0) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			out mediump mat4x3 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			in mediump mat4x3 tc_out[];
			out mediump mat4x3 te_out;
			void main()
			{
				te_out = tc_out[2] + 2.0 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat4x3 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case mat4
		version 450
		desc "uniform of type mat4"
		values
		{
			uniform mat4 val0	= [ 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) ];
			uniform mat4 val1	= [ mat4(1.0, 1.5, 2.5, -1.0, 2.0, 1.0, 3.0, 4.0, -1.0, 3.0, 4.5, -1.5, 3.5, 2.0, 5.0, 0.5) ];
			output mat4 out0	= [ mat4(0.75, 4.25, -4.5, -14.2, -21.65, -5.25, 20.21, -69.7, -2.0, 7.0, 8.0, -1.0, 9.25, 6.25, 32.5, 226.0) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			out mediump mat4 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			in mediump mat4 tc_out[];
			out mediump mat4 te_out;
			void main()
			{
				te_out = tc_out[2] + 2.0 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp float;
			${FRAGMENT_DECLARATIONS}
			in mat4 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case int
		version 450
		desc "uniform of type int"
		values
		{
			uniform int val0	= [ -1 ];
			uniform int val1	= [ 2 ];
			output int out0		= [ 3 ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			flat out mediump int tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			flat in mediump int tc_out[];
			flat out mediump int te_out;
			void main()
			{
				te_out = tc_out[2] + 2 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in int te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case ivec2
		version 450
		desc "uniform of type ivec2"
		values
		{
			uniform ivec2 val0	= [ ivec2(-1, 1) ];
			uniform ivec2 val1	= [ ivec2(2, 3) ];
			output ivec2 out0	= [ ivec2(3, 7) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			flat out mediump ivec2 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			flat in mediump ivec2 tc_out[];
			flat out mediump ivec2 te_out;
			void main()
			{
				te_out = tc_out[2] + 2 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in ivec2 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case ivec3
		version 450
		desc "uniform of type ivec3"
		values
		{
			uniform ivec3 val0	= [ ivec3(-1, 1, -2) ];
			uniform ivec3 val1	= [ ivec3(2, 3, -2) ];
			output ivec3 out0	= [ ivec3(3, 7, -6) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			flat out mediump ivec3 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			flat in mediump ivec3 tc_out[];
			flat out mediump ivec3 te_out;
			void main()
			{
				te_out = tc_out[2] + 2 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in ivec3 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case ivec4
		version 450
		desc "uniform of type ivec4"
		values
		{
			uniform ivec4 val0	= [ ivec4(-1, 1, -2, 2) ];
			uniform ivec4 val1	= [ ivec4(2, 3, -2, 1) ];
			output ivec4 out0	= [ ivec4(3, 7, -6, 4) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			flat out mediump ivec4 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			flat in mediump ivec4 tc_out[];
			flat out mediump ivec4 te_out;
			void main()
			{
				te_out = tc_out[2] + 2 * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in ivec4 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case uint
		version 450
		desc "uniform of type int"
		values
		{
			uniform uint val0	= [ 1 ];
			uniform uint val1	= [ 2 ];
			output uint out0	= [ 5 ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			flat out mediump uint tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			flat in mediump uint tc_out[];
			flat out mediump uint te_out;
			void main()
			{
				te_out = tc_out[2] + 2u * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in uint te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case uvec2
		version 450
		desc "uniform of type uvec2"
		values
		{
			uniform uvec2 val0	= [ uvec2(1, 1) ];
			uniform uvec2 val1	= [ uvec2(2, 3) ];
			output uvec2 out0	= [ uvec2(5, 7) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			flat out mediump uvec2 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			flat in mediump uvec2 tc_out[];
			flat out mediump uvec2 te_out;
			void main()
			{
				te_out = tc_out[2] + 2u * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in uvec2 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case uvec3
		version 450
		desc "uniform of type uvec3"
		values
		{
			uniform uvec3 val0	= [ uvec3(1, 1, 2) ];
			uniform uvec3 val1	= [ uvec3(2, 3, 4) ];
			output uvec3 out0	= [ uvec3(5, 7, 10) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			flat out mediump uvec3 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			flat in mediump uvec3 tc_out[];
			flat out mediump uvec3 te_out;
			void main()
			{
				te_out = tc_out[2] + 2u * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in uvec3 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case uvec4
		version 450
		desc "uniform of type uvec4"
		values
		{
			uniform uvec4 val0	= [ uvec4(1, 1, 2, 2) ];
			uniform uvec4 val1	= [ uvec4(2, 3, 4, 1) ];
			output uvec4 out0	= [ uvec4(5, 7, 10, 4) ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			flat out mediump uvec4 tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = val0;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			flat in mediump uvec4 tc_out[];
			flat out mediump uvec4 te_out;
			void main()
			{
				te_out = tc_out[2] + 2u * val1;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision highp int;
			${FRAGMENT_DECLARATIONS}
			flat in uvec4 te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end

	case float_struct
		version 450
		desc "varying of struct type containing float"
		values
		{
			uniform float u_struct.val	= [ 3.0 ];
			output float out0			= [ 6.0 ];
		}
		vertex ""
			#version 450
			${VERTEX_DECLARATIONS}
			void main()
			{
				${VERTEX_SETUP}
				${VERTEX_OUTPUT}
			}
		""
		tessellation_control ""
			#version 450
			${TESSELLATION_CONTROL_DECLARATIONS}
			struct S { mediump float val; };
			uniform S u_struct;
			out mediump float tc_out[];
			void main()
			{
				tc_out[gl_InvocationID] = u_struct.val;
				${TESSELLATION_CONTROL_OUTPUT}
			}
		""
		tessellation_evaluation ""
			#version 450
			${TESSELLATION_EVALUATION_DECLARATIONS}
			struct S { mediump float val; };
			uniform S u_struct;
			in mediump float tc_out[];
			out mediump float te_out;
			void main()
			{
				te_out = tc_out[2] + u_struct.val;
				${TESSELLATION_EVALUATION_OUTPUT}
			}
		""
		fragment ""
			#version 450
			precision mediump float;
			${FRAGMENT_DECLARATIONS}
			in mediump float te_out;
			void main()
			{
				out0 = te_out;
				${FRAGMENT_OUTPUT}
			}
		""
	end
end
