1 #ifndef _ESEXTCTEXTURECUBEMAPARRAYSTENCILATTACHMENTS_HPP 2 #define _ESEXTCTEXTURECUBEMAPARRAYSTENCILATTACHMENTS_HPP 3 /*------------------------------------------------------------------------- 4 * OpenGL Conformance Test Suite 5 * ----------------------------- 6 * 7 * Copyright (c) 2014-2016 The Khronos Group Inc. 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 */ /*! 22 * \file 23 * \brief 24 */ /*-------------------------------------------------------------------*/ 25 26 /*! 27 * \file esextcTextureCubeMapArrayStencilAttachments.hpp 28 * \brief Texture Cube Map Array Stencil Attachments (Test 3) 29 */ /*-------------------------------------------------------------------*/ 30 31 #include "../esextcTestCaseBase.hpp" 32 33 namespace glcts 34 { 35 36 /** Class used to store configuration and data for different texture cube map array textures 37 */ 38 class CubeMapArrayDataStorage 39 { 40 public: 41 /* Public functions */ 42 CubeMapArrayDataStorage(); 43 ~CubeMapArrayDataStorage(); 44 45 void deinit(void); 46 void init(const glw::GLuint width, const glw::GLuint height, const glw::GLuint depth, 47 glw::GLubyte initial_value = 0); 48 getDepth() const49 inline glw::GLuint getDepth() const 50 { 51 return m_depth; 52 } getHeight() const53 inline glw::GLuint getHeight() const 54 { 55 return m_height; 56 } getWidth() const57 inline glw::GLuint getWidth() const 58 { 59 return m_width; 60 } 61 62 glw::GLuint getArraySize() const; 63 glw::GLubyte* getDataArray() const; 64 65 protected: 66 /* Protected variables */ 67 glw::GLubyte* m_data_array; 68 glw::GLuint m_depth; 69 glw::GLuint m_height; 70 glw::GLuint m_width; 71 }; 72 73 /** Implementation of Test 3 from CTS_EXT_texture_cube_map_array. 74 * Test description follows: 75 * 76 * Make sure cube-map texture layers can be used as stencil attachments. 77 * 78 * Category: Functionality tests, 79 * Optional dependency on EXT_geometry_shader; 80 * Priority: Must-have. 81 * 82 * Verify that a cube-map array texture layers carrying stencil data 83 * can be used as a stencil attachment for a framebuffer object. 84 * 85 * Clear the color buffer with (1, 0, 0, 1) color. Fill the upper half of 86 * the stencil buffer with 1 and the bottom half of the stencil buffer with 0. 87 * 88 * Configure the stencil test so that it the test passes only if the stencil 89 * buffer data for each fragment is larger than 0. 90 * The fragment shader should set the only output variable to (0, 1, 1, 0). 91 * 92 * The test should render a full-screen quad and then check the outcome of 93 * the operation. The test passes if top half is filled with (0, 1, 1, 0) 94 * and bottom half is set to (1, 0, 0, 1). 95 * 96 * Rendering to both layered (if supported) and non-layered framebuffer 97 * objects should be verified. 98 * 99 * Test four different cube-map array texture resolutions, as described 100 * in test 1. Both immutable and mutable textures should be checked. 101 */ 102 class TextureCubeMapArrayStencilAttachments : public TestCaseBase 103 { 104 public: 105 /* Public functions */ 106 TextureCubeMapArrayStencilAttachments(Context& context, const ExtParameters& extParams, const char* name, 107 const char* description, glw::GLboolean immutable_storage, 108 glw::GLboolean fbo_layered); 109 ~TextureCubeMapArrayStencilAttachments()110 virtual ~TextureCubeMapArrayStencilAttachments() 111 { 112 } 113 114 virtual IterateResult iterate(void); 115 virtual void deinit(void); 116 117 /* Public variables */ 118 static const glw::GLuint m_n_components; 119 static const glw::GLuint m_n_cube_map_array_configurations; 120 static const glw::GLuint m_n_vertices_gs; 121 122 private: 123 /* Private variables */ 124 static const char* m_fragment_shader_code; 125 static const char* m_vertex_shader_code; 126 127 glw::GLboolean m_fbo_layered; 128 glw::GLboolean m_immutable_storage; 129 130 glw::GLuint m_fbo_draw_id; 131 glw::GLuint m_fbo_read_id; 132 glw::GLuint m_fragment_shader_id; 133 glw::GLuint m_geometry_shader_id; 134 glw::GLuint m_program_id; 135 glw::GLuint m_texture_cube_array_stencil_id; 136 glw::GLuint m_texture_cube_array_color_id; 137 glw::GLuint m_vao_id; 138 glw::GLuint m_vbo_id; 139 glw::GLuint m_vertex_shader_id; 140 141 CubeMapArrayDataStorage* m_cube_map_array_data; 142 glw::GLubyte* m_result_data; 143 144 /* Private functions */ 145 void buildAndUseProgram(glw::GLuint test_index); 146 void checkFramebufferStatus(glw::GLenum framebuffer_status); 147 void cleanAfterTest(void); 148 void createImmutableCubeArrayColor(glw::GLuint test_index); 149 void createImmutableCubeArrayStencil(glw::GLuint test_index); 150 void createMutableCubeArrayColor(glw::GLuint test_index); 151 void createMutableCubeArrayStencil(glw::GLuint test_index); 152 void fillStencilData(glw::GLuint test_index); 153 std::string getGeometryShaderCode(const std::string& max_vertices, const std::string& n_layers); 154 void initTest(void); 155 void initTestIteration(glw::GLuint test_index); 156 bool readPixelsAndCompareWithExpectedResult(glw::GLuint test_index); 157 void setupLayeredFramebuffer(void); 158 void setupNonLayeredFramebuffer(void); 159 }; 160 161 } // namespace glcts 162 163 #endif // _ESEXTCTEXTURECUBEMAPARRAYSTENCILATTACHMENTS_HPP 164