Fix PIPELINE_STAGE_TOP_OF_PIPE_BIT usage in api tests
[platform/upstream/VK-GL-CTS.git] / modules / gles31 / functional / es31fIndexedStateQueryTests.cpp
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES 3.1 Module
3  * -------------------------------------------------
4  *
5  * Copyright 2015 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 Indexed state query tests
22  *//*--------------------------------------------------------------------*/
23
24 #include "es31fIndexedStateQueryTests.hpp"
25 #include "tcuTestLog.hpp"
26 #include "tcuFormatUtil.hpp"
27 #include "gluRenderContext.hpp"
28 #include "gluCallLogWrapper.hpp"
29 #include "gluStrUtil.hpp"
30 #include "gluContextInfo.hpp"
31 #include "gluObjectWrapper.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 static const char* getVerifierSuffix (QueryType type)
50 {
51         switch (type)
52         {
53                 case QUERY_INDEXED_BOOLEAN:                     return "getbooleani_v";
54                 case QUERY_INDEXED_INTEGER:                     return "getintegeri_v";
55                 case QUERY_INDEXED_INTEGER64:           return "getinteger64i_v";
56                 case QUERY_INDEXED_BOOLEAN_VEC4:        return "getbooleani_v";
57                 case QUERY_INDEXED_INTEGER_VEC4:        return "getintegeri_v";
58                 case QUERY_INDEXED_INTEGER64_VEC4:      return "getinteger64i_v";
59                 case QUERY_INDEXED_ISENABLED:           return "isenabledi";
60                 default:
61                         DE_ASSERT(DE_FALSE);
62                         return DE_NULL;
63         }
64 }
65
66 void isExtensionSupported (Context& context, std::string extensionName)
67 {
68         if (extensionName == "GL_EXT_draw_buffers_indexed" || extensionName == "GL_KHR_blend_equation_advanced")
69         {
70                 if (!contextSupports(context.getRenderContext().getType(), glu::ApiType::es(3, 2)) && !context.getContextInfo().isExtensionSupported(extensionName.c_str()))
71                         TCU_THROW(NotSupportedError, (std::string("Extension ") + extensionName + std::string(" not supported.")).c_str());
72         }
73         else if (!context.getContextInfo().isExtensionSupported(extensionName.c_str()))
74                 TCU_THROW(NotSupportedError, (std::string("Extension ") + extensionName + std::string(" not supported.")).c_str());
75 }
76
77 class SampleMaskCase : public TestCase
78 {
79 public:
80                                                 SampleMaskCase  (Context& context, const char* name, const char* desc, QueryType verifierType);
81
82 private:
83         void                            init                    (void);
84         IterateResult           iterate                 (void);
85
86         const QueryType         m_verifierType;
87         int                                     m_maxSampleMaskWords;
88 };
89
90 SampleMaskCase::SampleMaskCase (Context& context, const char* name, const char* desc, QueryType verifierType)
91         : TestCase                              (context, name, desc)
92         , m_verifierType                (verifierType)
93         , m_maxSampleMaskWords  (-1)
94 {
95 }
96
97 void SampleMaskCase::init (void)
98 {
99         const glw::Functions& gl = m_context.getRenderContext().getFunctions();
100
101         gl.getIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &m_maxSampleMaskWords);
102         GLU_EXPECT_NO_ERROR(gl.getError(), "query sample mask words");
103
104         // mask word count ok?
105         if (m_maxSampleMaskWords <= 0)
106                 throw tcu::TestError("Minimum value of GL_MAX_SAMPLE_MASK_WORDS is 1. Got " + de::toString(m_maxSampleMaskWords));
107
108         m_testCtx.getLog() << tcu::TestLog::Message << "GL_MAX_SAMPLE_MASK_WORDS = " << m_maxSampleMaskWords << tcu::TestLog::EndMessage;
109 }
110
111 SampleMaskCase::IterateResult SampleMaskCase::iterate (void)
112 {
113         glu::CallLogWrapper             gl              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
114         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
115
116         gl.enableLogging(true);
117
118         // initial values
119         {
120                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "initial", "Initial values");
121
122                 for (int ndx = 0; ndx < m_maxSampleMaskWords; ++ndx)
123                         verifyStateIndexedInteger(result, gl, GL_SAMPLE_MASK_VALUE, ndx, -1, m_verifierType);
124         }
125
126         // fixed values
127         {
128                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "fixed", "Fixed values");
129
130                 for (int ndx = 0; ndx < m_maxSampleMaskWords; ++ndx)
131                 {
132                         gl.glSampleMaski(ndx, 0);
133                         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glSampleMaski");
134
135                         verifyStateIndexedInteger(result, gl, GL_SAMPLE_MASK_VALUE, ndx, 0, m_verifierType);
136                 }
137         }
138
139         // random masks
140         {
141                 const int                                       numRandomTest   = 20;
142                 const tcu::ScopedLogSection section                     (m_testCtx.getLog(), "random", "Random values");
143                 de::Random                                      rnd                             (0x4312);
144
145                 for (int testNdx = 0; testNdx < numRandomTest; ++testNdx)
146                 {
147                         const glw::GLint        maskIndex               = (glw::GLint)(rnd.getUint32() % m_maxSampleMaskWords);
148                         glw::GLint                      mask                    = (glw::GLint)(rnd.getUint32());
149
150                         gl.glSampleMaski(maskIndex, mask);
151                         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glSampleMaski");
152
153                         verifyStateIndexedInteger(result, gl, GL_SAMPLE_MASK_VALUE, maskIndex, mask, m_verifierType);
154                 }
155         }
156
157         result.setTestContextResult(m_testCtx);
158         return STOP;
159 }
160
161 class MinValueIndexed3Case : public TestCase
162 {
163 public:
164                                                 MinValueIndexed3Case    (Context& context, const char* name, const char* desc, glw::GLenum target, const tcu::IVec3& ref, QueryType verifierType);
165
166 private:
167         IterateResult           iterate                                 (void);
168
169         const glw::GLenum       m_target;
170         const tcu::IVec3        m_ref;
171         const QueryType         m_verifierType;
172 };
173
174 MinValueIndexed3Case::MinValueIndexed3Case (Context& context, const char* name, const char* desc, glw::GLenum target, const tcu::IVec3& ref, QueryType verifierType)
175         : TestCase                              (context, name, desc)
176         , m_target                              (target)
177         , m_ref                                 (ref)
178         , m_verifierType                (verifierType)
179 {
180 }
181
182 MinValueIndexed3Case::IterateResult MinValueIndexed3Case::iterate (void)
183 {
184         glu::CallLogWrapper             gl              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
185         tcu::ResultCollector    result  (m_testCtx.getLog(), " // ERROR: ");
186
187         gl.enableLogging(true);
188
189         for (int ndx = 0; ndx < 3; ++ndx)
190         {
191                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Element", "Element " + de::toString(ndx));
192
193                 verifyStateIndexedIntegerMin(result, gl, m_target, ndx, m_ref[ndx], m_verifierType);
194         }
195
196         result.setTestContextResult(m_testCtx);
197         return STOP;
198 }
199
200 class BufferBindingCase : public TestCase
201 {
202 public:
203                                                 BufferBindingCase       (Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bufferTarget, glw::GLenum numBindingsTarget, QueryType verifierType);
204
205 private:
206         IterateResult           iterate                         (void);
207
208         const glw::GLenum       m_queryTarget;
209         const glw::GLenum       m_bufferTarget;
210         const glw::GLenum       m_numBindingsTarget;
211         const QueryType         m_verifierType;
212 };
213
214 BufferBindingCase::BufferBindingCase (Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bufferTarget, glw::GLenum numBindingsTarget, QueryType verifierType)
215         : TestCase                              (context, name, desc)
216         , m_queryTarget                 (queryTarget)
217         , m_bufferTarget                (bufferTarget)
218         , m_numBindingsTarget   (numBindingsTarget)
219         , m_verifierType                (verifierType)
220 {
221 }
222
223 BufferBindingCase::IterateResult BufferBindingCase::iterate (void)
224 {
225         glu::CallLogWrapper             gl                      (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
226         tcu::ResultCollector    result          (m_testCtx.getLog(), " // ERROR: ");
227         int                                             maxBindings     = -1;
228
229         gl.enableLogging(true);
230
231         gl.glGetIntegerv(m_numBindingsTarget, &maxBindings);
232         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
233
234         {
235                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
236
237                 for (int ndx = 0; ndx < maxBindings; ++ndx)
238                         verifyStateIndexedInteger(result, gl, m_queryTarget, ndx, 0, m_verifierType);
239         }
240
241         {
242                 const tcu::ScopedLogSection     superSection    (m_testCtx.getLog(), "AfterSetting", "After setting");
243                 glu::Buffer                                     bufferA                 (m_context.getRenderContext());
244                 glu::Buffer                                     bufferB                 (m_context.getRenderContext());
245                 const int                                       ndxA                    = 0;
246                 const int                                       ndxB                    = maxBindings / 2;
247
248                 {
249                         const tcu::ScopedLogSection section(m_testCtx.getLog(), "Generic", "After setting generic binding point");
250
251                         gl.glBindBuffer(m_bufferTarget, *bufferA);
252                         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glBindBuffer");
253
254                         verifyStateIndexedInteger(result, gl, m_queryTarget, 0, 0, m_verifierType);
255                 }
256                 {
257                         const tcu::ScopedLogSection     section(m_testCtx.getLog(), "Indexed", "After setting with glBindBufferBase");
258
259                         gl.glBindBufferBase(m_bufferTarget, ndxA, *bufferA);
260                         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glBindBufferBase");
261
262                         verifyStateIndexedInteger(result, gl, m_queryTarget, ndxA, *bufferA, m_verifierType);
263                 }
264                 {
265                         const tcu::ScopedLogSection     section(m_testCtx.getLog(), "Indexed", "After setting with glBindBufferRange");
266
267                         gl.glBindBufferRange(m_bufferTarget, ndxB, *bufferB, 0, 8);
268                         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glBindBufferRange");
269
270                         verifyStateIndexedInteger(result, gl, m_queryTarget, ndxB, *bufferB, m_verifierType);
271                 }
272                 if (ndxA != ndxB)
273                 {
274                         const tcu::ScopedLogSection     section(m_testCtx.getLog(), "DifferentStates", "Original state did not change");
275
276                         verifyStateIndexedInteger(result, gl, m_queryTarget, ndxA, *bufferA, m_verifierType);
277                 }
278         }
279
280         result.setTestContextResult(m_testCtx);
281         return STOP;
282 }
283
284 class BufferStartCase : public TestCase
285 {
286 public:
287                                                 BufferStartCase         (Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bufferTarget, glw::GLenum numBindingsTarget, QueryType verifierType);
288
289 private:
290         IterateResult           iterate                         (void);
291
292         const glw::GLenum       m_queryTarget;
293         const glw::GLenum       m_bufferTarget;
294         const glw::GLenum       m_numBindingsTarget;
295         const QueryType         m_verifierType;
296 };
297
298 BufferStartCase::BufferStartCase (Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bufferTarget, glw::GLenum numBindingsTarget, QueryType verifierType)
299         : TestCase                              (context, name, desc)
300         , m_queryTarget                 (queryTarget)
301         , m_bufferTarget                (bufferTarget)
302         , m_numBindingsTarget   (numBindingsTarget)
303         , m_verifierType                (verifierType)
304 {
305 }
306
307 BufferStartCase::IterateResult BufferStartCase::iterate (void)
308 {
309         glu::CallLogWrapper             gl                      (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
310         tcu::ResultCollector    result          (m_testCtx.getLog(), " // ERROR: ");
311         int                                             maxBindings     = -1;
312
313         gl.enableLogging(true);
314
315         gl.glGetIntegerv(m_numBindingsTarget, &maxBindings);
316         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
317
318         {
319                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
320
321                 for (int ndx = 0; ndx < maxBindings; ++ndx)
322                         verifyStateIndexedInteger(result, gl, m_queryTarget, ndx, 0, m_verifierType);
323         }
324
325
326         {
327                 const tcu::ScopedLogSection     superSection    (m_testCtx.getLog(), "AfterSetting", "After setting");
328                 glu::Buffer                                     bufferA                 (m_context.getRenderContext());
329                 glu::Buffer                                     bufferB                 (m_context.getRenderContext());
330                 const int                                       ndxA                    = 0;
331                 const int                                       ndxB                    = maxBindings / 2;
332                 int                                                     offset                  = -1;
333
334                 if (m_bufferTarget == GL_ATOMIC_COUNTER_BUFFER)
335                         offset = 4;
336                 else if (m_bufferTarget == GL_SHADER_STORAGE_BUFFER)
337                 {
338                         gl.glGetIntegerv(GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT, &offset);
339                         GLU_EXPECT_NO_ERROR(gl.glGetError(), "get align");
340                 }
341                 else
342                         DE_ASSERT(false);
343
344                 TCU_CHECK(offset >= 0);
345
346                 {
347                         const tcu::ScopedLogSection     section(m_testCtx.getLog(), "Generic", "After setting generic binding point");
348
349                         gl.glBindBuffer(m_bufferTarget, *bufferA);
350                         gl.glBufferData(m_bufferTarget, 16, DE_NULL, GL_DYNAMIC_READ);
351                         gl.glBindBuffer(m_bufferTarget, *bufferB);
352                         gl.glBufferData(m_bufferTarget, 32, DE_NULL, GL_DYNAMIC_READ);
353                         GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen bufs");
354
355                         verifyStateIndexedInteger(result, gl, m_queryTarget, 0, 0, m_verifierType);
356                 }
357                 {
358                         const tcu::ScopedLogSection     section(m_testCtx.getLog(), "Indexed", "After setting with glBindBufferBase");
359
360                         gl.glBindBufferBase(m_bufferTarget, ndxA, *bufferA);
361                         GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind buf");
362
363                         verifyStateIndexedInteger(result, gl, m_queryTarget, ndxA, 0, m_verifierType);
364                 }
365                 {
366                         const tcu::ScopedLogSection     section(m_testCtx.getLog(), "Indexed", "After setting with glBindBufferRange");
367
368                         gl.glBindBufferRange(m_bufferTarget, ndxB, *bufferB, offset, 8);
369                         GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind buf");
370
371                         verifyStateIndexedInteger(result, gl, m_queryTarget, ndxB, offset, m_verifierType);
372                 }
373                 if (ndxA != ndxB)
374                 {
375                         const tcu::ScopedLogSection     section(m_testCtx.getLog(), "DifferentStates", "Original state did not change");
376
377                         verifyStateIndexedInteger(result, gl, m_queryTarget, ndxA, 0, m_verifierType);
378                 }
379         }
380
381         result.setTestContextResult(m_testCtx);
382         return STOP;
383 }
384
385 class BufferSizeCase : public TestCase
386 {
387 public:
388                                                 BufferSizeCase  (Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bufferTarget, glw::GLenum numBindingsTarget, QueryType verifierType);
389
390 private:
391         IterateResult           iterate                 (void);
392
393         const glw::GLenum       m_queryTarget;
394         const glw::GLenum       m_bufferTarget;
395         const glw::GLenum       m_numBindingsTarget;
396         const QueryType         m_verifierType;
397 };
398
399 BufferSizeCase::BufferSizeCase (Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bufferTarget, glw::GLenum numBindingsTarget, QueryType verifierType)
400         : TestCase                              (context, name, desc)
401         , m_queryTarget                 (queryTarget)
402         , m_bufferTarget                (bufferTarget)
403         , m_numBindingsTarget   (numBindingsTarget)
404         , m_verifierType                (verifierType)
405 {
406 }
407
408 BufferSizeCase::IterateResult BufferSizeCase::iterate (void)
409 {
410         glu::CallLogWrapper             gl                      (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
411         tcu::ResultCollector    result          (m_testCtx.getLog(), " // ERROR: ");
412         int                                             maxBindings     = -1;
413
414         gl.enableLogging(true);
415
416         gl.glGetIntegerv(m_numBindingsTarget, &maxBindings);
417         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
418
419         {
420                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
421
422                 for (int ndx = 0; ndx < maxBindings; ++ndx)
423                         verifyStateIndexedInteger(result, gl, m_queryTarget, ndx, 0, m_verifierType);
424         }
425
426         {
427                 const tcu::ScopedLogSection     superSection    (m_testCtx.getLog(), "AfterSetting", "After setting");
428                 glu::Buffer                                     bufferA                 (m_context.getRenderContext());
429                 glu::Buffer                                     bufferB                 (m_context.getRenderContext());
430                 const int                                       ndxA                    = 0;
431                 const int                                       ndxB                    = maxBindings / 2;
432
433                 {
434                         const tcu::ScopedLogSection     section(m_testCtx.getLog(), "Generic", "After setting generic binding point");
435
436                         gl.glBindBuffer(m_bufferTarget, *bufferA);
437                         gl.glBufferData(m_bufferTarget, 16, DE_NULL, GL_DYNAMIC_READ);
438                         gl.glBindBuffer(m_bufferTarget, *bufferB);
439                         gl.glBufferData(m_bufferTarget, 32, DE_NULL, GL_DYNAMIC_READ);
440                         GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen bufs");
441
442                         verifyStateIndexedInteger(result, gl, m_queryTarget, 0, 0, m_verifierType);
443                 }
444                 {
445                         const tcu::ScopedLogSection     section(m_testCtx.getLog(), "Indexed", "After setting with glBindBufferBase");
446
447                         gl.glBindBufferBase(m_bufferTarget, ndxA, *bufferA);
448                         GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind buf");
449
450                         verifyStateIndexedInteger(result, gl, m_queryTarget, ndxA, 0, m_verifierType);
451                 }
452                 {
453                         const tcu::ScopedLogSection     section(m_testCtx.getLog(), "Indexed", "After setting with glBindBufferRange");
454
455                         gl.glBindBufferRange(m_bufferTarget, ndxB, *bufferB, 0, 8);
456                         GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind buf");
457
458                         verifyStateIndexedInteger(result, gl, m_queryTarget, ndxB, 8, m_verifierType);
459                 }
460                 if (ndxA != ndxB)
461                 {
462                         const tcu::ScopedLogSection     section(m_testCtx.getLog(), "DifferentStates", "Original state did not change");
463
464                         verifyStateIndexedInteger(result, gl, m_queryTarget, ndxA, 0, m_verifierType);
465                 }
466         }
467
468         result.setTestContextResult(m_testCtx);
469         return STOP;
470 }
471
472 class ImageBindingNameCase : public TestCase
473 {
474 public:
475                                                 ImageBindingNameCase    (Context& context, const char* name, const char* desc, QueryType verifierType);
476
477 private:
478         IterateResult           iterate                                 (void);
479
480         const QueryType         m_verifierType;
481 };
482
483 ImageBindingNameCase::ImageBindingNameCase (Context& context, const char* name, const char* desc, QueryType verifierType)
484         : TestCase                      (context, name, desc)
485         , m_verifierType        (verifierType)
486 {
487 }
488
489 ImageBindingNameCase::IterateResult ImageBindingNameCase::iterate (void)
490 {
491         glu::CallLogWrapper             gl                      (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
492         tcu::ResultCollector    result          (m_testCtx.getLog(), " // ERROR: ");
493         int                                             maxImages       = -1;
494
495         gl.enableLogging(true);
496
497         gl.glGetIntegerv(GL_MAX_IMAGE_UNITS, &maxImages);
498         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
499
500         {
501                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
502
503                 for (int ndx = 0; ndx < maxImages; ++ndx)
504                         verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_NAME, ndx, 0, m_verifierType);
505         }
506
507         {
508                 const tcu::ScopedLogSection     superSection    (m_testCtx.getLog(), "AfterSetting", "After setting");
509                 glu::Texture                            textureA                (m_context.getRenderContext());
510                 glu::Texture                            textureB                (m_context.getRenderContext());
511                 const int                                       ndxA                    = 0;
512                 const int                                       ndxB                    = maxImages / 2;
513
514                 gl.glBindTexture(GL_TEXTURE_2D, *textureA);
515                 gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32);
516                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
517
518                 gl.glBindImageTexture(ndxA, *textureA, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
519                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
520
521                 gl.glBindTexture(GL_TEXTURE_2D_ARRAY, *textureB);
522                 gl.glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 32, 32, 4);
523                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
524
525                 gl.glBindImageTexture(ndxB, *textureB, 0, GL_FALSE, 2, GL_READ_ONLY, GL_RGBA8UI);
526                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
527
528                 verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_NAME, ndxA, *textureA, m_verifierType);
529                 verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_NAME, ndxB, *textureB, m_verifierType);
530         }
531
532         result.setTestContextResult(m_testCtx);
533         return STOP;
534 }
535
536 class ImageBindingLevelCase : public TestCase
537 {
538 public:
539                                                 ImageBindingLevelCase   (Context& context, const char* name, const char* desc, QueryType verifierType);
540
541 private:
542         IterateResult           iterate                                 (void);
543
544         const QueryType         m_verifierType;
545 };
546
547 ImageBindingLevelCase::ImageBindingLevelCase (Context& context, const char* name, const char* desc, QueryType verifierType)
548         : TestCase                      (context, name, desc)
549         , m_verifierType        (verifierType)
550 {
551 }
552
553 ImageBindingLevelCase::IterateResult ImageBindingLevelCase::iterate (void)
554 {
555         glu::CallLogWrapper             gl                      (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
556         tcu::ResultCollector    result          (m_testCtx.getLog(), " // ERROR: ");
557         int                                             maxImages       = -1;
558
559         gl.enableLogging(true);
560
561         gl.glGetIntegerv(GL_MAX_IMAGE_UNITS, &maxImages);
562         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
563
564         {
565                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
566
567                 for (int ndx = 0; ndx < maxImages; ++ndx)
568                         verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_LEVEL, ndx, 0, m_verifierType);
569         }
570
571         {
572                 const tcu::ScopedLogSection     superSection    (m_testCtx.getLog(), "AfterSetting", "After setting");
573                 glu::Texture                            textureA                (m_context.getRenderContext());
574                 glu::Texture                            textureB                (m_context.getRenderContext());
575                 const int                                       ndxA                    = 0;
576                 const int                                       ndxB                    = maxImages / 2;
577
578                 gl.glBindTexture(GL_TEXTURE_2D, *textureA);
579                 gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32);
580                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
581
582                 gl.glBindImageTexture(ndxA, *textureA, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
583                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
584
585                 gl.glBindTexture(GL_TEXTURE_2D, *textureB);
586                 gl.glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, 32, 32);
587                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
588
589                 gl.glBindImageTexture(ndxB, *textureB, 2, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
590                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
591
592                 verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_LEVEL, ndxA, 0, m_verifierType);
593                 verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_LEVEL, ndxB, 2, m_verifierType);
594         }
595
596         result.setTestContextResult(m_testCtx);
597         return STOP;
598 }
599
600 class ImageBindingLayeredCase : public TestCase
601 {
602 public:
603                                                 ImageBindingLayeredCase (Context& context, const char* name, const char* desc, QueryType verifierType);
604
605 private:
606         IterateResult           iterate                                 (void);
607
608         const QueryType         m_verifierType;
609 };
610
611 ImageBindingLayeredCase::ImageBindingLayeredCase (Context& context, const char* name, const char* desc, QueryType verifierType)
612         : TestCase                      (context, name, desc)
613         , m_verifierType        (verifierType)
614 {
615 }
616
617 ImageBindingLayeredCase::IterateResult ImageBindingLayeredCase::iterate (void)
618 {
619         glu::CallLogWrapper             gl                      (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
620         tcu::ResultCollector    result          (m_testCtx.getLog(), " // ERROR: ");
621         int                                             maxImages       = -1;
622
623         gl.enableLogging(true);
624
625         gl.glGetIntegerv(GL_MAX_IMAGE_UNITS, &maxImages);
626         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
627
628         {
629                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
630
631                 for (int ndx = 0; ndx < maxImages; ++ndx)
632                         verifyStateIndexedBoolean(result, gl, GL_IMAGE_BINDING_LAYERED, ndx, false, m_verifierType);
633         }
634
635         {
636                 const tcu::ScopedLogSection     superSection    (m_testCtx.getLog(), "AfterSetting", "After setting");
637                 glu::Texture                            textureA                (m_context.getRenderContext());
638                 glu::Texture                            textureB                (m_context.getRenderContext());
639                 const int                                       ndxA                    = 0;
640                 const int                                       ndxB                    = maxImages / 2;
641
642                 gl.glBindTexture(GL_TEXTURE_2D, *textureA);
643                 gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32);
644                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
645
646                 gl.glBindImageTexture(ndxA, *textureA, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
647                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
648
649                 gl.glBindTexture(GL_TEXTURE_2D_ARRAY, *textureB);
650                 gl.glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 32, 32, 4);
651                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
652
653                 gl.glBindImageTexture(ndxB, *textureB, 0, GL_TRUE, 2, GL_READ_ONLY, GL_RGBA8UI);
654                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
655
656                 verifyStateIndexedBoolean(result, gl, GL_IMAGE_BINDING_LAYERED, ndxA, false, m_verifierType);
657                 verifyStateIndexedBoolean(result, gl, GL_IMAGE_BINDING_LAYERED, ndxB, true, m_verifierType);
658         }
659
660         result.setTestContextResult(m_testCtx);
661         return STOP;
662 }
663
664 class ImageBindingLayerCase : public TestCase
665 {
666 public:
667                                                 ImageBindingLayerCase   (Context& context, const char* name, const char* desc, QueryType verifierType);
668
669 private:
670         IterateResult           iterate                                 (void);
671
672         const QueryType         m_verifierType;
673 };
674
675 ImageBindingLayerCase::ImageBindingLayerCase (Context& context, const char* name, const char* desc, QueryType verifierType)
676         : TestCase                      (context, name, desc)
677         , m_verifierType        (verifierType)
678 {
679 }
680
681 ImageBindingLayerCase::IterateResult ImageBindingLayerCase::iterate (void)
682 {
683         glu::CallLogWrapper             gl                      (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
684         tcu::ResultCollector    result          (m_testCtx.getLog(), " // ERROR: ");
685         int                                             maxImages       = -1;
686
687         gl.enableLogging(true);
688
689         gl.glGetIntegerv(GL_MAX_IMAGE_UNITS, &maxImages);
690         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
691
692         {
693                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
694
695                 for (int ndx = 0; ndx < maxImages; ++ndx)
696                         verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_LAYER, ndx, 0, m_verifierType);
697         }
698
699         {
700                 const tcu::ScopedLogSection     superSection    (m_testCtx.getLog(), "AfterSetting", "After setting");
701                 glu::Texture                            textureA                (m_context.getRenderContext());
702                 glu::Texture                            textureB                (m_context.getRenderContext());
703                 const int                                       ndxA                    = 0;
704                 const int                                       ndxB                    = maxImages / 2;
705
706                 gl.glBindTexture(GL_TEXTURE_2D, *textureA);
707                 gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32);
708                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
709
710                 gl.glBindImageTexture(ndxA, *textureA, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
711                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
712
713                 gl.glBindTexture(GL_TEXTURE_2D_ARRAY, *textureB);
714                 gl.glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 32, 32, 4);
715                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
716
717                 gl.glBindImageTexture(ndxB, *textureB, 0, GL_TRUE, 2, GL_READ_ONLY, GL_RGBA8UI);
718                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
719
720                 verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_LAYER, ndxA, 0, m_verifierType);
721                 verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_LAYER, ndxB, 2, m_verifierType);
722         }
723
724         result.setTestContextResult(m_testCtx);
725         return STOP;
726 }
727
728 class ImageBindingAccessCase : public TestCase
729 {
730 public:
731                                                 ImageBindingAccessCase  (Context& context, const char* name, const char* desc, QueryType verifierType);
732
733 private:
734         IterateResult           iterate                                 (void);
735
736         const QueryType         m_verifierType;
737 };
738
739 ImageBindingAccessCase::ImageBindingAccessCase (Context& context, const char* name, const char* desc, QueryType verifierType)
740         : TestCase                      (context, name, desc)
741         , m_verifierType        (verifierType)
742 {
743 }
744
745 ImageBindingAccessCase::IterateResult ImageBindingAccessCase::iterate (void)
746 {
747         glu::CallLogWrapper             gl                      (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
748         tcu::ResultCollector    result          (m_testCtx.getLog(), " // ERROR: ");
749         int                                             maxImages       = -1;
750
751         gl.enableLogging(true);
752
753         gl.glGetIntegerv(GL_MAX_IMAGE_UNITS, &maxImages);
754         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
755
756         {
757                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
758
759                 for (int ndx = 0; ndx < maxImages; ++ndx)
760                         verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_ACCESS, ndx, GL_READ_ONLY, m_verifierType);
761         }
762
763         {
764                 const tcu::ScopedLogSection     superSection    (m_testCtx.getLog(), "AfterSetting", "After setting");
765                 glu::Texture                            textureA                (m_context.getRenderContext());
766                 glu::Texture                            textureB                (m_context.getRenderContext());
767                 const int                                       ndxA                    = 0;
768                 const int                                       ndxB                    = maxImages / 2;
769
770                 gl.glBindTexture(GL_TEXTURE_2D, *textureA);
771                 gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32);
772                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
773
774                 gl.glBindImageTexture(ndxA, *textureA, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
775                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
776
777                 gl.glBindTexture(GL_TEXTURE_2D_ARRAY, *textureB);
778                 gl.glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 32, 32, 4);
779                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
780
781                 gl.glBindImageTexture(ndxB, *textureB, 0, GL_TRUE, 2, GL_READ_WRITE, GL_RGBA8UI);
782                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
783
784                 verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_ACCESS, ndxA, GL_READ_ONLY, m_verifierType);
785                 verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_ACCESS, ndxB, GL_READ_WRITE, m_verifierType);
786         }
787
788         result.setTestContextResult(m_testCtx);
789         return STOP;
790 }
791
792 class ImageBindingFormatCase : public TestCase
793 {
794 public:
795                                                 ImageBindingFormatCase  (Context& context, const char* name, const char* desc, QueryType verifierType);
796
797 private:
798         IterateResult           iterate                                 (void);
799
800         const QueryType         m_verifierType;
801 };
802
803 ImageBindingFormatCase::ImageBindingFormatCase (Context& context, const char* name, const char* desc, QueryType verifierType)
804         : TestCase                      (context, name, desc)
805         , m_verifierType        (verifierType)
806 {
807 }
808
809 ImageBindingFormatCase::IterateResult ImageBindingFormatCase::iterate (void)
810 {
811         glu::CallLogWrapper             gl                      (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
812         tcu::ResultCollector    result          (m_testCtx.getLog(), " // ERROR: ");
813         int                                             maxImages       = -1;
814
815         gl.enableLogging(true);
816
817         gl.glGetIntegerv(GL_MAX_IMAGE_UNITS, &maxImages);
818         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
819
820         {
821                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
822
823                 for (int ndx = 0; ndx < maxImages; ++ndx)
824                         verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_FORMAT, ndx, GL_R32UI, m_verifierType);
825         }
826
827         {
828                 const tcu::ScopedLogSection     superSection    (m_testCtx.getLog(), "AfterSetting", "After setting");
829                 glu::Texture                            textureA                (m_context.getRenderContext());
830                 glu::Texture                            textureB                (m_context.getRenderContext());
831                 const int                                       ndxA                    = 0;
832                 const int                                       ndxB                    = maxImages / 2;
833
834                 gl.glBindTexture(GL_TEXTURE_2D, *textureA);
835                 gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32);
836                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
837
838                 gl.glBindImageTexture(ndxA, *textureA, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
839                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
840
841                 gl.glBindTexture(GL_TEXTURE_2D_ARRAY, *textureB);
842                 gl.glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_R32F, 32, 32, 4);
843                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
844
845                 gl.glBindImageTexture(ndxB, *textureB, 0, GL_TRUE, 2, GL_READ_WRITE, GL_R32F);
846                 GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
847
848                 verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_FORMAT, ndxA, GL_RGBA8UI, m_verifierType);
849                 verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_FORMAT, ndxB, GL_R32F, m_verifierType);
850         }
851
852         result.setTestContextResult(m_testCtx);
853         return STOP;
854 }
855
856 class EnableBlendCase : public TestCase
857 {
858 public:
859                                                 EnableBlendCase (Context& context, const char* name, const char* desc, QueryType verifierType);
860
861         void                            init                    (void);
862 private:
863         IterateResult           iterate                 (void);
864
865         const QueryType         m_verifierType;
866 };
867
868 EnableBlendCase::EnableBlendCase (Context& context, const char* name, const char* desc, QueryType verifierType)
869         : TestCase                      (context, name, desc)
870         , m_verifierType        (verifierType)
871 {
872 }
873
874 void EnableBlendCase::init (void)
875 {
876         isExtensionSupported(m_context, "GL_EXT_draw_buffers_indexed");
877 }
878
879 EnableBlendCase::IterateResult EnableBlendCase::iterate (void)
880 {
881         glu::CallLogWrapper             gl                              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
882         tcu::ResultCollector    result                  (m_testCtx.getLog(), " // ERROR: ");
883         deInt32                                 maxDrawBuffers = 0;
884
885         gl.enableLogging(true);
886
887         gl.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
888         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
889
890         {
891                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
892
893                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
894                         verifyStateIndexedBoolean(result, gl, GL_BLEND, ndx, false, m_verifierType);
895         }
896         {
897                 const tcu::ScopedLogSection     superSection    (m_testCtx.getLog(), "AfterSettingCommon", "After setting common");
898
899                 gl.glEnable(GL_BLEND);
900
901                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
902                         verifyStateIndexedBoolean(result, gl, GL_BLEND, ndx, true, m_verifierType);
903
904         }
905         {
906                 const tcu::ScopedLogSection     superSection    (m_testCtx.getLog(), "AfterSettingIndexed", "After setting indexed");
907
908                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
909                 {
910                         if (ndx % 2 == 0)
911                                 gl.glEnablei(GL_BLEND, ndx);
912                         else
913                                 gl.glDisablei(GL_BLEND, ndx);
914                 }
915
916                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
917                         verifyStateIndexedBoolean(result, gl, GL_BLEND, ndx, (ndx % 2 == 0), m_verifierType);
918         }
919         {
920                 const tcu::ScopedLogSection     superSection    (m_testCtx.getLog(), "AfterResettingIndexedWithCommon", "After resetting indexed with common");
921
922                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
923                 {
924                         if (ndx % 2 == 0)
925                                 gl.glEnablei(GL_BLEND, ndx);
926                         else
927                                 gl.glDisablei(GL_BLEND, ndx);
928                 }
929
930                 gl.glEnable(GL_BLEND);
931
932                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
933                         verifyStateIndexedBoolean(result, gl, GL_BLEND, ndx, true, m_verifierType);
934         }
935
936         result.setTestContextResult(m_testCtx);
937         return STOP;
938 }
939
940 class ColorMaskCase : public TestCase
941 {
942 public:
943                                                 ColorMaskCase   (Context& context, const char* name, const char* desc, QueryType verifierType);
944
945         void                            init                    (void);
946 private:
947         IterateResult           iterate                 (void);
948
949         const QueryType         m_verifierType;
950 };
951
952 ColorMaskCase::ColorMaskCase (Context& context, const char* name, const char* desc, QueryType verifierType)
953         : TestCase                      (context, name, desc)
954         , m_verifierType        (verifierType)
955 {
956 }
957
958 void ColorMaskCase::init (void)
959 {
960         isExtensionSupported(m_context, "GL_EXT_draw_buffers_indexed");
961 }
962
963 ColorMaskCase::IterateResult ColorMaskCase::iterate (void)
964 {
965         glu::CallLogWrapper             gl                              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
966         tcu::ResultCollector    result                  (m_testCtx.getLog(), " // ERROR: ");
967         deInt32                                 maxDrawBuffers = 0;
968
969         gl.enableLogging(true);
970
971         gl.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
972         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
973
974         {
975                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
976
977                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
978                         verifyStateIndexedBooleanVec4(result, gl, GL_COLOR_WRITEMASK, ndx, tcu::BVec4(true), m_verifierType);
979         }
980         {
981                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingCommon", "After setting common");
982
983                 gl.glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE);
984
985                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
986                         verifyStateIndexedBooleanVec4(result, gl, GL_COLOR_WRITEMASK, ndx, tcu::BVec4(false, true, true, false), m_verifierType);
987         }
988         {
989                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingIndexed", "After setting indexed");
990
991                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
992                         gl.glColorMaski(ndx, (ndx % 2 == 0 ? GL_TRUE : GL_FALSE), (ndx % 2 == 1 ? GL_TRUE : GL_FALSE), (ndx % 2 == 0 ? GL_TRUE : GL_FALSE), (ndx % 2 == 1 ? GL_TRUE : GL_FALSE));
993
994                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
995                         verifyStateIndexedBooleanVec4(result, gl, GL_COLOR_WRITEMASK, ndx, (ndx % 2 == 0 ? tcu::BVec4(true, false, true, false) : tcu::BVec4(false, true, false, true)), m_verifierType);
996         }
997         {
998                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterResettingIndexedWithCommon", "After resetting indexed with common");
999
1000                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1001                         gl.glColorMaski(ndx, (ndx % 2 == 0 ? GL_TRUE : GL_FALSE), (ndx % 2 == 1 ? GL_TRUE : GL_FALSE), (ndx % 2 == 0 ? GL_TRUE : GL_FALSE), (ndx % 2 == 1 ? GL_TRUE : GL_FALSE));
1002
1003                 gl.glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE);
1004
1005                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1006                         verifyStateIndexedBooleanVec4(result, gl, GL_COLOR_WRITEMASK, ndx, tcu::BVec4(false, true, true, false), m_verifierType);
1007         }
1008
1009         result.setTestContextResult(m_testCtx);
1010         return STOP;
1011 }
1012
1013 class BlendFuncCase : public TestCase
1014 {
1015 public:
1016                                                 BlendFuncCase   (Context& context, const char* name, const char* desc, QueryType verifierType);
1017
1018         void                            init                    (void);
1019 private:
1020         IterateResult           iterate                 (void);
1021
1022         const QueryType         m_verifierType;
1023 };
1024
1025 BlendFuncCase::BlendFuncCase (Context& context, const char* name, const char* desc, QueryType verifierType)
1026         : TestCase                      (context, name, desc)
1027         , m_verifierType        (verifierType)
1028 {
1029 }
1030
1031 void BlendFuncCase::init (void)
1032 {
1033         isExtensionSupported(m_context, "GL_EXT_draw_buffers_indexed");
1034 }
1035
1036 BlendFuncCase::IterateResult BlendFuncCase::iterate (void)
1037 {
1038         const deUint32 blendFuncs[] =
1039         {
1040                 GL_ZERO,
1041                 GL_ONE,
1042                 GL_SRC_COLOR,
1043                 GL_ONE_MINUS_SRC_COLOR,
1044                 GL_DST_COLOR,
1045                 GL_ONE_MINUS_DST_COLOR,
1046                 GL_SRC_ALPHA,
1047                 GL_ONE_MINUS_SRC_ALPHA,
1048                 GL_DST_ALPHA,
1049                 GL_ONE_MINUS_DST_ALPHA,
1050                 GL_CONSTANT_COLOR,
1051                 GL_ONE_MINUS_CONSTANT_COLOR,
1052                 GL_CONSTANT_ALPHA,
1053                 GL_ONE_MINUS_CONSTANT_ALPHA,
1054                 GL_SRC_ALPHA_SATURATE
1055         };
1056
1057         glu::CallLogWrapper             gl                              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
1058         tcu::ResultCollector    result                  (m_testCtx.getLog(), " // ERROR: ");
1059         deInt32                                 maxDrawBuffers = 0;
1060
1061         gl.enableLogging(true);
1062
1063         gl.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
1064         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
1065
1066         {
1067                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
1068
1069                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1070                         verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_RGB, ndx, GL_ONE, m_verifierType);
1071
1072                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1073                         verifyStateIndexedInteger(result, gl, GL_BLEND_DST_RGB, ndx, GL_ZERO, m_verifierType);
1074
1075                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1076                         verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_ALPHA, ndx, GL_ONE, m_verifierType);
1077
1078                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1079                         verifyStateIndexedInteger(result, gl, GL_BLEND_DST_ALPHA, ndx, GL_ZERO, m_verifierType);
1080         }
1081         {
1082                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingCommon", "After setting common");
1083
1084                 gl.glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
1085
1086                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1087                         verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_RGB, ndx, GL_SRC_ALPHA, m_verifierType);
1088
1089                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1090                         verifyStateIndexedInteger(result, gl, GL_BLEND_DST_RGB, ndx, GL_DST_ALPHA, m_verifierType);
1091
1092                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1093                         verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_ALPHA, ndx, GL_SRC_ALPHA, m_verifierType);
1094
1095                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1096                         verifyStateIndexedInteger(result, gl, GL_BLEND_DST_ALPHA, ndx, GL_DST_ALPHA, m_verifierType);
1097         }
1098         {
1099                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingCommonSeparate", "After setting common separate");
1100
1101                 gl.glBlendFuncSeparate(GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA, GL_DST_COLOR, GL_ONE_MINUS_DST_ALPHA);
1102
1103                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1104                         verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_RGB, ndx, GL_SRC_COLOR, m_verifierType);
1105
1106                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1107                         verifyStateIndexedInteger(result, gl, GL_BLEND_DST_RGB, ndx, GL_ONE_MINUS_SRC_ALPHA, m_verifierType);
1108
1109                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1110                         verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_ALPHA, ndx, GL_DST_COLOR, m_verifierType);
1111
1112                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1113                         verifyStateIndexedInteger(result, gl, GL_BLEND_DST_ALPHA, ndx, GL_ONE_MINUS_DST_ALPHA, m_verifierType);
1114         }
1115         {
1116                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingIndexed", "After setting indexed");
1117
1118                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1119                         gl.glBlendFunci(ndx, blendFuncs[ndx % DE_LENGTH_OF_ARRAY(blendFuncs)], blendFuncs[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendFuncs)]);
1120
1121                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1122                         verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_RGB, ndx, blendFuncs[ndx % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1123
1124                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1125                         verifyStateIndexedInteger(result, gl, GL_BLEND_DST_RGB, ndx, blendFuncs[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1126
1127                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1128                         verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_ALPHA, ndx, blendFuncs[ndx % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1129
1130                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1131                         verifyStateIndexedInteger(result, gl, GL_BLEND_DST_ALPHA, ndx, blendFuncs[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1132         }
1133         {
1134                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingIndexedSeparate", "After setting indexed separate");
1135
1136                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1137                         gl.glBlendFuncSeparatei(ndx, blendFuncs[(ndx + 3) % DE_LENGTH_OF_ARRAY(blendFuncs)],
1138                                                                                  blendFuncs[(ndx + 2) % DE_LENGTH_OF_ARRAY(blendFuncs)],
1139                                                                                  blendFuncs[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendFuncs)],
1140                                                                                  blendFuncs[(ndx + 0) % DE_LENGTH_OF_ARRAY(blendFuncs)]);
1141
1142                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1143                         verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_RGB, ndx, blendFuncs[(ndx + 3) % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1144
1145                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1146                         verifyStateIndexedInteger(result, gl, GL_BLEND_DST_RGB, ndx, blendFuncs[(ndx + 2) % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1147
1148                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1149                         verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_ALPHA, ndx, blendFuncs[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1150
1151                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1152                         verifyStateIndexedInteger(result, gl, GL_BLEND_DST_ALPHA, ndx, blendFuncs[(ndx + 0) % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1153
1154         }
1155         {
1156                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterResettingIndexedWithCommon", "After resetting indexed with common");
1157
1158                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1159                         gl.glBlendFunci(ndx, blendFuncs[ndx % DE_LENGTH_OF_ARRAY(blendFuncs)], blendFuncs[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendFuncs)]);
1160
1161                 gl.glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
1162
1163                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1164                         verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_RGB, ndx, GL_SRC_ALPHA, m_verifierType);
1165
1166                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1167                         verifyStateIndexedInteger(result, gl, GL_BLEND_DST_RGB, ndx, GL_DST_ALPHA, m_verifierType);
1168
1169                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1170                         verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_ALPHA, ndx, GL_SRC_ALPHA, m_verifierType);
1171
1172                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1173                         verifyStateIndexedInteger(result, gl, GL_BLEND_DST_ALPHA, ndx, GL_DST_ALPHA, m_verifierType);
1174         }
1175         {
1176                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterResettingIndexedWithCommonSeparate", "After resetting indexed with common separate");
1177
1178                 gl.glBlendFuncSeparate(GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA, GL_DST_COLOR, GL_ONE_MINUS_DST_ALPHA);
1179
1180                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1181                         gl.glBlendFuncSeparatei(ndx, blendFuncs[(ndx + 3) % DE_LENGTH_OF_ARRAY(blendFuncs)],
1182                                                                                  blendFuncs[(ndx + 2) % DE_LENGTH_OF_ARRAY(blendFuncs)],
1183                                                                                  blendFuncs[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendFuncs)],
1184                                                                                  blendFuncs[(ndx + 0) % DE_LENGTH_OF_ARRAY(blendFuncs)]);
1185
1186                 gl.glBlendFuncSeparate(GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA, GL_DST_COLOR, GL_ONE_MINUS_DST_ALPHA);
1187
1188                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1189                         verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_RGB, ndx, GL_SRC_COLOR, m_verifierType);
1190
1191                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1192                         verifyStateIndexedInteger(result, gl, GL_BLEND_DST_RGB, ndx, GL_ONE_MINUS_SRC_ALPHA, m_verifierType);
1193
1194                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1195                         verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_ALPHA, ndx, GL_DST_COLOR, m_verifierType);
1196
1197                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1198                         verifyStateIndexedInteger(result, gl, GL_BLEND_DST_ALPHA, ndx, GL_ONE_MINUS_DST_ALPHA, m_verifierType);
1199         }
1200
1201         result.setTestContextResult(m_testCtx);
1202         return STOP;
1203 }
1204
1205 class BlendEquationCase : public TestCase
1206 {
1207 public:
1208                                                 BlendEquationCase       (Context& context, const char* name, const char* desc, QueryType verifierType);
1209
1210         void                            init                            (void);
1211 private:
1212         IterateResult           iterate                         (void);
1213
1214         const QueryType         m_verifierType;
1215 };
1216
1217 BlendEquationCase::BlendEquationCase (Context& context, const char* name, const char* desc, QueryType verifierType)
1218         : TestCase                      (context, name, desc)
1219         , m_verifierType        (verifierType)
1220 {
1221 }
1222
1223 void BlendEquationCase::init (void)
1224 {
1225         isExtensionSupported(m_context, "GL_EXT_draw_buffers_indexed");
1226 }
1227
1228 BlendEquationCase::IterateResult BlendEquationCase::iterate (void)
1229 {
1230         const deUint32 blendEquations[] =
1231         {
1232                 GL_FUNC_ADD,
1233                 GL_FUNC_SUBTRACT,
1234                 GL_FUNC_REVERSE_SUBTRACT,
1235                 GL_MIN,
1236                 GL_MAX
1237         };
1238
1239         glu::CallLogWrapper             gl                              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
1240         tcu::ResultCollector    result                  (m_testCtx.getLog(), " // ERROR: ");
1241         deInt32                                 maxDrawBuffers = 0;
1242
1243         gl.enableLogging(true);
1244
1245         gl.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
1246         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
1247
1248         {
1249                 const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
1250
1251                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1252                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_FUNC_ADD, m_verifierType);
1253
1254                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1255                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_FUNC_ADD, m_verifierType);
1256         }
1257         {
1258                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingCommon", "After setting common");
1259
1260                 gl.glBlendEquation(GL_FUNC_SUBTRACT);
1261
1262                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1263                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_FUNC_SUBTRACT, m_verifierType);
1264
1265                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1266                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_FUNC_SUBTRACT, m_verifierType);
1267         }
1268         {
1269                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingCommonSeparate", "After setting common separate");
1270
1271                 gl.glBlendEquationSeparate(GL_FUNC_REVERSE_SUBTRACT, GL_FUNC_SUBTRACT);
1272
1273                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1274                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_FUNC_REVERSE_SUBTRACT, m_verifierType);
1275
1276                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1277                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_FUNC_SUBTRACT, m_verifierType);
1278         }
1279         {
1280                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingIndexed", "After setting indexed");
1281
1282                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1283                         gl.glBlendEquationi(ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)]);
1284
1285                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1286                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)], m_verifierType);
1287
1288                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1289                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)], m_verifierType);
1290         }
1291         {
1292                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingIndexedSeparate", "After setting indexed separate");
1293
1294                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1295                         gl.glBlendEquationSeparatei(ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)], blendEquations[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendEquations)]);
1296
1297                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1298                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)], m_verifierType);
1299
1300                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1301                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, blendEquations[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendEquations)], m_verifierType);
1302         }
1303         {
1304                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterResettingIndexedWithCommon", "After resetting indexed with common");
1305
1306                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1307                         gl.glBlendEquationi(ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)]);
1308
1309                 gl.glBlendEquation(GL_FUNC_SUBTRACT);
1310
1311                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1312                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_FUNC_SUBTRACT, m_verifierType);
1313
1314                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1315                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_FUNC_SUBTRACT, m_verifierType);
1316         }
1317         {
1318                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterResettingIndexedWithCommonSeparate", "After resetting indexed with common separate");
1319
1320                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1321                         gl.glBlendEquationSeparatei(ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)], blendEquations[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendEquations)]);
1322
1323                 gl.glBlendEquationSeparate(GL_FUNC_REVERSE_SUBTRACT, GL_FUNC_SUBTRACT);
1324
1325                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1326                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_FUNC_REVERSE_SUBTRACT, m_verifierType);
1327
1328                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1329                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_FUNC_SUBTRACT, m_verifierType);
1330         }
1331
1332         result.setTestContextResult(m_testCtx);
1333         return STOP;
1334 }
1335
1336 class BlendEquationAdvancedCase : public TestCase
1337 {
1338 public:
1339                                                 BlendEquationAdvancedCase       (Context& context, const char* name, const char* desc, QueryType verifierType);
1340
1341         void                            init                            (void);
1342 private:
1343         IterateResult           iterate                         (void);
1344
1345         const QueryType         m_verifierType;
1346 };
1347
1348 BlendEquationAdvancedCase::BlendEquationAdvancedCase (Context& context, const char* name, const char* desc, QueryType verifierType)
1349         : TestCase                      (context, name, desc)
1350         , m_verifierType        (verifierType)
1351 {
1352 }
1353
1354 void BlendEquationAdvancedCase::init (void)
1355 {
1356         isExtensionSupported(m_context, "GL_EXT_draw_buffers_indexed");
1357         isExtensionSupported(m_context, "GL_KHR_blend_equation_advanced");
1358 }
1359
1360 BlendEquationAdvancedCase::IterateResult BlendEquationAdvancedCase::iterate (void)
1361 {
1362         const deUint32 blendEquations[] =
1363         {
1364                 GL_FUNC_ADD,
1365                 GL_FUNC_SUBTRACT,
1366                 GL_FUNC_REVERSE_SUBTRACT,
1367                 GL_MIN,
1368                 GL_MAX
1369         };
1370
1371         const deUint32 blendEquationAdvanced[] =
1372         {
1373                 GL_MULTIPLY,
1374                 GL_SCREEN,
1375                 GL_OVERLAY,
1376                 GL_DARKEN,
1377                 GL_LIGHTEN,
1378                 GL_COLORDODGE,
1379                 GL_COLORBURN,
1380                 GL_HARDLIGHT,
1381                 GL_SOFTLIGHT,
1382                 GL_DIFFERENCE,
1383                 GL_EXCLUSION,
1384                 GL_HSL_HUE,
1385                 GL_HSL_SATURATION,
1386                 GL_HSL_COLOR,
1387                 GL_HSL_LUMINOSITY
1388         };
1389
1390         glu::CallLogWrapper             gl                              (m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
1391         tcu::ResultCollector    result                  (m_testCtx.getLog(), " // ERROR: ");
1392         deInt32                                 maxDrawBuffers = 0;
1393
1394         gl.enableLogging(true);
1395
1396         gl.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
1397         GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
1398
1399         {
1400                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingCommon", "After setting common");
1401
1402                 gl.glBlendEquation(GL_SCREEN);
1403
1404                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1405                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_SCREEN, m_verifierType);
1406
1407                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1408                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_SCREEN, m_verifierType);
1409         }
1410         {
1411                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingIndexed", "After setting indexed");
1412
1413                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1414                         gl.glBlendEquationi(ndx, blendEquationAdvanced[ndx % DE_LENGTH_OF_ARRAY(blendEquationAdvanced)]);
1415
1416                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1417                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, blendEquationAdvanced[ndx % DE_LENGTH_OF_ARRAY(blendEquationAdvanced)], m_verifierType);
1418
1419                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1420                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, blendEquationAdvanced[ndx % DE_LENGTH_OF_ARRAY(blendEquationAdvanced)], m_verifierType);
1421         }
1422         {
1423                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterResettingIndexedWithCommon", "After resetting indexed with common");
1424
1425                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1426                         gl.glBlendEquationi(ndx, blendEquationAdvanced[ndx % DE_LENGTH_OF_ARRAY(blendEquationAdvanced)]);
1427
1428                 gl.glBlendEquation(GL_MULTIPLY);
1429
1430                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1431                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_MULTIPLY, m_verifierType);
1432
1433                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1434                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_MULTIPLY, m_verifierType);
1435         }
1436         {
1437                 const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterResettingIndexedSeparateWithCommon", "After resetting indexed separate with common");
1438
1439                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1440                         gl.glBlendEquationSeparatei(ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)], blendEquations[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendEquations)]);
1441
1442                 gl.glBlendEquation(GL_LIGHTEN);
1443
1444                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1445                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_LIGHTEN, m_verifierType);
1446
1447                 for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1448                         verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_LIGHTEN, m_verifierType);
1449         }
1450
1451         result.setTestContextResult(m_testCtx);
1452         return STOP;
1453 }
1454
1455 } // anonymous
1456
1457 IndexedStateQueryTests::IndexedStateQueryTests (Context& context)
1458         : TestCaseGroup(context, "indexed", "Indexed state queries")
1459 {
1460 }
1461
1462 IndexedStateQueryTests::~IndexedStateQueryTests (void)
1463 {
1464 }
1465
1466 void IndexedStateQueryTests::init (void)
1467 {
1468         static const QueryType verifiers[] = { QUERY_INDEXED_BOOLEAN, QUERY_INDEXED_INTEGER, QUERY_INDEXED_INTEGER64 };
1469         static const QueryType vec4Verifiers[] = { QUERY_INDEXED_BOOLEAN_VEC4, QUERY_INDEXED_INTEGER_VEC4, QUERY_INDEXED_INTEGER64_VEC4 };
1470
1471 #define FOR_EACH_VERIFIER(X) \
1472         for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx)   \
1473         {                                                                                                                                                                               \
1474                 const QueryType verifier = verifiers[verifierNdx];                                                                      \
1475                 const char* verifierSuffix = getVerifierSuffix(verifier);                                                       \
1476                 this->addChild(X);                                                                                                                                      \
1477         }
1478
1479 #define FOR_EACH_VEC4_VERIFIER(X) \
1480         for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(vec4Verifiers); ++verifierNdx)       \
1481         {                                                                                                                                                                                       \
1482                 const QueryType verifier = vec4Verifiers[verifierNdx];                                                                  \
1483                 const char* verifierSuffix = getVerifierSuffix(verifier);                                                               \
1484                 this->addChild(X);                                                                                                                                              \
1485         }
1486
1487         FOR_EACH_VERIFIER(new SampleMaskCase                    (m_context, (std::string() + "sample_mask_value_" + verifierSuffix).c_str(),                            "Test SAMPLE_MASK_VALUE", verifier))
1488
1489         FOR_EACH_VERIFIER(new MinValueIndexed3Case              (m_context, (std::string() + "max_compute_work_group_count_" + verifierSuffix).c_str(),         "Test MAX_COMPUTE_WORK_GROUP_COUNT",    GL_MAX_COMPUTE_WORK_GROUP_COUNT,        tcu::IVec3(65535,65535,65535),  verifier))
1490         FOR_EACH_VERIFIER(new MinValueIndexed3Case              (m_context, (std::string() + "max_compute_work_group_size_" + verifierSuffix).c_str(),          "Test MAX_COMPUTE_WORK_GROUP_SIZE",             GL_MAX_COMPUTE_WORK_GROUP_SIZE,         tcu::IVec3(128, 128, 64),               verifier))
1491
1492         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,       GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS,  verifier))
1493         FOR_EACH_VERIFIER(new BufferStartCase                   (m_context, (std::string() + "atomic_counter_buffer_start_" + verifierSuffix).c_str(),          "Test ATOMIC_COUNTER_BUFFER_START",             GL_ATOMIC_COUNTER_BUFFER_START,         GL_ATOMIC_COUNTER_BUFFER,       GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS,  verifier))
1494         FOR_EACH_VERIFIER(new BufferSizeCase                    (m_context, (std::string() + "atomic_counter_buffer_size_" + verifierSuffix).c_str(),           "Test ATOMIC_COUNTER_BUFFER_SIZE",              GL_ATOMIC_COUNTER_BUFFER_SIZE,          GL_ATOMIC_COUNTER_BUFFER,       GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS,  verifier))
1495
1496         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,       GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS,  verifier))
1497         FOR_EACH_VERIFIER(new BufferStartCase                   (m_context, (std::string() + "shader_storage_buffer_start_" + verifierSuffix).c_str(),          "Test SHADER_STORAGE_BUFFER_START",             GL_SHADER_STORAGE_BUFFER_START,         GL_SHADER_STORAGE_BUFFER,       GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS,  verifier))
1498         FOR_EACH_VERIFIER(new BufferSizeCase                    (m_context, (std::string() + "shader_storage_buffer_size_" + verifierSuffix).c_str(),           "Test SHADER_STORAGE_BUFFER_SIZE",              GL_SHADER_STORAGE_BUFFER_SIZE,          GL_SHADER_STORAGE_BUFFER,       GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS,  verifier))
1499
1500         FOR_EACH_VERIFIER(new ImageBindingNameCase              (m_context, (std::string() + "image_binding_name_" + verifierSuffix).c_str(),                           "Test IMAGE_BINDING_NAME",                              verifier))
1501         FOR_EACH_VERIFIER(new ImageBindingLevelCase             (m_context, (std::string() + "image_binding_level_" + verifierSuffix).c_str(),                          "Test IMAGE_BINDING_LEVEL",                             verifier))
1502         FOR_EACH_VERIFIER(new ImageBindingLayeredCase   (m_context, (std::string() + "image_binding_layered_" + verifierSuffix).c_str(),                        "Test IMAGE_BINDING_LAYERED",                   verifier))
1503         FOR_EACH_VERIFIER(new ImageBindingLayerCase             (m_context, (std::string() + "image_binding_layer_" + verifierSuffix).c_str(),                          "Test IMAGE_BINDING_LAYER",                             verifier))
1504         FOR_EACH_VERIFIER(new ImageBindingAccessCase    (m_context, (std::string() + "image_binding_access_" + verifierSuffix).c_str(),                         "Test IMAGE_BINDING_ACCESS",                    verifier))
1505         FOR_EACH_VERIFIER(new ImageBindingFormatCase    (m_context, (std::string() + "image_binding_format_" + verifierSuffix).c_str(),                         "Test IMAGE_BINDING_FORMAT",                    verifier))
1506
1507         {
1508                 const QueryType verifier = QUERY_INDEXED_ISENABLED;
1509                 const char* verifierSuffix = getVerifierSuffix(verifier);
1510                 this->addChild(new EnableBlendCase                      (m_context, (std::string() + "blend_" + verifierSuffix).c_str(),                                                        "BLEND",                                                                verifier));
1511         }
1512         FOR_EACH_VEC4_VERIFIER(new ColorMaskCase                (m_context, (std::string() + "color_mask_" + verifierSuffix).c_str(),                                           "COLOR_WRITEMASK",                                              verifier))
1513         FOR_EACH_VERIFIER(new BlendFuncCase                             (m_context, (std::string() + "blend_func_" + verifierSuffix).c_str(),                                           "BLEND_SRC and BLEND_DST",                              verifier))
1514         FOR_EACH_VERIFIER(new BlendEquationCase                 (m_context, (std::string() + "blend_equation_" + verifierSuffix).c_str(),                                       "BLEND_EQUATION_RGB and BLEND_DST",             verifier))
1515         FOR_EACH_VERIFIER(new BlendEquationAdvancedCase (m_context, (std::string() + "blend_equation_advanced_" + verifierSuffix).c_str(),                      "BLEND_EQUATION_RGB and BLEND_DST",             verifier))
1516
1517 #undef FOR_EACH_VEC4_VERIFIER
1518 #undef FOR_EACH_VERIFIER
1519 }
1520
1521 } // Functional
1522 } // gles31
1523 } // deqp