1 #ifndef _ESEXTCGEOMETRYSHADERLAYEREDFBO_HPP
2 #define _ESEXTCGEOMETRYSHADERLAYEREDFBO_HPP
3 /*-------------------------------------------------------------------------
4  * OpenGL Conformance Test Suite
5  * -----------------------------
6  *
7  * Copyright (c) 2015-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 /** Class which implements methods shared by more than one conformance test related to
31  *  layered framebuffers.
32  */
33 class GeometryShaderLayeredFBOShared
34 {
35 public:
36     static bool checkFBOCompleteness(tcu::TestContext &test_context, const glw::Functions &gl, glw::GLenum fbo_id,
37                                      glw::GLenum expected_completeness_status);
38 
39     static void deinitFBOs(const glw::Functions &gl, const glw::GLuint *fbo_ids);
40 
41     static void deinitTOs(const glw::Functions &gl, const glw::GLuint *to_ids);
42 
43     static void initFBOs(const glw::Functions &gl, glw::glFramebufferTextureFunc pGLFramebufferTexture,
44                          const glw::GLuint *to_ids, glw::GLuint *out_fbo_ids);
45 
46     static void initTOs(const glw::Functions &gl, glw::glTexStorage3DMultisampleFunc pGLTexStorage3DMultisample,
47                         glw::GLuint *out_to_ids);
48 
49     static const unsigned int n_shared_fbo_ids;
50     static const unsigned int n_shared_to_ids;
51     static const glw::GLuint shared_to_depth;
52     static const glw::GLuint shared_to_height;
53     static const glw::GLuint shared_to_width;
54 };
55 
56 /** Implementation of Test 21.1 from CTS_EXT_geometry_shader. Description follows:
57  *
58  *  Reassure GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT framebuffer
59  *  incompleteness status is reported for framebuffer objects, for which some
60  *  of the attachments are layered and some aren't.
61  *
62  *  Category: API;
63  *            Dependency with OES_texture_storage_multisample_2d_array.
64  *
65  *  1. Create four framebuffer objects (A, B, C, D) and set up:
66  *
67  *  - an immutable 2D texture object A (using any color-renderable
68  *    internalformat);
69  *  - an immutable 2D texture object A' (using any depth-renderable
70  *    internalformat);
71  *  - an immutable 2D array texture object B  (using any color-renderable
72  *    internalformat);
73  *  - an immutable 3D texture object C  (using any color-renderable
74  *    internalformat);
75  *  - an immutable cube-map texture object D  (using any color-renderable
76  *    internalformat);
77  *  - an immutable multisample 2D texture object E (using any
78  *    color-renderable internalformat and any number of samples > 1)
79  *  - an immutable multisample 2D array texture object F (using any
80  *    color-renderable internalformat and any number of samples > 1)
81  *
82  *  Resolution of all textures should be set to 4x4 (for each face, layer,
83  *  slice, etc.). Use depth of 4 if appropriate.
84  *
85  *  2.Set up a layered FBO A using glFramebufferTextureEXT() calls, so that:
86  *
87  *  - base mip-map of texture object A is bound to its color attachment 0;
88  *  - level 0 of texture object B is bound to color attachment 2;
89  *  - level 0 of texture object A' is bound to its depth attachment;
90  *  - draw buffers are set to use color attachments 0 and 2.
91  *
92  *  3. Set up a layered FBO B using glFramebufferTextureEXT() calls, so that:
93  *
94  *  - level 0 of texture object C is bound to color attachment 0;
95  *  - mip-map at level 0 of texture object A is bound to color attachment 1;
96  *  - layer 3 of the cube-map texture object is bound to color attachment 2;
97  *  - draw buffers are set to use color attachments 0, 1 and 2.
98  *
99  *  4. Set up a layered FBO C using glFramebufferTextureEXT() calls so that:
100  *
101  *  - layer 5 of the cube-map texture object is bound to color attachment 0;
102  *  - level 0 of texture object A' is bound to the depth attachment;
103  *  - the only draw buffer used is color attachment 0.
104  *
105  *  5. Set up a layered FBO D using glFramebufferTextureEXT() calls so that:
106  *
107  *  - base mip-map of multisample texture object E is bound to color
108  *    attachment 0;
109  *  - level 0 of texture object F is bound to color attachment 1;
110  *  - draw buffers are set to use color attachments 0 and 1.
111  *
112  *  6. Make sure that, once each of these FBOs is bound,
113  *     GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT FBO status is reported.
114  *
115  **/
116 class GeometryShaderIncompleteLayeredFBOTest : public TestCaseBase
117 {
118 public:
119     /* Public methods */
120     GeometryShaderIncompleteLayeredFBOTest(Context &context, const ExtParameters &extParams, const char *name,
121                                            const char *description);
122 
~GeometryShaderIncompleteLayeredFBOTest()123     virtual ~GeometryShaderIncompleteLayeredFBOTest()
124     {
125     }
126 
127     void deinit(void);
128     IterateResult iterate(void);
129 
130 private:
131     /* Private functions */
132 
133     /* Private variables */
134     glw::GLuint *m_fbo_ids;
135     glw::GLuint *m_to_ids;
136 };
137 
138 /** Implementation of Test 21.2 from CTS_EXT_geometry_shader. Description follows:
139  *
140  *  2. Make sure that values reported layered FBO attachment properties are
141  *     valid.
142  *
143  *     Category: API.
144  *
145  *     1. Use FBO and textures as described in test case 21.1.
146  *     2. Make sure that for each of the FBO attachments, value reported for
147  *        GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT is as expected.
148  *
149  **/
150 class GeometryShaderIncompleteLayeredAttachmentsTest : public TestCaseBase
151 {
152 public:
153     /* Public methods */
154     GeometryShaderIncompleteLayeredAttachmentsTest(Context &context, const ExtParameters &extParams, const char *name,
155                                                    const char *description);
156 
~GeometryShaderIncompleteLayeredAttachmentsTest()157     virtual ~GeometryShaderIncompleteLayeredAttachmentsTest()
158     {
159     }
160 
161     void deinit(void);
162     IterateResult iterate(void);
163 
164 private:
165     /* Private functions */
166 
167     /* Private variables */
168     glw::GLuint *m_fbo_ids;
169     glw::GLuint *m_to_ids;
170 };
171 
172 /* Implementation of "Group 26", test 1 from CTS_EXT_geometry_shader. Description follows:
173  *
174  *  1. glFramebufferTextureEXT() should not accept invalid targets.
175  *
176  *     Category: API;
177  *               Coverage;
178  *               Negative Test.
179  *
180  *     Calling glFramebufferTextureEXT() for target = GL_TEXTURE_3D should
181  *     result in GL_INVALID_ENUM error.
182  *
183  */
184 class GeometryShaderFramebufferTextureInvalidTarget : public TestCaseBase
185 {
186 public:
187     /* Public methods */
188     GeometryShaderFramebufferTextureInvalidTarget(Context &context, const ExtParameters &extParams, const char *name,
189                                                   const char *description);
190 
~GeometryShaderFramebufferTextureInvalidTarget()191     virtual ~GeometryShaderFramebufferTextureInvalidTarget()
192     {
193     }
194 
195     virtual void deinit();
196     virtual IterateResult iterate();
197 
198 private:
199     /* Private type definition */
200 
201     /* Private methods */
202 
203     /* Private variables */
204     glw::GLuint m_fbo_id;
205     glw::GLuint m_to_id;
206 };
207 
208 /* Implementation of "Group 26", test 2 from CTS_EXT_geometry_shader. Description follows:
209  *
210  *  2. glFramebufferTextureEXT() should generate GL_INVALID_OPERATION error if
211  *     there is no framebuffer object bound to requested framebuffer target.
212  *
213  *     Category: API;
214  *               Coverage;
215  *               Negative Test.
216  *
217  *     Try to issue glFramebufferTextureEXT() calls for  GL_DRAW_FRAMEBUFFER,
218  *     GL_READ_FRAMEBUFFER and GL_FRAMEBUFFER framebuffer targets, assuming the
219  *     texture object these calls refer to exists.
220  *
221  *     Default binding for both GL_DRAW_FRAMEBUFFER and GL_READ_FRAMEBUFFER
222  *     framebuffer target is zero, so after each of these calls
223  *     GL_INVALID_OPERATION error should be generated.
224  *
225  */
226 class GeometryShaderFramebufferTextureNoFBOBoundToTarget : public TestCaseBase
227 {
228 public:
229     /* Public methods */
230     GeometryShaderFramebufferTextureNoFBOBoundToTarget(Context &context, const ExtParameters &extParams,
231                                                        const char *name, const char *description);
232 
~GeometryShaderFramebufferTextureNoFBOBoundToTarget()233     virtual ~GeometryShaderFramebufferTextureNoFBOBoundToTarget()
234     {
235     }
236 
237     virtual void deinit();
238     virtual IterateResult iterate();
239 
240 private:
241     /* Private type definition */
242 
243     /* Private methods */
244 
245     /* Private variables */
246     glw::GLuint m_to_id;
247 };
248 
249 /* Implementation of "Group 26", test 3 from CTS_EXT_geometry_shader. Description follows:
250  *
251  *  3. glFramebufferTextureEXT() should generate GL_INVALID_ENUM if attachment
252  *     argument is set to invalid value.
253  *
254  *     Category: API;
255  *               Coverage;
256  *               Negative Test.
257  *
258  *     Try to issue glFramebufferTextureEXT() call for GL_COLOR_ATTACHMENTi
259  *     where i is equal to value reported for GL_MAX_COLOR_ATTACHMENTS.
260  *
261  */
262 class GeometryShaderFramebufferTextureInvalidAttachment : public TestCaseBase
263 {
264 public:
265     /* Public methods */
266     GeometryShaderFramebufferTextureInvalidAttachment(Context &context, const ExtParameters &extParams,
267                                                       const char *name, const char *description);
268 
~GeometryShaderFramebufferTextureInvalidAttachment()269     virtual ~GeometryShaderFramebufferTextureInvalidAttachment()
270     {
271     }
272 
273     virtual void deinit();
274     virtual IterateResult iterate();
275 
276 private:
277     /* Private type definition */
278 
279     /* Private methods */
280 
281     /* Private variables */
282     glw::GLuint m_fbo_id;
283     glw::GLuint m_to_id;
284 };
285 
286 /* Implementation of "Group 26", test 4 from CTS_EXT_geometry_shader. Description follows:
287  *
288  *  4. glFramebufferTextureEXT() should generate GL_INVALID_VALUE if texture is
289  *     not the name of a texture object.
290  *
291  *     Category: API;
292  *               Coverage;
293  *               Negative Test.
294  *
295  *     Try to issue glFramebufferTextureEXT() call for non-existing texture ids
296  *     1, 10 and 100, with a FBO bound to specified FBO target. GL_INVALID_VALUE
297  *     error should be reported for each attempt.
298  *
299  */
300 class GeometryShaderFramebufferTextureInvalidValue : public TestCaseBase
301 {
302 public:
303     /* Public methods */
304     GeometryShaderFramebufferTextureInvalidValue(Context &context, const ExtParameters &extParams, const char *name,
305                                                  const char *description);
306 
~GeometryShaderFramebufferTextureInvalidValue()307     virtual ~GeometryShaderFramebufferTextureInvalidValue()
308     {
309     }
310 
311     virtual void deinit();
312     virtual IterateResult iterate();
313 
314 private:
315     /* Private type definition */
316 
317     /* Private methods */
318 
319     /* Private variables */
320     glw::GLuint m_fbo_id;
321 };
322 
323 /* Implementation of "Group 26", test 5 from CTS_EXT_geometry_shader. Description follows:
324  *
325  *  5. glFramebufferTextureEXT() should generate GL_INVALID_OPERATION if level
326  *     argument is an invalid texture level number.
327  *
328  *     Category: API;
329  *               Coverage;
330  *               Negative Test.
331  *
332  *     Consider a 2D texture array object A and a 3D texture array object B
333  *     (each of 4x4x4 resolution), and a framebuffer object C. Base mip-map
334  *     should be filled with any data, and descendant mip-maps should be
335  *     generated with glGenerateMipmap() call.
336  *
337  *     glFramebufferTextureEXT() should fail with GL_INVALID_OPERATION error
338  *     when used for the FBO C and either of the textures and for level = 3.
339  *
340  */
341 class GeometryShaderFramebufferTextureInvalidLevelNumber : public TestCaseBase
342 {
343 public:
344     /* Public methods */
345     GeometryShaderFramebufferTextureInvalidLevelNumber(Context &context, const ExtParameters &extParams,
346                                                        const char *name, const char *description);
347 
~GeometryShaderFramebufferTextureInvalidLevelNumber()348     virtual ~GeometryShaderFramebufferTextureInvalidLevelNumber()
349     {
350     }
351 
352     virtual void deinit();
353     virtual IterateResult iterate();
354 
355 private:
356     /* Private type definition */
357 
358     /* Private methods */
359 
360     /* Private variables */
361     glw::GLuint m_fbo_id;
362     glw::GLubyte *m_texels;
363     glw::GLushort m_tex_depth;
364     glw::GLushort m_tex_height;
365     glw::GLushort m_tex_width;
366     glw::GLuint m_to_2d_array_id;
367     glw::GLuint m_to_3d_id;
368 };
369 
370 /* Implementation of "Group 26", test 6 from CTS_EXT_geometry_shader. Description follows:
371  *
372  *  6. glFramebufferTextureEXT() should generate GL_INVALID_OPERATION if texture
373  *     argument refers to a buffer texture.
374  *
375  *     Category: API;
376  *               Coverage;
377  *               Dependency on EXT_texture_buffer;
378  *               Negative Test.
379  *
380  *     Consider a framebuffer object A, buffer object B and a buffer texture C
381  *     using buffer object B as a data source.
382  *
383  *     glFramebufferTextureEXT() should fail with GL_INVALID_OPERATION error
384  *     when used for the FBO A and texture argument relates to ID of buffer
385  *     texture C.
386  *
387  */
388 class GeometryShaderFramebufferTextureArgumentRefersToBufferTexture : public TestCaseBase
389 {
390 public:
391     /* Public methods */
392     GeometryShaderFramebufferTextureArgumentRefersToBufferTexture(Context &context, const ExtParameters &extParams,
393                                                                   const char *name, const char *description);
394 
~GeometryShaderFramebufferTextureArgumentRefersToBufferTexture()395     virtual ~GeometryShaderFramebufferTextureArgumentRefersToBufferTexture()
396     {
397     }
398 
399     virtual void deinit();
400     virtual IterateResult iterate();
401 
402 private:
403     /* Private type definition */
404 
405     /* Private methods */
406 
407     /* Private variables */
408     glw::GLuint m_bo_id;
409     glw::GLuint m_fbo_id;
410     glw::GLuint m_tbo_id;
411     glw::GLuint m_tex_height;
412     glw::GLuint m_tex_width;
413     glw::GLint *m_texels;
414 };
415 
416 } // namespace glcts
417 
418 #endif // _ESEXTCGEOMETRYSHADERLAYEREDFBO_HPP
419