| #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); |
| |
| 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 |