1 /*-------------------------------------------------------------------------
2 * OpenGL Conformance Test Suite
3 * -----------------------------
4 *
5 * Copyright (c) 2014-2016 The Khronos Group Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 */ /*!
20 * \file
21 * \brief
22 */ /*-------------------------------------------------------------------*/
23
24 /**
25 */ /*!
26 * \file es31cTextureStorageMultisampleTexStorage2DMultisampleTests.cpp
27 * \brief Implements conformance tests for glTexStorage2DMultisample()
28 * entry-points (ES3.1 only)
29 */ /*-------------------------------------------------------------------*/
30
31 #include "es31cTextureStorageMultisampleTexStorage2DMultisampleTests.hpp"
32 #include "gluContextInfo.hpp"
33 #include "gluDefs.hpp"
34 #include "glwEnums.hpp"
35 #include "glwFunctions.hpp"
36 #include "tcuRenderTarget.hpp"
37 #include "tcuTestLog.hpp"
38
39 #include <algorithm>
40 #include <string>
41 #include <vector>
42
43 namespace glcts
44 {
45
46 /** Constructor.
47 *
48 * @param context Rendering context handle.
49 **/
MultisampleTextureTexStorage2DGeneralSamplesNumberTest(Context & context)50 MultisampleTextureTexStorage2DGeneralSamplesNumberTest::MultisampleTextureTexStorage2DGeneralSamplesNumberTest(
51 Context& context)
52 : TestCase(context, "multisample_texture_tex_storage_2d_general_samples_number",
53 "Verifies TexStorage2DMultisample() requests with exact number of samples"
54 " reported by glGetInternalformativ() succeed and larger values rejected")
55 , to_id(0)
56 {
57 /* Left blank on purpose */
58 }
59
60 /** Deinitializes ES objects created during test execution */
deinit()61 void MultisampleTextureTexStorage2DGeneralSamplesNumberTest::deinit()
62 {
63 /* Delete texture in case the test case failed */
64 deinitInternalIteration();
65
66 /* Call base class deinitialization routine */
67 glcts::TestCase::deinit();
68 }
69
70 /** Deinitializes GL ES objects specific to internal iteration */
deinitInternalIteration()71 void MultisampleTextureTexStorage2DGeneralSamplesNumberTest::deinitInternalIteration()
72 {
73 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
74
75 if (to_id != 0)
76 {
77 /* Delete texture object */
78 gl.deleteTextures(1, &to_id);
79
80 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to delete texture object");
81
82 to_id = 0;
83 }
84
85 /* Unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE texture target */
86 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
87
88 GLU_EXPECT_NO_ERROR(gl.getError(),
89 "Failed to unbind a texture object from GL_TEXTURE_2D_MULTISAMPLE texture target");
90 }
91
92 /** Initializes GL ES objects specific to internal iteration */
initInternalIteration()93 void MultisampleTextureTexStorage2DGeneralSamplesNumberTest::initInternalIteration()
94 {
95 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
96
97 /* Generate texture object id */
98 gl.genTextures(1, &to_id);
99
100 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed to generate texture");
101
102 /* Verify texture object has been generated properly */
103 if (to_id == 0)
104 {
105 TCU_FAIL("Texture object has not been generated properly");
106 }
107
108 /* Bind generated texture object ID to GL_TEXTURE_2D_MULTISAMPLE texture target */
109 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, to_id);
110
111 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() reported an error");
112 }
113
114 /** Executes test iteration.
115 *
116 * @return Always STOP.
117 */
iterate()118 tcu::TestNode::IterateResult MultisampleTextureTexStorage2DGeneralSamplesNumberTest::iterate()
119 {
120 /* Test case variables */
121 const glw::GLboolean fixedsamplelocations = GL_FALSE;
122 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
123 const glw::GLenum internalformat_list[] = { GL_R8,
124 GL_RGB565,
125 GL_RGB10_A2UI,
126 GL_SRGB8_ALPHA8,
127 GL_R8I,
128 GL_DEPTH_COMPONENT16,
129 GL_DEPTH_COMPONENT32F,
130 GL_DEPTH24_STENCIL8,
131 GL_DEPTH24_STENCIL8,
132 GL_DEPTH32F_STENCIL8 };
133 const int internalformat_list_count = sizeof(internalformat_list) / sizeof(internalformat_list[0]);
134 glw::GLint internalformat_max_samples = -1; /* Will be determined later */
135 const glw::GLsizei height = 1;
136 const glw::GLsizei width = 1;
137 const glw::GLenum target = GL_TEXTURE_2D_MULTISAMPLE; /* Test case uses GL_TEXTURE_2D_MULTISAMPLE target */
138 glw::GLint gl_max_samples_value = -1;
139
140 /* Get GL_MAX_SAMPLES value */
141 gl.getIntegerv(GL_MAX_SAMPLES, &gl_max_samples_value);
142 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to retrieve GL_MAX_SAMPLES value");
143
144 /* Iterate through all internal formats test case should check */
145 for (int internalformat_index = 0; internalformat_index < internalformat_list_count; internalformat_index++)
146 {
147 /* Iteration-specific internalformat */
148 glw::GLenum internalformat = internalformat_list[internalformat_index];
149
150 /* Subiteration. Case samples = internalformat_max_samples */
151 {
152 /* Initialize texture object and bind it to GL_TEXTURE_2D_MULTISAMPLE target */
153 initInternalIteration();
154
155 /* Retrieve maximum amount of samples available for the target's texture internalformat */
156 gl.getInternalformativ(target, internalformat, GL_SAMPLES, 1, &internalformat_max_samples);
157
158 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetInternalformativ() failed to retrieve GL_SAMPLES value");
159
160 /* Issue call with valid parameters */
161 gl.texStorage2DMultisample(target, internalformat_max_samples, internalformat, width, height,
162 fixedsamplelocations);
163
164 GLU_EXPECT_NO_ERROR(
165 gl.getError(),
166 "glTexStorage2DMultisample() call, for which a valid number of samples was used, has failed.");
167
168 /* Deinitialize texture object and unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE target */
169 deinitInternalIteration();
170 }
171
172 /* Subiteration. Case: samples > internalformat_max_samples */
173 {
174 /* Initialize texture object and bind it to GL_TEXTURE_2D_MULTISAMPLE target */
175 initInternalIteration();
176
177 /* Issue call with valid parameters, but invalid sample parameter */
178 gl.texStorage2DMultisample(target, internalformat_max_samples + 1, internalformat, width, height,
179 fixedsamplelocations);
180
181 /* Check if the expected error code was reported */
182 /* From spec:
183 * An INVALID_OPERATION error is generated if samples is greater than the
184 * maximum number of samples supported for this target and internalformat.*/
185
186 /* Expect GL_INVALID_OPERATION error code. */
187 TCU_CHECK_MSG(gl.getError() == GL_INVALID_OPERATION,
188 "glTexStorage2DMultisample() did not generate GL_INVALID_OPERATION error.");
189
190 /* Deinitialize texture object and unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE target */
191 deinitInternalIteration();
192 }
193 }
194
195 /* Test case passed */
196 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
197
198 return STOP;
199 }
200
201 /** Constructor.
202 *
203 * @param context Rendering context handle.
204 **/
205 MultisampleTextureTexStorage2DInvalidAndBorderCaseTextureSizesTest::
MultisampleTextureTexStorage2DInvalidAndBorderCaseTextureSizesTest(Context & context)206 MultisampleTextureTexStorage2DInvalidAndBorderCaseTextureSizesTest(Context& context)
207 : TestCase(context, "multisample_texture_tex_storage_2d_invalid_and_border_case_texture_sizes",
208 "Invalid multisample texture sizes are rejected; border cases are correctly accepted.")
209 , to_id(0)
210 {
211 /* Left blank on purpose */
212 }
213
214 /** Deinitializes GL ES objects used by the test */
deinit()215 void MultisampleTextureTexStorage2DInvalidAndBorderCaseTextureSizesTest::deinit()
216 {
217 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
218
219 /* Call base class deinitialization routine */
220 glcts::TestCase::deinit();
221
222 /* Release test texture object */
223 if (to_id != 0)
224 {
225 gl.deleteTextures(1, &to_id);
226
227 to_id = 0;
228 }
229 }
230
231 /** Initializes GL ES objects used by the test */
initInternals()232 void MultisampleTextureTexStorage2DInvalidAndBorderCaseTextureSizesTest::initInternals()
233 {
234 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
235
236 /* Generate texture object id */
237 gl.genTextures(1, &to_id);
238
239 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed");
240 }
241
242 /** Executes test iteration.
243 *
244 * @return Always STOP.
245 */
iterate()246 tcu::TestNode::IterateResult MultisampleTextureTexStorage2DInvalidAndBorderCaseTextureSizesTest::iterate()
247 {
248 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
249
250 initInternals();
251
252 /* Retrieve GL_MAX_TEXTURE_SIZE pname value */
253 glw::GLint gl_max_texture_size_value = 0;
254
255 gl.getIntegerv(GL_MAX_TEXTURE_SIZE, &gl_max_texture_size_value);
256 GLU_EXPECT_NO_ERROR(gl.getError(), "Could not retrieve GL_MAX_TEXTURE_SIZE pname value");
257
258 /* Try to set up a valid 2D multisample texture object of (max texture size, 1) resolution. */
259 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, to_id);
260
261 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2 /* samples */, GL_RGBA8, gl_max_texture_size_value,
262 1 /* height */, GL_TRUE /* fixedsamplelocations */);
263
264 GLU_EXPECT_NO_ERROR(gl.getError(),
265 "Valid glTexStorage2DMultisample() call ((max texture size, 1) resolution) failed");
266
267 /* Delete the texture object before we continue */
268 gl.deleteTextures(1, &to_id);
269
270 GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteTextures() failed");
271
272 /* Create a new texture object and bind it to 2D multisample texture target. */
273 gl.genTextures(1, &to_id);
274 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, to_id);
275
276 GLU_EXPECT_NO_ERROR(gl.getError(), "Could not re-create 2D multisample texture object");
277
278 /* Try to set up another valid 2D multisample texture object of (1, max texture size) resolution. */
279 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2 /* samples */, GL_RGBA8, 1 /* width */,
280 gl_max_texture_size_value, GL_TRUE /* fixedsamplelocations */);
281
282 GLU_EXPECT_NO_ERROR(gl.getError(),
283 "Valid glTexStorage2DMultisample() call ((1, max texture size) resolution) failed");
284
285 /* Delete the texture object before we continue */
286 gl.deleteTextures(1, &to_id);
287
288 GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteTextures() failed");
289
290 /* Create a new texture object and bind it to 2D multisample texture target. */
291 gl.genTextures(1, &to_id);
292 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, to_id);
293
294 GLU_EXPECT_NO_ERROR(gl.getError(), "Could not re-create 2D multisample texture object");
295
296 /* Try to set up invalid 2D multisample texture objects. */
297 glw::GLenum error_code = GL_NO_ERROR;
298
299 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2, /* samples */
300 GL_RGBA8, gl_max_texture_size_value + 1, /* width */
301 1, /* height */
302 GL_TRUE); /* fixedsamplelocations */
303
304 error_code = gl.getError();
305 if (error_code != GL_INVALID_VALUE)
306 {
307 TCU_FAIL("Invalid glTexStorage2DMultisample() call ((max texture size+1, 1) resolution) did not generate "
308 "GL_INVALID_VALUE error");
309 }
310
311 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2, /* samples */
312 GL_RGBA8, 1, /* width */
313 gl_max_texture_size_value + 1, /* height */
314 GL_TRUE); /* fixedsamplelocations */
315
316 error_code = gl.getError();
317 if (error_code != GL_INVALID_VALUE)
318 {
319 TCU_FAIL("Invalid glTexStorage2DMultisample() call ((1, max texture size+1) resolution) did not generate "
320 "GL_INVALID_VALUE error");
321 }
322
323 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2, /* samples */
324 GL_RGBA8, gl_max_texture_size_value + 1, /* width */
325 gl_max_texture_size_value + 1, /* height */
326 GL_TRUE); /* fixedsamplelocations */
327
328 error_code = gl.getError();
329 if (error_code != GL_INVALID_VALUE)
330 {
331 TCU_FAIL("Invalid glTexStorage2DMultisample() call ((max texture size+1, max texture size+1) resolution) did "
332 "not generate GL_INVALID_VALUE error");
333 }
334
335 /* Try to set up a null resolution 2D multisample TO. */
336 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2, /* samples */
337 GL_RGBA8, 0, /* width */
338 0, /* height */
339 GL_TRUE); /* fixedsamplelocations */
340
341 error_code = gl.getError();
342 if (error_code != GL_INVALID_VALUE)
343 {
344 TCU_FAIL(
345 "Invalid glTexStorage2DMultisample() call with a 0x0 resolution did not generate GL_INVALID_VALUE error");
346 }
347
348 /* Delete the texture object before we continue */
349 gl.deleteTextures(1, &to_id);
350
351 GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteTextures() failed");
352
353 /* Create a new texture object and bind it to 2D multisample texture target. */
354 gl.genTextures(1, &to_id);
355 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, to_id);
356
357 GLU_EXPECT_NO_ERROR(gl.getError(), "Could not re-create 2D multisample texture object");
358
359 /* Try to set up an invalid texture object with at least one dimension size defined as a negative value */
360 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2 /* samples */, GL_RGBA8 /* sizedinternalformat */,
361 -1, /* width */
362 0, /* height */
363 GL_TRUE /* fixedsamplelocations */);
364
365 error_code = gl.getError();
366 if (error_code != GL_INVALID_VALUE)
367 {
368 TCU_FAIL(
369 "Invalid glTexStorage2DMultisample() call ((-1, 0) resolution) did not generate GL_INVALID_VALUE error");
370 }
371
372 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2, /* samples */
373 GL_RGBA8, 0, /* width */
374 -1, /* height */
375 GL_TRUE); /* fixedsamplelocations */
376
377 error_code = gl.getError();
378 if (error_code != GL_INVALID_VALUE)
379 {
380 TCU_FAIL(
381 "Invalid glTexStorage2DMultisample() call ((0, -1) resolution) did not generate GL_INVALID_VALUE error");
382 }
383
384 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2, /* samples */
385 GL_RGBA8, -1, /* width */
386 -1, /* height */
387 GL_TRUE); /* fixedsamplelocations */
388
389 error_code = gl.getError();
390 if (error_code != GL_INVALID_VALUE)
391 {
392 TCU_FAIL(
393 "Invalid glTexStorage2DMultisample() call ((-1, -1) resolution) did not generate GL_INVALID_VALUE error");
394 }
395
396 /* Test case passed */
397 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
398
399 return STOP;
400 }
401
402 /** Constructor.
403 *
404 * @param context Rendering context handle.
405 **/
406 MultisampleTextureTexStorage2DNonColorDepthOrStencilInternalFormatsTest::
MultisampleTextureTexStorage2DNonColorDepthOrStencilInternalFormatsTest(Context & context)407 MultisampleTextureTexStorage2DNonColorDepthOrStencilInternalFormatsTest(Context& context)
408 : TestCase(context, "multisample_texture_tex_storage_2d_non_color_depth_or_stencil_internal_formats_rejected",
409 "Verifies TexStorage2DMultisample() rejects internal formats that "
410 "are not color-renderable, depth-renderable and stencil-renderable")
411 , to_id(0)
412 {
413 /* Left blank on purpose */
414 }
415
416 /** Deinitializes ES objects created during test execution */
deinit()417 void MultisampleTextureTexStorage2DNonColorDepthOrStencilInternalFormatsTest::deinit()
418 {
419 /* Delete texture in case the test case failed */
420 deinitInternalIteration();
421
422 /* Call base class deinitialization routine */
423 glcts::TestCase::deinit();
424 }
425
426 /** Deinitializes GL ES objects specific to internal iteration */
deinitInternalIteration()427 void MultisampleTextureTexStorage2DNonColorDepthOrStencilInternalFormatsTest::deinitInternalIteration()
428 {
429 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
430
431 if (to_id != 0)
432 {
433 /* Delete texture object */
434 gl.deleteTextures(1, &to_id);
435
436 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to delete texture object");
437
438 to_id = 0;
439 }
440
441 /* Unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE texture target */
442 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
443
444 GLU_EXPECT_NO_ERROR(gl.getError(),
445 "Failed to unbind a texture object from GL_TEXTURE_2D_MULTISAMPLE texture target");
446 }
447
448 /** Initializes GL ES objects specific to internal iteration */
initInternalIteration()449 void MultisampleTextureTexStorage2DNonColorDepthOrStencilInternalFormatsTest::initInternalIteration()
450 {
451 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
452
453 /* Generate texture object id */
454 gl.genTextures(1, &to_id);
455
456 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed to generate texture");
457
458 /* Verify texture object has been generated properly */
459 if (to_id == 0)
460 {
461 TCU_FAIL("Texture object has not been generated properly");
462 }
463
464 /* Bind generated texture object ID to GL_TEXTURE_2D_MULTISAMPLE texture target */
465 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, to_id);
466
467 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() reported an error");
468 }
469
470 /** Executes test iteration.
471 *
472 * @return Always STOP.
473 */
iterate()474 tcu::TestNode::IterateResult MultisampleTextureTexStorage2DNonColorDepthOrStencilInternalFormatsTest::iterate()
475 {
476 /* Test case variables */
477 const glw::GLboolean fixedsamplelocations = GL_TRUE;
478 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
479 const glw::GLsizei height = 1;
480 /* GL_SRGB8_ALPHA8 is renderable according to spec - replaced with GL_SRGB8 */
481 /* GL_RGBA32F is renderable if EXT_color_buffer_float extension is supported - replaced with GL_RGB32F */
482 /* GL_SRGB8 is renderable if extension NV_sRGB_formats is supported. */
483 /* GL_R8_SNORM is renderable if extension EXT_render_snorm is supported - replace with GL_RGB8_SNORM*/
484 const glw::GLenum internalformats_list[] = { GL_RGB8_SNORM, GL_RGB32F, GL_RGB32I };
485 const int internalformats_list_count = sizeof(internalformats_list) / sizeof(internalformats_list[0]);
486 const glw::GLsizei samples = 1;
487 const glw::GLenum target = GL_TEXTURE_2D_MULTISAMPLE;
488 const glw::GLsizei width = 1;
489
490 /* Iterate through all internal formats test case should check */
491 for (int i = 0; i < internalformats_list_count; i++)
492 {
493 /* Initialize texture object and bind it to GL_TEXTURE_2D_MULTISAMPLE target */
494 initInternalIteration();
495
496 /* Issue call with valid parameters, but invalid internalformats */
497 gl.texStorage2DMultisample(target, samples, internalformats_list[i], width, height, fixedsamplelocations);
498
499 /* Check if the expected error code was reported */
500 if (gl.getError() != GL_INVALID_ENUM)
501 {
502 TCU_FAIL("Invalid error code reported");
503 }
504
505 /* Deinitialize texture object and unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE target */
506 deinitInternalIteration();
507 }
508
509 /* Test case passed */
510 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
511
512 return STOP;
513 }
514
515 /** Constructor.
516 *
517 * @param context Rendering context handle.
518 **/
MultisampleTextureTexStorage2DReconfigurationRejectedTest(Context & context)519 MultisampleTextureTexStorage2DReconfigurationRejectedTest::MultisampleTextureTexStorage2DReconfigurationRejectedTest(
520 Context& context)
521 : TestCase(context, "multisample_texture_tex_storage_2d_reconfiguration_rejected",
522 "Verifies TexStorage2DMultisample() reconfiguration fails")
523 , gl_oes_texture_storage_multisample_2d_array_supported(GL_FALSE)
524 , to_id_2d(0)
525 , to_id_2d_array(0)
526 {
527 /* Left blank on purpose */
528 }
529
530 /** Deinitializes ES objects created during test execution */
deinit()531 void MultisampleTextureTexStorage2DReconfigurationRejectedTest::deinit()
532 {
533 /* Delete texture and bind default texture to GL_TEXTURE_2D_MULTISAMPLE */
534 deinitTexture(to_id_2d, GL_TEXTURE_2D_MULTISAMPLE);
535
536 if (gl_oes_texture_storage_multisample_2d_array_supported)
537 {
538 /* Delete texture and bind default texture to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES */
539 deinitTexture(to_id_2d_array, GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES);
540 }
541 /* Call base class' deinit() */
542 TestCase::deinit();
543 }
544
545 /** Deinitializes texture: delete texture and release texture object bound to specified target.
546 *
547 * @param to_id Texture object to delete & unbind. Will be set to 0 afterward
548 * @param texture_target Target from which the texture will be unbound
549 */
deinitTexture(glw::GLuint & to_id,glw::GLenum texture_target)550 void MultisampleTextureTexStorage2DReconfigurationRejectedTest::deinitTexture(glw::GLuint& to_id,
551 glw::GLenum texture_target)
552 {
553 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
554
555 /* Unbind texture object bound to texture_target target */
556 gl.bindTexture(texture_target, 0);
557
558 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to unbind a texture object");
559
560 /* Delete texture object */
561 gl.deleteTextures(1, &to_id);
562
563 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to delete texture object");
564
565 to_id = 0;
566 }
567
568 /** Initializes ES objects required for test execution */
initInternals()569 void MultisampleTextureTexStorage2DReconfigurationRejectedTest::initInternals()
570 {
571 /* Generate and bind texture to GL_TEXTURE_2D_MULTISAMPLE target */
572 initTexture(to_id_2d, GL_TEXTURE_2D_MULTISAMPLE);
573
574 if (gl_oes_texture_storage_multisample_2d_array_supported)
575 {
576 /* Generate and bind texture to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES target */
577 initTexture(to_id_2d_array, GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES);
578 }
579 }
580
581 /** Initializes texture: creates texture object and binds it to specified texture target.
582 *
583 * @param to_id Will be set to new texture object's id
584 * @param texture_target Texture target, to which the created texture should be bound to
585 */
initTexture(glw::GLuint & to_id,glw::GLenum texture_target)586 void MultisampleTextureTexStorage2DReconfigurationRejectedTest::initTexture(glw::GLuint& to_id,
587 glw::GLenum texture_target)
588 {
589 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
590
591 /* Generate texture object id */
592 gl.genTextures(1, &to_id);
593
594 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed to generate texture");
595
596 /* Verify texture object has been generated properly */
597 if (to_id == 0)
598 {
599 TCU_FAIL("Texture object has not been generated properly");
600 }
601
602 /* Bind generated texture object ID to texture_target target */
603 gl.bindTexture(texture_target, to_id);
604
605 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() reported an error");
606 }
607
608 /** Executes test iteration.
609 *
610 * @return Always STOP.
611 */
iterate()612 tcu::TestNode::IterateResult MultisampleTextureTexStorage2DReconfigurationRejectedTest::iterate()
613 {
614 gl_oes_texture_storage_multisample_2d_array_supported =
615 m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array");
616
617 initInternals();
618
619 /* Test case variables */
620 const glw::GLsizei depth = 4;
621 const glw::GLboolean fixedsamplelocations = GL_TRUE;
622 const glw::GLsizei height = 4;
623 const glw::GLenum internalformat = GL_RGBA8;
624 const glw::GLsizei samples = 2;
625 const glw::GLsizei width = 4;
626
627 /* Set up immutable 2D multisample texture object */
628 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
629
630 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, internalformat, width, height, fixedsamplelocations);
631
632 GLU_EXPECT_NO_ERROR(gl.getError(),
633 "glTexStorage2DMultisample() failed to set up immutable 2D multisample texture object");
634
635 /* Try to reset immutable 2D multisample texture object */
636 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, internalformat, width, height, fixedsamplelocations);
637
638 if (gl.getError() != GL_INVALID_OPERATION)
639 {
640 TCU_FAIL("Invalid error code reported");
641 }
642
643 if (gl_oes_texture_storage_multisample_2d_array_supported)
644 {
645 /* Set up immutable 2D array multisample texture object */
646 gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samples, internalformat, width, height, depth,
647 fixedsamplelocations);
648
649 GLU_EXPECT_NO_ERROR(
650 gl.getError(),
651 "gltexStorage3DMultisample() failed to set up immutable 2D array multisample texture object");
652
653 /* Try to reset immutable 2D array multisample texture object */
654 gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samples, internalformat, width, height, depth,
655 fixedsamplelocations);
656
657 if (gl.getError() != GL_INVALID_OPERATION)
658 {
659 TCU_FAIL("Invalid error code reported");
660 }
661 }
662
663 /* Test case passed */
664 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
665
666 return STOP;
667 }
668
669 /** Constructor.
670 *
671 * @param context Rendering context handle.
672 **/
673 MultisampleTextureTexStorage2DTexture2DMultisampleArrayTest::
MultisampleTextureTexStorage2DTexture2DMultisampleArrayTest(Context & context)674 MultisampleTextureTexStorage2DTexture2DMultisampleArrayTest(Context& context)
675 : TestCase(context, "multisample_texture_tex_storage_2d_texture_2d_multsample_array",
676 "Verifies TexStorage2DMultisample() rejects GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES targets")
677 {
678 /* Left blank on purpose */
679 }
680
681 /** Executes test iteration.
682 *
683 * @return Always STOP.
684 */
iterate()685 tcu::TestNode::IterateResult MultisampleTextureTexStorage2DTexture2DMultisampleArrayTest::iterate()
686 {
687 /* NOTE: This test can be executed, no matter whether GL_OES_texture_storage_multisample_2d_array
688 * extension is supported on the running platform, or not.
689 */
690 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
691
692 /* Issue call with valid parameters and GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES target */
693 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 1, GL_RGBA8, 1, 1, false);
694
695 /* Check if the expected error code was reported */
696 if (gl.getError() != GL_INVALID_ENUM)
697 {
698 TCU_FAIL("Invalid error code reported");
699 }
700
701 /* Test case passed */
702 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
703
704 return STOP;
705 }
706
707 /** Constructor.
708 *
709 * @param context Rendering context handle.
710 **/
711 MultisampleTextureTexStorage2DUnsupportedSamplesCountForColorTexturesTest::
MultisampleTextureTexStorage2DUnsupportedSamplesCountForColorTexturesTest(Context & context)712 MultisampleTextureTexStorage2DUnsupportedSamplesCountForColorTexturesTest(Context& context)
713 : TestCase(context, "multisample_texture_tex_storage_2d_unsupported_samples_count_for_color_textures_rejected",
714 "Verifies TexStorage2DMultisample() rejects requests to set up "
715 "multisample color textures with unsupported number of samples")
716 , to_id(0)
717 {
718 /* Left blank on purpose */
719 }
720
721 /** Deinitializes ES objects created during test execution */
deinit()722 void MultisampleTextureTexStorage2DUnsupportedSamplesCountForColorTexturesTest::deinit()
723 {
724 /* Delete texture in case the test case failed */
725 deinitInternalIteration();
726
727 /* Call base class deinitialization routine */
728 glcts::TestCase::deinit();
729 }
730
731 /** Deinitializes GL ES objects specific to internal iteration */
deinitInternalIteration()732 void MultisampleTextureTexStorage2DUnsupportedSamplesCountForColorTexturesTest::deinitInternalIteration()
733 {
734 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
735
736 if (to_id != 0)
737 {
738 /* Delete texture object */
739 gl.deleteTextures(1, &to_id);
740
741 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to delete texture object");
742
743 to_id = 0;
744 }
745
746 /* Unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE texture target */
747 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
748
749 GLU_EXPECT_NO_ERROR(gl.getError(),
750 "Failed to unbind a texture object from GL_TEXTURE_2D_MULTISAMPLE texture target");
751 }
752
753 /** Initializes GL ES objects specific to internal iteration */
initInternalIteration()754 void MultisampleTextureTexStorage2DUnsupportedSamplesCountForColorTexturesTest::initInternalIteration()
755 {
756 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
757
758 /* Generate texture object id */
759 gl.genTextures(1, &to_id);
760
761 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed to generate texture");
762
763 /* Verify texture object has been generated properly */
764 if (to_id == 0)
765 {
766 TCU_FAIL("Texture object has not been generated properly");
767 }
768
769 /* Bind generated texture object ID to GL_TEXTURE_2D_MULTISAMPLE texture target */
770 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, to_id);
771
772 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() reported an error");
773 }
774
775 /** Executes test iteration.
776 *
777 * @return Always STOP.
778 */
iterate()779 tcu::TestNode::IterateResult MultisampleTextureTexStorage2DUnsupportedSamplesCountForColorTexturesTest::iterate()
780 {
781 /* Test case variables */
782 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
783 const glw::GLsizei height = 1;
784 const glw::GLboolean fixedsamplelocations_list[] = { GL_FALSE, GL_TRUE };
785 const int fixedsamplelocations_list_count =
786 sizeof(fixedsamplelocations_list) / sizeof(fixedsamplelocations_list[0]);
787 glw::GLint gl_max_color_texture_samples_value = -1; /* Will be determined later */
788 glw::GLint gl_max_internalformat_samples_value = -1; /* Will be determined later */
789 glw::GLint gl_max_samples_value = -1; /* Will be determined later */
790 const glw::GLenum internalformat_list[] = { GL_R8, GL_RGB565, GL_RGB10_A2UI, GL_SRGB8_ALPHA8, GL_R8I };
791 const int internalformat_list_count = sizeof(internalformat_list) / sizeof(internalformat_list[0]);
792 const glw::GLenum target = GL_TEXTURE_2D_MULTISAMPLE; /* Test case uses GL_TEXTURE_2D_MULTISAMPLE target */
793 const glw::GLsizei width = 1;
794
795 /* Iterate through all internal formats test case should check */
796 for (int internalformat_index = 0; internalformat_index < internalformat_list_count; internalformat_index++)
797 {
798 /* Iteration-specific internalformat */
799 glw::GLenum internalformat = internalformat_list[internalformat_index];
800
801 /* Iterate through all fixedsamplelocations test case should check */
802 for (int fixedsamplelocations_index = 0; fixedsamplelocations_index < fixedsamplelocations_list_count;
803 fixedsamplelocations_index++)
804 {
805 /* Iteration-specific fixedsamplelocations */
806 glw::GLboolean fixedsamplelocations = fixedsamplelocations_list[fixedsamplelocations_index];
807
808 /* Initialize texture object and bind it to GL_TEXTURE_2D_MULTISAMPLE target */
809 initInternalIteration();
810
811 /* Get GL_MAX_SAMPLES value */
812 gl.getIntegerv(GL_MAX_SAMPLES, &gl_max_samples_value);
813
814 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to retrieve GL_MAX_SAMPLES value");
815
816 /* Get GL_MAX_COLOR_TEXTURE_SAMPLES value */
817 gl.getIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &gl_max_color_texture_samples_value);
818
819 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to retrieve GL_MAX_COLOR_TEXTURE_SAMPLES value");
820
821 /* Retrieve maximum amount of samples available for the texture target considered */
822 gl.getInternalformativ(target, internalformat, GL_SAMPLES, 1, &gl_max_internalformat_samples_value);
823
824 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetInternalformativ() failed to retrieve GL_SAMPLES");
825
826 /* Issue call with valid parameters, but samples argument might be invalid */
827 gl.texStorage2DMultisample(target, gl_max_internalformat_samples_value + 1, internalformat, width, height,
828 fixedsamplelocations);
829
830 /* Expect GL_INVALID_OPERATION error code. */
831 TCU_CHECK_MSG(gl.getError() == GL_INVALID_OPERATION,
832 "glTexStorage2DMultisample() did not generate GL_INVALID_OPERATION error.");
833
834 /* Issue call with valid parameters, but to another target GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES and with invalid samples.
835 *
836 * NOTE: This can be executed on both the implementations that support GL_OES_texture_storage_multisample_2d_array extension
837 * and on those that don't.
838 */
839 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, gl_max_internalformat_samples_value + 1,
840 internalformat, width, height, fixedsamplelocations);
841
842 /* Expect GL_INVALID_ENUM error code from invalid target. */
843 TCU_CHECK_MSG(gl.getError() == GL_INVALID_ENUM,
844 "glTexStorage2DMultisample() did not generate GL_INVALID_ENUM error.");
845
846 /* Deinitialize texture object and unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE target */
847 deinitInternalIteration();
848 }
849 }
850
851 /* Test case passed */
852 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
853
854 return STOP;
855 }
856
857 /** Constructor.
858 *
859 * @param context Rendering context handle.
860 **/
861 MultisampleTextureTexStorage2DUnsupportedSamplesCountForDepthTexturesTest::
MultisampleTextureTexStorage2DUnsupportedSamplesCountForDepthTexturesTest(Context & context)862 MultisampleTextureTexStorage2DUnsupportedSamplesCountForDepthTexturesTest(Context& context)
863 : TestCase(context, "multisample_texture_tex_storage_2d_unsupported_samples_count_for_depth_textures_rejected",
864 "Verifies TexStorage2DMultisample() rejects requests to set up multisample "
865 "depth textures with unsupported number of samples")
866 , to_id(0)
867 {
868 /* Left blank on purpose */
869 }
870
871 /** Deinitializes ES objects created during test execution */
deinit()872 void MultisampleTextureTexStorage2DUnsupportedSamplesCountForDepthTexturesTest::deinit()
873 {
874 /* Delete texture in case the test case failed */
875 deinitInternalIteration();
876
877 /* Call base class deinitialization routine */
878 glcts::TestCase::deinit();
879 }
880
881 /** Deinitializes GL ES objects specific to internal iteration */
deinitInternalIteration()882 void MultisampleTextureTexStorage2DUnsupportedSamplesCountForDepthTexturesTest::deinitInternalIteration()
883 {
884 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
885
886 if (to_id != 0)
887 {
888 /* Delete texture object */
889 gl.deleteTextures(1, &to_id);
890
891 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to delete texture object");
892
893 to_id = 0;
894 }
895
896 /* Unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE texture target */
897 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
898
899 GLU_EXPECT_NO_ERROR(gl.getError(),
900 "Failed to unbind a texture object from GL_TEXTURE_2D_MULTISAMPLE texture target");
901 }
902
903 /** Initializes GL ES objects specific to internal iteration */
initInternalIteration()904 void MultisampleTextureTexStorage2DUnsupportedSamplesCountForDepthTexturesTest::initInternalIteration()
905 {
906 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
907
908 /* Generate texture object id */
909 gl.genTextures(1, &to_id);
910
911 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed to generate texture");
912
913 /* Verify texture object has been generated properly */
914 if (to_id == 0)
915 {
916 TCU_FAIL("Texture object has not been generated properly");
917 }
918
919 /* Bind generated texture object ID to GL_TEXTURE_2D_MULTISAMPLE texture target */
920 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, to_id);
921
922 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() reported an error");
923 }
924
925 /** Executes test iteration.
926 *
927 * @return Always STOP.
928 */
iterate()929 tcu::TestNode::IterateResult MultisampleTextureTexStorage2DUnsupportedSamplesCountForDepthTexturesTest::iterate()
930 {
931 /* Test case variables */
932 const glw::GLboolean fixedsamplelocations_list[] = { GL_FALSE, GL_TRUE };
933 const int fixedsamplelocations_list_count =
934 sizeof(fixedsamplelocations_list) / sizeof(fixedsamplelocations_list[0]);
935 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
936 glw::GLint gl_max_depth_texture_samples_value = -1; /* Will be determined later */
937 glw::GLint gl_max_internalformat_samples_value = -1; /* Will be determined later */
938 glw::GLint gl_max_samples_value = -1; /* Will be determined later */
939 const glw::GLsizei height = 1;
940 const glw::GLenum internalformat_list[] = { GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT32F, GL_DEPTH24_STENCIL8 };
941 const int internalformat_list_count = sizeof(internalformat_list) / sizeof(internalformat_list[0]);
942 const glw::GLenum target = GL_TEXTURE_2D_MULTISAMPLE; /* Test case uses GL_TEXTURE_2D_MULTISAMPLE target */
943 const glw::GLsizei width = 1;
944
945 /* Iterate through all internal formats test case should check */
946 for (int internalformat_index = 0; internalformat_index < internalformat_list_count; internalformat_index++)
947 {
948 /* Iteration-specific internalformat */
949 glw::GLenum internalformat = internalformat_list[internalformat_index];
950
951 /* Iterate through all fixedsamplelocations test case should check */
952 for (int fixedsamplelocations_index = 0; fixedsamplelocations_index < fixedsamplelocations_list_count;
953 fixedsamplelocations_index++)
954 {
955 /* Iteration-specific fixedsamplelocations */
956 glw::GLboolean fixedsamplelocations = fixedsamplelocations_list[fixedsamplelocations_index];
957
958 /* Initialize texture object and bind it to GL_TEXTURE_2D_MULTISAMPLE target */
959 initInternalIteration();
960
961 /* Get GL_MAX_SAMPLES value */
962 gl.getIntegerv(GL_MAX_SAMPLES, &gl_max_samples_value);
963
964 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to retrieve GL_MAX_SAMPLES value");
965
966 /* Get GL_MAX_DEPTH_TEXTURE_SAMPLES value */
967 gl.getIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &gl_max_depth_texture_samples_value);
968
969 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to retrieve GL_MAX_DEPTH_TEXTURE_SAMPLES value");
970
971 /* Retrieve maximum amount of samples available for the texture target considered */
972 gl.getInternalformativ(target, internalformat, GL_SAMPLES, 1, &gl_max_internalformat_samples_value);
973
974 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetInternalformativ() failed to retrieve GL_SAMPLES");
975
976 /* Issue call with valid parameters, but samples argument might be invalid */
977 gl.texStorage2DMultisample(target, gl_max_internalformat_samples_value + 1, internalformat, width, height,
978 fixedsamplelocations);
979
980 /* Expect GL_INVALID_OPERATION error code. */
981 TCU_CHECK_MSG(gl.getError() == GL_INVALID_OPERATION,
982 "glTexStorage2DMultisample() did not generate GL_INVALID_OPERATION error.");
983
984 /* Deinitialize texture object and unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE target */
985 deinitInternalIteration();
986 }
987 }
988
989 /* Test case passed */
990 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
991
992 return STOP;
993 }
994
995 /** Constructor.
996 *
997 * @param context Rendering context handle.
998 **/
999 MultisampleTextureTexStorage2DUnsupportedSamplesCountForDepthStencilTexturesTest::
MultisampleTextureTexStorage2DUnsupportedSamplesCountForDepthStencilTexturesTest(Context & context)1000 MultisampleTextureTexStorage2DUnsupportedSamplesCountForDepthStencilTexturesTest(Context& context)
1001 : TestCase(context,
1002 "multisample_texture_tex_storage_2d_unsupported_samples_count_for_depth_stencil_textures_rejected",
1003 "Verifies TexStorage2DMultisample() rejects requests to set up multisample "
1004 "depth+stencil textures with unsupported number of samples")
1005 , to_id(0)
1006 {
1007 /* Left blank on purpose */
1008 }
1009
1010 /** Deinitializes ES objects created during test execution */
deinit()1011 void MultisampleTextureTexStorage2DUnsupportedSamplesCountForDepthStencilTexturesTest::deinit()
1012 {
1013 /* Delete texture in case the test case failed */
1014 deinitInternalIteration();
1015
1016 /* Call base class deinitialization routine */
1017 glcts::TestCase::deinit();
1018 }
1019
1020 /** Deinitializes GL ES objects specific to internal iteration */
deinitInternalIteration()1021 void MultisampleTextureTexStorage2DUnsupportedSamplesCountForDepthStencilTexturesTest::deinitInternalIteration()
1022 {
1023 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1024
1025 if (to_id != 0)
1026 {
1027 /* Delete texture object */
1028 gl.deleteTextures(1, &to_id);
1029
1030 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to delete texture object");
1031
1032 to_id = 0;
1033 }
1034
1035 /* Unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE texture target */
1036 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
1037
1038 GLU_EXPECT_NO_ERROR(gl.getError(),
1039 "Failed to unbind a texture object from GL_TEXTURE_2D_MULTISAMPLE texture target");
1040 }
1041
1042 /** Initializes GL ES objects specific to internal iteration */
initInternalIteration()1043 void MultisampleTextureTexStorage2DUnsupportedSamplesCountForDepthStencilTexturesTest::initInternalIteration()
1044 {
1045 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1046
1047 /* Generate texture object id */
1048 gl.genTextures(1, &to_id);
1049
1050 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed to generate texture");
1051
1052 /* Verify texture object has been generated properly */
1053 if (to_id == 0)
1054 {
1055 TCU_FAIL("Texture object has not been generated properly");
1056 }
1057
1058 /* Bind generated texture object ID to GL_TEXTURE_2D_MULTISAMPLE texture target */
1059 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, to_id);
1060
1061 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() reported an error");
1062 }
1063
1064 /** Executes test iteration.
1065 *
1066 * @return Always STOP.
1067 */
iterate()1068 tcu::TestNode::IterateResult MultisampleTextureTexStorage2DUnsupportedSamplesCountForDepthStencilTexturesTest::iterate()
1069 {
1070 /* Test case variables */
1071 const glw::GLboolean fixedsamplelocations_list[] = { GL_FALSE, GL_TRUE };
1072 const int fixedsamplelocations_list_count =
1073 sizeof(fixedsamplelocations_list) / sizeof(fixedsamplelocations_list[0]);
1074 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1075 glw::GLint gl_max_depth_texture_samples_value = -1; /* Will be determined later */
1076 glw::GLint gl_max_internalformat_samples_value = -1; /* Will be determined later */
1077 glw::GLint gl_max_samples_value = -1; /* Will be determined later */
1078 const glw::GLsizei height = 1;
1079 const glw::GLenum internalformat_list[] = { GL_DEPTH24_STENCIL8, GL_DEPTH32F_STENCIL8 };
1080 const int internalformat_list_count = sizeof(internalformat_list) / sizeof(internalformat_list[0]);
1081 const glw::GLenum target = GL_TEXTURE_2D_MULTISAMPLE; /* Test case uses GL_TEXTURE_2D_MULTISAMPLE target */
1082 const glw::GLsizei width = 1;
1083
1084 /* Iterate through all internal formats test case should check */
1085 for (int internalformat_index = 0; internalformat_index < internalformat_list_count; internalformat_index++)
1086 {
1087 /* Iteration-specific internalformat */
1088 glw::GLenum internalformat = internalformat_list[internalformat_index];
1089
1090 /* Iterate through all fixedsamplelocations test case should check */
1091 for (int fixedsamplelocations_index = 0; fixedsamplelocations_index < fixedsamplelocations_list_count;
1092 fixedsamplelocations_index++)
1093 {
1094 /* Iteration-specific fixedsamplelocations */
1095 glw::GLboolean fixedsamplelocations = fixedsamplelocations_list[fixedsamplelocations_index];
1096
1097 /* Initialize texture object and bind it to GL_TEXTURE_2D_MULTISAMPLE target */
1098 initInternalIteration();
1099
1100 /* Get GL_MAX_SAMPLES value */
1101 gl.getIntegerv(GL_MAX_SAMPLES, &gl_max_samples_value);
1102
1103 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to retrieve GL_MAX_SAMPLES value");
1104
1105 /* Get GL_MAX_DEPTH_TEXTURE_SAMPLES value */
1106 gl.getIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &gl_max_depth_texture_samples_value);
1107
1108 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to retrieve GL_MAX_DEPTH_TEXTURE_SAMPLES value");
1109
1110 /* Retrieve maximum amount of samples available for the texture target considered */
1111 gl.getInternalformativ(target, internalformat, GL_SAMPLES, 1, &gl_max_internalformat_samples_value);
1112
1113 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetInternalformativ() failed to retrieve GL_SAMPLES");
1114
1115 /* Issue call with valid parameters, but samples argument might be invalid */
1116 gl.texStorage2DMultisample(target, gl_max_internalformat_samples_value + 1, internalformat, width, height,
1117 fixedsamplelocations);
1118
1119 /* Expect GL_INVALID_OPERATION error code. */
1120 TCU_CHECK_MSG(gl.getError() == GL_INVALID_OPERATION,
1121 "glTexStorage2DMultisample() did not generate GL_INVALID_OPERATION error.");
1122
1123 /* Deinitialize texture object and unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE target */
1124 deinitInternalIteration();
1125 }
1126 }
1127
1128 /* Test case passed */
1129 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1130
1131 return STOP;
1132 }
1133
1134 /** Constructor.
1135 *
1136 * @param context Rendering context handle.
1137 **/
MultisampleTextureTexStorage2DValidCallsTest(Context & context)1138 MultisampleTextureTexStorage2DValidCallsTest::MultisampleTextureTexStorage2DValidCallsTest(Context& context)
1139 : TestCase(context, "multisample_texture_tex_storage_2d_valid_calls",
1140 "Verifies TexStorage2DMultisample() does not generate an error "
1141 "when asked to set up multisample color/depth/textures in various configurations.")
1142 , to_id(0)
1143 {
1144 /* Left blank on purpose */
1145 }
1146
1147 /** Deinitializes ES objects created during test execution */
deinit()1148 void MultisampleTextureTexStorage2DValidCallsTest::deinit()
1149 {
1150 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1151
1152 /* Unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE texture target */
1153 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
1154
1155 GLU_EXPECT_NO_ERROR(gl.getError(),
1156 "Failed to unbind a texture object from GL_TEXTURE_2D_MULTISAMPLE texture target");
1157
1158 /* Delete texture object */
1159 if (to_id != 0)
1160 {
1161 gl.deleteTextures(1, &to_id);
1162 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to delete texture object");
1163
1164 to_id = 0;
1165 }
1166
1167 /* Call base class deinitialization routine */
1168 glcts::TestCase::deinit();
1169 }
1170
1171 /** Initializes ES objects required for test execution */
initInternals()1172 void MultisampleTextureTexStorage2DValidCallsTest::initInternals()
1173 {
1174 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1175
1176 /* Generate a texture object id */
1177 gl.genTextures(1, &to_id);
1178
1179 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed to generate a texture object ID");
1180
1181 /* Bind texture to GL_TEXTURE_2D_MULTISAMPLE texture target */
1182 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, to_id);
1183
1184 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() failed");
1185 }
1186
1187 /** Executes test iteration.
1188 *
1189 * @return Always STOP.
1190 */
iterate()1191 tcu::TestNode::IterateResult MultisampleTextureTexStorage2DValidCallsTest::iterate()
1192 {
1193 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1194
1195 initInternals();
1196
1197 /* Retrieve GL_MAX_COLOR_TEXTURE_SAMPLES pname value */
1198 glw::GLint gl_max_color_texture_samples_value = 0;
1199
1200 gl.getIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &gl_max_color_texture_samples_value);
1201 GLU_EXPECT_NO_ERROR(gl.getError(), "Could not retrieve GL_MAX_COLOR_TEXTURE_SAMPLES pname value");
1202
1203 /* Retrieve GL_MAX_DEPTH_TEXTURE_SAMPLES pname value */
1204 glw::GLint gl_max_depth_texture_samples_value = 0;
1205
1206 gl.getIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &gl_max_depth_texture_samples_value);
1207 GLU_EXPECT_NO_ERROR(gl.getError(), "Could not retrieve GL_MAX_DEPTH_TEXTURE_SAMPLES pname value");
1208
1209 /* Iterate through color-, depth- and stencil-renderable internalformats */
1210 const glw::GLenum color_internalformats[] = { GL_R8, GL_RGB565, GL_RGB10_A2UI, GL_SRGB8_ALPHA8, GL_R8I };
1211 const glw::GLenum depth_internalformats[] = { GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT32F, GL_DEPTH24_STENCIL8 };
1212 const glw::GLenum stencil_internalformats[] = { GL_DEPTH24_STENCIL8, GL_DEPTH32F_STENCIL8 };
1213 const unsigned int n_color_internalformats = sizeof(color_internalformats) / sizeof(color_internalformats[0]);
1214 const unsigned int n_depth_internalformats = sizeof(depth_internalformats) / sizeof(depth_internalformats[0]);
1215 const unsigned int n_stencil_internalformats = sizeof(stencil_internalformats) / sizeof(stencil_internalformats[0]);
1216
1217 for (unsigned int n_iteration = 0; n_iteration < 3 /* color/depth/stencil */; ++n_iteration)
1218 {
1219 const glw::GLenum* internalformats = NULL;
1220 glw::GLint max_iteration_specific_gl_samples_value = 0;
1221 unsigned int n_internalformats = 0;
1222
1223 switch (n_iteration)
1224 {
1225 case 0:
1226 {
1227 internalformats = color_internalformats;
1228 max_iteration_specific_gl_samples_value = gl_max_color_texture_samples_value;
1229 n_internalformats = n_color_internalformats;
1230
1231 break;
1232 }
1233
1234 case 1:
1235 {
1236 internalformats = depth_internalformats;
1237 max_iteration_specific_gl_samples_value = gl_max_depth_texture_samples_value;
1238 n_internalformats = n_depth_internalformats;
1239
1240 break;
1241 }
1242
1243 case 2:
1244 {
1245 internalformats = stencil_internalformats;
1246 max_iteration_specific_gl_samples_value = gl_max_depth_texture_samples_value;
1247 n_internalformats = n_stencil_internalformats;
1248
1249 break;
1250 }
1251
1252 default:
1253 {
1254 TCU_FAIL("Unrecognized iteration index");
1255 }
1256 } /* switch (n_iteration) */
1257
1258 /* Iterate through valid fixedsamplelocations argument values */
1259 const glw::GLboolean fixedsamplelocations_values[] = { GL_FALSE, GL_TRUE };
1260 const unsigned int n_fixedsamplelocations_values =
1261 sizeof(fixedsamplelocations_values) / sizeof(fixedsamplelocations_values[0]);
1262
1263 for (unsigned int n_fixedsamplelocations_value = 0;
1264 n_fixedsamplelocations_value < n_fixedsamplelocations_values; ++n_fixedsamplelocations_value)
1265 {
1266 glw::GLboolean fixedsamplelocations = fixedsamplelocations_values[n_fixedsamplelocations_value];
1267
1268 /* Iterate through internalformats */
1269 for (unsigned int n_internalformat = 0; n_internalformat < n_internalformats; ++n_internalformat)
1270 {
1271 glw::GLenum internalformat = internalformats[n_internalformat];
1272 glw::GLint internalformat_max_samples = 0;
1273
1274 /* Retrieve internalformat-specific GL_MAX_SAMPLES value */
1275 gl.getInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, /* target */
1276 internalformat, GL_SAMPLES, 1, /* bufSize */
1277 &internalformat_max_samples);
1278
1279 GLU_EXPECT_NO_ERROR(gl.getError(), "glGetInternalformativ() failed");
1280
1281 /* Determine maximum amount of samples we can use for the test*/
1282 glw::GLint max_samples =
1283 de::max(1, de::min(internalformat_max_samples, max_iteration_specific_gl_samples_value));
1284
1285 /* Iterate through all valid samples argument values */
1286 for (int n_samples = 1; n_samples <= max_samples; ++n_samples)
1287 {
1288 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, n_samples, internalformat, 1, /* width */
1289 1, /* height */
1290 fixedsamplelocations); /* fixedsamplelocations */
1291
1292 GLU_EXPECT_NO_ERROR(gl.getError(), "A valid glTexStorage2DMultisample() call failed");
1293
1294 /* Re-create the texture object before we continue */
1295 gl.deleteTextures(1, &to_id);
1296 gl.genTextures(1, &to_id);
1297
1298 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, to_id);
1299
1300 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to re-create a texture object");
1301 } /* for (all samples argument values) */
1302 } /* for (all color-renderable internalformats) */
1303 } /* for (all fixedsamplelocations argument values) */
1304 } /* for (all iterations) */
1305
1306 /* Test case passed */
1307 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1308
1309 return STOP;
1310 }
1311
1312 /** Constructor.
1313 *
1314 * @param context Rendering context handle.
1315 **/
MultisampleTextureTexStorage2DZeroSampleTest(Context & context)1316 MultisampleTextureTexStorage2DZeroSampleTest::MultisampleTextureTexStorage2DZeroSampleTest(Context& context)
1317 : TestCase(context, "multisample_texture_tex_storage_2d_zero_sample",
1318 "Verifies TexStorage2DMultisample() rejects zero "
1319 "sample requests by generating a GL_INVALID_VALUE error.")
1320 , to_id(0)
1321 {
1322 /* Left blank on purpose */
1323 }
1324
1325 /** Deinitializes ES objects created during test execution */
deinit()1326 void MultisampleTextureTexStorage2DZeroSampleTest::deinit()
1327 {
1328 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1329
1330 /* Unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE texture target */
1331 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
1332
1333 GLU_EXPECT_NO_ERROR(gl.getError(),
1334 "Failed to unbind a texture object from GL_TEXTURE_2D_MULTISAMPLE texture target");
1335
1336 /* Delete texture object */
1337 gl.deleteTextures(1, &to_id);
1338
1339 GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to delete texture object");
1340
1341 to_id = 0;
1342
1343 /* Call base class deinitialization routine */
1344 glcts::TestCase::deinit();
1345 }
1346
1347 /** Initializes ES objects required for test execution */
initInternals()1348 void MultisampleTextureTexStorage2DZeroSampleTest::initInternals()
1349 {
1350 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1351
1352 /* Generate texture object id */
1353 gl.genTextures(1, &to_id);
1354
1355 GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed to generate texture");
1356
1357 /* Verify texture object has been generated properly */
1358 if (to_id == 0)
1359 {
1360 TCU_FAIL("Texture object has not been generated properly");
1361 }
1362
1363 /* Bind texture to GL_TEXTURE_2D_MULTISAMPLE */
1364 gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, to_id);
1365
1366 GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() reported an error");
1367 }
1368
1369 /** Executes test iteration.
1370 *
1371 * @return Always STOP.
1372 */
iterate()1373 tcu::TestNode::IterateResult MultisampleTextureTexStorage2DZeroSampleTest::iterate()
1374 {
1375 const glw::Functions& gl = m_context.getRenderContext().getFunctions();
1376
1377 initInternals();
1378
1379 /* Issue call function for target GL_TEXTURE_2D_MULTISAMPLE, but provide zero for samples argument */
1380 gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 0, GL_RGBA8, 1, 1, true);
1381
1382 /* Check if the expected error code was reported */
1383 glw::GLenum error_code = gl.getError();
1384
1385 if (error_code != GL_INVALID_VALUE)
1386 {
1387 TCU_FAIL("Invalid error code reported");
1388 }
1389
1390 /* Test case passed */
1391 m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1392
1393 return STOP;
1394 }
1395
1396 } /* glcts namespace */
1397