/*-------------------------------------------------------------------------
 * drawElements Quality Program OpenGL ES 2.0 Module
 * -------------------------------------------------
 *
 * Copyright 2014 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.
 *
 *//*!
 * \file
 * \brief State change call performance tests.
 *//*--------------------------------------------------------------------*/

#include "es2pStateChangeCallTests.hpp"
#include "glsStateChangePerfTestCases.hpp"
#include "glwFunctions.hpp"
#include "glwEnums.hpp"

namespace deqp
{
namespace gles2
{
namespace Performance
{

using namespace glw;

StateChangeCallTests::StateChangeCallTests (Context& context)
	: TestCaseGroup(context, "state_change_only", "Test cost of state change calls without rendering anything")
{
}

StateChangeCallTests::~StateChangeCallTests (void)
{
}

#define ARG_LIST(...) __VA_ARGS__

#define ADD_ARG_CASE1(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0)\
do {\
	class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\
	{\
	public:\
		StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\
			: gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\
		{\
		}\
		virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\
		{\
			const TYPE0 args0[] = ARGS0;\
			for (int callNdx = 0; callNdx < callCount; callNdx++)\
			{\
				const int		baseNdx		= iterNdx*callCount + callNdx;\
				const TYPE0		arg0		= args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\
				gl.FUNCNAME(arg0);\
			}\
		}\
	};\
	addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\
}while (0);

#define ADD_ARG_CASE2(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0, TYPE1, ARGS1)\
do {\
	class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\
	{\
	public:\
		StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\
			: gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\
		{\
		}\
		virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\
		{\
			const TYPE0 args0[] = ARGS0;\
			const TYPE1 args1[] = ARGS1;\
			for (int callNdx = 0; callNdx < callCount; callNdx++)\
			{\
				const int		baseNdx		= iterNdx*callCount + callNdx;\
				const TYPE0		arg0		= args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\
				const TYPE1		arg1		= args1[baseNdx%DE_LENGTH_OF_ARRAY(args1)];\
				gl.FUNCNAME(arg0, arg1);\
			}\
		}\
	};\
	addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\
}while (0);

#define ADD_ARG_CASE3(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0, TYPE1, ARGS1, TYPE2, ARGS2)\
do {\
	class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\
	{\
	public:\
		StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\
			: gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\
		{\
		}\
		virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\
		{\
			const TYPE0 args0[] = ARGS0;\
			const TYPE1 args1[] = ARGS1;\
			const TYPE2 args2[] = ARGS2;\
			for (int callNdx = 0; callNdx < callCount; callNdx++)\
			{\
				const int		baseNdx		= iterNdx*callCount + callNdx;\
				const TYPE0		arg0		= args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\
				const TYPE1		arg1		= args1[baseNdx%DE_LENGTH_OF_ARRAY(args1)];\
				const TYPE2		arg2		= args2[baseNdx%DE_LENGTH_OF_ARRAY(args2)];\
				gl.FUNCNAME(arg0, arg1, arg2);\
			}\
		}\
	};\
	addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\
}while (0);

#define ADD_ARG_CASE4(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0, TYPE1, ARGS1, TYPE2, ARGS2, TYPE3, ARGS3)\
do {\
	class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\
	{\
	public:\
		StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\
			: gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\
		{\
		}\
		virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\
		{\
			const TYPE0 args0[] = ARGS0;\
			const TYPE1 args1[] = ARGS1;\
			const TYPE2 args2[] = ARGS2;\
			const TYPE3 args3[] = ARGS3;\
			for (int callNdx = 0; callNdx < callCount; callNdx++)\
			{\
				const int		baseNdx		= iterNdx*callCount + callNdx;\
				const TYPE0		arg0		= args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\
				const TYPE1		arg1		= args1[baseNdx%DE_LENGTH_OF_ARRAY(args1)];\
				const TYPE2		arg2		= args2[baseNdx%DE_LENGTH_OF_ARRAY(args2)];\
				const TYPE3		arg3		= args3[baseNdx%DE_LENGTH_OF_ARRAY(args3)];\
				gl.FUNCNAME(arg0, arg1, arg2, arg3);\
			}\
		}\
	};\
	addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\
}while (0);

#define ADD_ARG_CASE6(NAME, DESCRIPTION, FUNCNAME, TYPE0, ARGS0, TYPE1, ARGS1, TYPE2, ARGS2, TYPE3, ARGS3, TYPE4, ARGS4, TYPE5, ARGS5)\
do {\
	class StateChangeCallTest_ ## NAME : public gls::StateChangeCallPerformanceCase\
	{\
	public:\
		StateChangeCallTest_ ## NAME (Context& context, const char* name, const char* description)\
			: gls::StateChangeCallPerformanceCase(context.getTestContext(), context.getRenderContext(), name, description)\
		{\
		}\
		virtual void execCalls (const glw::Functions& gl, int iterNdx, int callCount)\
		{\
			const TYPE0 args0[] = ARGS0;\
			const TYPE1 args1[] = ARGS1;\
			const TYPE2 args2[] = ARGS2;\
			const TYPE3 args3[] = ARGS3;\
			const TYPE4 args4[] = ARGS4;\
			const TYPE5 args5[] = ARGS5;\
			for (int callNdx = 0; callNdx < callCount; callNdx++)\
			{\
				const int		baseNdx		= iterNdx*callCount + callNdx;\
				const TYPE0		arg0		= args0[baseNdx%DE_LENGTH_OF_ARRAY(args0)];\
				const TYPE1		arg1		= args1[baseNdx%DE_LENGTH_OF_ARRAY(args1)];\
				const TYPE2		arg2		= args2[baseNdx%DE_LENGTH_OF_ARRAY(args2)];\
				const TYPE3		arg3		= args3[baseNdx%DE_LENGTH_OF_ARRAY(args3)];\
				const TYPE4		arg4		= args4[baseNdx%DE_LENGTH_OF_ARRAY(args4)];\
				const TYPE5		arg5		= args5[baseNdx%DE_LENGTH_OF_ARRAY(args5)];\
				gl.FUNCNAME(arg0, arg1, arg2, arg3, arg4, arg5);\
			}\
		}\
	};\
	addChild(new StateChangeCallTest_ ## NAME (m_context, #NAME, DESCRIPTION));\
}while (0);

void StateChangeCallTests::init (void)
{
	ADD_ARG_CASE1(enable, "Test cost of glEnable() calls",
		enable,
		GLenum,
		ARG_LIST({
			GL_CULL_FACE,
			GL_POLYGON_OFFSET_FILL,
			GL_SAMPLE_ALPHA_TO_COVERAGE,
			GL_SAMPLE_COVERAGE,
			GL_SCISSOR_TEST,
			GL_STENCIL_TEST,
			GL_DEPTH_TEST,
			GL_BLEND,
			GL_DITHER
		})
	);

	ADD_ARG_CASE1(disable, "Test cost of glDisable() calls",
		disable,
		GLenum,
		ARG_LIST({
			GL_CULL_FACE,
			GL_POLYGON_OFFSET_FILL,
			GL_SAMPLE_ALPHA_TO_COVERAGE,
			GL_SAMPLE_COVERAGE,
			GL_SCISSOR_TEST,
			GL_STENCIL_TEST,
			GL_DEPTH_TEST,
			GL_BLEND,
			GL_DITHER
		})
	);

	ADD_ARG_CASE1(depth_func, "Test cost of glDepthFunc() calls",
		depthFunc,
		GLenum,
		ARG_LIST({
			GL_NEVER,
			GL_ALWAYS,
			GL_LESS,
			GL_LEQUAL,
			GL_EQUAL,
			GL_GREATER,
			GL_GEQUAL,
			GL_NOTEQUAL
		})
	);

	ADD_ARG_CASE1(depth_mask, "Test cost of glDepthMask() calls",
		depthMask,
		GLboolean,
		ARG_LIST({
			GL_TRUE,
			GL_FALSE
		})
	);

	ADD_ARG_CASE1(stencil_mask, "Test cost of glStencilMask() calls",
		stencilMask,
		GLboolean,
		ARG_LIST({
			GL_TRUE,
			GL_FALSE
		})
	);

	ADD_ARG_CASE1(clear_depth, "Test cost of glClearDepth() calls",
		clearDepthf,
		GLclampf,
		ARG_LIST({
			0.0f,
			0.5f,
			1.0f
		})
	);

	ADD_ARG_CASE1(clear_stencil, "Test cost of glClearStencil() calls",
		clearStencil,
		GLint,
		ARG_LIST({
			0,
			128,
			28
		})
	);

	ADD_ARG_CASE1(line_width, "Test cost of glLineWidth() calls",
		lineWidth,
		GLfloat,
		ARG_LIST({
			1.0f,
			0.5f,
			10.0f
		})
	);

	ADD_ARG_CASE1(cull_face, "Test cost of glCullFace() calls",
		cullFace,
		GLenum,
		ARG_LIST({
			GL_FRONT,
			GL_BACK,
			GL_FRONT_AND_BACK
		})
	);

	ADD_ARG_CASE1(front_face, "Test cost of glFrontFace() calls",
		frontFace,
		GLenum,
		ARG_LIST({
			GL_CCW,
			GL_CW
		})
	);

	ADD_ARG_CASE1(blend_equation, "Test cost of glBlendEquation() calls",
		blendEquation,
		GLenum,
		ARG_LIST({
			GL_FUNC_ADD,
			GL_FUNC_SUBTRACT,
			GL_FUNC_REVERSE_SUBTRACT
		})
	);

	ADD_ARG_CASE1(enable_vertex_attrib_array, "Test cost of glEnableVertexAttribArray() calls",
		enableVertexAttribArray,
		GLuint,
		ARG_LIST({
			0,
			1,
			2,
			3,
			4,
			5,
			6,
			7,
		})
	);

	ADD_ARG_CASE1(disable_vertex_attrib_array, "Test cost of glDisableVertexAttribArray() calls",
		disableVertexAttribArray,
		GLuint,
		ARG_LIST({
			0,
			1,
			2,
			3,
			4,
			5,
			6,
			7,
		})
	);

	ADD_ARG_CASE1(use_program, "Test cost of glUseProgram() calls. Note: Uses only program 0.",
		useProgram,
		GLuint,
		ARG_LIST({
			0,
		})
	);

	ADD_ARG_CASE1(active_texture, "Test cost of glActiveTexture() calls",
		activeTexture,
		GLenum,
		ARG_LIST({
			GL_TEXTURE0,
			GL_TEXTURE1,
			GL_TEXTURE2,
			GL_TEXTURE3,
			GL_TEXTURE4,
			GL_TEXTURE5,
			GL_TEXTURE6,
			GL_TEXTURE7
		})
	);

	ADD_ARG_CASE2(depth_range, "Test cost of glDepthRangef() calls",
		depthRangef,
		GLclampf,
		ARG_LIST({
			0.0f,
			1.0f,
			0.5f
		}),
		GLclampf,
		ARG_LIST({
			0.0f,
			1.0f,
			0.5f
		})
	);

	ADD_ARG_CASE2(polygon_offset, "Test cost of glPolygonOffset() calls",
		polygonOffset,
		GLfloat,
		ARG_LIST({
			0.0f,
			1.0f,
			0.5f,
			10.0f
		}),
		GLfloat,
		ARG_LIST({
			0.0f,
			1.0f,
			0.5f,
			1000.0f
		})
	);

	ADD_ARG_CASE2(sample_coverage, "Test cost of glSampleCoverage() calls",
		sampleCoverage,
		GLclampf,
		ARG_LIST({
			0.0f,
			1.0f,
			0.5f,
			0.67f
		}),
		GLboolean,
		ARG_LIST({
			GL_TRUE,
			GL_FALSE
		})
	);

	ADD_ARG_CASE2(blend_func, "Test cost of glBlendFunc() calls",
		blendFunc,
		GLenum,
		ARG_LIST({
			GL_ZERO,
			GL_ONE,
			GL_SRC_COLOR,
			GL_ONE_MINUS_SRC_COLOR,
			GL_DST_COLOR,
			GL_ONE_MINUS_DST_COLOR,
			GL_SRC_ALPHA,
			GL_ONE_MINUS_SRC_ALPHA,
			GL_DST_ALPHA,
			GL_ONE_MINUS_DST_ALPHA,
			GL_CONSTANT_COLOR,
			GL_ONE_MINUS_CONSTANT_COLOR,
			GL_CONSTANT_ALPHA,
			GL_ONE_MINUS_CONSTANT_ALPHA
		}),
		GLenum,
		ARG_LIST({
			GL_ZERO,
			GL_ONE,
			GL_SRC_COLOR,
			GL_ONE_MINUS_SRC_COLOR,
			GL_DST_COLOR,
			GL_ONE_MINUS_DST_COLOR,
			GL_SRC_ALPHA,
			GL_ONE_MINUS_SRC_ALPHA,
			GL_DST_ALPHA,
			GL_ONE_MINUS_DST_ALPHA,
			GL_CONSTANT_COLOR,
			GL_ONE_MINUS_CONSTANT_COLOR,
			GL_CONSTANT_ALPHA,
			GL_ONE_MINUS_CONSTANT_ALPHA
		})
	);

	ADD_ARG_CASE2(blend_equation_separate, "Test cost of glBlendEquationSeparate() calls",
		blendEquationSeparate,
		GLenum,
		ARG_LIST({
			GL_FUNC_ADD,
			GL_FUNC_SUBTRACT,
			GL_FUNC_REVERSE_SUBTRACT
		}),
		GLenum,
		ARG_LIST({
			GL_FUNC_ADD,
			GL_FUNC_SUBTRACT,
			GL_FUNC_REVERSE_SUBTRACT
		})
	);

	ADD_ARG_CASE2(stencil_mask_separate, "Test cost of glStencilMaskSeparate() calls",
		stencilMaskSeparate,
		GLenum,
		ARG_LIST({
			GL_FRONT,
			GL_BACK,
			GL_FRONT_AND_BACK
		}),
		GLboolean,
		ARG_LIST({
			GL_TRUE,
			GL_FALSE
		})
	);

	ADD_ARG_CASE2(bind_buffer, "Test cost of glBindBuffer() calls. Note: Uses only buffer 0",
		bindBuffer,
		GLenum,
		ARG_LIST({
			GL_ELEMENT_ARRAY_BUFFER,
			GL_ARRAY_BUFFER
		}),
		GLuint,
		ARG_LIST({
			0
		})
	);

	ADD_ARG_CASE2(bind_texture, "Test cost of glBindTexture() calls. Note: Uses only texture 0",
		bindTexture,
		GLenum,
		ARG_LIST({
			GL_TEXTURE_2D,
			GL_TEXTURE_CUBE_MAP
		}),
		GLuint,
		ARG_LIST({
			0
		})
	);

	ADD_ARG_CASE2(hint, "Test cost of glHint() calls",
		hint,
		GLenum,
		ARG_LIST({
			GL_GENERATE_MIPMAP_HINT
		}),
		GLenum,
		ARG_LIST({
			GL_FASTEST,
			GL_NICEST,
			GL_DONT_CARE
		})
	);

	ADD_ARG_CASE3(stencil_func, "Test cost of glStencilFunc() calls",
		stencilFunc,
		GLenum,
		ARG_LIST({
			GL_NEVER,
			GL_ALWAYS,
			GL_LESS,
			GL_LEQUAL,
			GL_EQUAL,
			GL_GEQUAL,
			GL_GREATER,
			GL_NOTEQUAL
		}),
		GLint,
		ARG_LIST({
			0,
			1,
			255,
			128,
			7
		}),
		GLuint,
		ARG_LIST({
			0,
			1,
			255,
			128,
			7,
			0xFFFFFFFF
		})
	);

	ADD_ARG_CASE3(stencil_op, "Test cost of glStencilOp() calls",
		stencilOp,
		GLenum,
		ARG_LIST({
			GL_KEEP,
			GL_ZERO,
			GL_REPLACE,
			GL_INCR,
			GL_DECR,
			GL_INVERT,
			GL_INCR_WRAP,
			GL_DECR_WRAP
		}),
		GLenum,
		ARG_LIST({
			GL_KEEP,
			GL_ZERO,
			GL_REPLACE,
			GL_INCR,
			GL_DECR,
			GL_INVERT,
			GL_INCR_WRAP,
			GL_DECR_WRAP
		}),
		GLenum,
		ARG_LIST({
			GL_KEEP,
			GL_ZERO,
			GL_REPLACE,
			GL_INCR,
			GL_DECR,
			GL_INVERT,
			GL_INCR_WRAP,
			GL_DECR_WRAP
		})
	);

	ADD_ARG_CASE4(viewport, "Test cost of glViewport() calls",
		viewport,
		GLint,
		ARG_LIST({
			0,
			1,
			100,
			1145235
		}),
		GLint,
		ARG_LIST({
			0,
			1,
			100,
			1145235
		}),
		GLint,
		ARG_LIST({
			0,
			1,
			100,
			1145235
		}),
		GLint,
		ARG_LIST({
			0,
			1,
			100,
			1145235
		})
	);

	ADD_ARG_CASE4(scissor, "Test cost of glScissor() calls",
		scissor,
		GLint,
		ARG_LIST({
			0,
			1,
			100,
			1145235
		}),
		GLint,
		ARG_LIST({
			0,
			1,
			100,
			1145235
		}),
		GLint,
		ARG_LIST({
			0,
			1,
			100,
			1145235
		}),
		GLint,
		ARG_LIST({
			0,
			1,
			100,
			1145235
		})
	);

	ADD_ARG_CASE4(stencil_func_separate, "Test cost of glStencilFuncSeparate() calls",
		stencilFuncSeparate,
		GLenum,
		ARG_LIST({
			GL_FRONT,
			GL_BACK,
			GL_FRONT_AND_BACK
		}),
		GLenum,
		ARG_LIST({
			GL_NEVER,
			GL_ALWAYS,
			GL_LESS,
			GL_LEQUAL,
			GL_EQUAL,
			GL_GEQUAL,
			GL_GREATER,
			GL_NOTEQUAL
		}),
		GLint,
		ARG_LIST({
			0,
			1,
			255,
			128,
			7
		}),
		GLuint,
		ARG_LIST({
			0,
			1,
			255,
			128,
			7,
			0xFFFFFFFF
		})
	);

	ADD_ARG_CASE4(stencil_op_separatae, "Test cost of glStencilOpSeparate() calls",
		stencilOpSeparate,
		GLenum,
		ARG_LIST({
			GL_FRONT,
			GL_BACK,
			GL_FRONT_AND_BACK
		}),
		GLenum,
		ARG_LIST({
			GL_KEEP,
			GL_ZERO,
			GL_REPLACE,
			GL_INCR,
			GL_DECR,
			GL_INVERT,
			GL_INCR_WRAP,
			GL_DECR_WRAP
		}),
		GLenum,
		ARG_LIST({
			GL_KEEP,
			GL_ZERO,
			GL_REPLACE,
			GL_INCR,
			GL_DECR,
			GL_INVERT,
			GL_INCR_WRAP,
			GL_DECR_WRAP
		}),
		GLenum,
		ARG_LIST({
			GL_KEEP,
			GL_ZERO,
			GL_REPLACE,
			GL_INCR,
			GL_DECR,
			GL_INVERT,
			GL_INCR_WRAP,
			GL_DECR_WRAP
		})
	);

	ADD_ARG_CASE4(blend_func_separate, "Test cost of glBlendFuncSeparate() calls",
		blendFuncSeparate,
		GLenum,
		ARG_LIST({
			GL_ZERO,
			GL_ONE,
			GL_SRC_COLOR,
			GL_ONE_MINUS_SRC_COLOR,
			GL_DST_COLOR,
			GL_ONE_MINUS_DST_COLOR,
			GL_SRC_ALPHA,
			GL_ONE_MINUS_SRC_ALPHA,
			GL_DST_ALPHA,
			GL_ONE_MINUS_DST_ALPHA,
			GL_CONSTANT_COLOR,
			GL_ONE_MINUS_CONSTANT_COLOR,
			GL_CONSTANT_ALPHA,
			GL_ONE_MINUS_CONSTANT_ALPHA
		}),
		GLenum,
		ARG_LIST({
			GL_ZERO,
			GL_ONE,
			GL_SRC_COLOR,
			GL_ONE_MINUS_SRC_COLOR,
			GL_DST_COLOR,
			GL_ONE_MINUS_DST_COLOR,
			GL_SRC_ALPHA,
			GL_ONE_MINUS_SRC_ALPHA,
			GL_DST_ALPHA,
			GL_ONE_MINUS_DST_ALPHA,
			GL_CONSTANT_COLOR,
			GL_ONE_MINUS_CONSTANT_COLOR,
			GL_CONSTANT_ALPHA,
			GL_ONE_MINUS_CONSTANT_ALPHA
		}),
		GLenum,
		ARG_LIST({
			GL_ZERO,
			GL_ONE,
			GL_SRC_COLOR,
			GL_ONE_MINUS_SRC_COLOR,
			GL_DST_COLOR,
			GL_ONE_MINUS_DST_COLOR,
			GL_SRC_ALPHA,
			GL_ONE_MINUS_SRC_ALPHA,
			GL_DST_ALPHA,
			GL_ONE_MINUS_DST_ALPHA,
			GL_CONSTANT_COLOR,
			GL_ONE_MINUS_CONSTANT_COLOR,
			GL_CONSTANT_ALPHA,
			GL_ONE_MINUS_CONSTANT_ALPHA
		}),
		GLenum,
		ARG_LIST({
			GL_ZERO,
			GL_ONE,
			GL_SRC_COLOR,
			GL_ONE_MINUS_SRC_COLOR,
			GL_DST_COLOR,
			GL_ONE_MINUS_DST_COLOR,
			GL_SRC_ALPHA,
			GL_ONE_MINUS_SRC_ALPHA,
			GL_DST_ALPHA,
			GL_ONE_MINUS_DST_ALPHA,
			GL_CONSTANT_COLOR,
			GL_ONE_MINUS_CONSTANT_COLOR,
			GL_CONSTANT_ALPHA,
			GL_ONE_MINUS_CONSTANT_ALPHA
		})
	);

	ADD_ARG_CASE4(color_mask, "Test cost of glColorMask() calls",
		colorMask,
		GLboolean,
		ARG_LIST({
			GL_TRUE,
			GL_FALSE
		}),
		GLboolean,
		ARG_LIST({
			GL_TRUE,
			GL_FALSE
		}),
		GLboolean,
		ARG_LIST({
			GL_TRUE,
			GL_FALSE
		}),
		GLboolean,
		ARG_LIST({
			GL_TRUE,
			GL_FALSE
		})
	);

	ADD_ARG_CASE4(clear_color, "Test cost of glClearColor() calls",
		clearColor,
		GLclampf,
		ARG_LIST({
			0.0f,
			1.0f,
			0.5f,
			0.33f
		}),
		GLclampf,
		ARG_LIST({
			0.0f,
			1.0f,
			0.5f,
			0.33f
		}),
		GLclampf,
		ARG_LIST({
			0.0f,
			1.0f,
			0.5f,
			0.33f
		}),
		GLclampf,
		ARG_LIST({
			0.0f,
			1.0f,
			0.5f,
			0.33f
		})
	);

	ADD_ARG_CASE6(vertex_attrib_pointer, "Test cost of glVertexAttribPointer() calls",
		vertexAttribPointer,
		GLuint,
		ARG_LIST({
			0,
			1,
			2,
			3,
			4,
			5,
			6,
			7
		}),
		GLint,
		ARG_LIST({
			1,
			2,
			3,
			4
		}),
		GLenum,
		ARG_LIST({
			GL_UNSIGNED_BYTE,
			GL_BYTE,
			GL_UNSIGNED_SHORT,
			GL_SHORT,
			GL_FLOAT
		}),
		GLboolean,
		ARG_LIST({
			GL_FALSE,
			GL_TRUE
		}),
		GLsizei,
		ARG_LIST({
			0,
			2,
			4
		}),
		void*,
		ARG_LIST({
			(void*)(deUintptr)(0x0FF),
			(void*)(deUintptr)(0x0EF)
		})
	);
}

} // Performance
} // gles2
} // deqp
