• 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  es31cTextureStorageMultisampleGetActiveUniformTests.cpp
27  * \brief Implements conformance tests that check whether glGetActiveUniform()
28  *        works correctly with multisample texture samplers. (ES3.1 only)
29  */ /*-------------------------------------------------------------------*/
30 
31 #include "es31cTextureStorageMultisampleGetActiveUniformTests.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.h>
40 #include <string>
41 #include <vector>
42 
43 namespace glcts
44 {
45 
46 /* Constants */
47 const char* MultisampleTextureGetActiveUniformSamplersTest::fs_body =
48 	"#version 310 es\n"
49 	"\n"
50 	"precision highp float;\n"
51 	"\n"
52 	"uniform highp sampler2DMS  fs_sampler_2d_multisample;\n"
53 	"uniform highp usampler2DMS fs_sampler_2d_multisample_uint;\n"
54 	"uniform highp isampler2DMS fs_sampler_2d_multisample_int;\n"
55 	"\n"
56 	"out vec4 result;\n"
57 	"\n"
58 	"void main()\n"
59 	"{\n"
60 	"    vec4  sampler2DMS_value  = texelFetch(fs_sampler_2d_multisample,      ivec2(0), 0);\n"
61 	"    uvec4 usampler2DMS_value = texelFetch(fs_sampler_2d_multisample_uint, ivec2(0), 0);\n"
62 	"    ivec4 isampler2DMS_value = texelFetch(fs_sampler_2d_multisample_int,  ivec2(0), 0);\n"
63 	"\n"
64 	"    result  =       sampler2DMS_value  +\n"
65 	"              vec4(usampler2DMS_value) +\n"
66 	"              vec4(isampler2DMS_value);\n"
67 	"}\n";
68 
69 const char* MultisampleTextureGetActiveUniformSamplersTest::fs_body_oes =
70 	"#version 310 es\n"
71 	"\n"
72 	"#extension GL_OES_texture_storage_multisample_2d_array : enable\n"
73 	"precision highp float;\n"
74 	"\n"
75 	"uniform highp sampler2DMS       fs_sampler_2d_multisample;\n"
76 	"uniform highp sampler2DMSArray  fs_sampler_2d_multisample_array;\n"
77 	"uniform highp usampler2DMS      fs_sampler_2d_multisample_uint;\n"
78 	"uniform highp usampler2DMSArray fs_sampler_2d_multisample_array_uint;\n"
79 	"uniform highp isampler2DMS      fs_sampler_2d_multisample_int;\n"
80 	"uniform highp isampler2DMSArray fs_sampler_2d_multisample_array_int;\n"
81 	"\n"
82 	"out vec4 result;\n"
83 	"\n"
84 	"void main()\n"
85 	"{\n"
86 	"    vec4  sampler2DMS_value       = texelFetch(fs_sampler_2d_multisample,            ivec2(0), 0);\n"
87 	"    vec4  sampler2DMSArray_value  = texelFetch(fs_sampler_2d_multisample_array,      ivec3(0), 0);\n"
88 	"    uvec4 usampler2DMS_value      = texelFetch(fs_sampler_2d_multisample_uint,       ivec2(0), 0);\n"
89 	"    uvec4 usampler2DMSArray_value = texelFetch(fs_sampler_2d_multisample_array_uint, ivec3(0), 0);\n"
90 	"    ivec4 isampler2DMS_value      = texelFetch(fs_sampler_2d_multisample_int,        ivec2(0), 0);\n"
91 	"    ivec4 isampler2DMSArray_value = texelFetch(fs_sampler_2d_multisample_array_int,  ivec3(0), 0);\n"
92 	"\n"
93 	"    result  =       sampler2DMS_value  +       sampler2DMSArray_value  +\n"
94 	"              vec4(usampler2DMS_value) + vec4(usampler2DMSArray_value) +\n"
95 	"              vec4(isampler2DMS_value) + vec4(isampler2DMSArray_value);\n"
96 	"}\n";
97 
98 const char* MultisampleTextureGetActiveUniformSamplersTest::vs_body =
99 	"#version 310 es\n"
100 	"\n"
101 	"precision highp float;\n"
102 	"\n"
103 	"uniform highp sampler2DMS  vs_sampler_2d_multisample;\n"
104 	"uniform highp usampler2DMS vs_sampler_2d_multisample_uint;\n"
105 	"uniform highp isampler2DMS vs_sampler_2d_multisample_int;\n"
106 	"\n"
107 	"out vec4 result;\n"
108 	"\n"
109 	"void main()\n"
110 	"{\n"
111 	"    vec4  sampler2DMS_value  = texelFetch(vs_sampler_2d_multisample,      ivec2(0), 0);\n"
112 	"    uvec4 usampler2DMS_value = texelFetch(vs_sampler_2d_multisample_uint, ivec2(0), 0);\n"
113 	"    ivec4 isampler2DMS_value = texelFetch(vs_sampler_2d_multisample_int,  ivec2(0), 0);\n"
114 	"\n"
115 	"    gl_Position =       sampler2DMS_value  +\n"
116 	"                  vec4(usampler2DMS_value) +\n"
117 	"                  vec4(isampler2DMS_value);\n"
118 	"}\n";
119 
120 const char* MultisampleTextureGetActiveUniformSamplersTest::vs_body_oes =
121 	"#version 310 es\n"
122 	"\n"
123 	"#extension GL_OES_texture_storage_multisample_2d_array : enable\n"
124 	"precision highp float;\n"
125 	"\n"
126 	"uniform highp sampler2DMS       vs_sampler_2d_multisample;\n"
127 	"uniform highp sampler2DMSArray  vs_sampler_2d_multisample_array;\n"
128 	"uniform highp usampler2DMS      vs_sampler_2d_multisample_uint;\n"
129 	"uniform highp usampler2DMSArray vs_sampler_2d_multisample_array_uint;\n"
130 	"uniform highp isampler2DMS      vs_sampler_2d_multisample_int;\n"
131 	"uniform highp isampler2DMSArray vs_sampler_2d_multisample_array_int;\n"
132 	"\n"
133 	"out vec4 result;\n"
134 	"\n"
135 	"void main()\n"
136 	"{\n"
137 	"    vec4  sampler2DMS_value       = texelFetch(vs_sampler_2d_multisample,            ivec2(0), 0);\n"
138 	"    vec4  sampler2DMSArray_value  = texelFetch(vs_sampler_2d_multisample_array,      ivec3(0), 0);\n"
139 	"    uvec4 usampler2DMS_value      = texelFetch(vs_sampler_2d_multisample_uint,       ivec2(0), 0);\n"
140 	"    uvec4 usampler2DMSArray_value = texelFetch(vs_sampler_2d_multisample_array_uint, ivec3(0), 0);\n"
141 	"    ivec4 isampler2DMS_value      = texelFetch(vs_sampler_2d_multisample_int,        ivec2(0), 0);\n"
142 	"    ivec4 isampler2DMSArray_value = texelFetch(vs_sampler_2d_multisample_array_int,  ivec3(0), 0);\n"
143 	"\n"
144 	"    gl_Position =       sampler2DMS_value  +       sampler2DMSArray_value  +\n"
145 	"                  vec4(usampler2DMS_value) + vec4(usampler2DMSArray_value) +\n"
146 	"                  vec4(isampler2DMS_value) + vec4(isampler2DMSArray_value);\n"
147 	"}\n";
148 
149 /** Constructor.
150  *
151  *  @param context Rendering context handle.
152  **/
MultisampleTextureGetActiveUniformSamplersTest(Context & context)153 MultisampleTextureGetActiveUniformSamplersTest::MultisampleTextureGetActiveUniformSamplersTest(Context& context)
154 	: TestCase(context, "multisample_texture_samplers", "Verifies multisample texture samplers are reported correctly")
155 	, fs_id(0)
156 	, gl_oes_texture_storage_multisample_2d_array_supported(GL_FALSE)
157 	, po_id(0)
158 	, vs_id(0)
159 {
160 	/* Left blank on purpose */
161 }
162 
163 /** Deinitializes ES objects created during test execution */
deinit()164 void MultisampleTextureGetActiveUniformSamplersTest::deinit()
165 {
166 	/* Call base class' deinit() */
167 	TestCase::deinit();
168 }
169 
170 /** Initializes test-specific ES objects */
initInternals()171 void MultisampleTextureGetActiveUniformSamplersTest::initInternals()
172 {
173 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
174 
175 	fs_id = gl.createShader(GL_FRAGMENT_SHADER);
176 	po_id = gl.createProgram();
177 	vs_id = gl.createShader(GL_VERTEX_SHADER);
178 
179 	GLU_EXPECT_NO_ERROR(gl.getError(), "Shader or program creation failed");
180 }
181 
182 /** Removes test-specific ES objects */
deinitInternals()183 void MultisampleTextureGetActiveUniformSamplersTest::deinitInternals()
184 {
185 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
186 
187 	gl.deleteShader(fs_id);
188 	gl.deleteProgram(po_id);
189 	gl.deleteShader(vs_id);
190 
191 	GLU_EXPECT_NO_ERROR(gl.getError(), "Shader or program delete failed");
192 }
193 
194 /** Executes test iteration.
195  *
196  *  @return Returns STOP when test has finished executing, CONTINUE if more iterations are needed.
197  */
iterate()198 tcu::TestNode::IterateResult MultisampleTextureGetActiveUniformSamplersTest::iterate()
199 {
200 	gl_oes_texture_storage_multisample_2d_array_supported =
201 		m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array");
202 
203 	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
204 
205 	initInternals();
206 
207 	/* Configure the test program object */
208 	gl.attachShader(po_id, fs_id);
209 	gl.attachShader(po_id, vs_id);
210 
211 	GLU_EXPECT_NO_ERROR(gl.getError(), "Could not configure the test program object");
212 
213 	/* Compile the fragment shader */
214 	glw::GLint compile_status = GL_FALSE;
215 
216 	if (gl_oes_texture_storage_multisample_2d_array_supported)
217 	{
218 		gl.shaderSource(fs_id, 1,			 /* count */
219 						&fs_body_oes, NULL); /* length */
220 	}
221 	else
222 	{
223 		gl.shaderSource(fs_id, 1,		 /* count */
224 						&fs_body, NULL); /* length */
225 	}
226 
227 	GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource() call failed.");
228 
229 	gl.compileShader(fs_id);
230 	GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader() call failed.");
231 
232 	gl.getShaderiv(fs_id, GL_COMPILE_STATUS, &compile_status);
233 
234 	if (compile_status != GL_TRUE)
235 	{
236 		TCU_FAIL("Fragment shader compilation failed.");
237 	}
238 
239 	if (gl_oes_texture_storage_multisample_2d_array_supported)
240 	{
241 		/* Compile the vertex shader */
242 		gl.shaderSource(vs_id, 1,			 /* count */
243 						&vs_body_oes, NULL); /* length */
244 	}
245 	else
246 	{
247 		/* Compile the vertex shader */
248 		gl.shaderSource(vs_id, 1,		 /* count */
249 						&vs_body, NULL); /* length */
250 	}
251 
252 	GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource() call failed.");
253 
254 	gl.compileShader(vs_id);
255 	GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader() call failed.");
256 
257 	gl.getShaderiv(vs_id, GL_COMPILE_STATUS, &compile_status);
258 
259 	if (compile_status != GL_TRUE)
260 	{
261 		char temp[1024];
262 
263 		gl.getShaderInfoLog(vs_id, 1024, 0, temp);
264 
265 		TCU_FAIL("Vertex shader compilation failed.");
266 	}
267 
268 	/* Link the test program object */
269 	glw::GLint link_status = GL_FALSE;
270 
271 	gl.linkProgram(po_id);
272 	GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram() call failed.");
273 
274 	gl.getProgramiv(po_id, GL_LINK_STATUS, &link_status);
275 
276 	if (link_status != GL_TRUE)
277 	{
278 		TCU_FAIL("Program linking failed.");
279 	}
280 
281 	/* Retrieve amount of active uniforms */
282 	glw::GLint n_active_uniforms = 0;
283 
284 	gl.getProgramiv(po_id, GL_ACTIVE_UNIFORMS, &n_active_uniforms);
285 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv() call (GL_ACTIVE_UNIFORMS) failed.");
286 
287 	/* Allocate a buffer that will hold uniform names */
288 	glw::GLint max_active_uniform_length = 0;
289 	char*	  uniform_name				 = NULL;
290 
291 	gl.getProgramiv(po_id, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max_active_uniform_length);
292 	GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv() call (GL_ACTIVE_UNIFORM_MAX_LENGTH) failed.");
293 
294 	uniform_name = new char[max_active_uniform_length];
295 
296 	/* Prepare an array of booleans. Each cell, set to false by default, will tell
297 	 * whether a corresponding uniform has already been reported.
298 	 */
299 	enum
300 	{
301 		SHADER_UNIFORM_FS_MULTISAMPLE,
302 		SHADER_UNIFORM_FS_MULTISAMPLE_ARRAY,
303 		SHADER_UNIFORM_FS_MULTISAMPLE_UINT,
304 		SHADER_UNIFORM_FS_MULTISAMPLE_ARRAY_UINT,
305 		SHADER_UNIFORM_FS_MULTISAMPLE_INT,
306 		SHADER_UNIFORM_FS_MULTISAMPLE_ARRAY_INT,
307 
308 		SHADER_UNIFORM_VS_MULTISAMPLE,
309 		SHADER_UNIFORM_VS_MULTISAMPLE_ARRAY,
310 		SHADER_UNIFORM_VS_MULTISAMPLE_UINT,
311 		SHADER_UNIFORM_VS_MULTISAMPLE_ARRAY_UINT,
312 		SHADER_UNIFORM_VS_MULTISAMPLE_INT,
313 		SHADER_UNIFORM_VS_MULTISAMPLE_ARRAY_INT,
314 
315 		SHADER_UNIFORM_COUNT
316 	};
317 
318 	bool shader_uniform_reported_status[SHADER_UNIFORM_COUNT];
319 
320 	memset(shader_uniform_reported_status, 0, sizeof(shader_uniform_reported_status));
321 
322 	/* Iterate through all active uniforms. */
323 	for (int n_uniform = 0; n_uniform < n_active_uniforms; ++n_uniform)
324 	{
325 		glw::GLint  uniform_size = 0;
326 		glw::GLenum uniform_type = GL_NONE;
327 
328 		/* Retrieve uniform properties */
329 		gl.getActiveUniform(po_id, n_uniform, max_active_uniform_length, NULL, /* length */
330 							&uniform_size, &uniform_type, uniform_name);
331 		GLU_EXPECT_NO_ERROR(gl.getError(), "glGetActiveUniform() call failed");
332 
333 		/* Check if the reported name is valid and that the type and size
334 		 * retrieved matches the uniform.
335 		 * Also verify that the uniform has not been already reported.
336 		 */
337 		if (strcmp(uniform_name, "fs_sampler_2d_multisample") == 0)
338 		{
339 			if (shader_uniform_reported_status[SHADER_UNIFORM_FS_MULTISAMPLE])
340 			{
341 				TCU_FAIL("fs_sampler_2d_multisample uniform is reported more than once");
342 			}
343 
344 			if (uniform_type != GL_SAMPLER_2D_MULTISAMPLE)
345 			{
346 				TCU_FAIL("Invalid uniform type reported for fs_sampler_2d_multisample uniform");
347 			}
348 
349 			shader_uniform_reported_status[SHADER_UNIFORM_FS_MULTISAMPLE] = true;
350 		}
351 		else if (strcmp(uniform_name, "fs_sampler_2d_multisample_array") == 0)
352 		{
353 			if (gl_oes_texture_storage_multisample_2d_array_supported)
354 			{
355 				if (shader_uniform_reported_status[SHADER_UNIFORM_FS_MULTISAMPLE_ARRAY])
356 				{
357 					TCU_FAIL("fs_sampler_2d_multisample_array uniform is reported more than once");
358 				}
359 
360 				if (uniform_type != GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES)
361 				{
362 					TCU_FAIL("Invalid uniform type reported for fs_sampler_2d_multisample_array uniform");
363 				}
364 
365 				shader_uniform_reported_status[SHADER_UNIFORM_FS_MULTISAMPLE_ARRAY] = true;
366 			}
367 			else
368 			{
369 				TCU_FAIL("Unsupported active uniform type reported.");
370 			}
371 		}
372 		else if (strcmp(uniform_name, "fs_sampler_2d_multisample_uint") == 0)
373 		{
374 			if (shader_uniform_reported_status[SHADER_UNIFORM_FS_MULTISAMPLE_UINT])
375 			{
376 				TCU_FAIL("fs_sampler_2d_multisample_uint uniform is reported more than once");
377 			}
378 
379 			if (uniform_type != GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE)
380 			{
381 				TCU_FAIL("Invalid uniform type reported for fs_sampler_2d_multisample_uint uniform");
382 			}
383 
384 			shader_uniform_reported_status[SHADER_UNIFORM_FS_MULTISAMPLE_UINT] = true;
385 		}
386 		else if (strcmp(uniform_name, "fs_sampler_2d_multisample_array_uint") == 0)
387 		{
388 			if (gl_oes_texture_storage_multisample_2d_array_supported)
389 			{
390 				if (shader_uniform_reported_status[SHADER_UNIFORM_FS_MULTISAMPLE_ARRAY_UINT])
391 				{
392 					TCU_FAIL("fs_sampler_2d_multisample_array_uint uniform is reported more than once");
393 				}
394 
395 				if (uniform_type != GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES)
396 				{
397 					TCU_FAIL("Invalid uniform type reported for fs_sampler_2d_multisample_array_uint uniform");
398 				}
399 
400 				shader_uniform_reported_status[SHADER_UNIFORM_FS_MULTISAMPLE_ARRAY_UINT] = true;
401 			}
402 			else
403 			{
404 				TCU_FAIL("Unsupported active uniform type reported.");
405 			}
406 		}
407 		else if (strcmp(uniform_name, "fs_sampler_2d_multisample_int") == 0)
408 		{
409 			if (shader_uniform_reported_status[SHADER_UNIFORM_FS_MULTISAMPLE_INT])
410 			{
411 				TCU_FAIL("fs_sampler_2d_multisample_int uniform is reported more than once");
412 			}
413 
414 			if (uniform_type != GL_INT_SAMPLER_2D_MULTISAMPLE)
415 			{
416 				TCU_FAIL("Invalid uniform type reported for fs_sampler_2d_multisample_int uniform");
417 			}
418 
419 			shader_uniform_reported_status[SHADER_UNIFORM_FS_MULTISAMPLE_INT] = true;
420 		}
421 		else if (strcmp(uniform_name, "fs_sampler_2d_multisample_array_int") == 0)
422 		{
423 			if (gl_oes_texture_storage_multisample_2d_array_supported)
424 			{
425 				if (shader_uniform_reported_status[SHADER_UNIFORM_FS_MULTISAMPLE_ARRAY_INT])
426 				{
427 					TCU_FAIL("fs_sampler_2d_multisample_array_int uniform is reported more than once");
428 				}
429 
430 				if (uniform_type != GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES)
431 				{
432 					TCU_FAIL("Invalid uniform type reported for fs_sampler_2d_multisample_array_int uniform");
433 				}
434 
435 				shader_uniform_reported_status[SHADER_UNIFORM_FS_MULTISAMPLE_ARRAY_INT] = true;
436 			}
437 			else
438 			{
439 				TCU_FAIL("Unsupported active uniform type reported.");
440 			}
441 		}
442 		else if (strcmp(uniform_name, "vs_sampler_2d_multisample") == 0)
443 		{
444 			if (shader_uniform_reported_status[SHADER_UNIFORM_VS_MULTISAMPLE])
445 			{
446 				TCU_FAIL("vs_sampler_2d_multisample uniform is reported more than once");
447 			}
448 
449 			if (uniform_type != GL_SAMPLER_2D_MULTISAMPLE)
450 			{
451 				TCU_FAIL("Invalid uniform type reported for vs_sampler_2d_multisample uniform");
452 			}
453 
454 			shader_uniform_reported_status[SHADER_UNIFORM_VS_MULTISAMPLE] = true;
455 		}
456 		else if (strcmp(uniform_name, "vs_sampler_2d_multisample_array") == 0)
457 		{
458 			if (gl_oes_texture_storage_multisample_2d_array_supported)
459 			{
460 				if (shader_uniform_reported_status[SHADER_UNIFORM_VS_MULTISAMPLE_ARRAY])
461 				{
462 					TCU_FAIL("vs_sampler_2d_multisample_array uniform is reported more than once");
463 				}
464 
465 				if (uniform_type != GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES)
466 				{
467 					TCU_FAIL("Invalid uniform type reported for vs_sampler_2d_multisample_array uniform");
468 				}
469 
470 				shader_uniform_reported_status[SHADER_UNIFORM_VS_MULTISAMPLE_ARRAY] = true;
471 			}
472 			else
473 			{
474 				TCU_FAIL("Unsupported active uniform type reported.");
475 			}
476 		}
477 		else if (strcmp(uniform_name, "vs_sampler_2d_multisample_uint") == 0)
478 		{
479 			if (shader_uniform_reported_status[SHADER_UNIFORM_VS_MULTISAMPLE_UINT])
480 			{
481 				TCU_FAIL("vs_sampler_2d_multisample_uint uniform is reported more than once");
482 			}
483 
484 			if (uniform_type != GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE)
485 			{
486 				TCU_FAIL("Invalid uniform type reported for vs_sampler_2d_multisample_uint uniform");
487 			}
488 
489 			shader_uniform_reported_status[SHADER_UNIFORM_VS_MULTISAMPLE_UINT] = true;
490 		}
491 		else if (strcmp(uniform_name, "vs_sampler_2d_multisample_array_uint") == 0)
492 		{
493 			if (gl_oes_texture_storage_multisample_2d_array_supported)
494 			{
495 				if (shader_uniform_reported_status[SHADER_UNIFORM_VS_MULTISAMPLE_ARRAY_UINT])
496 				{
497 					TCU_FAIL("vs_sampler_2d_multisample_array_uint uniform is reported more than once");
498 				}
499 
500 				if (uniform_type != GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES)
501 				{
502 					TCU_FAIL("Invalid uniform type reported for vs_sampler_2d_multisample_array_uint uniform");
503 				}
504 
505 				shader_uniform_reported_status[SHADER_UNIFORM_VS_MULTISAMPLE_ARRAY_UINT] = true;
506 			}
507 			else
508 			{
509 				TCU_FAIL("Unsupported active uniform type reported.");
510 			}
511 		}
512 		else if (strcmp(uniform_name, "vs_sampler_2d_multisample_int") == 0)
513 		{
514 			if (shader_uniform_reported_status[SHADER_UNIFORM_VS_MULTISAMPLE_INT])
515 			{
516 				TCU_FAIL("vs_sampler_2d_multisample_int uniform is reported more than once");
517 			}
518 
519 			if (uniform_type != GL_INT_SAMPLER_2D_MULTISAMPLE)
520 			{
521 				TCU_FAIL("Invalid uniform type reported for vs_sampler_2d_multisample_int uniform");
522 			}
523 
524 			shader_uniform_reported_status[SHADER_UNIFORM_VS_MULTISAMPLE_INT] = true;
525 		}
526 		else if (strcmp(uniform_name, "vs_sampler_2d_multisample_array_int") == 0)
527 		{
528 			if (gl_oes_texture_storage_multisample_2d_array_supported)
529 			{
530 				if (shader_uniform_reported_status[SHADER_UNIFORM_VS_MULTISAMPLE_ARRAY_INT])
531 				{
532 					TCU_FAIL("vs_sampler_2d_multisample_array_int uniform is reported more than once");
533 				}
534 
535 				if (uniform_type != GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES)
536 				{
537 					TCU_FAIL("Invalid uniform type reported for vs_sampler_2d_multisample_array_int uniform");
538 				}
539 
540 				shader_uniform_reported_status[SHADER_UNIFORM_VS_MULTISAMPLE_ARRAY_INT] = true;
541 			}
542 			else
543 			{
544 				TCU_FAIL("Unsupported active uniform type reported.");
545 			}
546 		}
547 		else
548 		{
549 			m_testCtx.getLog() << tcu::TestLog::Message << "Unrecognized active uniform [" << uniform_name
550 							   << "] of type [" << uniform_type << "] was reported." << tcu::TestLog::EndMessage;
551 
552 			TCU_FAIL("Unrecognized active uniform type reported.");
553 		}
554 	} /* for (all active uniforms) */
555 
556 	/* sampler2DMSArray, isampler2DMSArray and usampler2DMSArray are part of the
557 	 * OES_texture_storage_multisample_2d_array extension and should only be reported
558 	 * if the extension is supported */
559 	bool expected_result[SHADER_UNIFORM_COUNT]	 = { 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 };
560 	bool expected_result_oes[SHADER_UNIFORM_COUNT] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
561 
562 	/* Make sure all sampler uniforms we were expecting have been reported */
563 	for (unsigned int n_sampler_type = 0; n_sampler_type < SHADER_UNIFORM_COUNT; ++n_sampler_type)
564 	{
565 		if (gl_oes_texture_storage_multisample_2d_array_supported)
566 		{
567 			if (shader_uniform_reported_status[n_sampler_type] != expected_result_oes[n_sampler_type])
568 			{
569 				m_testCtx.getLog() << tcu::TestLog::Message << "Sampler type [" << n_sampler_type
570 								   << "] has not been reported by glGetActiveUniform()." << tcu::TestLog::EndMessage;
571 
572 				TCU_FAIL(
573 					"At least one expected multisample texture sampler has not been reported by glGetActiveUniform()");
574 			}
575 		}
576 		else
577 		{
578 			if (shader_uniform_reported_status[n_sampler_type] != expected_result[n_sampler_type])
579 			{
580 				m_testCtx.getLog() << tcu::TestLog::Message << "Sampler type [" << n_sampler_type
581 								   << "] has not been reported by glGetActiveUniform()." << tcu::TestLog::EndMessage;
582 
583 				TCU_FAIL(
584 					"At least one expected multisample texture sampler has not been reported by glGetActiveUniform()");
585 			}
586 		}
587 	} /* for (all shader uniform types) */
588 
589 	/* Done */
590 	deinitInternals();
591 	delete[] uniform_name;
592 	uniform_name = NULL;
593 
594 	m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
595 	return STOP;
596 }
597 
598 } /* glcts namespace */
599