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
28namespace glcts
29{
30/** Class which implements methods shared by more than one conformance test related to
31 *  layered framebuffers.
32 */
33class GeometryShaderLayeredFBOShared
34{
35public:
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 **/
116class GeometryShaderIncompleteLayeredFBOTest : public TestCaseBase
117{
118public:
119	/* Public methods */
120	GeometryShaderIncompleteLayeredFBOTest(Context& context, const ExtParameters& extParams, const char* name,
121										   const char* description);
122
123	virtual ~GeometryShaderIncompleteLayeredFBOTest()
124	{
125	}
126
127	void		  deinit(void);
128	IterateResult iterate(void);
129
130private:
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 **/
150class GeometryShaderIncompleteLayeredAttachmentsTest : public TestCaseBase
151{
152public:
153	/* Public methods */
154	GeometryShaderIncompleteLayeredAttachmentsTest(Context& context, const ExtParameters& extParams, const char* name,
155												   const char* description);
156
157	virtual ~GeometryShaderIncompleteLayeredAttachmentsTest()
158	{
159	}
160
161	void		  deinit(void);
162	IterateResult iterate(void);
163
164private:
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 */
184class GeometryShaderFramebufferTextureInvalidTarget : public TestCaseBase
185{
186public:
187	/* Public methods */
188	GeometryShaderFramebufferTextureInvalidTarget(Context& context, const ExtParameters& extParams, const char* name,
189												  const char* description);
190
191	virtual ~GeometryShaderFramebufferTextureInvalidTarget()
192	{
193	}
194
195	virtual void		  deinit();
196	virtual IterateResult iterate();
197
198private:
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 */
226class GeometryShaderFramebufferTextureNoFBOBoundToTarget : public TestCaseBase
227{
228public:
229	/* Public methods */
230	GeometryShaderFramebufferTextureNoFBOBoundToTarget(Context& context, const ExtParameters& extParams,
231													   const char* name, const char* description);
232
233	virtual ~GeometryShaderFramebufferTextureNoFBOBoundToTarget()
234	{
235	}
236
237	virtual void		  deinit();
238	virtual IterateResult iterate();
239
240private:
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 */
262class GeometryShaderFramebufferTextureInvalidAttachment : public TestCaseBase
263{
264public:
265	/* Public methods */
266	GeometryShaderFramebufferTextureInvalidAttachment(Context& context, const ExtParameters& extParams,
267													  const char* name, const char* description);
268
269	virtual ~GeometryShaderFramebufferTextureInvalidAttachment()
270	{
271	}
272
273	virtual void		  deinit();
274	virtual IterateResult iterate();
275
276private:
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 */
300class GeometryShaderFramebufferTextureInvalidValue : public TestCaseBase
301{
302public:
303	/* Public methods */
304	GeometryShaderFramebufferTextureInvalidValue(Context& context, const ExtParameters& extParams, const char* name,
305												 const char* description);
306
307	virtual ~GeometryShaderFramebufferTextureInvalidValue()
308	{
309	}
310
311	virtual void		  deinit();
312	virtual IterateResult iterate();
313
314private:
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 */
341class GeometryShaderFramebufferTextureInvalidLevelNumber : public TestCaseBase
342{
343public:
344	/* Public methods */
345	GeometryShaderFramebufferTextureInvalidLevelNumber(Context& context, const ExtParameters& extParams,
346													   const char* name, const char* description);
347
348	virtual ~GeometryShaderFramebufferTextureInvalidLevelNumber()
349	{
350	}
351
352	virtual void		  deinit();
353	virtual IterateResult iterate();
354
355private:
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 */
388class GeometryShaderFramebufferTextureArgumentRefersToBufferTexture : public TestCaseBase
389{
390public:
391	/* Public methods */
392	GeometryShaderFramebufferTextureArgumentRefersToBufferTexture(Context& context, const ExtParameters& extParams,
393																  const char* name, const char* description);
394
395	virtual ~GeometryShaderFramebufferTextureArgumentRefersToBufferTexture()
396	{
397	}
398
399	virtual void		  deinit();
400	virtual IterateResult iterate();
401
402private:
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