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 } // namespace glcts
599