| #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 <map> |
| #include <math.h> |
| #include <string.h> |
| |
| /* 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<std::string, std::string> 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 |