1 #ifndef _ESEXTCGEOMETRYSHADERLAYEREDFRAMEBUFFER_HPP 2 #define _ESEXTCGEOMETRYSHADERLAYEREDFRAMEBUFFER_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 #include "../esextcTestCaseBase.hpp" 27 28 namespace glcts 29 { 30 /** Implementation of Tests 11.3 from CTS_EXT_geometry_shader. Description follows: 31 * 32 * 3. Make sure blending and color writes work correctly for layered rendering. 33 * 34 * Category: API; 35 * Functional Test. 36 * 37 * Consider a layered framebuffer object A: 38 * 39 * - 3D texture object A of resolution 4x4x4, internalformat GL_RGBA8, is 40 * bound to color attachment 0. 41 * 42 * For texture object A, each slice should be filled with texels of value 43 * (0, slice_index / 4, slice_index / 8, slice_index / 12), where 44 * slice_index corresponds to slice index considered. 45 * 46 * Depth and stencil tests should be disabled. 47 * 48 * Blending should be enabled. Source blend function should be set to 49 * GL_ONE_MINUS_SRC_COLOR, destination blend function should be set to 50 * GL_DST_COLOR. 51 * 52 * A vertex shader for the test can be boilerplate. 53 * 54 * Geometry shader should take points on input and output a maximum of 55 * 4 (layers) * (4 (sets of) * 4 (coordinates) ) vertices forming a triangle 56 * strip (as in test case 7.1). The shader should emit 4 "full-screen quads" 57 * for layers 0, 1, 2 and 3. 58 * 59 * A fragment shader for the test should set the only output vec4 variable 60 * to (0.2, 0.2, 0.2, 0.2). 61 * 62 * Using a program object built of these three shaders *and* with the 63 * framebuffer object A bound to both targets *and* with stencil test 64 * stage configured as discussed, the test should draw a single point. 65 * 66 * Test passes if result texel data is valid for all slices, given active 67 * blending equation and function configuration. 68 * 69 **/ 70 class GeometryShaderLayeredFramebufferBlending : public TestCaseBase 71 { 72 public: 73 /* Public methods */ 74 GeometryShaderLayeredFramebufferBlending(Context& context, const ExtParameters& extParams, const char* name, 75 const char* description); 76 ~GeometryShaderLayeredFramebufferBlending()77 virtual ~GeometryShaderLayeredFramebufferBlending() 78 { 79 } 80 81 void deinit(void); 82 IterateResult iterate(void); 83 84 private: 85 /* Private functions */ 86 87 /* Private variables */ 88 glw::GLuint m_fbo_id; 89 glw::GLuint m_fs_id; 90 glw::GLuint m_gs_id; 91 glw::GLuint m_po_id; 92 glw::GLuint m_read_fbo_id; 93 glw::GLuint m_to_id; 94 glw::GLuint m_vao_id; 95 glw::GLuint m_vs_id; 96 }; 97 98 /** Implementation of Tests 11.4 and 11.5 from CTS_EXT_geometry_shader. Description follows: 99 * 100 * 4. Make sure glClear*() commands clear all layers of a layered attachment. 101 * 102 * Category: API; 103 * Functional Test. 104 * 105 * Consider a layered framebuffer object A with the following configuration: 106 * 107 * - 3D texture of resolution 4x4x4 and of internal format GL_RGBA8, bound 108 * to color attachment 0. The texture contents should be as follows: 109 * 110 * 1) Texels of the first slice should be set to (255, 0, 0, 0). 111 * 2) Texels of the second slice should be set to (0, 255, 0, 0). 112 * 3) Texels of the third slice should be set to (0, 0, 255, 0). 113 * 4) Texels of the fourth slice should be set to (255, 255, 0, 0). 114 * 115 * FBO A should be bound to GL_FRAMEBUFFER target. Clear color should be set 116 * to (64, 128, 255, 32). 117 * 118 * For each glClear*() command, reset all slices of the texture object with 119 * values as above, and clear color attachment 0. The test should then 120 * verify that each slice was set to (64, 128, 255, 32). 121 * 122 * 5. glReadPixels() calls done for a layered attachment should always work on 123 * layer zero. 124 * 125 * Category: API; 126 * Functional Test. 127 * 128 * Consider a 3D texture object A, configured exactly like in test case 11.4. 129 * 130 * Consider a layered framebuffer object B. Texture object A's first layer 131 * should be attached to color attachment 0. 132 * 133 * The test should do a glReadPixels() call with GL_RGBA format and 134 * GL_UNSIGNED_BYTE type. The data read should be equal to (255, 0, 0, 0) 135 * for all texels. 136 * 137 **/ 138 class GeometryShaderLayeredFramebufferClear : public TestCaseBase 139 { 140 public: 141 /* Public methods */ 142 GeometryShaderLayeredFramebufferClear(Context& context, const ExtParameters& extParams, const char* name, 143 const char* description); 144 145 void deinit(void); 146 IterateResult iterate(void); 147 148 private: 149 /* Private functions */ 150 151 /* Private variables */ 152 glw::GLuint m_fbo_char_id; 153 glw::GLuint m_fbo_int_id; 154 glw::GLuint m_fbo_uint_id; 155 glw::GLuint m_read_fbo_id; 156 glw::GLuint m_to_rgba32i_id; 157 glw::GLuint m_to_rgba32ui_id; 158 glw::GLuint m_to_rgba8_id; 159 }; 160 161 /** Implementation of Tests 11.2 from CTS_EXT_geometry_shader. Description follows: 162 * 163 * 2. Make sure depth test stage works correctly for layered rendering. 164 * 165 * Category: API; 166 * Functional Test. 167 * 168 * Consider a layered framebuffer object A: 169 * 170 * - 2D array texture object A of resolution 4x4x4, internalformat GL_RGBA8, all 171 * slices set to (0, 0, 0, 0) is bound to color attachment 0. 172 * - 2D array texture object B of resolution 4x4x4, internalformat 173 * GL_DEPTH_COMPONENT32F is bound to depth attachment. 174 * 175 * For texture object B, all slices should be filled with depth value 0.5. 176 * 177 * Stencil test should be disabled. 178 * 179 * A vertex shader for the test can be boilerplate. 180 * 181 * Geometry shader should take points on input and output a maximum of 182 * 4 (layers) * (4 (sets of) * 4 (coordinates) ) vertices forming a triangle 183 * strip (as in test case 7.1). The shader should emit 4 "full-screen quads" 184 * for layers 0, 1, 2 and 3, with an exception that the depth of each of 185 * these quads should be equal to -1 + (quad index) / 2. For instance: 186 * first layer's quad would be placed at depth -1.0, second layer's quad 187 * would be placed at depth -0.5, and so on. 188 * 189 * A fragment shader for the test should set the only output vec4 variable 190 * to (1, 1, 1, 1). 191 * 192 * Using a program object built of these three shaders *and* with the 193 * framebuffer object A bound to both targets *and* with stencil test stage 194 * configured as discussed, the test should draw a single point. 195 * 196 * Test passes if the following conditions are met at this point: 197 * 198 * * All texels of slice 0 of the texture object A are set to 199 * (255, 255, 255, 255). 200 * * All texels of slice 1 of the texture object A are set to 201 * (255, 255, 255, 255). 202 * * All texels of slice 2 of the texture object A are set to 203 * (0, 0, 0, 0); 204 * * All texels of slice 3 of the texture object A are set to 205 * (0, 0, 0, 0); 206 **/ 207 class GeometryShaderLayeredFramebufferDepth : public TestCaseBase 208 { 209 public: 210 /* Public methods */ 211 GeometryShaderLayeredFramebufferDepth(Context& context, const ExtParameters& extParams, const char* name, 212 const char* description); 213 214 void deinit(void); 215 IterateResult iterate(void); 216 217 private: 218 /* Private functions */ 219 220 /* Private variables */ 221 glw::GLuint m_fbo_id; 222 glw::GLuint m_fs_id; 223 glw::GLuint m_gs_id; 224 glw::GLuint m_po_id; 225 glw::GLuint m_read_fbo_id; 226 glw::GLuint m_to_a_id; 227 glw::GLuint m_to_b_id; 228 glw::GLuint m_vao_id; 229 glw::GLuint m_vs_id; 230 }; 231 232 /** Implementation of Tests 11.1 from CTS_EXT_geometry_shader. Description follows: 233 * 234 * Make sure stencil test stage works correctly for layered rendering. 235 * 236 * Category: API; 237 * Functional Test. 238 * 239 * Consider a layered framebuffer object A: 240 * 241 * - 2D array texture object A of resolution 4x4x4, internalformat GL_RGBA8, all 242 * slices set to (0, 0, 0, 0) is bound to color attachment 0. 243 * - 2D array texture object B of resolution 4x4x4, internalformat 244 * GL_DEPTH32F_STENCIL8 is bound to depth+stencil attachments. 245 * 246 * For texture object B, first slice (of index 0) should be filled with 247 * stencil value 2, second slice should be filled with stencil value 1, 248 * third and fourth slices should be filled with stencil value 0. 249 * 250 * Stencil function should be set to GL_LESS, reference value should 251 * be set at 0. 252 * 253 * Depth tests should be disabled. 254 * 255 * A vertex shader for the test can be boilerplate. 256 * 257 * Geometry shader should take points on input and output a maximum of 258 * 4 (layers) * (4 (sets of) *4 (coordinates) ) vertices forming a triangle 259 * strip (as in test case 7.1). The shader should emit 4 "full-screen quads" 260 * for layers 0, 1, 2 and 3. 261 * 262 * A fragment shader for the test should set the only output vec4 variable 263 * to (1, 1, 1, 1). 264 * 265 * Using a program object built of these three shaders *and* with the 266 * framebuffer object A bound to both targets *and* with stencil test stage 267 * configured as discussed, the test should draw a single point. 268 * 269 * Test passes if the following conditions are met at this point: 270 * 271 * * All texels of slice 0 of the texture object A are set to 272 * (255, 255, 255, 255). 273 * * All texels of slice 1 of the texture object A are set to 274 * (255, 255, 255, 255). 275 * * All texels of slice 2 of the texture object A are set to 276 * (0, 0, 0, 0); 277 * * All texels of slice 3 of the texture object A are set to 278 * (0, 0, 0, 0); 279 * 280 **/ 281 class GeometryShaderLayeredFramebufferStencil : public TestCaseBase 282 { 283 public: 284 /* Public methods */ 285 GeometryShaderLayeredFramebufferStencil(Context& context, const ExtParameters& extParams, const char* name, 286 const char* description); 287 288 void deinit(void); 289 IterateResult iterate(void); 290 291 private: 292 /* Private functions */ 293 294 /* Private variables */ 295 glw::GLuint m_fbo_id; 296 glw::GLuint m_fs_id; 297 glw::GLuint m_gs_id; 298 glw::GLuint m_po_id; 299 glw::GLuint m_to_a_id; 300 glw::GLuint m_to_b_id; 301 glw::GLuint m_vao_id; 302 glw::GLuint m_vs_id; 303 }; 304 305 } // namespace glcts 306 307 #endif // _ESEXTCGEOMETRYSHADERLAYEREDFRAMEBUFFER_HPP 308