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  es31cTextureStorageMultisampleTexStorage3DMultisampleTests.cpp
27  * \brief Implements conformance tests for glTexStorage3DMultisampleOES()
28  *        entry-points (ES3.1 only)
29  */ /*-------------------------------------------------------------------*/
30 
31 #include "es31cTextureStorageMultisampleTexStorage3DMultisampleTests.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 <string>
40 #include <vector>
41 
42 namespace glcts
43 {
44 /* Array holding color renderable internalformats used by the following tests:
45  * - "valid internalformat and samples values are accepted" test,
46  * - "requests to set up multisample color textures with unsupported number of samples are rejected" test.
47  */
48 const glw::GLint color_renderable_internalformats[] = {GL_R8, GL_RGB565, GL_RGB10_A2UI, GL_SRGB8_ALPHA8, GL_R8I};
49 
50 /* Array holding depth renderable internalformats used by the following tests:
51  * - valid internalformat and samples values are accepted" test,
52  * - requests to set up multisample depth textures with unsupported number of samples are rejected" test.
53  */
54 const glw::GLint depth_renderable_internalformats[] = {GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT32F,
55                                                        GL_DEPTH24_STENCIL8};
56 
57 /* Array holding depth-stencil renderable internalformats used by the following tests:
58  * - valid internalformat and samples values are accepted" test,
59  * - requests to set up multisample stencil textures with unsupported number of samples are rejected" test.
60  */
61 const glw::GLint depth_stencil_renderable_internalformats[] = {GL_DEPTH24_STENCIL8, GL_DEPTH32F_STENCIL8};
62 
63 /* Array holding boolean values indicating possible fixed sample locations values. */
64 const glw::GLboolean fixed_sample_locations_values[] = {GL_TRUE, GL_FALSE};
65 
66 /* Array holding supported internalformat values used by the following tests:
67  * - requests to set up multisample textures with valid and invalid number of samples" test.
68  */
69 const glw::GLint supported_internalformats[] = {GL_R8,
70                                                 GL_RGB565,
71                                                 GL_RGB10_A2UI,
72                                                 GL_SRGB8_ALPHA8,
73                                                 GL_R8I,
74                                                 GL_DEPTH_COMPONENT16,
75                                                 GL_DEPTH_COMPONENT32F,
76                                                 GL_DEPTH24_STENCIL8,
77                                                 GL_DEPTH24_STENCIL8};
78 
79 /* Array holding internalformats which are neither color-, stencil- nor depth-renderable,
80  * used by the following tests:
81  * - non color-, depth-, stencil-, renderable internalformats are rejected test.
82  */
83 /* GL_SRGB8_ALPHA8 is renderable according to spec - replaced with GL_SRGB8 */
84 /* GL_RGBA32F is renderable if EXT_color_buffer_float extension is supported - replaced with GL_RGB32F */
85 /* GL_SRGB8 is renderable if extension NV_sRGB_formats is supported. */
86 /* GL_R8_SNORM is renderable if extension EXT_render_snorm is supported - replace with GL_RGB8_SNORM*/
87 const glw::GLint unsupported_internalformats[] = {GL_RGB8_SNORM, GL_RGB32F, GL_RGB32I};
88 
89 /** Constructor.
90  *
91  *  @param context CTS context handle.
92  **/
InvalidTextureSizesAreRejectedValidAreAcceptedTest(Context & context)93 InvalidTextureSizesAreRejectedValidAreAcceptedTest::InvalidTextureSizesAreRejectedValidAreAcceptedTest(Context &context)
94     : TestCase(context, "invalid_texture_sizes_are_rejected_valid_are_accepted_test",
95                "Verifies gltexStorage3DMultisample() rejects invalid multisample "
96                "texture sizes by generating GL_INVALID_VALUE error; border cases are correctly accepted.")
97     , gl_oes_texture_multisample_2d_array_supported(GL_FALSE)
98     , max_texture_size(0)
99     , max_array_texture_layers(0)
100     , to_id_2d_array_1(0)
101     , to_id_2d_array_2(0)
102     , to_id_2d_array_3(0)
103 {
104     /* Left blank on purpose */
105 }
106 
107 /** Deinitializes ES objects created during test execution */
deinit()108 void InvalidTextureSizesAreRejectedValidAreAcceptedTest::deinit()
109 {
110     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
111 
112     if (gl_oes_texture_multisample_2d_array_supported)
113     {
114         /* Bind default texture object to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
115         gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0);
116     }
117 
118     if (to_id_2d_array_1 != 0)
119     {
120         /* Delete texture object. */
121         gl.deleteTextures(1, &to_id_2d_array_1);
122 
123         to_id_2d_array_1 = 0;
124     }
125 
126     if (to_id_2d_array_2 != 0)
127     {
128         /* Delete texture object. */
129         gl.deleteTextures(1, &to_id_2d_array_2);
130 
131         to_id_2d_array_2 = 0;
132     }
133 
134     if (to_id_2d_array_3 != 0)
135     {
136         /* Delete texture object. */
137         gl.deleteTextures(1, &to_id_2d_array_3);
138 
139         to_id_2d_array_3 = 0;
140     }
141 
142     max_texture_size         = 0;
143     max_array_texture_layers = 0;
144 
145     /* Make sure no error was generated. */
146     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture objects deletion failed.");
147 
148     /* Call base class' deinit() */
149     TestCase::deinit();
150 }
151 
152 /** Initializes ES objects created during test execution */
initInternals()153 void InvalidTextureSizesAreRejectedValidAreAcceptedTest::initInternals()
154 {
155     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
156 
157     /* Generate first texture object. */
158     gl.genTextures(1, &to_id_2d_array_1);
159 
160     /* Generate second texture object. */
161     gl.genTextures(1, &to_id_2d_array_2);
162 
163     /* Generate third texture object. */
164     gl.genTextures(1, &to_id_2d_array_3);
165 
166     /* Retrieve maximum 3D texture image dimensions. */
167     gl.getIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size);
168     gl.getIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &max_array_texture_layers);
169 
170     /* Make sure no error was generated. */
171     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture objects creation failed.");
172 }
173 
174 /** Executes test iteration.
175  *
176  *  @return Returns STOP when test has finished executing.
177  */
iterate()178 tcu::TestNode::IterateResult InvalidTextureSizesAreRejectedValidAreAcceptedTest::iterate()
179 {
180     gl_oes_texture_multisample_2d_array_supported =
181         m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array");
182 
183     if (!gl_oes_texture_multisample_2d_array_supported)
184     {
185         m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "OES_texture_storage_multisample_2d_array");
186 
187         return STOP;
188     }
189 
190     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
191 
192     initInternals();
193 
194     /* Check if texture objects were generated properly. */
195     TCU_CHECK_MSG(to_id_2d_array_1 != 0, "First texture object has not been generated.");
196     TCU_CHECK_MSG(to_id_2d_array_2 != 0, "Second texture object has not been generated.");
197     TCU_CHECK_MSG(to_id_2d_array_3 != 0, "Third texture object has not been generated.");
198 
199     /* Make sure valid maximum 3d image dimensions were returned. */
200     TCU_CHECK_MSG(max_texture_size >= 2048, "Invalid GL_MAX_TEXTURE_SIZE was returned.");
201     TCU_CHECK_MSG(max_array_texture_layers >= 256, "Invalid GL_MAX_ARRAY_TEXTURE_LAYERS was returned.");
202 
203     /* Bind texture object to_id_2d_array_1 to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
204     gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, to_id_2d_array_1);
205 
206     /* Make sure no error was generated. */
207     glw::GLenum error_code = gl.getError();
208 
209     GLU_EXPECT_NO_ERROR(error_code, "Unexpected error was generated when binding texture object to "
210                                     "GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target.");
211 
212     /* Call gltexStorage3DMultisample() with invalid depth argument value (depth value cannot be negative). */
213     gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA8, 4, 4,
214                                0, /* Invalid depth argument value. */
215                                GL_TRUE);
216 
217     /* Expect GL_INVALID_VALUE error code. */
218     error_code = gl.getError();
219 
220     TCU_CHECK_MSG(error_code == GL_INVALID_VALUE,
221                   "gltexStorage3DMultisample() did not generate GL_INVALID_VALUE error.");
222 
223     /* Call gltexStorage3DMultisample() with invalid depth argument value
224      * (depth value cannot be greater than GL_MAX_TEXTURE_SIZE). */
225     gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA8, 4, 4,
226                                max_array_texture_layers + 1, /* Invalid depth argument value. */
227                                GL_TRUE);
228 
229     /* Expect GL_INVALID_VALUE error code. */
230     error_code = gl.getError();
231 
232     TCU_CHECK_MSG(error_code == GL_INVALID_VALUE,
233                   "gltexStorage3DMultisample() did not generate GL_INVALID_VALUE error.");
234 
235     /* Set up a valid immutable 2D array multisample texture object using gltexStorage3DMultisample() call. */
236     gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA8, 4, 4, 1, GL_TRUE);
237 
238     /* Make sure no error was generated. */
239     error_code = gl.getError();
240 
241     GLU_EXPECT_NO_ERROR(error_code, "gltexStorage3DMultisample() reported unexpected error code.");
242 
243     /* Bind texture object to_id_2d_array_2 to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
244     gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, to_id_2d_array_2);
245 
246     /* Make sure no error was generated. */
247     error_code = gl.getError();
248 
249     GLU_EXPECT_NO_ERROR(error_code, "Unexpected error was generated when binding texture object to "
250                                     "GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target.");
251 
252     /* Set up a valid immutable 2D array multisample texture object using gltexStorage3DMultisample() call. */
253     gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA8, 4, 4, max_array_texture_layers,
254                                GL_TRUE);
255 
256     /* Make sure no error was generated. */
257     error_code = gl.getError();
258 
259     GLU_EXPECT_NO_ERROR(error_code, "gltexStorage3DMultisample() reported unexpected error code.");
260 
261     /* Bind texture object to_id_2d_array_3 to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
262     gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, to_id_2d_array_3);
263 
264     /* Make sure no error was generated. */
265     error_code = gl.getError();
266 
267     GLU_EXPECT_NO_ERROR(error_code, "Unexpected error was generated when binding texture object to "
268                                     "GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target.");
269 
270     /* Call gltexStorage3DMultisample() with invalid width argument value
271      * (width value cannot be greater than GL_MAX_3D_TEXTURE_SIZE). */
272     gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA8,
273                                max_texture_size + 1, /* Invalid width argument value. */
274                                max_texture_size, 2, GL_TRUE);
275 
276     /* Expect GL_INVALID_VALUE error code. */
277     error_code = gl.getError();
278 
279     TCU_CHECK_MSG(error_code == GL_INVALID_VALUE,
280                   "gltexStorage3DMultisample() did not generate GL_INVALID_VALUE error.");
281 
282     /* Call gltexStorage3DMultisample() with invalid height argument value
283      * (height value cannot be greater than GL_MAX_3D_TEXTURE_SIZE). */
284     gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 2, GL_RGBA8, max_texture_size,
285                                max_texture_size + 1, /* Invalid height argument value. */
286                                2, GL_TRUE);
287 
288     /* Expect GL_INVALID_VALUE error code. */
289     error_code = gl.getError();
290 
291     TCU_CHECK_MSG(error_code == GL_INVALID_VALUE,
292                   "gltexStorage3DMultisample() did not generate GL_INVALID_VALUE error.");
293 
294     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
295 
296     return STOP;
297 }
298 
299 /** Constructor.
300  *
301  *  @param context Rendering context handle.
302  **/
MultisampleTextureTexStorage3DZeroSampleTest(Context & context)303 MultisampleTextureTexStorage3DZeroSampleTest::MultisampleTextureTexStorage3DZeroSampleTest(Context &context)
304     : TestCase(context, "multisample_texture_tex_storage_3d_zero_sample",
305                "Verifies TexStorage3DMultisample() rejects zero sample requests "
306                "by generating a GL_INVALID_VALUE error.")
307     , gl_oes_texture_multisample_2d_array_supported(GL_FALSE)
308     , to_id(0)
309 {
310     /* Left blank on purpose */
311 }
312 
313 /** Deinitializes ES objects created during test execution */
deinit()314 void MultisampleTextureTexStorage3DZeroSampleTest::deinit()
315 {
316     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
317 
318     /* Unbind texture object bound to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES */
319     if (gl_oes_texture_multisample_2d_array_supported)
320     {
321         gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, to_id);
322     }
323 
324     GLU_EXPECT_NO_ERROR(gl.getError(),
325                         "Failed to unbind a texture object from GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target");
326 
327     /* Delete texture object */
328     gl.deleteTextures(1, &to_id);
329 
330     GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to delete texture object");
331 
332     to_id = 0;
333 
334     /* Call base class deinitialization routine */
335     glcts::TestCase::deinit();
336 }
337 
338 /** Initializes ES objects required for test execution */
initInternals()339 void MultisampleTextureTexStorage3DZeroSampleTest::initInternals()
340 {
341     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
342 
343     /* Generate texture object id */
344     gl.genTextures(1, &to_id);
345 
346     GLU_EXPECT_NO_ERROR(gl.getError(), "glGenTextures() failed to generate texture");
347 
348     /* Verify texture object has been generated properly */
349     if (to_id == 0)
350     {
351         TCU_FAIL("Texture object has not been generated properly");
352     }
353 
354     /* Bind texture to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES */
355     gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, to_id);
356 
357     GLU_EXPECT_NO_ERROR(gl.getError(), "glBindTexture() reported an error");
358 }
359 
360 /** Executes test iteration.
361  *
362  *  @return Always STOP.
363  */
iterate()364 tcu::TestNode::IterateResult MultisampleTextureTexStorage3DZeroSampleTest::iterate()
365 {
366     gl_oes_texture_multisample_2d_array_supported =
367         m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array");
368 
369     if (!gl_oes_texture_multisample_2d_array_supported)
370     {
371         m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "OES_texture_storage_multisample_2d_array");
372 
373         return STOP;
374     }
375 
376     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
377 
378     initInternals();
379 
380     /* Issue call function for target GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES_, but provide zero for samples argument */
381     gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0, GL_RGBA8, 1, 1, 1, true);
382 
383     /* Check if the expected error code was reported */
384     glw::GLenum error_code = gl.getError();
385 
386     if (error_code != GL_INVALID_VALUE)
387     {
388         TCU_FAIL("Invalid error code reported");
389     }
390 
391     /* Test case passed */
392     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
393 
394     return STOP;
395 }
396 
397 /** Constructor.
398  *
399  *  @param context CTS context handle.
400  **/
401 NonColorDepthStencilRenderableInternalformatsAreRejectedTest::
NonColorDepthStencilRenderableInternalformatsAreRejectedTest(Context & context)402     NonColorDepthStencilRenderableInternalformatsAreRejectedTest(Context &context)
403     : TestCase(context, "non_color_depth_stencil_renderable_internalformats_are_rejected_test",
404                "Verifies gltexStorage3DMultisample() rejects internalformats which are not"
405                " color-, depth-, nor stencil- renderable by generating GL_INVALID_ENUM error.")
406     , gl_oes_texture_multisample_2d_array_supported(GL_FALSE)
407     , to_id(0)
408 {
409     /* Left blank on purpose */
410 }
411 
412 /** Deinitializes ES objects created during test execution */
deinit()413 void NonColorDepthStencilRenderableInternalformatsAreRejectedTest::deinit()
414 {
415     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
416 
417     if (gl_oes_texture_multisample_2d_array_supported)
418     {
419         /* Bind default texture object to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
420         gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0);
421     }
422     /* Delete texture object. */
423     gl.deleteTextures(1, &to_id);
424 
425     to_id = 0;
426 
427     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture object deletion failed.");
428 
429     /* Call base class' deinit() */
430     TestCase::deinit();
431 }
432 
433 /** Initializes ES objects created during test execution */
initInternals()434 void NonColorDepthStencilRenderableInternalformatsAreRejectedTest::initInternals()
435 {
436     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
437 
438     /* Generate texture object id. */
439     gl.genTextures(1, &to_id);
440 
441     /* Bind generated texture object ID to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
442     gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, to_id);
443 
444     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture object initialization failed.");
445 }
446 
447 /** Executes test iteration.
448  *
449  *  @return Returns STOP when test has finished executing.
450  */
iterate()451 tcu::TestNode::IterateResult NonColorDepthStencilRenderableInternalformatsAreRejectedTest::iterate()
452 {
453     gl_oes_texture_multisample_2d_array_supported =
454         m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array");
455 
456     if (!gl_oes_texture_multisample_2d_array_supported)
457     {
458         m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "OES_texture_storage_multisample_2d_array");
459 
460         return STOP;
461     }
462 
463     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
464 
465     initInternals();
466 
467     /* Check if texture object was generated properly. */
468     TCU_CHECK_MSG(to_id != 0, "Texture object has not been generated.");
469 
470     const int number_of_internalformats_to_check =
471         sizeof(unsupported_internalformats) / sizeof(unsupported_internalformats[0]);
472 
473     /* Go through all requested internalformats. */
474     for (int internalformat_index = 0; internalformat_index < number_of_internalformats_to_check;
475          internalformat_index++)
476     {
477         gl.texStorage3DMultisample(
478             GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 1,
479             unsupported_internalformats[internalformat_index], /* One of unsupported internalformats. */
480             1, 1, 1, true);
481 
482         /* Expect GL_INVALID_ENUM error code. */
483         TCU_CHECK_MSG(gl.getError() == GL_INVALID_ENUM,
484                       "gltexStorage3DMultisample() did not generate GL_INVALID_ENUM error.");
485     } /* for each unsupported internalformat */
486 
487     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
488 
489     return STOP;
490 }
491 
492 /** Constructor.
493  *
494  *  @param context CTS context handle.
495  **/
496 RequestsToSetUpMultisampleColorTexturesWithUnsupportedNumberOfSamplesAreRejectedTest::
RequestsToSetUpMultisampleColorTexturesWithUnsupportedNumberOfSamplesAreRejectedTest(Context & context)497     RequestsToSetUpMultisampleColorTexturesWithUnsupportedNumberOfSamplesAreRejectedTest(Context &context)
498     : TestCase(context,
499                "requests_to_set_up_multisample_color_textures_with_unsupported_number_of_samples_are_rejected_test",
500                "Verifies gltexStorage3DMultisample() rejects unsupported samples value by generating "
501                "GL_INVALID_VALUE or GL_INVALID_OPEARATION error.")
502     , gl_oes_texture_multisample_2d_array_supported(GL_FALSE)
503     , to_id(0)
504 {
505     /* Left blank on purpose */
506 }
507 
508 /** Deinitializes ES objects created during test execution */
deinit()509 void RequestsToSetUpMultisampleColorTexturesWithUnsupportedNumberOfSamplesAreRejectedTest::deinit()
510 {
511     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
512 
513     if (gl_oes_texture_multisample_2d_array_supported)
514     {
515         /* Bind default texture object to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
516         gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0);
517     }
518 
519     /* Delete texture object. */
520     gl.deleteTextures(1, &to_id);
521 
522     to_id = 0;
523 
524     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture object deletion failed.");
525 
526     /* Call base class' deinit() */
527     TestCase::deinit();
528 }
529 
530 /** Initializes ES objects created during test execution */
initInternals()531 void RequestsToSetUpMultisampleColorTexturesWithUnsupportedNumberOfSamplesAreRejectedTest::initInternals()
532 {
533     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
534 
535     /* Generate texture object id. */
536     gl.genTextures(1, &to_id);
537 
538     /* Bind generated texture object ID to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
539     gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, to_id);
540 
541     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture object initialization failed.");
542 }
543 
544 /** Executes test iteration.
545  *
546  *  @return Returns STOP when test has finished executing.
547  */
548 tcu::TestNode::IterateResult RequestsToSetUpMultisampleColorTexturesWithUnsupportedNumberOfSamplesAreRejectedTest::
iterate()549     iterate()
550 {
551     gl_oes_texture_multisample_2d_array_supported =
552         m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array");
553 
554     if (!gl_oes_texture_multisample_2d_array_supported)
555     {
556         m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "OES_texture_storage_multisample_2d_array");
557 
558         return STOP;
559     }
560 
561     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
562 
563     initInternals();
564 
565     /* Check if texture object was generated properly. */
566     TCU_CHECK_MSG(to_id != 0, "Texture object has not been generated.");
567 
568     glw::GLint internalformat_specific_max_samples = 0;
569     glw::GLint max_color_texture_samples           = 0;
570     glw::GLint max_samples                         = 0;
571     int number_of_color_renderable_internalformats_to_check =
572         sizeof(color_renderable_internalformats) / sizeof(color_renderable_internalformats[0]);
573     int number_of_fixed_sample_locations_values_to_check =
574         sizeof(fixed_sample_locations_values) / sizeof(fixed_sample_locations_values[0]);
575 
576     /* Retrieve maximum color texture samples value. */
577     gl.getIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &max_color_texture_samples);
578 
579     /* Expect no error was generated. */
580     GLU_EXPECT_NO_ERROR(gl.getError(), "Querying GL_MAX_COLOR_TEXTURE_SAMPLES value failed.");
581 
582     /* Retrieve maximum samples value for an implementation. */
583     gl.getIntegerv(GL_MAX_SAMPLES, &max_samples);
584 
585     /* Expect no error was generated. */
586     GLU_EXPECT_NO_ERROR(gl.getError(), "Querying GL_MAX_SAMPLES value failed.");
587 
588     /* Go through all supported color renderable internal formats. */
589     for (int color_renderable_internalformat_index = 0;
590          color_renderable_internalformat_index < number_of_color_renderable_internalformats_to_check;
591          color_renderable_internalformat_index++)
592     {
593         /* Retrieve maximum amount of samples available for the combination of texture target and internalformat considered */
594         gl.getInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES,
595                                color_renderable_internalformats[color_renderable_internalformat_index], GL_SAMPLES, 1,
596                                &internalformat_specific_max_samples);
597 
598         /* Expect no error was generated. */
599         GLU_EXPECT_NO_ERROR(gl.getError(), "Querying texture target-spcecific maximum sample value failed.");
600 
601         /* Go through all possible sample locations values. */
602         for (int fixed_sample_locations_values_index = 0;
603              fixed_sample_locations_values_index < number_of_fixed_sample_locations_values_to_check;
604              fixed_sample_locations_values_index++)
605         {
606             glw::GLsizei samples = de::max(internalformat_specific_max_samples, max_color_texture_samples) + 1;
607 
608             gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samples,
609                                        color_renderable_internalformats[color_renderable_internalformat_index], 1, 1, 1,
610                                        fixed_sample_locations_values[fixed_sample_locations_values_index]);
611 
612             /* Expect GL_INVALID_OPERATION to be returned. */
613             TCU_CHECK_MSG(gl.getError() == GL_INVALID_OPERATION,
614                           "gltexStorage3DMultisample() did not generate GL_INVALID_OPERATION error.");
615 
616             samples = internalformat_specific_max_samples + 1;
617             gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, internalformat_specific_max_samples + 1,
618                                        color_renderable_internalformats[color_renderable_internalformat_index], 1, 1, 1,
619                                        fixed_sample_locations_values[fixed_sample_locations_values_index]);
620 
621             /* Expect GL_INVALID_OPERATION to be returned. */
622             TCU_CHECK_MSG(gl.getError() == GL_INVALID_OPERATION,
623                           "gltexStorage3DMultisample() did not generate GL_INVALID_OPERATION error.");
624 
625         } /* for each fixed sample locations value */
626     }     /* for each color renderable internalformat */
627 
628     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
629 
630     return STOP;
631 }
632 
633 /** Constructor.
634  *
635  *  @param context CTS context handle.
636  **/
637 RequestsToSetUpMultisampleDepthTexturesWithUnsupportedNumberOfSamplesAreRejectedTest::
RequestsToSetUpMultisampleDepthTexturesWithUnsupportedNumberOfSamplesAreRejectedTest(Context & context)638     RequestsToSetUpMultisampleDepthTexturesWithUnsupportedNumberOfSamplesAreRejectedTest(Context &context)
639     : TestCase(context,
640                "requests_to_set_up_multisample_depth_textures_with_unsupported_number_of_samples_are_rejected_test",
641                "Verifies gltexStorage3DMultisample() rejects unsupported samples "
642                "value by generating GL_INVALID_VALUE or GL_INVALID_OPEARATION error.")
643     , gl_oes_texture_multisample_2d_array_supported(GL_FALSE)
644     , to_id(0)
645 {
646     /* Left blank on purpose */
647 }
648 
649 /** Deinitializes ES objects created during test execution */
deinit()650 void RequestsToSetUpMultisampleDepthTexturesWithUnsupportedNumberOfSamplesAreRejectedTest::deinit()
651 {
652     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
653 
654     if (gl_oes_texture_multisample_2d_array_supported)
655     {
656         /* Bind default texture object to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
657         gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0);
658     }
659 
660     /* Delete texture object. */
661     gl.deleteTextures(1, &to_id);
662 
663     to_id = 0;
664 
665     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture object deletion failed.");
666 
667     /* Call base class' deinit() */
668     TestCase::deinit();
669 }
670 
671 /** Initializes ES objects created during test execution */
initInternals()672 void RequestsToSetUpMultisampleDepthTexturesWithUnsupportedNumberOfSamplesAreRejectedTest::initInternals()
673 {
674     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
675 
676     /* Generate texture object id. */
677     gl.genTextures(1, &to_id);
678 
679     /* Bind generated texture object ID to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
680     gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, to_id);
681 
682     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture object initialization failed.");
683 }
684 
685 /** Executes test iteration.
686  *
687  *  @return Returns STOP when test has finished executing.
688  */
689 tcu::TestNode::IterateResult RequestsToSetUpMultisampleDepthTexturesWithUnsupportedNumberOfSamplesAreRejectedTest::
iterate()690     iterate()
691 {
692     gl_oes_texture_multisample_2d_array_supported =
693         m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array");
694 
695     if (!gl_oes_texture_multisample_2d_array_supported)
696     {
697         m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "OES_texture_storage_multisample_2d_array");
698 
699         return STOP;
700     }
701 
702     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
703 
704     initInternals();
705 
706     /* Check if texture object was generated properly. */
707     TCU_CHECK_MSG(to_id != 0, "Texture object has not been generated.");
708 
709     glw::GLint internalformat_specific_max_samples = 0;
710     glw::GLint max_depth_texture_samples           = 0;
711     int number_of_depth_renderable_internalformats_to_check =
712         sizeof(depth_renderable_internalformats) / sizeof(depth_renderable_internalformats[0]);
713     int number_of_fixed_sample_locations_values_to_check =
714         sizeof(fixed_sample_locations_values) / sizeof(fixed_sample_locations_values[0]);
715 
716     /* Retrieve maximum depth texture samples value. */
717     gl.getIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &max_depth_texture_samples);
718 
719     /* Expect no error was generated. */
720     GLU_EXPECT_NO_ERROR(gl.getError(), "Querying maximum sample value failed.");
721 
722     /* Go through all supported depth renderable internal formats. */
723     for (int depth_renderable_internalformat_index = 0;
724          depth_renderable_internalformat_index < number_of_depth_renderable_internalformats_to_check;
725          depth_renderable_internalformat_index++)
726     {
727         /* Retrieve maximum amount of samples available for the texture target considered */
728         gl.getInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES,
729                                depth_renderable_internalformats[depth_renderable_internalformat_index], GL_SAMPLES, 1,
730                                &internalformat_specific_max_samples);
731 
732         /* Expect no error was generated. */
733         GLU_EXPECT_NO_ERROR(gl.getError(), "Querying texture target-spcecific maximum sample value failed.");
734 
735         /* Go through all possible sample locations values. */
736         for (int fixed_sample_locations_values_index = 0;
737              fixed_sample_locations_values_index < number_of_fixed_sample_locations_values_to_check;
738              fixed_sample_locations_values_index++)
739         {
740             glw::GLsizei samples = de::max(internalformat_specific_max_samples, max_depth_texture_samples) + 1;
741 
742             gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samples,
743                                        depth_renderable_internalformats[depth_renderable_internalformat_index], 1, 1, 1,
744                                        fixed_sample_locations_values[fixed_sample_locations_values_index]);
745 
746             /* Expect GL_INVALID_OPERATION error code. */
747             TCU_CHECK_MSG(gl.getError() == GL_INVALID_OPERATION,
748                           "gltexStorage3DMultisample() did not generate GL_INVALID_OPERATION error.");
749 
750         } /* for each fixed sample locations value */
751     }     /* for each depth renderable internalformat */
752 
753     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
754 
755     return STOP;
756 }
757 
758 /** Constructor.
759  *
760  *  @param context CTS context handle.
761  **/
762 RequestsToSetUpMultisampleStencilTexturesWithUnsupportedNumberOfSamplesAreRejectedTest::
RequestsToSetUpMultisampleStencilTexturesWithUnsupportedNumberOfSamplesAreRejectedTest(Context & context)763     RequestsToSetUpMultisampleStencilTexturesWithUnsupportedNumberOfSamplesAreRejectedTest(Context &context)
764     : TestCase(context,
765                "requests_to_set_up_multisample_stencil_textures_with_unsupported_number_of_samples_are_rejected_test",
766                "Verifies gltexStorage3DMultisample() rejects unsupported samples value"
767                " by generating GL_INVALID_VALUE or GL_INVALID_OPERATION error.")
768     , gl_oes_texture_multisample_2d_array_supported(GL_FALSE)
769     , to_id(0)
770 {
771     /* Left blank on purpose */
772 }
773 
774 /** Deinitializes ES objects created during test execution */
deinit()775 void RequestsToSetUpMultisampleStencilTexturesWithUnsupportedNumberOfSamplesAreRejectedTest::deinit()
776 {
777     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
778 
779     if (gl_oes_texture_multisample_2d_array_supported)
780     {
781         /* Bind default texture object to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
782         gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0);
783     }
784 
785     /* Delete texture object. */
786     gl.deleteTextures(1, &to_id);
787 
788     to_id = 0;
789 
790     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture object deletion failed.");
791 
792     /* Call base class' deinit() */
793     TestCase::deinit();
794 }
795 
796 /** Initializes ES objects created during test execution */
initInternals()797 void RequestsToSetUpMultisampleStencilTexturesWithUnsupportedNumberOfSamplesAreRejectedTest::initInternals()
798 {
799     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
800 
801     /* Generate texture object id. */
802     gl.genTextures(1, &to_id);
803 
804     /* Bind generated texture object ID to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
805     gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, to_id);
806 
807     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture object initialization failed.");
808 }
809 
810 /** Executes test iteration.
811  *
812  * @return Returns STOP when test has finished executing.
813  */
814 tcu::TestNode::IterateResult RequestsToSetUpMultisampleStencilTexturesWithUnsupportedNumberOfSamplesAreRejectedTest::
iterate()815     iterate()
816 {
817     gl_oes_texture_multisample_2d_array_supported =
818         m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array");
819 
820     if (!gl_oes_texture_multisample_2d_array_supported)
821     {
822         m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "OES_texture_storage_multisample_2d_array");
823 
824         return STOP;
825     }
826 
827     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
828 
829     initInternals();
830 
831     /* Check if texture object was generated properly. */
832     TCU_CHECK_MSG(to_id != 0, "Texture object has not been generated.");
833 
834     glw::GLint internalformat_specific_max_samples = 0;
835     glw::GLint max_depth_texture_samples           = 0;
836     int number_of_depth_stencil_renderable_internalformats_to_check =
837         sizeof(depth_stencil_renderable_internalformats) / sizeof(depth_stencil_renderable_internalformats[0]);
838     int number_of_fixed_sample_locations_values_to_check =
839         sizeof(fixed_sample_locations_values) / sizeof(fixed_sample_locations_values[0]);
840 
841     /* Retrieve maximum depth texture samples value. */
842     gl.getIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &max_depth_texture_samples);
843 
844     /* Expect no error was generated. */
845     GLU_EXPECT_NO_ERROR(gl.getError(), "Querying maximum sample value failed.");
846 
847     /* Go through all supported depth-stencil renderable internal formats. */
848     for (int depth_stencil_renderable_internalformat_index = 0;
849          depth_stencil_renderable_internalformat_index < number_of_depth_stencil_renderable_internalformats_to_check;
850          depth_stencil_renderable_internalformat_index++)
851     {
852         /* Retrieve maximum amount of samples available for the texture target considered */
853         gl.getInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES,
854                                depth_stencil_renderable_internalformats[depth_stencil_renderable_internalformat_index],
855                                GL_SAMPLES, 1, &internalformat_specific_max_samples);
856 
857         /* Expect no error was generated. */
858         GLU_EXPECT_NO_ERROR(gl.getError(), "Querying texture target-spcecific maximum sample value failed.");
859 
860         /* Go through all possible sample locations values. */
861         for (int fixed_sample_locations_values_index = 0;
862              fixed_sample_locations_values_index < number_of_fixed_sample_locations_values_to_check;
863              fixed_sample_locations_values_index++)
864         {
865             glw::GLsizei samples = de::max(internalformat_specific_max_samples, max_depth_texture_samples) + 1;
866 
867             gl.texStorage3DMultisample(
868                 GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, samples,
869                 depth_stencil_renderable_internalformats[depth_stencil_renderable_internalformat_index], 1, 1, 1,
870                 fixed_sample_locations_values[fixed_sample_locations_values_index]);
871 
872             /* Expect GL_INVALID_OPERATION to be returned. */
873             TCU_CHECK_MSG(gl.getError() == GL_INVALID_OPERATION,
874                           "gltexStorage3DMultisample() did not generate GL_INVALID_OPERATION error.");
875 
876         } /* for each fixed sample locations value */
877     }     /* for each depth-stencil renderable internalformat */
878 
879     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
880 
881     return STOP;
882 }
883 
884 /** Constructor.
885  *
886  *  @param context CTS context handle.
887  **/
888 RequestsToSetUpMultisampleTexturesWithValidAndInvalidNumberOfSamplesTest::
RequestsToSetUpMultisampleTexturesWithValidAndInvalidNumberOfSamplesTest(Context & context)889     RequestsToSetUpMultisampleTexturesWithValidAndInvalidNumberOfSamplesTest(Context &context)
890     : TestCase(context, "requests_to_set_up_multisample_textures_with_valid_and_invalid_number_of_samples_test",
891                "Verifies gltexStorage3DMultisample() rejects invalid samples value "
892                "by generating GL_INVALID_OPEARATION error and works properly when samples value is valid.")
893     , gl_oes_texture_multisample_2d_array_supported(GL_FALSE)
894     , to_id(0)
895 {
896     /* Left blank on purpose */
897 }
898 
899 /* Generates texture object and binds it to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
createAssets()900 void RequestsToSetUpMultisampleTexturesWithValidAndInvalidNumberOfSamplesTest::createAssets()
901 {
902     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
903 
904     /* Generate texture object. */
905     gl.genTextures(1, &to_id);
906 
907     /* Bind texture object to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
908     gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, to_id);
909 
910     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture object initialization failed.");
911 }
912 
913 /** Deinitializes ES objects created during test execution */
deinit()914 void RequestsToSetUpMultisampleTexturesWithValidAndInvalidNumberOfSamplesTest::deinit()
915 {
916     if (to_id != 0)
917     {
918         /* Destroy created assets. */
919         releaseAssets();
920     }
921 
922     /* Call base class' deinit() */
923     TestCase::deinit();
924 }
925 
926 /* Unbinds and deletes texture object. */
releaseAssets()927 void RequestsToSetUpMultisampleTexturesWithValidAndInvalidNumberOfSamplesTest::releaseAssets()
928 {
929     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
930 
931     if (gl_oes_texture_multisample_2d_array_supported)
932     {
933         /* Bind default texture object to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
934         gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0);
935     }
936 
937     /* Delete texture object. */
938     gl.deleteTextures(1, &to_id);
939 
940     to_id = 0;
941 
942     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture object deletion failed.");
943 }
944 
945 /** Executes test iteration.
946  *
947  *  @return Returns STOP when test has finished executing.
948  */
iterate()949 tcu::TestNode::IterateResult RequestsToSetUpMultisampleTexturesWithValidAndInvalidNumberOfSamplesTest::iterate()
950 {
951     gl_oes_texture_multisample_2d_array_supported =
952         m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array");
953 
954     if (!gl_oes_texture_multisample_2d_array_supported)
955     {
956         m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "OES_texture_storage_multisample_2d_array");
957 
958         return STOP;
959     }
960 
961     const glw::Functions &gl                       = m_context.getRenderContext().getFunctions();
962     glw::GLint gl_max_samples_value                = 0;
963     glw::GLint internalformat_specific_max_samples = 0;
964     int number_of_internalformats_to_check = sizeof(supported_internalformats) / sizeof(supported_internalformats[0]);
965 
966     /* Retrieve maximum samples value for an implementation. */
967     gl.getIntegerv(GL_MAX_SAMPLES, &gl_max_samples_value);
968 
969     /* Expect no error was generated. */
970     GLU_EXPECT_NO_ERROR(gl.getError(), "Querying GL_MAX_SAMPLES value failed.");
971 
972     /* Go through all supported internal formats. */
973     for (int internalformat_index = 0; internalformat_index < number_of_internalformats_to_check;
974          internalformat_index++)
975     {
976         /* Generate and bind texture object. */
977         RequestsToSetUpMultisampleTexturesWithValidAndInvalidNumberOfSamplesTest::createAssets();
978 
979         /* Check if texture object was generated properly. */
980         TCU_CHECK_MSG(to_id != 0, "Texture object has not been generated.");
981 
982         /* Retrieve maximum amount of samples available for the texture target considered */
983         gl.getInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, supported_internalformats[internalformat_index],
984                                GL_SAMPLES, 1, &internalformat_specific_max_samples);
985 
986         /* Expect no error was generated. */
987         GLU_EXPECT_NO_ERROR(gl.getError(), "Querying texture target-spcecific maximum sample value failed.");
988 
989         /* Call gltexStorage3DMultisample() with valid samples value. */
990         gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, internalformat_specific_max_samples,
991                                    supported_internalformats[internalformat_index], 1, 1, 1, GL_FALSE);
992 
993         /* Expect no error was generated. */
994         GLU_EXPECT_NO_ERROR(gl.getError(), "gltexStorage3DMultisample() returned unexpected error code.");
995 
996         /* Delete texture object. */
997         RequestsToSetUpMultisampleTexturesWithValidAndInvalidNumberOfSamplesTest::releaseAssets();
998 
999         /* Generate and bind texture object. */
1000         RequestsToSetUpMultisampleTexturesWithValidAndInvalidNumberOfSamplesTest::createAssets();
1001 
1002         /* Check if texture object was generated properly. */
1003         TCU_CHECK_MSG(to_id != 0, "Texture object has not been generated.");
1004 
1005         /* Call gltexStorage3DMultisample() with invalid samples value. */
1006         gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, internalformat_specific_max_samples + 1,
1007                                    supported_internalformats[internalformat_index], 1, 1, 1, GL_FALSE);
1008 
1009         /* Expect GL_INVALID_OPERATION error code. */
1010         TCU_CHECK_MSG(gl.getError() == GL_INVALID_OPERATION,
1011                       "gltexStorage3DMultisample() did not generate GL_INVALID_OPERATION error.");
1012 
1013         /* Delete texture object. */
1014         RequestsToSetUpMultisampleTexturesWithValidAndInvalidNumberOfSamplesTest::releaseAssets();
1015     } /* for each supported internalformat */
1016 
1017     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1018 
1019     return STOP;
1020 }
1021 
1022 /** Constructor.
1023  *
1024  *  @param context CTS context handle.
1025  **/
Texture2DMultisampleTargetIsRejectedTest(Context & context)1026 Texture2DMultisampleTargetIsRejectedTest::Texture2DMultisampleTargetIsRejectedTest(Context &context)
1027     : TestCase(context, "texture_2D_multisample_target_is_rejected_test",
1028                "Verifies gltexStorage3DMultisample() rejects GL_TEXTURE_2D_MULTISAMPLE "
1029                "texture target by generating GL_INVALID_ENUM error.")
1030     , gl_oes_texture_multisample_2d_array_supported(GL_FALSE)
1031     , to_id(0)
1032 {
1033     /* Left blank on purpose */
1034 }
1035 
1036 /** Deinitializes ES objects created during test execution */
deinit()1037 void Texture2DMultisampleTargetIsRejectedTest::deinit()
1038 {
1039     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
1040 
1041     /* Bind default texture object to GL_TEXTURE_2D_MULTISAMPLE texture target. */
1042     gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
1043 
1044     /* Delete texture object. */
1045     gl.deleteTextures(1, &to_id);
1046 
1047     to_id = 0;
1048 
1049     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture object deletion failed.");
1050 
1051     /* Call base class' deinit() */
1052     TestCase::deinit();
1053 }
1054 
1055 /** Initializes ES objects created during test execution */
initInternals()1056 void Texture2DMultisampleTargetIsRejectedTest::initInternals()
1057 {
1058     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
1059 
1060     /* Generate texture object id. */
1061     gl.genTextures(1, &to_id);
1062 
1063     /* Bind generated texture object ID to GL_TEXTURE_2D_MULTISAMPLE texture target. */
1064     gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, to_id);
1065 
1066     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture object initialization failed.");
1067 }
1068 
1069 /** Executes test iteration.
1070  *
1071  *  @return Returns STOP when test has finished executing.
1072  */
iterate()1073 tcu::TestNode::IterateResult Texture2DMultisampleTargetIsRejectedTest::iterate()
1074 {
1075     gl_oes_texture_multisample_2d_array_supported =
1076         m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array");
1077 
1078     if (!gl_oes_texture_multisample_2d_array_supported)
1079     {
1080         m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "OES_texture_storage_multisample_2d_array");
1081 
1082         return STOP;
1083     }
1084 
1085     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
1086 
1087     initInternals();
1088 
1089     /* Check if texture object was generated properly. */
1090     TCU_CHECK_MSG(to_id != 0, "Texture object has not been generated.");
1091 
1092     /* Call gltexStorage3DMultisample() with invalid GL_TEXTURE_2D_MULTISAMPLE texture target argument. */
1093     gl.texStorage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE, /* invalid texture target */ 1, GL_RGBA8, 1, 1, 1, GL_FALSE);
1094 
1095     /* Expect GL_INVALID_ENUM error code. */
1096     TCU_CHECK_MSG(gl.getError() == GL_INVALID_ENUM,
1097                   "gltexStorage3DMultisample() did not generate GL_INVALID_ENUM error.");
1098 
1099     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1100 
1101     return STOP;
1102 }
1103 
1104 /** Constructor.
1105  *
1106  *  @param context CTS context handle.
1107  **/
ValidInternalformatAndSamplesValuesAreAcceptedTest(Context & context)1108 ValidInternalformatAndSamplesValuesAreAcceptedTest::ValidInternalformatAndSamplesValuesAreAcceptedTest(Context &context)
1109     : TestCase(context, "valid_internalformats_are_accepted_test",
1110                "Verifies gltexStorage3DMultisample() accepts multisample color/depth/stencil "
1111                "textures with disabled/enabled fixed sample locations and valid internalformats.")
1112     , gl_oes_texture_multisample_2d_array_supported(GL_FALSE)
1113     , to_id(0)
1114 {
1115     /* Left blank on purpose */
1116 }
1117 
1118 /** Deinitializes ES objects created during test execution */
deinit()1119 void ValidInternalformatAndSamplesValuesAreAcceptedTest::deinit()
1120 {
1121     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
1122 
1123     if (gl_oes_texture_multisample_2d_array_supported)
1124     {
1125         /* Bind default texture object to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
1126         gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, 0);
1127     }
1128 
1129     /* Delete texture object. */
1130     gl.deleteTextures(1, &to_id);
1131 
1132     to_id = 0;
1133 
1134     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture object deletion failed.");
1135 
1136     /* Call base class' deinit() */
1137     TestCase::deinit();
1138 }
1139 
1140 /** Initializes ES objects created during test execution */
initInternals()1141 void ValidInternalformatAndSamplesValuesAreAcceptedTest::initInternals()
1142 {
1143     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
1144 
1145     /* Generate texture object id. */
1146     gl.genTextures(1, &to_id);
1147 
1148     /* Bind generated texture object ID to GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES texture target. */
1149     gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, to_id);
1150 
1151     GLU_EXPECT_NO_ERROR(gl.getError(), "Texture object initialization failed.");
1152 }
1153 
1154 /** Executes test iteration.
1155  *
1156  *  @return Returns STOP when test has finished executing.
1157  */
iterate()1158 tcu::TestNode::IterateResult ValidInternalformatAndSamplesValuesAreAcceptedTest::iterate()
1159 {
1160     gl_oes_texture_multisample_2d_array_supported =
1161         m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array");
1162 
1163     if (!gl_oes_texture_multisample_2d_array_supported)
1164     {
1165         m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "OES_texture_storage_multisample_2d_array");
1166 
1167         return STOP;
1168     }
1169 
1170     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
1171 
1172     initInternals();
1173 
1174     /* Check if texture object was generated properly. */
1175     TCU_CHECK_MSG(to_id != 0, "Texture object has not been generated.");
1176 
1177     glw::GLint max_color_texture_samples = 0;
1178     glw::GLint max_depth_texture_samples = 0;
1179     const int n_color_internalformats =
1180         sizeof(color_renderable_internalformats) / sizeof(color_renderable_internalformats[0]);
1181     const int n_depth_internalformats =
1182         sizeof(depth_renderable_internalformats) / sizeof(depth_renderable_internalformats[0]);
1183     const int n_fixed_sample_locations =
1184         sizeof(fixed_sample_locations_values) / sizeof(fixed_sample_locations_values[0]);
1185     const int n_stencil_internalformats =
1186         sizeof(depth_stencil_renderable_internalformats) / sizeof(depth_stencil_renderable_internalformats[0]);
1187 
1188     /* Retrieve maximum color texture samples value. */
1189     gl.getIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &max_color_texture_samples);
1190     /* Retrieve maximum depth texture samples value. */
1191     gl.getIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &max_depth_texture_samples);
1192 
1193     /* Expect no error was generated. */
1194     GLU_EXPECT_NO_ERROR(
1195         gl.getError(),
1196         "Querying maximum GL_MAX_COLOR_TEXTURE_SAMPLES and GL_MAX_DEPTH_TEXTURE_SAMPLES property values failed.");
1197 
1198     for (unsigned int n_iteration = 0; n_iteration < 3 /* color/depth/stencil */; ++n_iteration)
1199     {
1200         const glw::GLint *internalformats                  = NULL;
1201         glw::GLint internalformat_specific_max_samples     = 0;
1202         glw::GLint max_iteration_specific_gl_samples_value = 0;
1203         glw::GLint max_supported_samples_value             = 0;
1204         int n_internalformats                              = 0;
1205 
1206         switch (n_iteration)
1207         {
1208         case 0:
1209         {
1210             internalformats                         = color_renderable_internalformats;
1211             max_iteration_specific_gl_samples_value = max_color_texture_samples;
1212             n_internalformats                       = n_color_internalformats;
1213 
1214             break;
1215         }
1216 
1217         case 1:
1218         {
1219             internalformats                         = depth_renderable_internalformats;
1220             max_iteration_specific_gl_samples_value = max_depth_texture_samples;
1221             n_internalformats                       = n_depth_internalformats;
1222 
1223             break;
1224         }
1225 
1226         case 2:
1227         {
1228             internalformats                         = depth_stencil_renderable_internalformats;
1229             max_iteration_specific_gl_samples_value = max_depth_texture_samples;
1230             n_internalformats                       = n_stencil_internalformats;
1231 
1232             break;
1233         }
1234 
1235         default:
1236         {
1237             TCU_FAIL("Unrecognized iteration index");
1238         }
1239         } /* switch (n_iteration) */
1240 
1241         /* Go through all requested internalformats. */
1242         for (int internalformat_index = 0; internalformat_index < n_internalformats; internalformat_index++)
1243         {
1244             /* Retrieve maximum amount of samples available for the combination of
1245              * texture target and internalformat considered. */
1246             gl.getInternalformativ(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, internalformats[internalformat_index],
1247                                    GL_SAMPLES, 1, &internalformat_specific_max_samples);
1248 
1249             /* Expect no error was generated. */
1250             GLU_EXPECT_NO_ERROR(gl.getError(), "Querying texture target-spcecific maximum samples value failed.");
1251 
1252             /* Choose maximum supported samples value. */
1253             max_supported_samples_value =
1254                 de::min(internalformat_specific_max_samples, max_iteration_specific_gl_samples_value);
1255 
1256             /* Go through all supported samples values. */
1257             for (glw::GLint n_samples = 1; n_samples <= max_supported_samples_value; n_samples++)
1258             {
1259                 /* Go through all supported 'fixed_sample_locations' argument values. */
1260                 for (int fixed_sample_location_value_index = 0;
1261                      fixed_sample_location_value_index < n_fixed_sample_locations; fixed_sample_location_value_index++)
1262                 {
1263                     /* Call gltexStorage3DMultisample() with valid arguments. */
1264                     gl.texStorage3DMultisample(
1265                         GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, n_samples, /* Iteration-specific sample value. */
1266                         internalformats
1267                             [internalformat_index], /* One of color/depth/stencil-renderable internalformats. */
1268                         1,                          /* width */
1269                         1,                          /* height */
1270                         1,                          /* depth */
1271                         fixed_sample_locations_values[fixed_sample_location_value_index]);
1272 
1273                     /* Expect no error was generated. */
1274                     GLU_EXPECT_NO_ERROR(gl.getError(), "gltexStorage3DMultisample() generated unexpected error.");
1275 
1276                     /* Delete texture object. */
1277                     gl.deleteTextures(1, &to_id);
1278 
1279                     /* Generate texture object. */
1280                     gl.genTextures(1, &to_id);
1281 
1282                     /* Check if texture object was generated properly. */
1283                     TCU_CHECK_MSG(to_id != 0, "Texture object has not been generated.");
1284 
1285                     /* Re-bind texture object. */
1286                     gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES, to_id);
1287 
1288                     /* Expect no error was generated. */
1289                     GLU_EXPECT_NO_ERROR(gl.getError(), "Rebinding texture object generated unexpected error.");
1290                 } /* for each fixed sample locations value (enabled/disabled). */
1291             }     /* for each supported sample value. */
1292         }         /* for each color/depth/stencil-renderable internalformat */
1293     }             /* for color/depth/stencil interation */
1294 
1295     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1296 
1297     return STOP;
1298 }
1299 } // namespace glcts
1300