• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 } /* glcts namespace */
1300