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