#ifndef _ESEXTCTESTCASEBASE_HPP #define _ESEXTCTESTCASEBASE_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 */ /*-------------------------------------------------------------------*/ #include "glcContext.hpp" #include "gluShaderUtil.hpp" #include "tcuDefs.hpp" #include "tcuTestCase.hpp" #include "glcExtTokens.hpp" #include "glwDefs.hpp" #include "glwFunctions.hpp" #include #include #include /* String definitions */ #define GEOMETRY_SHADER_EXTENSION_NOT_SUPPORTED "Geometry shader functionality not supported, skipping" #define GEOMETRY_SHADER_POINT_SIZE_NOT_SUPPORTED "Geometry shader point size functionality not supported, skipping" #define GPU_SHADER5_EXTENSION_NOT_SUPPORTED "GPU shader5 functionality not supported, skipping" #define TESSELLATION_SHADER_EXTENSION_NOT_SUPPORTED "Tessellation shader functionality not supported, skipping" #define TEXTURE_BORDER_CLAMP_NOT_SUPPORTED "Texture border clamp functionality not supported, skipping" #define TEXTURE_CUBE_MAP_ARRAY_EXTENSION_NOT_SUPPORTED "Texture cube map array functionality not supported, skipping" #define SHADER_IMAGE_ATOMIC_EXTENSION_NOT_SUPPORTED "Shader image atomic functionality not supported, skipping" #define TEXTURE_BUFFER_EXTENSION_NOT_SUPPORTED "Texture buffer functionality not supported, skipping" #define DRAW_BUFFERS_INDEXED_NOT_SUPPORTED "Draw buffers indexed functionality not supported, skipping" #define VIEWPORT_ARRAY_NOT_SUPPORTED "Viewport array functionality not supported, skipping" #define DISJOINT_TIMER_QUERY_NOT_SUPPORTED "Disjoint timer query functionality not supported, skipping" namespace glcts { /* Define allowed storage types */ enum STORAGE_TYPE { ST_MUTABLE, /* Mutable Storage */ ST_IMMUTABLE /* Immutable Storage */ }; /* Extension names */ enum ExtensionName { EXTENSIONNAME_SHADER_IMAGE_ATOMIC, EXTENSIONNAME_SHADER_IO_BLOCKS, EXTENSIONNAME_GEOMETRY_SHADER, EXTENSIONNAME_GEOMETRY_POINT_SIZE, EXTENSIONNAME_TESSELLATION_SHADER, EXTENSIONNAME_TESSELLATION_POINT_SIZE, EXTENSIONNAME_TEXTURE_BUFFER, EXTENSIONNAME_TEXTURE_CUBE_MAP_ARRAY, EXTENSIONNAME_GPU_SHADER5, EXTENSIONNAME_VIEWPORT_ARRAY, }; /* Extension type */ enum ExtensionType { EXTENSIONTYPE_NONE, /* Not an extension (part of this version of OpenGL or OpenGL ES) */ EXTENSIONTYPE_EXT, /* EXT multivendor extension */ EXTENSIONTYPE_OES /* OES Khronos extension */ }; enum ExtensionBehavior { EXTENSIONBEHAVIOR_DISABLE, /* disable */ EXTENSIONBEHAVIOR_WARN, /* warn */ EXTENSIONBEHAVIOR_ENABLE, /* enable */ EXTENSIONBEHAVIOR_REQUIRE /* require */ }; using deqp::Context; struct ExtParameters { glu::GLSLVersion glslVersion; ExtensionType extType; ExtParameters(glu::GLSLVersion _glslVersion, ExtensionType _extType) : glslVersion(_glslVersion), extType(_extType) { } }; /** * Base class for tests implementations. */ class TestCaseBase : public tcu::TestCase { public: /* Public methods */ /* Destructor */ virtual ~TestCaseBase(void) { } static const float m_epsilon_float; protected: enum LOG_TYPE { LT_SHADER_OBJECT, /* Shader object */ LT_PROGRAM_OBJECT, /* Program object */ LT_PIPELINE_OBJECT /* Program pipeline object */ }; /* Protected type definitions */ /* Protected methods */ /* Constructor */ TestCaseBase(Context& context, const ExtParameters& extParam, const char* name, const char* description); /* Methods that a derived test case should reimplement */ virtual void deinit(void); virtual void init(void); virtual IterateResult iterate(void); /* Initializes extension function pointers */ void initExtensions(); /* Initializes GLSL specialization map */ void initGLSLSpecializationMap(); /* Function that generates an extension directive */ std::string getGLSLExtDirective(ExtensionType type, ExtensionName name, ExtensionBehavior behavior); /* Sets the seed for the random generator */ void randomSeed(const glw::GLuint seed); /* Returns random unsigned integer from the range [0,max) */ glw::GLuint randomFormula(const glw::GLuint max); /* Helper method for verification of pixel color */ bool comparePixel(const unsigned char* buffer, unsigned int x, unsigned int y, unsigned int width, unsigned int height, unsigned int pixel_size, unsigned char expected_red = 0, unsigned char expected_green = 0, unsigned char expected_blue = 0, unsigned char expected_alpha = 0) const; /* Helper method for checking if an extension is supported*/ bool isExtensionSupported(const std::string& extName) const; /* Program creation and validation helper methods */ std::string specializeShader(const unsigned int parts, const char* const* code) const; void shaderSourceSpecialized(glw::GLuint shader_id, glw::GLsizei shader_count, const glw::GLchar* const* shader_string); bool buildProgram(glw::GLuint po_id, glw::GLuint sh1_shader_id, unsigned int n_sh1_body_parts, const char* const* sh1_body_parts, bool* out_has_compilation_failed = NULL); bool buildProgram(glw::GLuint po_id, glw::GLuint sh1_shader_id, unsigned int n_sh1_body_parts, const char* const* sh1_body_parts, glw::GLuint sh2_shader_id, unsigned int n_sh2_body_parts, const char* const* sh2_body_parts, bool* out_has_compilation_failed = NULL); bool buildProgram(glw::GLuint po_id, glw::GLuint sh1_shader_id, unsigned int n_sh1_body_parts, const char* const* sh1_body_parts, glw::GLuint sh2_shader_id, unsigned int n_sh2_body_parts, const char* const* sh2_body_parts, glw::GLuint sh3_shader_id, unsigned int n_sh3_body_parts, const char* const* sh3_body_parts, bool* out_has_compilation_failed = NULL); bool buildProgram(glw::GLuint po_id, glw::GLuint sh1_shader_id, unsigned int n_sh1_body_parts, const char* const* sh1_body_parts, glw::GLuint sh2_shader_id, unsigned int n_sh2_body_parts, const char* const* sh2_body_parts, glw::GLuint sh3_shader_id, unsigned int n_sh3_body_parts, const char* const* sh3_body_parts, glw::GLuint sh4_shader_id, unsigned int n_sh4_body_parts, const char* const* sh4_body_parts, bool* out_has_compilation_failed = NULL); bool buildProgram(glw::GLuint po_id, glw::GLuint sh1_shader_id, unsigned int n_sh1_body_parts, const char* const* sh1_body_parts, glw::GLuint sh2_shader_id, unsigned int n_sh2_body_parts, const char* const* sh2_body_parts, glw::GLuint sh3_shader_id, unsigned int n_sh3_body_parts, const char* const* sh3_body_parts, glw::GLuint sh4_shader_id, unsigned int n_sh4_body_parts, const char* const* sh4_body_parts, glw::GLuint sh5_shader_id, unsigned int n_sh5_body_parts, const char* const* sh5_body_parts, bool* out_has_compilation_failed = NULL); bool doesProgramBuild(unsigned int n_fs_body_parts, const char* const* fs_body_parts, unsigned int n_gs_body_parts, const char* const* gs_body_parts, unsigned int n_vs_body_parts, const char* const* vs_body_parts); std::string getShaderSource(glw::GLuint shader_id); std::string getCompilationInfoLog(glw::GLuint shader_id); std::string getLinkingInfoLog(glw::GLuint po_id); std::string getPipelineInfoLog(glw::GLuint ppo_id); /* Helper method for setting up a fraembuffer with texture as color attachment */ bool setupFramebufferWithTextureAsAttachment(glw::GLuint framebuffer_object_id, glw::GLuint color_texture_id, glw::GLenum texture_format, glw::GLuint width, glw::GLuint height) const; void checkFramebufferStatus(glw::GLenum framebuffer) const; /* Protected variables */ Context& m_context; glu::GLSLVersion m_glslVersion; ExtensionType m_extType; std::map m_specializationMap; bool m_is_framebuffer_no_attachments_supported; bool m_is_geometry_shader_extension_supported; bool m_is_geometry_shader_point_size_supported; bool m_is_gpu_shader5_supported; bool m_is_program_interface_query_supported; bool m_is_shader_image_load_store_supported; bool m_is_shader_image_atomic_supported; bool m_is_texture_storage_multisample_supported; bool m_is_texture_storage_multisample_2d_array_supported; bool m_is_tessellation_shader_supported; bool m_is_tessellation_shader_point_size_supported; bool m_is_texture_cube_map_array_supported; bool m_is_texture_border_clamp_supported; bool m_is_texture_buffer_supported; bool m_is_viewport_array_supported; /* Predefined shader strings */ static const char* m_boilerplate_vs_code; /* GL tokens that are diferent for functionalities * enabled by extensions and for functionalities that * are present in the core. */ deqp::GLExtTokens m_glExtTokens; private: /* Private functions */ bool buildProgramVA(glw::GLuint po_id, bool* out_has_compilation_failed, unsigned int sh_stages, ...); std::string getInfoLog(LOG_TYPE log_type, glw::GLuint id); /* Private variables */ glw::GLuint seed_value; friend class TessellationShaderUtils; }; /* Test Case Group that tracks GLSL version and extension type */ class TestCaseGroupBase : public tcu::TestCaseGroup { public: TestCaseGroupBase(Context& context, const ExtParameters& extParam, const char* name, const char* description); virtual ~TestCaseGroupBase(void) { } Context& getContext(void) { return m_context; } protected: Context& m_context; ExtParameters m_extParams; }; inline TestCaseGroupBase::TestCaseGroupBase(Context& context, const ExtParameters& extParams, const char* name, const char* description) : tcu::TestCaseGroup(context.getTestContext(), name, description), m_context(context), m_extParams(extParams) { } } // namespace glcts #endif // _ESEXTCTESTCASEBASE_HPP