Merge Vulkan CTS 1.0.2.2 into goog/oc-dev
[platform/upstream/VK-GL-CTS.git] / modules / gles31 / functional / es31fIntegerStateQueryTests.cpp
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES 3.1 Module
3  * -------------------------------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
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 Integer state query tests
22  *//*--------------------------------------------------------------------*/
23
24 #include "es31fIntegerStateQueryTests.hpp"
25 #include "tcuTestLog.hpp"
26 #include "gluRenderContext.hpp"
27 #include "gluCallLogWrapper.hpp"
28 #include "gluContextInfo.hpp"
29 #include "gluObjectWrapper.hpp"
30 #include "gluShaderProgram.hpp"
31 #include "gluStrUtil.hpp"
32 #include "glwFunctions.hpp"
33 #include "glwEnums.hpp"
34 #include "glsStateQueryUtil.hpp"
35 #include "deRandom.hpp"
36 #include "deStringUtil.hpp"
37
38 namespace deqp
39 {
40 namespace gles31
41 {
42 namespace Functional
43 {
44 namespace
45 {
46
47 using namespace gls::StateQueryUtil;
48
49 const int MAX_FRAG_ATOMIC_COUNTER_BUFFERS_GLES32        = 1;
50 const int MAX_FRAG_ATOMIC_COUNTERS_GLES32                       = 8;
51 const int MAX_FRAG_SHADER_STORAGE_BLOCKS_GLES32         = 4;
52
53 static const char* getVerifierSuffix (QueryType type)
54 {
55         switch (type)
56         {
57                 case QUERY_BOOLEAN:             return "getboolean";
58                 case QUERY_INTEGER:             return "getinteger";
59                 case QUERY_INTEGER64:   return "getinteger64";
60                 case QUERY_FLOAT:               return "getfloat";
61                 default:
62                         DE_ASSERT(DE_FALSE);
63                         return DE_NULL;
64         }
65 }
66
67 class MaxSamplesCase : public TestCase
68 {
69 public:
70                                                 MaxSamplesCase  (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType);
71 private:
72         IterateResult           iterate                 (void);
73
74         const glw::GLenum       m_target;
75         const int                       m_minValue;
76         const QueryType         m_verifierType;
77 };
78
79 MaxSamplesCase::MaxSamplesCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType)
80         : TestCase                      (context, name, desc)
81         , m_target                      (target)
82         , m_minValue            (minValue)
83         , m_verifierType        (verifierType)
84 {
85 }
86
87 MaxSamplesCase::IterateResult MaxSamplesCase::iterate (void)
88 {
89         glu::CallLogWrapper             gl              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
90         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
91
92         gl.enableLogging(true);
93         verifyStateIntegerMin(result, gl, m_target, m_minValue, m_verifierType);
94
95         result.setTestContextResult(m_testCtx);
96         return STOP;
97 }
98
99 class TexBindingCase : public TestCase
100 {
101 public:
102                                                 TexBindingCase  (Context& context, const char* name, const char* desc, glw::GLenum texTarget, glw::GLenum bindTarget, QueryType verifierType);
103 private:
104         void                            init                    (void);
105         IterateResult           iterate                 (void);
106
107         const glw::GLenum       m_texTarget;
108         const glw::GLenum       m_bindTarget;
109         const QueryType         m_verifierType;
110 };
111
112 TexBindingCase::TexBindingCase (Context& context, const char* name, const char* desc, glw::GLenum texTarget, glw::GLenum bindTarget, QueryType verifierType)
113         : TestCase                      (context, name, desc)
114         , m_texTarget           (texTarget)
115         , m_bindTarget          (bindTarget)
116         , m_verifierType        (verifierType)
117 {
118 }
119
120 void TexBindingCase::init (void)
121 {
122         if (contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
123                 return;
124
125         if (m_texTarget == GL_TEXTURE_2D_MULTISAMPLE_ARRAY && !m_context.getContextInfo().isExtensionSupported("GL_OES_texture_storage_multisample_2d_array"))
126                 throw tcu::NotSupportedError("Test requires OES_texture_storage_multisample_2d_array extension");
127         if (m_texTarget == GL_TEXTURE_CUBE_MAP_ARRAY && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_cube_map_array"))
128                 throw tcu::NotSupportedError("Test requires GL_EXT_texture_cube_map_array extension");
129         if (m_texTarget == GL_TEXTURE_BUFFER && !m_context.getContextInfo().isExtensionSupported("GL_EXT_texture_buffer"))
130                 throw tcu::NotSupportedError("Test requires GL_EXT_texture_buffer extension");
131 }
132
133 TexBindingCase::IterateResult TexBindingCase::iterate (void)
134 {
135         glu::CallLogWrapper             gl              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
136         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
137
138         gl.enableLogging(true);
139
140         // initial
141         {
142                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "initial", "Initial value");
143
144                 verifyStateInteger(result, gl, m_bindTarget, 0, m_verifierType);
145         }
146
147         // bind
148         {
149                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "bind", "After bind");
150
151                 glw::GLuint texture;
152
153                 gl.glGenTextures(1, &texture);
154                 gl.glBindTexture(m_texTarget, texture);
155                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "bind texture");
156
157                 verifyStateInteger(result, gl, m_bindTarget, texture, m_verifierType);
158
159                 gl.glDeleteTextures(1, &texture);
160         }
161
162         // after delete
163         {
164                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "bind", "After delete");
165
166                 verifyStateInteger(result, gl, m_bindTarget, 0, m_verifierType);
167         }
168
169         result.setTestContextResult(m_testCtx);
170         return STOP;
171 }
172
173 class MinimumValueCase : public TestCase
174 {
175 public:
176                                                 MinimumValueCase        (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType);
177                                                 MinimumValueCase        (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType, glu::ApiType minVersion);
178 private:
179         IterateResult           iterate                         (void);
180
181         const glw::GLenum       m_target;
182         const int                       m_minValue;
183         const QueryType         m_verifierType;
184         const glu::ApiType      m_minimumVersion;
185 };
186
187 MinimumValueCase::MinimumValueCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType)
188         : TestCase                      (context, name, desc)
189         , m_target                      (target)
190         , m_minValue            (minValue)
191         , m_verifierType        (verifierType)
192         , m_minimumVersion      (glu::ApiType::es(3, 1))
193 {
194 }
195
196 MinimumValueCase::MinimumValueCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType, glu::ApiType minVersion)
197         : TestCase                      (context, name, desc)
198         , m_target                      (target)
199         , m_minValue            (minValue)
200         , m_verifierType        (verifierType)
201         , m_minimumVersion      (minVersion)
202 {
203 }
204
205 MinimumValueCase::IterateResult MinimumValueCase::iterate (void)
206 {
207         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(m_context.getRenderContext().getType(), m_minimumVersion), "Test not supported in this context version.");
208
209         glu::CallLogWrapper             gl              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
210         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
211
212         // \note: In GL ES 3.2, the following targets have different limits as in 3.1
213         const int                               value   = contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2))
214                                                                         ? (m_target == GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS   ? MAX_FRAG_ATOMIC_COUNTER_BUFFERS_GLES32        // 1
215                                                                         : m_target == GL_MAX_FRAGMENT_ATOMIC_COUNTERS                   ? MAX_FRAG_ATOMIC_COUNTERS_GLES32                       // 8
216                                                                         : m_target == GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS             ? MAX_FRAG_SHADER_STORAGE_BLOCKS_GLES32         // 4
217                                                                         : m_minValue)
218                                                                         : m_minValue;
219
220         gl.enableLogging(true);
221         verifyStateIntegerMin(result, gl, m_target, value, m_verifierType);
222
223         result.setTestContextResult(m_testCtx);
224         return STOP;
225 }
226
227 class AlignmentCase : public TestCase
228 {
229 public:
230                                                 AlignmentCase   (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType);
231                                                 AlignmentCase   (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType, glu::ApiType minVersion);
232 private:
233         IterateResult           iterate                 (void);
234
235         const glw::GLenum       m_target;
236         const int                       m_minValue;
237         const QueryType         m_verifierType;
238         const glu::ApiType      m_minimumVersion;
239 };
240
241 AlignmentCase::AlignmentCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType)
242         : TestCase                      (context, name, desc)
243         , m_target                      (target)
244         , m_minValue            (minValue)
245         , m_verifierType        (verifierType)
246         , m_minimumVersion      (glu::ApiType::es(3, 1))
247 {
248 }
249
250 AlignmentCase::AlignmentCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, QueryType verifierType, glu::ApiType minVersion)
251         : TestCase                      (context, name, desc)
252         , m_target                      (target)
253         , m_minValue            (minValue)
254         , m_verifierType        (verifierType)
255         , m_minimumVersion      (minVersion)
256 {
257 }
258
259 AlignmentCase::IterateResult AlignmentCase::iterate (void)
260 {
261         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(m_context.getRenderContext().getType(), m_minimumVersion), "Test not supported in this context.");
262
263         glu::CallLogWrapper             gl              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
264         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
265
266         gl.enableLogging(true);
267         verifyStateIntegerMax(result, gl, m_target, m_minValue, m_verifierType);
268
269         result.setTestContextResult(m_testCtx);
270         return STOP;
271 }
272
273 class BufferBindingCase : public TestCase
274 {
275 public:
276                                                 BufferBindingCase       (Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bindingPoint, QueryType verifierType);
277 private:
278         IterateResult           iterate                         (void);
279
280         const glw::GLenum       m_queryTarget;
281         const glw::GLenum       m_bindingPoint;
282         const QueryType         m_verifierType;
283 };
284
285 BufferBindingCase::BufferBindingCase (Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bindingPoint, QueryType verifierType)
286         : TestCase                      (context, name, desc)
287         , m_queryTarget         (queryTarget)
288         , m_bindingPoint        (bindingPoint)
289         , m_verifierType        (verifierType)
290 {
291 }
292
293 BufferBindingCase::IterateResult BufferBindingCase::iterate (void)
294 {
295         glu::CallLogWrapper             gl              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
296         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
297
298         gl.enableLogging(true);
299
300         {
301                 const tcu::ScopedLogSection     section(m_testCtx.getLog(), "Initial", "Initial value");
302
303                 verifyStateInteger(result, gl, m_queryTarget, 0, m_verifierType);
304         }
305
306         {
307                 const tcu::ScopedLogSection     section (m_testCtx.getLog(), "AfterBinding", "After binding");
308                 glu::Buffer                                     buf             (m_context.getRenderContext());
309
310                 gl.glBindBuffer(m_bindingPoint, *buf);
311                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup");
312
313                 verifyStateInteger(result, gl, m_queryTarget, *buf, m_verifierType);
314         }
315
316         {
317                 const tcu::ScopedLogSection     section (m_testCtx.getLog(), "AfterDelete", "After deleting");
318                 glw::GLuint                                     buf             = 0;
319
320                 gl.glGenBuffers(1, &buf);
321                 gl.glBindBuffer(m_bindingPoint, buf);
322                 gl.glDeleteBuffers(1, &buf);
323                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup");
324
325                 verifyStateInteger(result, gl, m_queryTarget, 0, m_verifierType);
326         }
327
328         result.setTestContextResult(m_testCtx);
329         return STOP;
330 }
331
332 class ProgramPipelineBindingCase : public TestCase
333 {
334 public:
335                                                 ProgramPipelineBindingCase      (Context& context, const char* name, const char* desc, QueryType verifierType);
336 private:
337         IterateResult           iterate                                         (void);
338
339         const QueryType         m_verifierType;
340 };
341
342 ProgramPipelineBindingCase::ProgramPipelineBindingCase (Context& context, const char* name, const char* desc, QueryType verifierType)
343         : TestCase                      (context, name, desc)
344         , m_verifierType        (verifierType)
345 {
346 }
347
348 ProgramPipelineBindingCase::IterateResult ProgramPipelineBindingCase::iterate (void)
349 {
350         glu::CallLogWrapper             gl              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
351         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
352
353         gl.enableLogging(true);
354
355         {
356                 const tcu::ScopedLogSection     section(m_testCtx.getLog(), "Initial", "Initial value");
357
358                 verifyStateInteger(result, gl, GL_PROGRAM_PIPELINE_BINDING, 0, m_verifierType);
359         }
360
361         {
362                 const tcu::ScopedLogSection     section         (m_testCtx.getLog(), "AfterBinding", "After binding");
363                 glu::ProgramPipeline            pipeline        (m_context.getRenderContext());
364
365                 gl.glBindProgramPipeline(pipeline.getPipeline());
366                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup");
367
368                 verifyStateInteger(result, gl, GL_PROGRAM_PIPELINE_BINDING, pipeline.getPipeline(), m_verifierType);
369         }
370
371         {
372                 const tcu::ScopedLogSection     section         (m_testCtx.getLog(), "AfterDelete", "After deleting");
373                 glw::GLuint                                     pipeline        = 0;
374
375                 gl.glGenProgramPipelines(1, &pipeline);
376                 gl.glBindProgramPipeline(pipeline);
377                 gl.glDeleteProgramPipelines(1, &pipeline);
378                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "setup");
379
380                 verifyStateInteger(result, gl, GL_PROGRAM_PIPELINE_BINDING, 0, m_verifierType);
381         }
382
383         result.setTestContextResult(m_testCtx);
384         return STOP;
385 }
386
387 class FramebufferMinimumValueCase : public TestCase
388 {
389 public:
390                                                 FramebufferMinimumValueCase     (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, glw::GLenum tiedTo, QueryType verifierType);
391 private:
392         IterateResult           iterate                                         (void);
393
394         const glw::GLenum       m_target;
395         const glw::GLenum       m_tiedTo;
396         const int                       m_minValue;
397         const QueryType         m_verifierType;
398 };
399
400 FramebufferMinimumValueCase::FramebufferMinimumValueCase (Context& context, const char* name, const char* desc, glw::GLenum target, int minValue, glw::GLenum tiedTo, QueryType verifierType)
401         : TestCase                      (context, name, desc)
402         , m_target                      (target)
403         , m_tiedTo                      (tiedTo)
404         , m_minValue            (minValue)
405         , m_verifierType        (verifierType)
406 {
407 }
408
409 FramebufferMinimumValueCase::IterateResult FramebufferMinimumValueCase::iterate (void)
410 {
411         glu::CallLogWrapper             gl              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
412         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
413
414         gl.enableLogging(true);
415
416         {
417                 const tcu::ScopedLogSection     section(m_testCtx.getLog(), "Minimum", "Specified minimum is " + de::toString(m_minValue));
418
419                 verifyStateIntegerMin(result, gl, m_target, m_minValue, m_verifierType);
420         }
421         {
422                 const tcu::ScopedLogSection                             section         (m_testCtx.getLog(), "Ties", "The limit is tied to the value of " + de::toString(glu::getGettableStateStr(m_tiedTo)));
423                 StateQueryMemoryWriteGuard<glw::GLint>  tiedToValue;
424
425                 gl.glGetIntegerv(m_tiedTo, &tiedToValue);
426                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
427
428                 if (tiedToValue.verifyValidity(result))
429                         verifyStateIntegerMin(result, gl, m_target, tiedToValue, m_verifierType);
430         }
431
432         result.setTestContextResult(m_testCtx);
433         return STOP;
434 }
435
436 class LegacyVectorLimitCase : public TestCase
437 {
438 public:
439                                                 LegacyVectorLimitCase   (Context& context, const char* name, const char* desc, glw::GLenum legacyTarget, glw::GLenum componentTarget, QueryType verifierType);
440 private:
441         IterateResult           iterate                                 (void);
442
443         const glw::GLenum       m_legacyTarget;
444         const glw::GLenum       m_componentTarget;
445         const QueryType         m_verifierType;
446 };
447
448 LegacyVectorLimitCase::LegacyVectorLimitCase (Context& context, const char* name, const char* desc, glw::GLenum legacyTarget, glw::GLenum componentTarget, QueryType verifierType)
449         : TestCase                      (context, name, desc)
450         , m_legacyTarget        (legacyTarget)
451         , m_componentTarget     (componentTarget)
452         , m_verifierType        (verifierType)
453 {
454 }
455
456 LegacyVectorLimitCase::IterateResult LegacyVectorLimitCase::iterate (void)
457 {
458         glu::CallLogWrapper             gl              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
459         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
460
461         gl.enableLogging(true);
462
463         {
464                 const tcu::ScopedLogSection     section(m_testCtx.getLog(), "TiedTo", de::toString(glu::getGettableStateStr(m_legacyTarget)) +
465                                                                                                                                                         " is " +
466                                                                                                                                                         de::toString(glu::getGettableStateStr(m_componentTarget)) +
467                                                                                                                                                         " divided by four");
468
469                 StateQueryMemoryWriteGuard<glw::GLint> value;
470                 gl.glGetIntegerv(m_componentTarget, &value);
471                 GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
472
473                 if (value.verifyValidity(result))
474                         verifyStateInteger(result, gl, m_legacyTarget, ((int)value) / 4, m_verifierType);
475         }
476
477         result.setTestContextResult(m_testCtx);
478         return STOP;
479 }
480
481 class CombinedUniformComponentsCase : public TestCase
482 {
483 public:
484                                                 CombinedUniformComponentsCase   (Context& context, const char* name, const char* desc, glw::GLenum target, QueryType verifierType);
485                                                 CombinedUniformComponentsCase   (Context& context, const char* name, const char* desc, glw::GLenum target, QueryType verifierType, glu::ApiType minVersion);
486 private:
487         IterateResult           iterate                                                                 (void);
488         const glw::GLenum       m_target;
489         const QueryType         m_verifierType;
490         const glu::ApiType      m_minimumVersion;
491 };
492
493 CombinedUniformComponentsCase::CombinedUniformComponentsCase (Context& context, const char* name, const char* desc, glw::GLenum target, QueryType verifierType)
494         : TestCase                      (context, name, desc)
495         , m_target                      (target)
496         , m_verifierType        (verifierType)
497         , m_minimumVersion      (glu::ApiType::es(3, 1))
498 {
499 }
500
501 CombinedUniformComponentsCase::CombinedUniformComponentsCase (Context& context, const char* name, const char* desc, glw::GLenum target, QueryType verifierType, glu::ApiType minVersion)
502         : TestCase                      (context, name, desc)
503         , m_target                      (target)
504         , m_verifierType        (verifierType)
505         , m_minimumVersion      (minVersion)
506 {
507 }
508
509 CombinedUniformComponentsCase::IterateResult CombinedUniformComponentsCase::iterate (void)
510 {
511         TCU_CHECK_AND_THROW(NotSupportedError, contextSupports(m_context.getRenderContext().getType(), m_minimumVersion), "Test not supported in this context.");
512
513         glu::CallLogWrapper             gl                                                      (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
514         tcu::ResultCollector    result                                          (m_testCtx.getLog(), " // ERROR: ");
515
516         const glw::GLenum               maxUniformBlocksEnum            = (m_target == GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS) ? GL_MAX_COMPUTE_UNIFORM_BLOCKS
517                                                                                                                 : (m_target == GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS) ? GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS
518                                                                                                                 : (m_target == GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS) ? GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS
519                                                                                                                 : (m_target == GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS) ? GL_MAX_GEOMETRY_UNIFORM_BLOCKS
520                                                                                                                 : -1;
521
522         const glw::GLenum               maxUniformComponentsEnum        = (m_target == GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS) ? GL_MAX_COMPUTE_UNIFORM_COMPONENTS
523                                                                                                                 : (m_target == GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS) ? GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS
524                                                                                                                 : (m_target == GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS) ? GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS
525                                                                                                                 : (m_target == GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS) ? GL_MAX_GEOMETRY_UNIFORM_COMPONENTS
526                                                                                                                 : -1;
527
528         gl.enableLogging(true);
529
530         m_testCtx.getLog()      << tcu::TestLog::Message
531                                                 << "The minimum value of MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS is MAX_COMPUTE_UNIFORM_BLOCKS x MAX_UNIFORM_BLOCK_SIZE / 4 + MAX_COMPUTE_UNIFORM_COMPONENTS"
532                                                 << tcu::TestLog::EndMessage;
533
534         StateQueryMemoryWriteGuard<glw::GLint> maxUniformBlocks;
535         gl.glGetIntegerv(maxUniformBlocksEnum, &maxUniformBlocks);
536         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
537
538         StateQueryMemoryWriteGuard<glw::GLint> maxUniformBlockSize;
539         gl.glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &maxUniformBlockSize);
540         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
541
542         StateQueryMemoryWriteGuard<glw::GLint> maxUniformComponents;
543         gl.glGetIntegerv(maxUniformComponentsEnum, &maxUniformComponents);
544         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
545
546         if (maxUniformBlocks.verifyValidity(result) && maxUniformBlockSize.verifyValidity(result) && maxUniformComponents.verifyValidity(result))
547                 verifyStateIntegerMin(result, gl, m_target, ((int)maxUniformBlocks) * ((int)maxUniformBlockSize) / 4 + (int)maxUniformComponents, m_verifierType);
548
549         result.setTestContextResult(m_testCtx);
550         return STOP;
551 }
552
553 class TextureGatherLimitCase : public TestCase
554 {
555 public:
556                                                 TextureGatherLimitCase  (Context& context, const char* name, const char* desc, bool isMaxCase, QueryType verifierType);
557 private:
558         IterateResult           iterate                                 (void);
559
560         const bool                      m_isMaxCase;
561         const QueryType         m_verifierType;
562 };
563
564 TextureGatherLimitCase::TextureGatherLimitCase (Context& context, const char* name, const char* desc, bool isMaxCase, QueryType verifierType)
565         : TestCase                      (context, name, desc)
566         , m_isMaxCase           (isMaxCase)
567         , m_verifierType        (verifierType)
568 {
569 }
570
571 TextureGatherLimitCase::IterateResult TextureGatherLimitCase::iterate (void)
572 {
573         glu::CallLogWrapper             gl              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
574         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
575
576         gl.enableLogging(true);
577
578         if (m_isMaxCase)
579         {
580                 // range [0, inf)
581                 verifyStateIntegerMin(result, gl, GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET, 0, m_verifierType);
582         }
583         else
584         {
585                 // range (-inf, 0]
586                 verifyStateIntegerMax(result, gl, GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET, 0, m_verifierType);
587         }
588
589         result.setTestContextResult(m_testCtx);
590         return STOP;
591 }
592
593 class MaxUniformBufferBindingsCase : public TestCase
594 {
595 public:
596                                                 MaxUniformBufferBindingsCase    (Context& context, const char* name, const char* desc, QueryType verifierType);
597 private:
598         IterateResult           iterate                                                 (void);
599
600         const QueryType         m_verifierType;
601 };
602
603 MaxUniformBufferBindingsCase::MaxUniformBufferBindingsCase (Context& context, const char* name, const char* desc, QueryType verifierType)
604         : TestCase                      (context, name, desc)
605         , m_verifierType        (verifierType)
606 {
607 }
608
609 MaxUniformBufferBindingsCase::IterateResult MaxUniformBufferBindingsCase::iterate (void)
610 {
611         glu::CallLogWrapper             gl              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
612         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
613         int                                             minMax;
614
615         gl.enableLogging(true);
616
617         if (contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
618         {
619                 minMax = 72;
620         }
621         else
622         {
623                 if (m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
624                 {
625                         m_testCtx.getLog()      << tcu::TestLog::Message
626                                                                 << "GL_EXT_tessellation_shader increases the minimum value of GL_MAX_UNIFORM_BUFFER_BINDINGS to 72"
627                                                                 << tcu::TestLog::EndMessage;
628                         minMax = 72;
629                 }
630                 else if (m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader"))
631                 {
632                         m_testCtx.getLog()      << tcu::TestLog::Message
633                                                                 << "GL_EXT_geometry_shader increases the minimum value of GL_MAX_UNIFORM_BUFFER_BINDINGS to 48"
634                                                                 << tcu::TestLog::EndMessage;
635                         minMax = 48;
636                 }
637                 else
638                 {
639                         minMax = 36;
640                 }
641         }
642
643         // range [0, inf)
644         verifyStateIntegerMin(result, gl, GL_MAX_UNIFORM_BUFFER_BINDINGS, minMax, m_verifierType);
645
646         result.setTestContextResult(m_testCtx);
647         return STOP;
648 }
649
650 class MaxCombinedUniformBlocksCase : public TestCase
651 {
652 public:
653                                                 MaxCombinedUniformBlocksCase    (Context& context, const char* name, const char* desc, QueryType verifierType);
654 private:
655         IterateResult           iterate                                                 (void);
656
657         const QueryType         m_verifierType;
658 };
659
660 MaxCombinedUniformBlocksCase::MaxCombinedUniformBlocksCase (Context& context, const char* name, const char* desc, QueryType verifierType)
661         : TestCase                      (context, name, desc)
662         , m_verifierType        (verifierType)
663 {
664 }
665
666 MaxCombinedUniformBlocksCase::IterateResult MaxCombinedUniformBlocksCase::iterate (void)
667 {
668         glu::CallLogWrapper             gl              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
669         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
670         int                                             minMax;
671
672         gl.enableLogging(true);
673
674         if (contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
675         {
676                 minMax = 60;
677         }
678         else
679         {
680                 if (m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
681                 {
682                         m_testCtx.getLog()      << tcu::TestLog::Message
683                                                                 << "GL_EXT_tessellation_shader increases the minimum value of GL_MAX_COMBINED_UNIFORM_BLOCKS to 60"
684                                                                 << tcu::TestLog::EndMessage;
685                         minMax = 60;
686                 }
687                 else if (m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader"))
688                 {
689                         m_testCtx.getLog()      << tcu::TestLog::Message
690                                                                 << "GL_EXT_geometry_shader increases the minimum value of GL_MAX_COMBINED_UNIFORM_BLOCKS to 36"
691                                                                 << tcu::TestLog::EndMessage;
692                         minMax = 36;
693                 }
694                 else
695                 {
696                         minMax = 24;
697                 }
698         }
699
700         // range [0, inf)
701         verifyStateIntegerMin(result, gl, GL_MAX_COMBINED_UNIFORM_BLOCKS, minMax, m_verifierType);
702
703         result.setTestContextResult(m_testCtx);
704         return STOP;
705 }
706
707 class MaxCombinedTexImageUnitsCase : public TestCase
708 {
709 public:
710                                                 MaxCombinedTexImageUnitsCase    (Context& context, const char* name, const char* desc, QueryType verifierType);
711 private:
712         IterateResult           iterate                                                 (void);
713
714         const QueryType         m_verifierType;
715 };
716
717 MaxCombinedTexImageUnitsCase::MaxCombinedTexImageUnitsCase (Context& context, const char* name, const char* desc, QueryType verifierType)
718         : TestCase                      (context, name, desc)
719         , m_verifierType        (verifierType)
720 {
721 }
722
723 MaxCombinedTexImageUnitsCase::IterateResult MaxCombinedTexImageUnitsCase::iterate (void)
724 {
725         glu::CallLogWrapper             gl              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
726         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
727         int                                             minMax;
728
729         gl.enableLogging(true);
730         if (contextSupports(m_context.getRenderContext().getType(), glu::ApiType::es(3, 2)))
731         {
732                 minMax = 96;
733         }
734         else
735         {
736                 if (m_context.getContextInfo().isExtensionSupported("GL_EXT_tessellation_shader"))
737                 {
738                         m_testCtx.getLog()      << tcu::TestLog::Message
739                                                                 << "GL_EXT_tessellation_shader increases the minimum value of GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS to 96"
740                                                                 << tcu::TestLog::EndMessage;
741                         minMax = 96;
742                 }
743                 else if (m_context.getContextInfo().isExtensionSupported("GL_EXT_geometry_shader"))
744                 {
745                         m_testCtx.getLog()      << tcu::TestLog::Message
746                                                                 << "GL_EXT_geometry_shader increases the minimum value of GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS to 36"
747                                                                 << tcu::TestLog::EndMessage;
748                         minMax = 64;
749                 }
750                 else
751                 {
752                         minMax = 48;
753                 }
754         }
755
756         // range [0, inf)
757         verifyStateIntegerMin(result, gl, GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, minMax, m_verifierType);
758
759         result.setTestContextResult(m_testCtx);
760         return STOP;
761 }
762
763 } // anonymous
764
765 IntegerStateQueryTests::IntegerStateQueryTests (Context& context)
766         : TestCaseGroup(context, "integer", "Integer state query tests")
767 {
768 }
769
770 IntegerStateQueryTests::~IntegerStateQueryTests (void)
771 {
772 }
773
774 void IntegerStateQueryTests::init (void)
775 {
776         // Verifiers
777         const QueryType verifiers[]     = { QUERY_BOOLEAN, QUERY_INTEGER, QUERY_INTEGER64, QUERY_FLOAT };
778
779 #define FOR_EACH_VERIFIER(X) \
780         for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx)   \
781         {                                                                                                                                                                               \
782                 const char* verifierSuffix = getVerifierSuffix(verifiers[verifierNdx]);                         \
783                 const QueryType verifier = verifiers[verifierNdx];                                                                      \
784                 this->addChild(X);                                                                                                                                      \
785         }
786
787         FOR_EACH_VERIFIER(new MaxSamplesCase(m_context,         (std::string() + "max_color_texture_samples_" + verifierSuffix).c_str(),                                "Test GL_MAX_COLOR_TEXTURE_SAMPLES",                    GL_MAX_COLOR_TEXTURE_SAMPLES,           1,      verifier))
788         FOR_EACH_VERIFIER(new MaxSamplesCase(m_context,         (std::string() + "max_depth_texture_samples_" + verifierSuffix).c_str(),                                "Test GL_MAX_DEPTH_TEXTURE_SAMPLES",                    GL_MAX_DEPTH_TEXTURE_SAMPLES,           1,      verifier))
789         FOR_EACH_VERIFIER(new MaxSamplesCase(m_context,         (std::string() + "max_integer_samples_" + verifierSuffix).c_str(),                                              "Test GL_MAX_INTEGER_SAMPLES",                                  GL_MAX_INTEGER_SAMPLES,                         1,      verifier))
790
791         FOR_EACH_VERIFIER(new TexBindingCase(m_context,         (std::string() + "texture_binding_2d_multisample_" + verifierSuffix).c_str(),                   "Test TEXTURE_BINDING_2D_MULTISAMPLE",                  GL_TEXTURE_2D_MULTISAMPLE,                      GL_TEXTURE_BINDING_2D_MULTISAMPLE,                      verifier))
792         FOR_EACH_VERIFIER(new TexBindingCase(m_context,         (std::string() + "texture_binding_2d_multisample_array_" + verifierSuffix).c_str(),             "Test TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY",    GL_TEXTURE_2D_MULTISAMPLE_ARRAY,        GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY,        verifier))
793         FOR_EACH_VERIFIER(new TexBindingCase(m_context,         (std::string() + "texture_binding_cube_map_array_" + verifierSuffix).c_str(),                   "Test TEXTURE_BINDING_CUBE_MAP_ARRAY",                  GL_TEXTURE_CUBE_MAP_ARRAY,                      GL_TEXTURE_BINDING_CUBE_MAP_ARRAY,                      verifier))
794         FOR_EACH_VERIFIER(new TexBindingCase(m_context,         (std::string() + "texture_binding_buffer_" + verifierSuffix).c_str(),                                   "Test TEXTURE_BINDING_BUFFER",                                  GL_TEXTURE_BUFFER,                                      GL_TEXTURE_BINDING_BUFFER,                                      verifier))
795
796         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_vertex_attrib_relative_offset_" + verifierSuffix).c_str(),                "Test MAX_VERTEX_ATTRIB_RELATIVE_OFFSET",               GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET,   2047,   verifier))
797         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_vertex_attrib_bindings_" + verifierSuffix).c_str(),                               "Test MAX_VERTEX_ATTRIB_BINDINGS",                              GL_MAX_VERTEX_ATTRIB_BINDINGS,                  16,             verifier))
798         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_vertex_attrib_stride_" + verifierSuffix).c_str(),                                 "Test MAX_VERTEX_ATTRIB_STRIDE",                                GL_MAX_VERTEX_ATTRIB_STRIDE,                    2048,   verifier))
799         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_sample_mask_words_" + verifierSuffix).c_str(),                                    "Test MAX_SAMPLE_MASK_WORDS",                                   GL_MAX_SAMPLE_MASK_WORDS,                               1,              verifier))
800
801         FOR_EACH_VERIFIER(new AlignmentCase(m_context,          (std::string() + "shader_storage_buffer_offset_alignment_" + verifierSuffix).c_str(),   "Test SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT",  GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT,      256,    verifier))
802
803         FOR_EACH_VERIFIER(new BufferBindingCase(m_context,      (std::string() + "draw_indirect_buffer_binding_" + verifierSuffix).c_str(),                             "Test DRAW_INDIRECT_BUFFER_BINDING",                    GL_DRAW_INDIRECT_BUFFER_BINDING,                GL_DRAW_INDIRECT_BUFFER,                verifier))
804         FOR_EACH_VERIFIER(new BufferBindingCase(m_context,      (std::string() + "atomic_counter_buffer_binding_" + verifierSuffix).c_str(),                    "Test ATOMIC_COUNTER_BUFFER_BINDING",                   GL_ATOMIC_COUNTER_BUFFER_BINDING,               GL_ATOMIC_COUNTER_BUFFER,               verifier))
805         FOR_EACH_VERIFIER(new BufferBindingCase(m_context,      (std::string() + "shader_storage_buffer_binding_" + verifierSuffix).c_str(),                    "Test SHADER_STORAGE_BUFFER_BINDING",                   GL_SHADER_STORAGE_BUFFER_BINDING,               GL_SHADER_STORAGE_BUFFER,               verifier))
806         FOR_EACH_VERIFIER(new BufferBindingCase(m_context,      (std::string() + "dispatch_indirect_buffer_binding_" + verifierSuffix).c_str(),                 "Test DISPATCH_INDIRECT_BUFFER_BINDING",                GL_DISPATCH_INDIRECT_BUFFER_BINDING,    GL_DISPATCH_INDIRECT_BUFFER,    verifier))
807
808         FOR_EACH_VERIFIER(new FramebufferMinimumValueCase(m_context,    (std::string() + "max_framebuffer_width_" + verifierSuffix).c_str(),            "Test MAX_FRAMEBUFFER_WIDTH",                                   GL_MAX_FRAMEBUFFER_WIDTH,                               2048,   GL_MAX_TEXTURE_SIZE,    verifier))
809         FOR_EACH_VERIFIER(new FramebufferMinimumValueCase(m_context,    (std::string() + "max_framebuffer_height_" + verifierSuffix).c_str(),           "Test MAX_FRAMEBUFFER_HEIGHT",                                  GL_MAX_FRAMEBUFFER_HEIGHT,                              2048,   GL_MAX_TEXTURE_SIZE,    verifier))
810         FOR_EACH_VERIFIER(new FramebufferMinimumValueCase(m_context,    (std::string() + "max_framebuffer_samples_" + verifierSuffix).c_str(),          "Test MAX_FRAMEBUFFER_SAMPLES",                                 GL_MAX_FRAMEBUFFER_SAMPLES,                             4,              GL_MAX_SAMPLES,                 verifier))
811
812         FOR_EACH_VERIFIER(new ProgramPipelineBindingCase(m_context,     (std::string() + "program_pipeline_binding_" + verifierSuffix).c_str(),                 "Test PROGRAM_PIPELINE_BINDING",        verifier))
813
814         // vertex
815         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_vertex_atomic_counter_buffers_" + verifierSuffix).c_str(),                "Test MAX_VERTEX_ATOMIC_COUNTER_BUFFERS",               GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS,   0,              verifier))
816         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_vertex_atomic_counters_" + verifierSuffix).c_str(),                               "Test MAX_VERTEX_ATOMIC_COUNTERS",                              GL_MAX_VERTEX_ATOMIC_COUNTERS,                  0,              verifier))
817         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_vertex_image_uniforms_" + verifierSuffix).c_str(),                                "Test MAX_VERTEX_IMAGE_UNIFORMS",                               GL_MAX_VERTEX_IMAGE_UNIFORMS,                   0,              verifier))
818         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_vertex_shader_storage_blocks_" + verifierSuffix).c_str(),                 "Test MAX_VERTEX_SHADER_STORAGE_BLOCKS",                GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS,    0,              verifier))
819         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_vertex_uniform_components_" + verifierSuffix).c_str(),                    "Test MAX_VERTEX_UNIFORM_COMPONENTS",                   GL_MAX_VERTEX_UNIFORM_COMPONENTS,               1024,   verifier))
820
821         // fragment
822         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_fragment_atomic_counter_buffers_" + verifierSuffix).c_str(),              "Test MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS",             GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS, 0,              verifier))
823         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_fragment_atomic_counters_" + verifierSuffix).c_str(),                             "Test MAX_FRAGMENT_ATOMIC_COUNTERS",                    GL_MAX_FRAGMENT_ATOMIC_COUNTERS,                0,              verifier))
824         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_fragment_image_uniforms_" + verifierSuffix).c_str(),                              "Test MAX_FRAGMENT_IMAGE_UNIFORMS",                             GL_MAX_FRAGMENT_IMAGE_UNIFORMS,                 0,              verifier))
825         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_fragment_shader_storage_blocks_" + verifierSuffix).c_str(),               "Test MAX_FRAGMENT_SHADER_STORAGE_BLOCKS",              GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS,  0,              verifier))
826         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_fragment_uniform_components_" + verifierSuffix).c_str(),                  "Test MAX_FRAGMENT_UNIFORM_COMPONENTS",                 GL_MAX_FRAGMENT_UNIFORM_COMPONENTS,             1024,   verifier))
827
828         // compute
829         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_compute_work_group_invocations_" + verifierSuffix).c_str(),               "Test MAX_COMPUTE_WORK_GROUP_INVOCATIONS",              GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS,          128,    verifier))
830         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_compute_uniform_blocks_" + verifierSuffix).c_str(),                               "Test MAX_COMPUTE_UNIFORM_BLOCKS",                              GL_MAX_COMPUTE_UNIFORM_BLOCKS,                          12,             verifier))
831         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_compute_texture_image_units_" + verifierSuffix).c_str(),                  "Test MAX_COMPUTE_TEXTURE_IMAGE_UNITS",                 GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS,                     16,             verifier))
832         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_compute_shared_memory_size_" + verifierSuffix).c_str(),                   "Test MAX_COMPUTE_SHARED_MEMORY_SIZE",                  GL_MAX_COMPUTE_SHARED_MEMORY_SIZE,                      16384,  verifier))
833         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_compute_uniform_components_" + verifierSuffix).c_str(),                   "Test MAX_COMPUTE_UNIFORM_COMPONENTS",                  GL_MAX_COMPUTE_UNIFORM_COMPONENTS,                      1024,   verifier))
834         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_compute_atomic_counter_buffers_" + verifierSuffix).c_str(),               "Test MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS",              GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS,          1,              verifier))
835         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_compute_atomic_counters_" + verifierSuffix).c_str(),                              "Test MAX_COMPUTE_ATOMIC_COUNTERS",                             GL_MAX_COMPUTE_ATOMIC_COUNTERS,                         8,              verifier))
836         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_compute_image_uniforms_" + verifierSuffix).c_str(),                               "Test MAX_COMPUTE_IMAGE_UNIFORMS",                              GL_MAX_COMPUTE_IMAGE_UNIFORMS,                          4,              verifier))
837         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_compute_shader_storage_blocks_" + verifierSuffix).c_str(),                "Test MAX_COMPUTE_SHADER_STORAGE_BLOCKS",               GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS,           4,              verifier))
838
839         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_uniform_locations_" + verifierSuffix).c_str(),                                    "Test MAX_UNIFORM_LOCATIONS",                                   GL_MAX_UNIFORM_LOCATIONS,                                       1024,   verifier))
840         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_atomic_counter_buffer_bindings_" + verifierSuffix).c_str(),               "Test MAX_ATOMIC_COUNTER_BUFFER_BINDINGS",              GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS,          1,              verifier))
841         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_atomic_counter_buffer_size_" + verifierSuffix).c_str(),                   "Test MAX_ATOMIC_COUNTER_BUFFER_SIZE",                  GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE,                      32,             verifier))
842         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_combined_atomic_counter_buffers_" + verifierSuffix).c_str(),              "Test MAX_COMBINED_ATOMIC_COUNTER_BUFFERS",             GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS,         1,              verifier))
843         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_combined_atomic_counters_" + verifierSuffix).c_str(),                             "Test MAX_COMBINED_ATOMIC_COUNTERS",                    GL_MAX_COMBINED_ATOMIC_COUNTERS,                        8,              verifier))
844         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_image_units_" + verifierSuffix).c_str(),                                                  "Test MAX_IMAGE_UNITS",                                                 GL_MAX_IMAGE_UNITS,                                                     4,              verifier))
845         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_combined_image_uniforms_" + verifierSuffix).c_str(),                              "Test MAX_COMBINED_IMAGE_UNIFORMS",                             GL_MAX_COMBINED_IMAGE_UNIFORMS,                         4,              verifier))
846         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_shader_storage_buffer_bindings_" + verifierSuffix).c_str(),               "Test MAX_SHADER_STORAGE_BUFFER_BINDINGS",              GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS,          4,              verifier))
847         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_shader_storage_block_size_" + verifierSuffix).c_str(),                    "Test MAX_SHADER_STORAGE_BLOCK_SIZE",                   GL_MAX_SHADER_STORAGE_BLOCK_SIZE,                       1<<27,  verifier))
848         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_combined_shader_storage_blocks_" + verifierSuffix).c_str(),               "Test MAX_COMBINED_SHADER_STORAGE_BLOCKS",              GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS,          4,              verifier))
849         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_combined_shader_output_resources_" + verifierSuffix).c_str(),             "Test MAX_COMBINED_SHADER_OUTPUT_RESOURCES",    GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES,        4,              verifier))
850
851         FOR_EACH_VERIFIER(new MaxUniformBufferBindingsCase      (m_context,     (std::string() + "max_uniform_buffer_bindings_" + verifierSuffix).c_str(),                              "Test MAX_UNIFORM_BUFFER_BINDINGS",                             verifier))
852         FOR_EACH_VERIFIER(new MaxCombinedUniformBlocksCase      (m_context,     (std::string() + "max_combined_uniform_blocks_" + verifierSuffix).c_str(),                              "Test MAX_COMBINED_UNIFORM_BLOCKS",                             verifier))
853         FOR_EACH_VERIFIER(new MaxCombinedTexImageUnitsCase      (m_context,     (std::string() + "max_combined_texture_image_units_" + verifierSuffix).c_str(),                 "Test MAX_COMBINED_TEXTURE_IMAGE_UNITS",                verifier))
854         FOR_EACH_VERIFIER(new CombinedUniformComponentsCase     (m_context,     (std::string() + "max_combined_compute_uniform_components_" + verifierSuffix).c_str(),  "Test MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS", GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS, verifier))
855
856         FOR_EACH_VERIFIER(new LegacyVectorLimitCase(m_context,  (std::string() + "max_vertex_uniform_vectors_" + verifierSuffix).c_str(),                       "Test MAX_VERTEX_UNIFORM_VECTORS",                              GL_MAX_VERTEX_UNIFORM_VECTORS,                  GL_MAX_VERTEX_UNIFORM_COMPONENTS,       verifier))
857         FOR_EACH_VERIFIER(new LegacyVectorLimitCase(m_context,  (std::string() + "max_fragment_uniform_vectors_" + verifierSuffix).c_str(),                     "Test MAX_FRAGMENT_UNIFORM_VECTORS",                    GL_MAX_FRAGMENT_UNIFORM_VECTORS,                GL_MAX_FRAGMENT_UNIFORM_COMPONENTS,     verifier))
858
859         FOR_EACH_VERIFIER(new TextureGatherLimitCase(m_context, (std::string() + "min_program_texture_gather_offset_" + verifierSuffix).c_str(),        "Test MIN_PROGRAM_TEXTURE_GATHER_OFFSET",               false,          verifier))
860         FOR_EACH_VERIFIER(new TextureGatherLimitCase(m_context, (std::string() + "max_program_texture_gather_offset_" + verifierSuffix).c_str(),        "Test MAX_PROGRAM_TEXTURE_GATHER_OFFSET",               true,           verifier))
861
862         // GL ES 3.2 tests
863         FOR_EACH_VERIFIER(new MinimumValueCase  (m_context,     (std::string() + "max_framebuffer_layers_" + verifierSuffix).c_str(),                                           "Test MAX_FRAMEBUFFER_LAYERS",                                          GL_MAX_FRAMEBUFFER_LAYERS,                                              256,    verifier,       glu::ApiType::es(3, 2)))
864         FOR_EACH_VERIFIER(new MinimumValueCase  (m_context,     (std::string() + "fragment_interpolation_offset_bits_" + verifierSuffix).c_str(),                       "Test FRAGMENT_INTERPOLATION_OFFSET_BITS",                      GL_FRAGMENT_INTERPOLATION_OFFSET_BITS,                  4,              verifier,       glu::ApiType::es(3, 2)))
865         FOR_EACH_VERIFIER(new MinimumValueCase  (m_context,     (std::string() + "max_texture_buffer_size_" + verifierSuffix).c_str(),                                          "Test MAX_TEXTURE_BUFFER_SIZE",                                         GL_MAX_TEXTURE_BUFFER_SIZE,                                             65536,  verifier,       glu::ApiType::es(3, 2)))
866         FOR_EACH_VERIFIER(new AlignmentCase             (m_context,     (std::string() + "texture_buffer_offset_alignment_" + verifierSuffix).c_str(),                          "Test TEXTURE_BUFFER_OFFSET_ALIGNMENT",                         GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT,                             256,    verifier,       glu::ApiType::es(3, 2)))
867
868         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_gen_level_" + verifierSuffix).c_str(),                                                       "Test MAX_TESS_GEN_LEVEL",                                                      GL_MAX_TESS_GEN_LEVEL,                                                  64,             verifier,       glu::ApiType::es(3, 2)))
869         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_patch_vertices_" + verifierSuffix).c_str(),                                                       "Test MAX_PATCH_VERTICES",                                                      GL_MAX_PATCH_VERTICES,                                                  32,             verifier,       glu::ApiType::es(3, 2)))
870         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_patch_components_" + verifierSuffix).c_str(),                                        "Test MAX_TESS_PATCH_COMPONENTS",                                       GL_MAX_TESS_PATCH_COMPONENTS,                                   120,    verifier,       glu::ApiType::es(3, 2)))
871
872         // tess control
873         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_control_uniform_components_" + verifierSuffix).c_str(),                      "Test MAX_TESS_CONTROL_UNIFORM_COMPONENTS",                     GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS,                 1024,   verifier,       glu::ApiType::es(3, 2)))
874         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_control_texture_image_units_" + verifierSuffix).c_str(),                     "Test MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS",            GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS,                16,             verifier,       glu::ApiType::es(3, 2)))
875         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_control_output_components_" + verifierSuffix).c_str(),                       "Test MAX_TESS_CONTROL_OUTPUT_COMPONENTS",                      GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS,                  64,             verifier,       glu::ApiType::es(3, 2)))
876         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_control_total_output_components_" + verifierSuffix).c_str(),         "Test MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS",        GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS,    2048,   verifier,       glu::ApiType::es(3, 2)))
877         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_control_input_components_" + verifierSuffix).c_str(),                        "Test MAX_TESS_CONTROL_INPUT_COMPONENTS",                       GL_MAX_TESS_CONTROL_INPUT_COMPONENTS,                   64,             verifier,       glu::ApiType::es(3, 2)))
878         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_control_uniform_blocks_" + verifierSuffix).c_str(),                          "Test MAX_TESS_CONTROL_UNIFORM_BLOCKS",                         GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS,                             12,             verifier,       glu::ApiType::es(3, 2)))
879         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_control_atomic_counter_buffers_" + verifierSuffix).c_str(),          "Test MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS",         GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS,             0,              verifier,       glu::ApiType::es(3, 2)))
880         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_control_atomic_counters_" + verifierSuffix).c_str(),                         "Test MAX_TESS_CONTROL_ATOMIC_COUNTERS",                        GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS,                    0,              verifier,       glu::ApiType::es(3, 2)))
881         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_control_shader_storage_blocks_" + verifierSuffix).c_str(),           "Test MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS",          GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS,              0,              verifier,       glu::ApiType::es(3, 2)))
882
883         // tess evaluation
884         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_evaluation_uniform_components_" + verifierSuffix).c_str(),           "Test MAX_TESS_EVALUATION_UNIFORM_COMPONENTS",          GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS,              1024,   verifier,       glu::ApiType::es(3, 2)))
885         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_evaluation_texture_image_units_" + verifierSuffix).c_str(),          "Test MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS",         GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS,             16,             verifier,       glu::ApiType::es(3, 2)))
886         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_evaluation_output_components_" + verifierSuffix).c_str(),            "Test MAX_TESS_EVALUATION_OUTPUT_COMPONENTS",           GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS,               64,             verifier,       glu::ApiType::es(3, 2)))
887         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_evaluation_input_components_" + verifierSuffix).c_str(),                     "Test MAX_TESS_EVALUATION_INPUT_COMPONENTS",            GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS,                64,             verifier,       glu::ApiType::es(3, 2)))
888         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_evaluation_uniform_blocks_" + verifierSuffix).c_str(),                       "Test MAX_TESS_EVALUATION_UNIFORM_BLOCKS",                      GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS,                  12,             verifier,       glu::ApiType::es(3, 2)))
889         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_evaluation_atomic_counter_buffers_" + verifierSuffix).c_str(),       "Test MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS",      GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS,  0,              verifier,       glu::ApiType::es(3, 2)))
890         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_evaluation_atomic_counters_" + verifierSuffix).c_str(),                      "Test MAX_TESS_EVALUATION_ATOMIC_COUNTERS",                     GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS,                 0,              verifier,       glu::ApiType::es(3, 2)))
891         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_evaluation_shader_storage_blocks_" + verifierSuffix).c_str(),        "Test MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS",       GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS,   0,              verifier,       glu::ApiType::es(3, 2)))
892
893         // geometry
894         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_geometry_uniform_components_" + verifierSuffix).c_str(),                          "Test MAX_GEOMETRY_UNIFORM_COMPONENTS",                         GL_MAX_GEOMETRY_UNIFORM_COMPONENTS,                             1024,   verifier,       glu::ApiType::es(3, 2)))
895         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_geometry_uniform_blocks_" + verifierSuffix).c_str(),                                      "Test MAX_GEOMETRY_UNIFORM_BLOCKS",                                     GL_MAX_GEOMETRY_UNIFORM_BLOCKS,                                 12,             verifier,       glu::ApiType::es(3, 2)))
896         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_geometry_input_components_" + verifierSuffix).c_str(),                            "Test MAX_GEOMETRY_INPUT_COMPONENTS",                           GL_MAX_GEOMETRY_INPUT_COMPONENTS,                               64,             verifier,       glu::ApiType::es(3, 2)))
897         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_geometry_output_components_" + verifierSuffix).c_str(),                           "Test MAX_GEOMETRY_OUTPUT_COMPONENTS",                          GL_MAX_GEOMETRY_OUTPUT_COMPONENTS,                              64,             verifier,       glu::ApiType::es(3, 2)))
898         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_geometry_output_vertices_" + verifierSuffix).c_str(),                                     "Test MAX_GEOMETRY_OUTPUT_VERTICES",                            GL_MAX_GEOMETRY_OUTPUT_VERTICES,                                256,    verifier,       glu::ApiType::es(3, 2)))
899         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_geometry_total_output_components_" + verifierSuffix).c_str(),                     "Test MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS",            GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS,                1024,   verifier,       glu::ApiType::es(3, 2)))
900         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_geometry_texture_image_units_" + verifierSuffix).c_str(),                         "Test MAX_GEOMETRY_TEXTURE_IMAGE_UNITS",                        GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS,                    16,             verifier,       glu::ApiType::es(3, 2)))
901         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_geometry_shader_invocations_" + verifierSuffix).c_str(),                          "Test MAX_GEOMETRY_SHADER_INVOCATIONS",                         GL_MAX_GEOMETRY_SHADER_INVOCATIONS,                             32,             verifier,       glu::ApiType::es(3, 2)))
902         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_geometry_atomic_counter_buffers_" + verifierSuffix).c_str(),                      "Test MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS",                     GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS,                 0,              verifier,       glu::ApiType::es(3, 2)))
903         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_geometry_atomic_counters_" + verifierSuffix).c_str(),                                     "Test MAX_GEOMETRY_ATOMIC_COUNTERS",                            GL_MAX_GEOMETRY_ATOMIC_COUNTERS,                                0,              verifier,       glu::ApiType::es(3, 2)))
904         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_geometry_shader_storage_blocks_" + verifierSuffix).c_str(),                       "Test MAX_GEOMETRY_SHADER_STORAGE_BLOCKS",                      GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS,                  0,              verifier,       glu::ApiType::es(3, 2)))
905
906         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_control_image_uniforms_" + verifierSuffix).c_str(),                          "Test MAX_TESS_CONTROL_IMAGE_UNIFORMS",                         GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS,                             0,              verifier,       glu::ApiType::es(3, 2)))
907         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_tess_evaluation_image_uniforms_" + verifierSuffix).c_str(),                       "Test MAX_TESS_EVALUATION_IMAGE_UNIFORMS",                      GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS,                  0,              verifier,       glu::ApiType::es(3, 2)))
908         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_geometry_image_uniforms_" + verifierSuffix).c_str(),                                      "Test MAX_GEOMETRY_IMAGE_UNIFORMS",                                     GL_MAX_GEOMETRY_IMAGE_UNIFORMS,                                 0,              verifier,       glu::ApiType::es(3, 2)))
909
910         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "debug_logged_messages_" + verifierSuffix).c_str(),                                            "Test DEBUG_LOGGED_MESSAGES",                                           GL_DEBUG_LOGGED_MESSAGES,                                               0,              verifier,       glu::ApiType::es(3, 2)))
911         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "debug_next_logged_message_length_" + verifierSuffix).c_str(),                         "Test DEBUG_NEXT_LOGGED_MESSAGE_LENGTH",                        GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH,                    0,              verifier,       glu::ApiType::es(3, 2)))
912         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "debug_group_stack_depth_" + verifierSuffix).c_str(),                                          "Test DEBUG_GROUP_STACK_DEPTH",                                         GL_DEBUG_GROUP_STACK_DEPTH,                                             0,              verifier,       glu::ApiType::es(3, 2)))
913         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_debug_message_length_" + verifierSuffix).c_str(),                                         "Test MAX_DEBUG_MESSAGE_LENGTH",                                        GL_MAX_DEBUG_MESSAGE_LENGTH,                                    1,              verifier,       glu::ApiType::es(3, 2)))
914         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_debug_logged_messages_" + verifierSuffix).c_str(),                                        "Test MAX_DEBUG_LOGGED_MESSAGES",                                       GL_MAX_DEBUG_LOGGED_MESSAGES,                                   1,              verifier,       glu::ApiType::es(3, 2)))
915         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_debug_group_stack_depth_" + verifierSuffix).c_str(),                                      "Test MAX_DEBUG_GROUP_STACK_DEPTH",                                     GL_MAX_DEBUG_GROUP_STACK_DEPTH,                                 64,             verifier,       glu::ApiType::es(3, 2)))
916         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "max_label_length_" + verifierSuffix).c_str(),                                                         "Test MAX_LABEL_LENGTH",                                                        GL_MAX_LABEL_LENGTH,                                                    256,    verifier,       glu::ApiType::es(3, 2)))
917
918         FOR_EACH_VERIFIER(new MinimumValueCase(m_context,       (std::string() + "texture_buffer_binding_" + verifierSuffix).c_str(),                                           "Test TEXTURE_BUFFER_BINDING",                                          GL_TEXTURE_BUFFER_BINDING,                                              0,              verifier,       glu::ApiType::es(3, 2)))
919
920         FOR_EACH_VERIFIER(new CombinedUniformComponentsCase     (m_context,     (std::string() + "max_combined_tess_control_uniform_components_" + verifierSuffix).c_str(),             "Test MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS",    GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS,        verifier,       glu::ApiType::es(3, 2)))
921         FOR_EACH_VERIFIER(new CombinedUniformComponentsCase     (m_context,     (std::string() + "max_combined_tess_evaluation_uniform_components_" + verifierSuffix).c_str(),  "Test MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS", GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS, verifier,   glu::ApiType::es(3, 2)))
922         FOR_EACH_VERIFIER(new CombinedUniformComponentsCase     (m_context,     (std::string() + "max_combined_geometry_uniform_components_" + verifierSuffix).c_str(),                 "Test MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS",                GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS,            verifier,       glu::ApiType::es(3, 2)))
923
924 #undef FOR_EACH_VERIFIER
925 }
926
927 } // Functional
928 } // gles31
929 } // deqp