#ifndef _GL3CCOMMONBUGSTESTS_HPP #define _GL3CCOMMONBUGSTESTS_HPP /*------------------------------------------------------------------------- * OpenGL Conformance Test Suite * ----------------------------- * * Copyright (c) 2015-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 gl3cCommonBugsTests.hpp * \brief Tiny conformance tests which verify various pieces of functionality which have * either been found to be broken on at least one publically available driver, * or whose behavior was found to differ across vendors. */ /*-------------------------------------------------------------------*/ #ifndef _GLCTESTCASE_HPP #include "glcTestCase.hpp" #endif #ifndef _GLWDEFS_HPP #include "glwDefs.hpp" #endif #ifndef _TCUDEFS_HPP #include "tcuDefs.hpp" #endif namespace gl3cts { /* Conformance test which verifies that glGetProgramiv() accepts the GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH * pname and returns meaningful values. */ class GetProgramivActiveUniformBlockMaxNameLengthTest : public deqp::TestCase { public: /* Public methods */ GetProgramivActiveUniformBlockMaxNameLengthTest(deqp::Context& context); void deinit(); void init(); tcu::TestNode::IterateResult iterate(); private: /* Private methods */ bool initTest(); /* Private members */ glw::GLuint m_fs_id; glw::GLuint m_po_id; glw::GLuint m_vs_id; }; /** Conformance test which verifies that input variables used in the cases described below * cannot be set to any value: * * - input variable defined in a fragment shader. * - input variable, wrapped in an input block, defined in a fragment shader. * - input variable defined in a geometry shader. * - input variable, wrapped in an input block, defined in a geometry shader. * - input variable defined in a tessellation control shader. * - input variable, wrapped in an input block, defined in a tessellation control shader. * - input patch variable. defined in a tessellation evaluation shader. * - input variable defined in a tessellation evaluation shader. * - input variable, wrapped in an input block, defined in a tessellation evaluation shader. * - input variable defined in a vertex shader. * * Furthermore, the test also verifies that an input variable cannot be passed as an inout * or out function argument in any of the five shader stages. * */ class InputVariablesCannotBeModifiedTest : public deqp::TestCase { public: /* Public methods */ InputVariablesCannotBeModifiedTest(deqp::Context& context); void deinit(); void init(); tcu::TestNode::IterateResult iterate(); private: /* Private type declarations */ typedef enum { SHADER_STAGE_FRAGMENT, SHADER_STAGE_GEOMETRY, SHADER_STAGE_TESSELLATION_CONTROL, SHADER_STAGE_TESSELLATION_EVALUATION, SHADER_STAGE_VERTEX } _shader_stage; typedef enum { TEST_ITERATION_FIRST, TEST_ITERATION_INPUT_FS_VARIABLE = TEST_ITERATION_FIRST, TEST_ITERATION_INPUT_FS_VARIABLE_IN_INPUT_BLOCK, TEST_ITERATION_INPUT_FS_VARIABLE_PASSED_TO_INOUT_FUNCTION_PARAMETER, TEST_ITERATION_INPUT_FS_VARIABLE_PASSED_TO_OUT_FUNCTION_PARAMETER, TEST_ITERATION_INPUT_GS_VARIABLE, TEST_ITERATION_INPUT_GS_VARIABLE_IN_INPUT_BLOCK, TEST_ITERATION_INPUT_GS_VARIABLE_PASSED_TO_INOUT_FUNCTION_PARAMETER, TEST_ITERATION_INPUT_GS_VARIABLE_PASSED_TO_OUT_FUNCTION_PARAMETER, TEST_ITERATION_INPUT_TC_VARIABLE, TEST_ITERATION_INPUT_TC_VARIABLE_IN_INPUT_BLOCK, TEST_ITERATION_INPUT_TC_VARIABLE_PASSED_TO_INOUT_FUNCTION_PARAMETER, TEST_ITERATION_INPUT_TC_VARIABLE_PASSED_TO_OUT_FUNCTION_PARAMETER, TEST_ITERATION_INPUT_TE_PATCH_VARIABLE, TEST_ITERATION_INPUT_TE_VARIABLE, TEST_ITERATION_INPUT_TE_VARIABLE_IN_INPUT_BLOCK, TEST_ITERATION_INPUT_TE_VARIABLE_PASSED_TO_INOUT_FUNCTION_PARAMETER, TEST_ITERATION_INPUT_TE_VARIABLE_PASSED_TO_OUT_FUNCTION_PARAMETER, TEST_ITERATION_INPUT_VS_VARIABLE, TEST_ITERATION_INPUT_VS_VARIABLE_PASSED_TO_INOUT_FUNCTION_PARAMETER, TEST_ITERATION_INPUT_VS_VARIABLE_PASSED_TO_OUT_FUNCTION_PARAMETER, TEST_ITERATION_COUNT } _test_iteration; /* Private functions */ void getIterationData(_test_iteration iteration, glu::ApiType* out_required_min_context_type_ptr, _shader_stage* out_target_shader_stage_ptr, std::string* out_body_ptr) const; std::string getIterationName(_test_iteration iteration) const; std::string getShaderStageName(_shader_stage stage) const; /* Private members */ glw::GLuint m_fs_id; glw::GLuint m_gs_id; glw::GLuint m_tc_id; glw::GLuint m_te_id; glw::GLuint m_vs_id; }; /* Conformance test which verifies that: * * - ! operator does not accept bvec2, bvec3 and bvec4 arguments. * - all() function does not accept a bool argument. * - not() function does not accept a bool argument. */ class InvalidUseCasesForAllNotFuncsAndExclMarkOpTest : public deqp::TestCase { public: /* Public methods */ InvalidUseCasesForAllNotFuncsAndExclMarkOpTest(deqp::Context& context); void deinit(); void init(); tcu::TestNode::IterateResult iterate(); private: /* Private type declarations */ typedef enum { TEST_ITERATION_FIRST, TEST_ITERATION_EXCL_MARK_OP_MUST_NOT_ACCEPT_BVEC2 = TEST_ITERATION_FIRST, TEST_ITERATION_EXCL_MARK_OP_MUST_NOT_ACCEPT_BVEC3, TEST_ITERATION_EXCL_MARK_OP_MUST_NOT_ACCEPT_BVEC4, TEST_ITERATION_ALL_FUNC_MUST_NOT_ACCEPT_BOOL, TEST_ITERATION_NOT_FUNC_MUST_NOT_ACCEPT_BOOL, TEST_ITERATION_COUNT } _test_iteration; /* Private functions */ std::string getIterationName(_test_iteration iteration) const; std::string getShaderBody(_test_iteration iteration) const; /* Private members */ glw::GLuint m_vs_id; }; /* Conformance test which verifies that all reserved names are rejected by the GL SL compiler * at compilation time, if used as: * * - Block names (input blocks, output blocks, SSBOs, UBOs) * - Function names * - Shader inputs * - Shader outputs * - Structure member name * - Structure names * - Subroutine names * - Uniform names * - Variable names * * in all shader stages supported for GL contexts, starting from GL 3.1. * * Support for all contexts (core profile where applicable) from GL 3.1 * up to GL 4.5 is implemented. * */ class ReservedNamesTest : public deqp::TestCase { public: /* Public methods */ ReservedNamesTest(deqp::Context& context); void deinit(); void init(); tcu::TestNode::IterateResult iterate(); private: /* Private type declarations */ typedef enum { LANGUAGE_FEATURE_ATOMIC_COUNTER, /* tests usage of incorrectly named atomic counters */ LANGUAGE_FEATURE_ATTRIBUTE, LANGUAGE_FEATURE_CONSTANT, LANGUAGE_FEATURE_FUNCTION_ARGUMENT_NAME, /* tests usage of incorrectly named function argument name */ LANGUAGE_FEATURE_FUNCTION_NAME, /* tests usage of incorrectly named function name */ LANGUAGE_FEATURE_INPUT, LANGUAGE_FEATURE_INPUT_BLOCK_INSTANCE_NAME, /* tests usage of incorrectly named input block instance */ LANGUAGE_FEATURE_INPUT_BLOCK_MEMBER_NAME, /* tests usage of an input block with an incorrectly named member variable */ LANGUAGE_FEATURE_INPUT_BLOCK_NAME, /* tests usage of incorrectly named input block name */ LANGUAGE_FEATURE_OUTPUT, LANGUAGE_FEATURE_OUTPUT_BLOCK_INSTANCE_NAME, /* tests usage of incorrectly named output block instance */ LANGUAGE_FEATURE_OUTPUT_BLOCK_MEMBER_NAME, /* tests usage of an output block with an incorrectly named member variable */ LANGUAGE_FEATURE_OUTPUT_BLOCK_NAME, /* tests usage of incorrectly named output block name */ LANGUAGE_FEATURE_SHADER_STORAGE_BLOCK_INSTANCE_NAME, /* tests usage of incorrectly named shader storage block instance */ LANGUAGE_FEATURE_SHADER_STORAGE_BLOCK_MEMBER_NAME, /* tests usage of a shader storage block with an incorrectly named member variable */ LANGUAGE_FEATURE_SHADER_STORAGE_BLOCK_NAME, /* tests usage of incorrectly named shader storage block name */ LANGUAGE_FEATURE_SHARED_VARIABLE, LANGUAGE_FEATURE_STRUCTURE_MEMBER, /* tests usage of a structure whose member variable is incorrectly named */ LANGUAGE_FEATURE_STRUCTURE_INSTANCE_NAME, /* tests usage of a structure whose instance is incorrectly named */ LANGUAGE_FEATURE_STRUCTURE_NAME, /* tests usage of a structure whose name is incorrect */ LANGUAGE_FEATURE_SUBROUTINE_FUNCTION_NAME, /* tests usage of incorrectly named subroutine functions */ LANGUAGE_FEATURE_SUBROUTINE_TYPE, /* tests usage of incorrectly named subroutine types */ LANGUAGE_FEATURE_SUBROUTINE_UNIFORM, /* tests usage of incorrectly named subroutine uniforms */ LANGUAGE_FEATURE_UNIFORM, /* tests usage of incorrectly named sampler2D uniforms */ LANGUAGE_FEATURE_UNIFORM_BLOCK_INSTANCE_NAME, /* tests usage of incorrectly named shader storage block instance */ LANGUAGE_FEATURE_UNIFORM_BLOCK_MEMBER_NAME, /* tests usage of a shader storage block with an incorrectly named member variable */ LANGUAGE_FEATURE_UNIFORM_BLOCK_NAME, /* tests usage of incorrectly named shader storage block name */ LANGUAGE_FEATURE_VARIABLE, LANGUAGE_FEATURE_VARYING, LANGUAGE_FEATURE_COUNT } _language_feature; typedef enum { SHADER_TYPE_COMPUTE, SHADER_TYPE_FRAGMENT, SHADER_TYPE_GEOMETRY, SHADER_TYPE_TESS_CONTROL, SHADER_TYPE_TESS_EVALUATION, SHADER_TYPE_VERTEX, SHADER_TYPE_COUNT } _shader_type; /* Private functions */ std::string getLanguageFeatureName(_language_feature language_feature) const; std::vector getReservedNames() const; std::string getShaderBody(_shader_type shader_type, _language_feature language_feature, const char* invalid_name) const; std::string getShaderTypeName(_shader_type shader_type) const; std::vector<_language_feature> getSupportedLanguageFeatures(_shader_type shader_type) const; std::vector<_shader_type> getSupportedShaderTypes() const; bool isStructAllowed(_shader_type shader_type, _language_feature language_feature) const; /* Private members */ glw::GLint m_max_fs_ssbos; glw::GLint m_max_gs_acs; glw::GLint m_max_gs_ssbos; glw::GLint m_max_tc_acs; glw::GLint m_max_tc_ssbos; glw::GLint m_max_te_acs; glw::GLint m_max_te_ssbos; glw::GLint m_max_vs_acs; glw::GLint m_max_vs_ssbos; glw::GLuint m_so_ids[SHADER_TYPE_COUNT]; }; /* Conformance test which verifies that the following types, used to declare a vertex * shader input variable, result in a compilation-time error: * * - bool, bvec2, bvec3, bvec4 * - opaque type * - structure * * The test also verifies that it is illegal to use any of the following qualifiers * for an otherwise valid vertex shader input variable declaration: * * - centroid * - patch * - sample */ class InvalidVSInputsTest : public deqp::TestCase { public: /* Public methods */ InvalidVSInputsTest(deqp::Context& context); void deinit(); void init(); tcu::TestNode::IterateResult iterate(); private: /* Private type declarations */ typedef enum { TEST_ITERATION_FIRST, TEST_ITERATION_INVALID_BOOL_INPUT = TEST_ITERATION_FIRST, TEST_ITERATION_INVALID_BVEC2_INPUT, TEST_ITERATION_INVALID_BVEC3_INPUT, TEST_ITERATION_INVALID_BVEC4_INPUT, TEST_ITERATION_INVALID_CENTROID_QUALIFIED_INPUT, TEST_ITERATION_INVALID_PATCH_QUALIFIED_INPUT, TEST_ITERATION_INVALID_OPAQUE_TYPE_INPUT, TEST_ITERATION_INVALID_STRUCTURE_INPUT, TEST_ITERATION_INVALID_SAMPLE_QUALIFIED_INPUT, TEST_ITERATION_COUNT } _test_iteration; /* Private functions */ std::string getIterationName(_test_iteration iteration) const; std::string getShaderBody(_test_iteration iteration) const; /* Private members */ glw::GLuint m_vs_id; }; /* Conformance test which verifies that parenthesis are not accepted in compute shaders, prior to GL4.4, * unless GL_ARB_enhanced_layouts is supported. */ class ParenthesisInLayoutQualifierIntegerValuesTest : public deqp::TestCase { public: /* Public methods */ ParenthesisInLayoutQualifierIntegerValuesTest(deqp::Context& context); void deinit(); void init(); tcu::TestNode::IterateResult iterate(); private: /* Private members */ glw::GLuint m_cs_id; glw::GLuint m_po_id; }; /* Conformance test which verifies that gl_PerVertex block re-declarations are required by * the OpenGL implementation if separate shader object functionality is used. * * Additionally, the test also checks that the following test cases result in an error: * * - Usage of any of the input/output built-in variables in any of the five shader stages, with the * variable not being defined in the re-declared gl_PerVertex block. * - gl_PerVertex block re-declarations defined in a different manner for each of the used shader stages. * * Each test iteration is run in two "modes": * * 1. A pipeline object is created and shader programs are attached to it. It is expected that validation * should fail. * 2. A single separate shader program, to which all shader stages used by the test are attached, is linked. * It is expected the linking process should fail. * */ class PerVertexValidationTest : public deqp::TestCase { public: /* Public methods */ PerVertexValidationTest(deqp::Context& context); void deinit(); void init(); tcu::TestNode::IterateResult iterate(); private: /* Private type definitions */ typedef enum { SHADER_STAGE_FRAGMENT = 1 << 0, SHADER_STAGE_GEOMETRY = 1 << 1, SHADER_STAGE_TESSELLATION_CONTROL = 1 << 2, SHADER_STAGE_TESSELLATION_EVALUATION = 1 << 3, SHADER_STAGE_VERTEX = 1 << 4 } _shader_stage; typedef enum { TEST_ITERATION_FIRST, TEST_ITERATION_UNDECLARED_IN_PERVERTEX_GS_GL_CLIPDISTANCE_USAGE = TEST_ITERATION_FIRST, TEST_ITERATION_UNDECLARED_IN_PERVERTEX_GS_GL_CULLDISTANCE_USAGE, TEST_ITERATION_UNDECLARED_IN_PERVERTEX_GS_GL_POINTSIZE_USAGE, TEST_ITERATION_UNDECLARED_IN_PERVERTEX_GS_GL_POSITION_USAGE, TEST_ITERATION_UNDECLARED_IN_PERVERTEX_TC_GL_CLIPDISTANCE_USAGE, TEST_ITERATION_UNDECLARED_IN_PERVERTEX_TC_GL_CULLDISTANCE_USAGE, TEST_ITERATION_UNDECLARED_IN_PERVERTEX_TC_GL_POINTSIZE_USAGE, TEST_ITERATION_UNDECLARED_IN_PERVERTEX_TC_GL_POSITION_USAGE, TEST_ITERATION_UNDECLARED_IN_PERVERTEX_TE_GL_CLIPDISTANCE_USAGE, TEST_ITERATION_UNDECLARED_IN_PERVERTEX_TE_GL_CULLDISTANCE_USAGE, TEST_ITERATION_UNDECLARED_IN_PERVERTEX_TE_GL_POINTSIZE_USAGE, TEST_ITERATION_UNDECLARED_IN_PERVERTEX_TE_GL_POSITION_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_GS_GL_CLIPDISTANCE_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_GS_GL_CULLDISTANCE_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_GS_GL_POINTSIZE_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_GS_GL_POSITION_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_TC_GL_CLIPDISTANCE_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_TC_GL_CULLDISTANCE_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_TC_GL_POINTSIZE_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_TC_GL_POSITION_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_TE_GL_CLIPDISTANCE_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_TE_GL_CULLDISTANCE_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_TE_GL_POINTSIZE_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_TE_GL_POSITION_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_VS_GL_CLIPDISTANCE_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_VS_GL_CULLDISTANCE_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_VS_GL_POINTSIZE_USAGE, TEST_ITERATION_UNDECLARED_OUT_PERVERTEX_VS_GL_POSITION_USAGE, TEST_ITERATION_PERVERTEX_DECLARATION_MISMATCH_GS_VS, TEST_ITERATION_PERVERTEX_DECLARATION_MISMATCH_GS_TC_TE_VS, TEST_ITERATION_PERVERTEX_DECLARATION_MISMATCH_TC_TE_VS, TEST_ITERATION_PERVERTEX_BLOCK_UNDEFINED, /* Always last */ TEST_ITERATION_COUNT } _test_iteration; typedef enum { VALIDATION_RESULT_FALSE, VALIDATION_RESULT_TRUE, VALIDATION_RESULT_UNDEFINED, } _validation; /* Private functions */ void destroyPOsAndSOs(); _validation getProgramPipelineValidationExpectedResult(void) const; std::string getShaderStageName(_shader_stage shader_stage) const; std::string getTestIterationName(_test_iteration iteration) const; void getTestIterationProperties(glu::ContextType context_type, _test_iteration iteration, glu::ContextType* out_min_context_type_ptr, _shader_stage* out_used_shader_stages_ptr, std::string* out_gs_body_ptr, std::string* out_tc_body_ptr, std::string* out_te_body_ptr, std::string* out_vs_body_ptr) const; std::string getVertexShaderBody(glu::ContextType context_type, _test_iteration iteration, std::string main_body = std::string("gl_Position = vec4(1.0);")) const; bool isShaderProgramLinkingFailureExpected(_test_iteration iteration) const; bool runPipelineObjectValidationTestMode(_test_iteration iteration); bool runSeparateShaderTestMode(_test_iteration iteration); /* Private members */ glw::GLuint m_fs_id; glw::GLuint m_fs_po_id; glw::GLuint m_gs_id; glw::GLuint m_gs_po_id; glw::GLuint m_pipeline_id; glw::GLuint m_tc_id; glw::GLuint m_tc_po_id; glw::GLuint m_te_id; glw::GLuint m_te_po_id; glw::GLuint m_vs_id; glw::GLuint m_vs_po_id; }; /* Conformance test which verifies that glCopyBufferSubData() and glBufferSubData() calls, executed * within a single page boundary, work correctly. The test is ran for a number of consecutive pages, * a predefined number of times, where each pass is separated by a front/back buffer swap operation. */ class SparseBuffersWithCopyOpsTest : public deqp::TestCase { public: /* Public methods */ SparseBuffersWithCopyOpsTest(deqp::Context& context); void deinit(); void init(); tcu::TestNode::IterateResult iterate(); private: /* Private methods */ bool initTest(); /* Private members */ glw::GLuint m_bo_id; glw::GLuint m_bo_read_id; unsigned char* m_clear_buffer; glw::GLint m_page_size; unsigned char m_reference_data[16]; unsigned int m_result_data_storage_size; const unsigned int m_n_iterations_to_run; const unsigned int m_n_pages_to_test; const unsigned int m_virtual_bo_size; }; /** Test group which encapsulates all "common bugs" conformance tests */ class CommonBugsTests : public deqp::TestCaseGroup { public: /* Public methods */ CommonBugsTests(deqp::Context& context); void init(); private: CommonBugsTests(const CommonBugsTests& other); CommonBugsTests& operator=(const CommonBugsTests& other); }; } /* glcts namespace */ #endif // _GL3CCOMMONBUGSTESTS_HPP