#ifndef _GL4CPIPELINESTATISTICSQUERYTESTS_HPP
#define _GL4CPIPELINESTATISTICSQUERYTESTS_HPP
/*-------------------------------------------------------------------------
 * OpenGL Conformance Test Suite
 * -----------------------------
 *
 * Copyright (c) 2014-2016 The Khronos Group Inc.
 *
 * 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
 */ /*-------------------------------------------------------------------*/

/**
 */ /*!
 * \file  gl4c PipelineStatisticsQueryTests.hpp
 * \brief Declares test classes that verify conformance of the
 *        GL implementation with GL_ARB_pipeline_statistics_query
 *        extension specification.
 */ /*-------------------------------------------------------------------*/

#include "glcTestCase.hpp"
#include "glwDefs.hpp"
#include "tcuDefs.hpp"
#include <limits.h>
#include <sstream>
#include <string.h>

namespace glcts
{
class PipelineStatisticsQueryUtilities
{
public:
	/* Public type definitions */
	typedef bool (*PFNQUERYDRAWHANDLERPROC)(void* user_arg);

	/* Type of the draw call used for a test iteration */
	enum _draw_call_type
	{
		/* glDrawArrays() */
		DRAW_CALL_TYPE_GLDRAWARRAYS,
		/* glDrawArraysIndirect() */
		DRAW_CALL_TYPE_GLDRAWARRAYSINDIRECT,
		/* glDrawArraysInstanced() */
		DRAW_CALL_TYPE_GLDRAWARRAYSINSTANCED,
		/* glDrawArraysInstancedBaseInstance() */
		DRAW_CALL_TYPE_GLDRAWARRAYSINSTANCEDBASEINSTANCE,
		/* glDrawElements() */
		DRAW_CALL_TYPE_GLDRAWELEMENTS,
		/* glDrawElementsBaseVertex() */
		DRAW_CALL_TYPE_GLDRAWELEMENTSBASEVERTEX,
		/* glDrawElementsIndirect() */
		DRAW_CALL_TYPE_GLDRAWELEMENTSINDIRECT,
		/* glDrawElementsInstanced() */
		DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCED,
		/* glDrawElementsInstancedBaseInstance() */
		DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCEDBASEINSTANCE,
		/* glDrawElementsInstancedBaseVertexBaseInstance() */
		DRAW_CALL_TYPE_GLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCE,
		/* glDrawRangeElements() */
		DRAW_CALL_TYPE_GLDRAWRANGEELEMENTS,
		/* glDrawRangeElementsBaseVertex() */
		DRAW_CALL_TYPE_GLDRAWRANGEELEMENTSBASEVERTEX,

		/* Always last */
		DRAW_CALL_TYPE_COUNT
	};

	/* Input primitive type defined in geometry shader body used by a test iteration */
	enum _geometry_shader_input
	{
		GEOMETRY_SHADER_INPUT_FIRST,

		GEOMETRY_SHADER_INPUT_POINTS = GEOMETRY_SHADER_INPUT_FIRST,
		GEOMETRY_SHADER_INPUT_LINES,
		GEOMETRY_SHADER_INPUT_LINES_ADJACENCY,
		GEOMETRY_SHADER_INPUT_TRIANGLES,
		GEOMETRY_SHADER_INPUT_TRIANGLES_ADJACENCY,

		/* Always last */
		GEOMETRY_SHADER_INPUT_COUNT
	};

	/* Output primitive type defined in geometry shader body used by a test iteration */
	enum _geometry_shader_output
	{
		GEOMETRY_SHADER_OUTPUT_FIRST,

		GEOMETRY_SHADER_OUTPUT_POINTS = GEOMETRY_SHADER_OUTPUT_FIRST,
		GEOMETRY_SHADER_OUTPUT_LINE_STRIP,
		GEOMETRY_SHADER_OUTPUT_TRIANGLE_STRIP,

		/* Always last */
		GEOMETRY_SHADER_OUTPUT_COUNT
	};

	/* Primitive type used for a draw call */
	enum _primitive_type
	{
		PRIMITIVE_TYPE_FIRST,

		/* GL_POINTS */
		PRIMITIVE_TYPE_POINTS = PRIMITIVE_TYPE_FIRST,
		/* GL_LINE_LOOP */
		PRIMITIVE_TYPE_LINE_LOOP,
		/* GL_LINE_STRIP */
		PRIMITIVE_TYPE_LINE_STRIP,
		/* GL_LINES */
		PRIMITIVE_TYPE_LINES,
		/* GL_LINES_ADJACENCY */
		PRIMITIVE_TYPE_LINES_ADJACENCY,
		/* GL_PATCHES */
		PRIMITIVE_TYPE_PATCHES,
		/* GL_TRIANGLE_FAN */
		PRIMITIVE_TYPE_TRIANGLE_FAN,
		/* GL_TRIANGLE_STRIP */
		PRIMITIVE_TYPE_TRIANGLE_STRIP,
		/* GL_TRIANGLES */
		PRIMITIVE_TYPE_TRIANGLES,
		/* GL_TRIANGLES_ADJACENCY */
		PRIMITIVE_TYPE_TRIANGLES_ADJACENCY,

		/* Always last */
		PRIMITIVE_TYPE_COUNT
	};

	/* Stores result of a single test iteration. */
	struct _test_execution_result
	{
		/* true if 64-bit signed integer counter value was retrieved for the iteration,
		 * false otherwise.
		 */
		bool int64_written;
		/* true if 64-bit unsigned integer counter value was retrieved for the iteration,
		 * false otherwise.
		 */
		bool uint64_written;

		/* 32-bit signed integer counter value, as stored in the query buffer object
		 * used for the test iteration. This variable will only be modified if query
		 * buffer objects are supported.
		 */
		glw::GLint result_qo_int;
		/* 64-bit signed integer counter value, as stored in the query buffer object
		 * used for the test iteration. This variable will only be modified if query
		 * buffer objects are supported, and int64_written is true.
		 */
		glw::GLint64 result_qo_int64;
		/* 32-bit unsigned integer counter value, as stored in the query buffer object
		 * used for the test iteration. This variable will only be modified if query
		 * buffer objects are supported.
		 */
		glw::GLuint result_qo_uint;
		/* 64-bit unsigned integer counter value, as stored in the query buffer object
		 * used for the test iteration. This variable will only be modified if query
		 * buffer objects are supported, and uint64_written is true.
		 */
		glw::GLuint64 result_qo_uint64;

		/* 32-bit signed integer counter value, as stored in the query object
		 * used for the test iteration.
		 */
		glw::GLint result_int;
		/* 64-bit signed integer counter value, as stored in the query object
		 * used for the test iteration. Only set if int64_written is true.
		 */
		glw::GLint64 result_int64;
		/* 32-bit unsigned integer counter value, as stored in the query object
		 * used for the test iteration.
		 */
		glw::GLuint result_uint;
		/* 64-bit unsigned integer counter value, as stored in the query object
		 * used for the test iteration. Only set if uint64_written is true.
		 */
		glw::GLuint64 result_uint64;

		/* Constructor */
		_test_execution_result()
		{
			result_qo_int	= INT_MAX;
			result_qo_int64  = LLONG_MAX;
			result_qo_uint   = UINT_MAX;
			result_qo_uint64 = ULLONG_MAX;

			result_int	= INT_MAX;
			result_int64  = LLONG_MAX;
			result_uint   = UINT_MAX;
			result_uint64 = ULLONG_MAX;

			int64_written  = false;
			uint64_written = false;
		}
	};

	/* Tells how the result values should be verified against
	 * the reference value.
	 */
	enum _verification_type
	{
		/* The result value should be equal to the reference value */
		VERIFICATION_TYPE_EXACT_MATCH,
		/* The result value should be equal or larger than the reference value */
		VERIFICATION_TYPE_EQUAL_OR_GREATER,

		VERIFICATION_TYPE_UNDEFINED
	};

	/* Code of a compute shader used by a functional test that verifies
	 * GL_COMPUTE_SHADER_INVOCATIONS_ARB query works correctly.
	 */
	static const char* dummy_cs_code;
	static const char* dummy_cs_code_arb;
	/* Code of a fragment shader used by a number of functional tests */
	static const char* dummy_fs_code;
	/* Code of a tessellation control shader used by a functional test that verifies
	 * GL_TESS_CONTROL_SHADER_PATCHES_ARB and GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB
	 * queries work correctly.
	 */
	static const char* dummy_tc_code;
	/* Code of a tessellation evaluation shader used by a functional test that verifies
	 * GL_TESS_CONTROL_SHADER_PATCHES_ARB and GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB
	 * queries work correctly.
	 */
	static const char* dummy_te_code;
	/* Code of a vertex shader used by a number of functional tests */
	static const char* dummy_vs_code;

	/* Tells how many query targets are stored in query_targets */
	static const unsigned int n_query_targets;
	/* Stores all query targets that should be used by the tests */
	static const glw::GLenum query_targets[];

	/* Tells the offset, relative to the beginning of the buffer object storage,
	 * from which the query's int32 result value starts. */
	static const unsigned int qo_bo_int_offset;
	/* Tells the offset, relative to the beginning of the buffer object storage,
	 * from which the query's int64 result value starts. */
	static const unsigned int qo_bo_int64_offset;
	/* Tells the offset, relative to the beginning of the buffer object storage,
	 * from which the query's uint32 result value starts. */
	static const unsigned int qo_bo_uint_offset;
	/* Tells the offset, relative to the beginning of the buffer object storage,
	 * from which the query's uint64 result value starts. */
	static const unsigned int qo_bo_uint64_offset;
	static const unsigned int qo_bo_size;

	/* Public methods */
	static std::string buildGeometryShaderBody(_geometry_shader_input gs_input, _geometry_shader_output gs_output,
											   unsigned int n_primitives_to_emit_in_stream0, unsigned int n_streams);

	static bool executeQuery(glw::GLenum query_type, glw::GLuint qo_id, glw::GLuint qo_bo_id,
							 PFNQUERYDRAWHANDLERPROC pfn_draw, void* draw_user_arg,
							 const glu::RenderContext& render_context, tcu::TestContext& test_context,
							 const glu::ContextInfo& context_info, _test_execution_result* out_result,
							 bool& skipped);

	static glw::GLenum getEnumForPrimitiveType(_primitive_type primitive_type);
	static std::string getGLSLStringForGSInput(_geometry_shader_input gs_input);
	static std::string getGLSLStringForGSOutput(_geometry_shader_output gs_output);
	static unsigned int getNumberOfVerticesForGSInput(_geometry_shader_input gs_input);
	static unsigned int getNumberOfVerticesForGSOutput(_geometry_shader_output gs_output);
	static unsigned int getNumberOfVerticesForPrimitiveType(_primitive_type primitive_type);
	static _primitive_type getPrimitiveTypeFromGSInput(_geometry_shader_input gs_input);
	static std::string getStringForDrawCallType(_draw_call_type draw_call_type);
	static std::string getStringForEnum(glw::GLenum value);
	static std::string getStringForPrimitiveType(_primitive_type primitive_type);

	static bool isDrawCallSupported(_draw_call_type draw_call, const glw::Functions& gl);

	static bool isInstancedDrawCall(_draw_call_type draw_call);

	static bool isQuerySupported(glw::GLenum value, const glu::ContextInfo& context_info,
								 const glu::RenderContext& render_context);

	static bool verifyResultValues(const _test_execution_result& run_result, unsigned int n_expected_values,
								   const glw::GLuint64* expected_values, bool should_check_qo_bo_values,
								   const glw::GLenum query_type, const _draw_call_type* draw_call_type_ptr,
								   const _primitive_type* primitive_type_ptr, bool is_primitive_restart_enabled,
								   tcu::TestContext& test_context, _verification_type verification_type);

	/** Constructs a string that describes details of a test iteration that has been
	 *  detected to have failed.
	 *
	 *  @param value                        Query counter value as retrieved by the test iteration.
	 *  @param value_type                   Null-terminated string holding the name of the type
	 *                                      of the result value.
	 *  @param n_expected_values            Number of possible expected values.
	 *  @param expected_values              Array of possible expected values.
	 *  @param query_type                   Type of the query used by the test iteration.
	 *  @param draw_call_type_name          Type of the draw call used by the test iteration.
	 *  @param primitive_type_name          Primitive type used for the test iteration's draw call.
	 *  @param is_primitive_restart_enabled true if the test iteration was run with "primitive restart"
	 *                                      functionality enabled, false otherwise.
	 *
	 *  @return                             String that includes a human-readable description of the
	 *                                      test iteration's properties.
	 *
	 */
	template <typename VALUE_TYPE>
	static std::string getVerifyResultValuesErrorString(VALUE_TYPE value, const char* value_type,
														unsigned int		 n_expected_values,
														const glw::GLuint64* expected_values, glw::GLenum query_type,
														std::string draw_call_type_name,
														std::string primitive_type_name,
														bool		is_primitive_restart_enabled)
	{
		std::stringstream log_sstream;

		DE_ASSERT(expected_values != DE_NULL);

		log_sstream << "Invalid default " << value_type << " query result value: found "
														   "["
					<< value << "], expected:"
								"["
					<< expected_values[0] << "]";

		for (unsigned int i = 1; i < n_expected_values; ++i)
		{
			log_sstream << " or [" << expected_values[i] << "]";
		}

		log_sstream << ", query type:"
					   "["
					<< getStringForEnum(query_type) << "], "
													   "GL_PRIMITIVE_RESTART mode:"
													   "["
					<< ((is_primitive_restart_enabled) ? "enabled" : "disabled") << "]"
																					", draw call type:"
																					"["
					<< draw_call_type_name.c_str() << "]"
													  ", primitive type:"
													  "["
					<< primitive_type_name.c_str() << "].";

		return log_sstream.str();
	}
};

/** Check that calling BeginQuery with a pipeline statistics query target
 *  generates an INVALID_OPERATION error if the specified query was
 *  previously used with a different pipeline statistics query target.
 **/
class PipelineStatisticsQueryTestAPICoverage1 : public deqp::TestCase
{
public:
	/* Public methods */
	PipelineStatisticsQueryTestAPICoverage1(deqp::Context& context);

	virtual void						 deinit();
	virtual tcu::TestNode::IterateResult iterate();

private:
	/* Private fields */
	glw::GLuint m_qo_id;
};

/** Performs the following tests:
 *
 *  * If GL 3.2 and ARB_geometry_shader4 are not supported then check that
 *    calling BeginQuery with target GEOMETRY_SHADER_INVOCATIONS or
 *    GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB generates an INVALID_ENUM error.
 *
 *  * If GL 4.0 and ARB_tessellation_shader are not supported then check that
 *    calling BeginQuery with target TESS_CONTROL_SHADER_INVOCATIONS_ARB or
 *    TESS_EVALUATION_SHADER_INVOCATIONS_ARB generates an INVALID_ENUM error.
 *
 *  * If GL 4.3 and ARB_compute_shader are not supported then check that
 *    calling BeginQuery with target COMPUTE_SHADER_INVOCATIONS_ARB generates
 *    an INVALID_ENUM error.
 *
 **/
class PipelineStatisticsQueryTestAPICoverage2 : public deqp::TestCase
{
public:
	/* Public methods */
	PipelineStatisticsQueryTestAPICoverage2(deqp::Context& context);

	virtual void						 deinit();
	virtual tcu::TestNode::IterateResult iterate();

private:
	/* Private fields */
	glw::GLuint m_qo_id;
};

/** Base class used by all functional test implementations. Provides various
 *  methods that are shared between functional tests.
 *
 *  Derivative classes must implement executeTest() method.
 */
class PipelineStatisticsQueryTestFunctionalBase : public deqp::TestCase
{
public:
	/* Public methods */
	PipelineStatisticsQueryTestFunctionalBase(deqp::Context& context, const char* name, const char* description);

	virtual void						 deinit();
	virtual tcu::TestNode::IterateResult iterate();

protected:
	/* Protected methods */
	void buildProgram(const char* cs_body, const char* fs_body, const char* gs_body, const char* tc_body,
					  const char* te_body, const char* vs_body);

	virtual void deinitObjects();

	virtual bool executeTest(glw::GLenum current_query_target) = 0;
	void		 initFBO();
	virtual void initObjects();
	void		 initQOBO();
	void initVAO(unsigned int n_components_per_vertex);

	void initVBO(const float* raw_vertex_data, unsigned int raw_vertex_data_size, const unsigned int* raw_index_data,
				 unsigned int raw_index_data_size, unsigned int indirect_draw_bo_count_argument,
				 unsigned int indirect_draw_bo_primcount_argument, unsigned int indirect_draw_bo_baseinstance_argument,
				 unsigned int indirect_draw_bo_first_argument,		 /* glDrawArrays() only */
				 unsigned int indirect_draw_bo_basevertex_argument); /* glDrawElements() only */

	virtual bool shouldExecuteForQueryTarget(glw::GLenum query_target);

	/* Protected static methods */
	static bool queryCallbackDrawCallHandler(void* pThis);

	/* Protected fields */
	glw::GLuint m_bo_qo_id;
	glw::GLuint m_fbo_id;
	glw::GLuint m_po_id;
	glw::GLuint m_qo_id;
	glw::GLuint m_to_id;
	glw::GLuint m_vao_id;
	glw::GLuint m_vbo_id;

	const unsigned int m_to_height;
	const unsigned int m_to_width;

	unsigned int m_vbo_indirect_arrays_argument_offset;
	unsigned int m_vbo_indirect_elements_argument_offset;
	unsigned int m_vbo_index_data_offset;
	unsigned int m_vbo_n_indices;
	unsigned int m_vbo_vertex_data_offset;

	PipelineStatisticsQueryUtilities::_draw_call_type m_current_draw_call_type;
	PipelineStatisticsQueryUtilities::_primitive_type m_current_primitive_type;
	unsigned int									  m_indirect_draw_call_baseinstance_argument;
	unsigned int									  m_indirect_draw_call_basevertex_argument;
	unsigned int									  m_indirect_draw_call_count_argument;
	unsigned int									  m_indirect_draw_call_first_argument;
	unsigned int									  m_indirect_draw_call_firstindex_argument;
	unsigned int									  m_indirect_draw_call_primcount_argument;
};

/** Performs the following functional test:
 *
 * Check that all pipeline statistics query types return a result of zero
 * if no rendering commands are issued between BeginQuery and EndQuery.
 *
 **/
class PipelineStatisticsQueryTestFunctional1 : public PipelineStatisticsQueryTestFunctionalBase
{
public:
	/* Public methods */
	PipelineStatisticsQueryTestFunctional1(deqp::Context& context);

protected:
	/* Protected methods */
	bool executeTest(glw::GLenum current_query_target);
};

/** Performs the following functional test:
 *
 * Check that all pipeline statistics query types return a result of zero
 * if Clear, ClearBuffer*, BlitFramebuffer, or any of the non-rendering
 * commands involving blits or copies (e.g. TexSubImage, CopyImageSubData,
 * ClearTexSubImage, BufferSubData, ClearBufferSubData) are issued between
 * BeginQuery and EndQuery.
 *
 **/
class PipelineStatisticsQueryTestFunctional2 : public PipelineStatisticsQueryTestFunctionalBase
{
public:
	/* Public methods */
	PipelineStatisticsQueryTestFunctional2(deqp::Context& context);

protected:
	/* Protected methods */
	void deinitObjects();
	bool executeTest(glw::GLenum current_query_target);
	void initObjects();

private:
	static bool executeBlitFramebufferTest(void* pThis);
	static bool executeBufferSubDataTest(void* pThis);
	static bool executeClearBufferfvColorBufferTest(void* pThis);
	static bool executeClearBufferfvDepthBufferTest(void* pThis);
	static bool executeClearBufferivStencilBufferTest(void* pThis);
	static bool executeClearBufferSubDataTest(void* pThis);
	static bool executeClearColorBufferTest(void* pThis);
	static bool executeClearDepthBufferTest(void* pThis);
	static bool executeClearStencilBufferTest(void* pThis);
	static bool executeClearTexSubImageTest(void* pThis);
	static bool executeCopyImageSubDataTest(void* pThis);
	static bool executeTexSubImageTest(void* pThis);

	/* Private fields */
	glw::GLuint m_bo_id;
	glw::GLuint m_fbo_draw_id;
	glw::GLuint m_fbo_read_id;
	glw::GLuint m_to_draw_fbo_id;
	glw::GLuint m_to_read_fbo_id;

	const glw::GLuint m_to_height;
	const glw::GLuint m_to_width;

	static const glw::GLuint bo_size;
};

/** Performs the following functional tests:
 *
 * Using the basic outline check that VERTICES_SUBMITTED_ARB queries return
 * the number of vertices submitted using draw commands. Vertices
 * corresponding to partial/incomplete primitives may or may not be counted
 * (e.g. when submitting a single instance with 8 vertices with primitive
 * mode TRIANGLES, the result of the query could be either 6 or 8).
 *
 * Using the basic outline check that VERTICES_SUBMITTED_ARB queries don't
 * count primitive topology restarts when PRIMITIVE_RESTART is enabled and
 * DrawElements* is used to submit an element array which contains one or
 * more primitive restart index values.
 *
 * Using the basic outline check that PRIMITIVES_SUBMITTED_ARB queries
 * return the exact number of primitives submitted using draw commands.
 * Partial/incomplete primitives may or may not be counted (e.g. when
 * submitting a single instance with 8 vertices with primitive mode
 * TRIANGLES, the result of the query could be either 2 or 3). Test the
 * behavior with all supported primitive modes.
 *
 * Using the basic outline check that PRIMITIVES_SUBMITTED_ARB queries
 * don't count primitive topology restarts when PRIMITIVE_RESTART is
 * enabled and DrawElements* is used to submit an element array which
 * contains one or more primitive restart index values. Also, partial/
 * incomplete primitives resulting from the use of primitive restart index
 * values may or may not be counted.
 *
 * Using the basic outline check that CLIPPING_INPUT_PRIMITIVES_ARB queries
 * return the exact number of primitives reaching the primitive clipping
 * stage. If RASTERIZER_DISCARD is disabled, and the tessellation and
 * geometry shader stage is not used, this should match the number of
 * primitives submitted.
 *
 * Using the basic outline check that CLIPPING_OUTPUT_PRIMITIVES_ARB
 * queries return a value that is always greater than or equal to the
 * number of primitives submitted if RASTERIZER_DISCARD is disabled, there
 * is no tessellation and geometry shader stage used, and all primitives
 * lie entirely in the cull volume.
 *
 **/
class PipelineStatisticsQueryTestFunctional3 : public PipelineStatisticsQueryTestFunctionalBase
{
public:
	/* Public methods */
	PipelineStatisticsQueryTestFunctional3(deqp::Context& context);

protected:
	/* Protected methods */
	void deinitObjects();
	bool executeTest(glw::GLenum current_query_target);
	void initObjects();
	bool shouldExecuteForQueryTarget(glw::GLenum query_target);

private:
	/* Private methods */
	void getExpectedPrimitivesSubmittedQueryResult(
		PipelineStatisticsQueryUtilities::_primitive_type current_primitive_type, unsigned int* out_results_written,
		glw::GLuint64 out_results[4]);

	void getExpectedVerticesSubmittedQueryResult(
		PipelineStatisticsQueryUtilities::_primitive_type current_primitive_type, unsigned int* out_results_written,
		glw::GLuint64 out_results[4]);

	/* Private fields */
	bool m_is_primitive_restart_enabled;
};

/** Performs the following functional test:
 *
 * Using the basic outline with a program having a vertex shader check that
 * VERTEX_SHADER_INVOCATIONS_ARB queries return a result greater than zero
 * if at least one vertex is submitted to the GL.
 *
 **/
class PipelineStatisticsQueryTestFunctional4 : public PipelineStatisticsQueryTestFunctionalBase
{
public:
	/* Public methods */
	PipelineStatisticsQueryTestFunctional4(deqp::Context& context);

protected:
	/* Protected methods */
	void deinitObjects();
	bool executeTest(glw::GLenum current_query_target);
	void initObjects();
	bool shouldExecuteForQueryTarget(glw::GLenum query_target);
};

/** Performs the following functional test:
 *
 * If GL 4.0 is supported, using the basic outline with a program having a
 * tessellation control and tessellation evaluation shader check that
 * TESS_CONTROL_SHADER_INVOCATIONS_ARB and TESS_EVALUATION_SHADER_-
 * INVOCATIONS_ARB queries return a result greater than zero if at least
 * one patch is needed to be processed by the GL (e.g. PATCH_VERTICES is 3,
 * and at least 3 vertices are submitted to the GL).
 *
 **/
class PipelineStatisticsQueryTestFunctional5 : public PipelineStatisticsQueryTestFunctionalBase
{
public:
	/* Public methods */
	PipelineStatisticsQueryTestFunctional5(deqp::Context& context);

protected:
	/* Protected methods */
	void deinitObjects();
	bool executeTest(glw::GLenum current_query_target);
	void initObjects();
	bool shouldExecuteForQueryTarget(glw::GLenum query_target);
};

/** Performs the following functional test:
 *
 * If GL 3.2 is supported, using the basic outline with a program having a
 * geometry shader check that GEOMETRY_SHADER_INVOCATIONS queries return
 * a result greater than zero if at least one complete primitive is
 * submitted to the GL.
 *
 * If GL 3.2 is supported, using the basic outline with a program having a
 * geometry shader check that GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB
 * queries return the exact number of primitives emitted by the geometry
 * shader. Also, if GL 4.0 is supported, use a geometry shader that emits
 * primitives to multiple vertex streams. In this case the result of
 * GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB has to match the sum of the
 * number of primitives emitted to each particular vertex stream.
 *
 **/
class PipelineStatisticsQueryTestFunctional6 : public PipelineStatisticsQueryTestFunctionalBase
{
public:
	/* Public methods */
	PipelineStatisticsQueryTestFunctional6(deqp::Context& context);

protected:
	/* Protected methods */
	void deinitObjects();
	bool executeTest(glw::GLenum current_query_target);
	void initObjects();
	bool shouldExecuteForQueryTarget(glw::GLenum query_target);

private:
	/* Private fields */
	const unsigned int m_n_primitives_emitted_by_gs;
	const unsigned int m_n_streams_emitted_by_gs;
};

/** Performs the following functional test:
 *
 * Using the basic outline with a program having a fragment shader check
 * that FRAGMENT_SHADER_INVOCATIONS_ARB queries return a result greater
 * than zero if at least one fragment gets rasterized.
 *
 **/
class PipelineStatisticsQueryTestFunctional7 : public PipelineStatisticsQueryTestFunctionalBase
{
public:
	/* Public methods */
	PipelineStatisticsQueryTestFunctional7(deqp::Context& context);

protected:
	/* Protected methods */
	void deinitObjects();
	bool executeTest(glw::GLenum current_query_target);
	void initObjects();
	bool shouldExecuteForQueryTarget(glw::GLenum query_target);
};

/** Performs the following functional test:
 *
 * Using the basic outline with a program having a compute shader check
 * that COMPUTE_SHADER_INVOCATIONS_ARB queries return a result greater
 * than zero if at least a single work group is submitted using one of the
 * Dispatch* commands.
 *
 **/
class PipelineStatisticsQueryTestFunctional8 : public PipelineStatisticsQueryTestFunctionalBase
{
public:
	/* Public methods */
	PipelineStatisticsQueryTestFunctional8(deqp::Context& context);

protected:
	/* Protected methods */
	void deinitObjects();
	bool executeTest(glw::GLenum current_query_target);
	void initObjects();
	bool shouldExecuteForQueryTarget(glw::GLenum query_target);

private:
	/* Private methods */
	static bool queryCallbackDispatchCallHandler(void* pInstance);

	/* Private fields */
	glw::GLuint  m_bo_dispatch_compute_indirect_args_offset;
	glw::GLuint  m_bo_id;
	unsigned int m_current_iteration;
};

/** Test group which encapsulates all conformance tests for
 *  GL_ARB_pipeline_statistics_query extension.
 */
class PipelineStatisticsQueryTests : public deqp::TestCaseGroup
{
public:
	/* Public methods */
	PipelineStatisticsQueryTests(deqp::Context& context);

	void init(void);

private:
	PipelineStatisticsQueryTests(const PipelineStatisticsQueryTests& other);
	PipelineStatisticsQueryTests& operator=(const PipelineStatisticsQueryTests& other);
};

} /* glcts namespace */

#endif // _GL4CPIPELINESTATISTICSQUERYTESTS_HPP
