1cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry/*-------------------------------------------------------------------------
2cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry * drawElements Quality Program OpenGL ES 3.1 Module
3cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry * -------------------------------------------------
4cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry *
5cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry * Copyright 2015 The Android Open Source Project
6cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry *
7cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry * Licensed under the Apache License, Version 2.0 (the "License");
8cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry * you may not use this file except in compliance with the License.
9cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry * You may obtain a copy of the License at
10cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry *
11cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry *      http://www.apache.org/licenses/LICENSE-2.0
12cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry *
13cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry * Unless required by applicable law or agreed to in writing, software
14cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry * distributed under the License is distributed on an "AS IS" BASIS,
15cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry * See the License for the specific language governing permissions and
17cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry * limitations under the License.
18cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry *
19cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry *//*!
20cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry * \file
21cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry * \brief Indexed state query tests
22cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry *//*--------------------------------------------------------------------*/
23cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
24cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#include "es31fIndexedStateQueryTests.hpp"
25cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#include "tcuTestLog.hpp"
26cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#include "tcuFormatUtil.hpp"
27cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#include "gluRenderContext.hpp"
28cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#include "gluCallLogWrapper.hpp"
29cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#include "gluStrUtil.hpp"
30591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi#include "gluContextInfo.hpp"
31cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#include "gluObjectWrapper.hpp"
32cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#include "glwFunctions.hpp"
33cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#include "glwEnums.hpp"
34cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#include "glsStateQueryUtil.hpp"
35cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#include "deRandom.hpp"
36cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#include "deStringUtil.hpp"
37cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
38cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrynamespace deqp
39cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
40cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrynamespace gles31
41cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
42cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrynamespace Functional
43cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
44cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrynamespace
45cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
46cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
47cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryusing namespace gls::StateQueryUtil;
48cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
49cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrystatic const char* getVerifierSuffix (QueryType type)
50cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
51cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	switch (type)
52cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
53591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		case QUERY_INDEXED_BOOLEAN:			return "getbooleani_v";
54591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		case QUERY_INDEXED_INTEGER:			return "getintegeri_v";
55591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		case QUERY_INDEXED_INTEGER64:		return "getinteger64i_v";
56591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		case QUERY_INDEXED_BOOLEAN_VEC4:	return "getbooleani_v";
57591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		case QUERY_INDEXED_INTEGER_VEC4:	return "getintegeri_v";
58591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		case QUERY_INDEXED_INTEGER64_VEC4:	return "getinteger64i_v";
59591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		case QUERY_INDEXED_ISENABLED:		return "isenabledi";
60cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		default:
61cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			DE_ASSERT(DE_FALSE);
62cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			return DE_NULL;
63cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
64cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
65cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
66cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryclass SampleMaskCase : public TestCase
67cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
68cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrypublic:
69cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry						SampleMaskCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
70cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
71cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryprivate:
72cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	void				init			(void);
73cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	IterateResult		iterate			(void);
74cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
75cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const QueryType		m_verifierType;
76cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	int					m_maxSampleMaskWords;
77cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry};
78cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
79cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyrySampleMaskCase::SampleMaskCase (Context& context, const char* name, const char* desc, QueryType verifierType)
80cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	: TestCase				(context, name, desc)
81cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_verifierType		(verifierType)
82cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_maxSampleMaskWords	(-1)
83cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
84cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
85cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
86cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryvoid SampleMaskCase::init (void)
87cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
88cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const glw::Functions& gl = m_context.getRenderContext().getFunctions();
89cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
90cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.getIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &m_maxSampleMaskWords);
91cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	GLU_EXPECT_NO_ERROR(gl.getError(), "query sample mask words");
92cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
93cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	// mask word count ok?
94cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	if (m_maxSampleMaskWords <= 0)
95cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		throw tcu::TestError("Minimum value of GL_MAX_SAMPLE_MASK_WORDS is 1. Got " + de::toString(m_maxSampleMaskWords));
96cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
97cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	m_testCtx.getLog() << tcu::TestLog::Message << "GL_MAX_SAMPLE_MASK_WORDS = " << m_maxSampleMaskWords << tcu::TestLog::EndMessage;
98cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
99cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
100cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyrySampleMaskCase::IterateResult SampleMaskCase::iterate (void)
101cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
102cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	glu::CallLogWrapper		gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
103cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
104cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
105cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.enableLogging(true);
106cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
107cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	// initial values
108cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
109cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection section(m_testCtx.getLog(), "initial", "Initial values");
110cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
111cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		for (int ndx = 0; ndx < m_maxSampleMaskWords; ++ndx)
112cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, GL_SAMPLE_MASK_VALUE, ndx, -1, m_verifierType);
113cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
114cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
115cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	// fixed values
116cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
117cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection section(m_testCtx.getLog(), "fixed", "Fixed values");
118cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
119cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		for (int ndx = 0; ndx < m_maxSampleMaskWords; ++ndx)
120cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
121cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glSampleMaski(ndx, 0);
122cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			GLU_EXPECT_NO_ERROR(gl.glGetError(), "glSampleMaski");
123cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
124cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, GL_SAMPLE_MASK_VALUE, ndx, 0, m_verifierType);
125cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
126cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
127cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
128cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	// random masks
129cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
130cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					numRandomTest	= 20;
131cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection section			(m_testCtx.getLog(), "random", "Random values");
132cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		de::Random					rnd				(0x4312);
133cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
134cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		for (int testNdx = 0; testNdx < numRandomTest; ++testNdx)
135cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
136cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			const glw::GLint	maskIndex		= (glw::GLint)(rnd.getUint32() % m_maxSampleMaskWords);
137cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			glw::GLint			mask			= (glw::GLint)(rnd.getUint32());
138cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
139cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glSampleMaski(maskIndex, mask);
140cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			GLU_EXPECT_NO_ERROR(gl.glGetError(), "glSampleMaski");
141cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
142cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, GL_SAMPLE_MASK_VALUE, maskIndex, mask, m_verifierType);
143cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
144cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
145cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
146cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	result.setTestContextResult(m_testCtx);
147cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	return STOP;
148cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
149cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
150cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryclass MinValueIndexed3Case : public TestCase
151cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
152cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrypublic:
153cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry						MinValueIndexed3Case	(Context& context, const char* name, const char* desc, glw::GLenum target, const tcu::IVec3& ref, QueryType verifierType);
154cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
155cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryprivate:
156cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	IterateResult		iterate					(void);
157cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
158cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const glw::GLenum	m_target;
159cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const tcu::IVec3	m_ref;
160cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const QueryType		m_verifierType;
161cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry};
162cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
163cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryMinValueIndexed3Case::MinValueIndexed3Case (Context& context, const char* name, const char* desc, glw::GLenum target, const tcu::IVec3& ref, QueryType verifierType)
164cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	: TestCase				(context, name, desc)
165cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_target				(target)
166cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_ref					(ref)
167cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_verifierType		(verifierType)
168cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
169cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
170cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
171cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryMinValueIndexed3Case::IterateResult MinValueIndexed3Case::iterate (void)
172cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
173cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	glu::CallLogWrapper		gl		(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
174cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	tcu::ResultCollector	result	(m_testCtx.getLog(), " // ERROR: ");
175cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
176cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.enableLogging(true);
177cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
178cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	for (int ndx = 0; ndx < 3; ++ndx)
179cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
180cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection section(m_testCtx.getLog(), "Element", "Element " + de::toString(ndx));
181cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
182cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		verifyStateIndexedIntegerMin(result, gl, m_target, ndx, m_ref[ndx], m_verifierType);
183cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
184cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
185cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	result.setTestContextResult(m_testCtx);
186cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	return STOP;
187cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
188cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
189cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryclass BufferBindingCase : public TestCase
190cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
191cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrypublic:
192cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry						BufferBindingCase	(Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bufferTarget, glw::GLenum numBindingsTarget, QueryType verifierType);
193cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
194cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryprivate:
195cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	IterateResult		iterate				(void);
196cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
197cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const glw::GLenum	m_queryTarget;
198cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const glw::GLenum	m_bufferTarget;
199cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const glw::GLenum	m_numBindingsTarget;
200cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const QueryType		m_verifierType;
201cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry};
202cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
203cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryBufferBindingCase::BufferBindingCase (Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bufferTarget, glw::GLenum numBindingsTarget, QueryType verifierType)
204cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	: TestCase				(context, name, desc)
205cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_queryTarget			(queryTarget)
206cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_bufferTarget		(bufferTarget)
207cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_numBindingsTarget	(numBindingsTarget)
208cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_verifierType		(verifierType)
209cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
210cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
211cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
212cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryBufferBindingCase::IterateResult BufferBindingCase::iterate (void)
213cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
214cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	glu::CallLogWrapper 	gl			(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
215cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	tcu::ResultCollector	result		(m_testCtx.getLog(), " // ERROR: ");
216cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	int						maxBindings	= -1;
217cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
218cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.enableLogging(true);
219cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
220cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.glGetIntegerv(m_numBindingsTarget, &maxBindings);
221cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
222cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
223cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
224cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
225cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
226cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		for (int ndx = 0; ndx < maxBindings; ++ndx)
227cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, ndx, 0, m_verifierType);
228cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
229cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
230cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
231cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection	superSection	(m_testCtx.getLog(), "AfterSetting", "After setting");
232cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Buffer					bufferA			(m_context.getRenderContext());
233cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Buffer					bufferB			(m_context.getRenderContext());
234cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxA			= 0;
235cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxB			= maxBindings / 2;
236cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
237cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
238cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			const tcu::ScopedLogSection section(m_testCtx.getLog(), "Generic", "After setting generic binding point");
239cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
240cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBindBuffer(m_bufferTarget, *bufferA);
241cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			GLU_EXPECT_NO_ERROR(gl.glGetError(), "glBindBuffer");
242cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
243cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, 0, 0, m_verifierType);
244cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
245cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
246cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			const tcu::ScopedLogSection	section(m_testCtx.getLog(), "Indexed", "After setting with glBindBufferBase");
247cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
248cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBindBufferBase(m_bufferTarget, ndxA, *bufferA);
249cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			GLU_EXPECT_NO_ERROR(gl.glGetError(), "glBindBufferBase");
250cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
251cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, ndxA, *bufferA, m_verifierType);
252cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
253cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
254cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			const tcu::ScopedLogSection	section(m_testCtx.getLog(), "Indexed", "After setting with glBindBufferRange");
255cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
256cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBindBufferRange(m_bufferTarget, ndxB, *bufferB, 0, 8);
257cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			GLU_EXPECT_NO_ERROR(gl.glGetError(), "glBindBufferRange");
258cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
259cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, ndxB, *bufferB, m_verifierType);
260cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
261cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		if (ndxA != ndxB)
262cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
263cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			const tcu::ScopedLogSection	section(m_testCtx.getLog(), "DifferentStates", "Original state did not change");
264cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
265cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, ndxA, *bufferA, m_verifierType);
266cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
267cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
268cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
269cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	result.setTestContextResult(m_testCtx);
270cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	return STOP;
271cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
272cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
273cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryclass BufferStartCase : public TestCase
274cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
275cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrypublic:
276cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry						BufferStartCase		(Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bufferTarget, glw::GLenum numBindingsTarget, QueryType verifierType);
277cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
278cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryprivate:
279cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	IterateResult		iterate				(void);
280cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
281cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const glw::GLenum	m_queryTarget;
282cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const glw::GLenum	m_bufferTarget;
283cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const glw::GLenum	m_numBindingsTarget;
284cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const QueryType		m_verifierType;
285cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry};
286cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
287cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryBufferStartCase::BufferStartCase (Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bufferTarget, glw::GLenum numBindingsTarget, QueryType verifierType)
288cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	: TestCase				(context, name, desc)
289cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_queryTarget			(queryTarget)
290cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_bufferTarget		(bufferTarget)
291cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_numBindingsTarget	(numBindingsTarget)
292cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_verifierType		(verifierType)
293cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
294cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
295cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
296cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryBufferStartCase::IterateResult BufferStartCase::iterate (void)
297cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
298cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	glu::CallLogWrapper		gl			(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
299cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	tcu::ResultCollector	result		(m_testCtx.getLog(), " // ERROR: ");
300cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	int						maxBindings	= -1;
301cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
302cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.enableLogging(true);
303cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
304cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.glGetIntegerv(m_numBindingsTarget, &maxBindings);
305cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
306cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
307cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
308cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
309cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
310cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		for (int ndx = 0; ndx < maxBindings; ++ndx)
311cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, ndx, 0, m_verifierType);
312cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
313cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
314cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
315cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
316cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection	superSection	(m_testCtx.getLog(), "AfterSetting", "After setting");
317cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Buffer					bufferA			(m_context.getRenderContext());
318cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Buffer					bufferB			(m_context.getRenderContext());
319cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxA			= 0;
320cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxB			= maxBindings / 2;
321cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		int							offset			= -1;
322cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
323cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		if (m_bufferTarget == GL_ATOMIC_COUNTER_BUFFER)
324cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			offset = 4;
325cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		else if (m_bufferTarget == GL_SHADER_STORAGE_BUFFER)
326cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
327cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glGetIntegerv(GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT, &offset);
328cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			GLU_EXPECT_NO_ERROR(gl.glGetError(), "get align");
329cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
330012f21ddfb2c86a2960edd65a3f0ea8f1fcd7832Jarkko Pöyry		else
331012f21ddfb2c86a2960edd65a3f0ea8f1fcd7832Jarkko Pöyry			DE_ASSERT(false);
332cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
333012f21ddfb2c86a2960edd65a3f0ea8f1fcd7832Jarkko Pöyry		TCU_CHECK(offset >= 0);
334cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
335cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
336cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			const tcu::ScopedLogSection	section(m_testCtx.getLog(), "Generic", "After setting generic binding point");
337cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
338cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBindBuffer(m_bufferTarget, *bufferA);
339cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBufferData(m_bufferTarget, 16, DE_NULL, GL_DYNAMIC_READ);
340cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBindBuffer(m_bufferTarget, *bufferB);
341cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBufferData(m_bufferTarget, 32, DE_NULL, GL_DYNAMIC_READ);
342cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen bufs");
343cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
344cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, 0, 0, m_verifierType);
345cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
346cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
347cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			const tcu::ScopedLogSection	section(m_testCtx.getLog(), "Indexed", "After setting with glBindBufferBase");
348cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
349cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBindBufferBase(m_bufferTarget, ndxA, *bufferA);
350cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind buf");
351cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
352cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, ndxA, 0, m_verifierType);
353cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
354cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
355cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			const tcu::ScopedLogSection	section(m_testCtx.getLog(), "Indexed", "After setting with glBindBufferRange");
356cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
357cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBindBufferRange(m_bufferTarget, ndxB, *bufferB, offset, 8);
358cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind buf");
359cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
360cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, ndxB, offset, m_verifierType);
361cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
362cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		if (ndxA != ndxB)
363cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
364cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			const tcu::ScopedLogSection	section(m_testCtx.getLog(), "DifferentStates", "Original state did not change");
365cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
366cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, ndxA, 0, m_verifierType);
367cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
368cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
369cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
370cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	result.setTestContextResult(m_testCtx);
371cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	return STOP;
372cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
373cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
374cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryclass BufferSizeCase : public TestCase
375cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
376cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrypublic:
377cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry						BufferSizeCase	(Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bufferTarget, glw::GLenum numBindingsTarget, QueryType verifierType);
378cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
379cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryprivate:
380cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	IterateResult		iterate			(void);
381cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
382cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const glw::GLenum	m_queryTarget;
383cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const glw::GLenum	m_bufferTarget;
384cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const glw::GLenum	m_numBindingsTarget;
385cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const QueryType		m_verifierType;
386cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry};
387cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
388cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryBufferSizeCase::BufferSizeCase (Context& context, const char* name, const char* desc, glw::GLenum queryTarget, glw::GLenum bufferTarget, glw::GLenum numBindingsTarget, QueryType verifierType)
389cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	: TestCase				(context, name, desc)
390cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_queryTarget			(queryTarget)
391cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_bufferTarget		(bufferTarget)
392cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_numBindingsTarget	(numBindingsTarget)
393cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_verifierType		(verifierType)
394cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
395cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
396cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
397cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryBufferSizeCase::IterateResult BufferSizeCase::iterate (void)
398cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
399cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	glu::CallLogWrapper		gl			(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
400cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	tcu::ResultCollector	result		(m_testCtx.getLog(), " // ERROR: ");
401cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	int						maxBindings	= -1;
402cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
403cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.enableLogging(true);
404cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
405cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.glGetIntegerv(m_numBindingsTarget, &maxBindings);
406cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
407cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
408cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
409cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
410cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
411cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		for (int ndx = 0; ndx < maxBindings; ++ndx)
412cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, ndx, 0, m_verifierType);
413cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
414cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
415cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
416cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection	superSection	(m_testCtx.getLog(), "AfterSetting", "After setting");
417cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Buffer					bufferA			(m_context.getRenderContext());
418cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Buffer					bufferB			(m_context.getRenderContext());
419cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxA			= 0;
420cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxB			= maxBindings / 2;
421cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
422cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
423cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			const tcu::ScopedLogSection	section(m_testCtx.getLog(), "Generic", "After setting generic binding point");
424cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
425cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBindBuffer(m_bufferTarget, *bufferA);
426cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBufferData(m_bufferTarget, 16, DE_NULL, GL_DYNAMIC_READ);
427cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBindBuffer(m_bufferTarget, *bufferB);
428cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBufferData(m_bufferTarget, 32, DE_NULL, GL_DYNAMIC_READ);
429cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen bufs");
430cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
431cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, 0, 0, m_verifierType);
432cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
433cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
434cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			const tcu::ScopedLogSection	section(m_testCtx.getLog(), "Indexed", "After setting with glBindBufferBase");
435cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
436cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBindBufferBase(m_bufferTarget, ndxA, *bufferA);
437cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind buf");
438cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
439cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, ndxA, 0, m_verifierType);
440cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
441cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
442cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			const tcu::ScopedLogSection	section(m_testCtx.getLog(), "Indexed", "After setting with glBindBufferRange");
443cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
444cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			gl.glBindBufferRange(m_bufferTarget, ndxB, *bufferB, 0, 8);
445cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind buf");
446cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
447cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, ndxB, 8, m_verifierType);
448cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
449cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		if (ndxA != ndxB)
450cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		{
451cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			const tcu::ScopedLogSection	section(m_testCtx.getLog(), "DifferentStates", "Original state did not change");
452cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
453cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, m_queryTarget, ndxA, 0, m_verifierType);
454cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		}
455cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
456cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
457cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	result.setTestContextResult(m_testCtx);
458cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	return STOP;
459cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
460cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
461cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryclass ImageBindingNameCase : public TestCase
462cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
463cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrypublic:
464cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry						ImageBindingNameCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
465cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
466cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryprivate:
467cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	IterateResult		iterate					(void);
468cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
469cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const QueryType		m_verifierType;
470cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry};
471cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
472cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryImageBindingNameCase::ImageBindingNameCase (Context& context, const char* name, const char* desc, QueryType verifierType)
473cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	: TestCase			(context, name, desc)
474cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_verifierType	(verifierType)
475cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
476cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
477cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
478cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryImageBindingNameCase::IterateResult ImageBindingNameCase::iterate (void)
479cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
480cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	glu::CallLogWrapper		gl			(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
481cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	tcu::ResultCollector	result		(m_testCtx.getLog(), " // ERROR: ");
482cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	int						maxImages	= -1;
483cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
484cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.enableLogging(true);
485cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
486cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.glGetIntegerv(GL_MAX_IMAGE_UNITS, &maxImages);
487cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
488cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
489cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
490cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
491cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
492cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		for (int ndx = 0; ndx < maxImages; ++ndx)
493cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_NAME, ndx, 0, m_verifierType);
494cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
495cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
496cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
497cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection	superSection	(m_testCtx.getLog(), "AfterSetting", "After setting");
498cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Texture				textureA		(m_context.getRenderContext());
499cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Texture				textureB		(m_context.getRenderContext());
500cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxA			= 0;
501cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxB			= maxImages / 2;
502cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
503cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindTexture(GL_TEXTURE_2D, *textureA);
504cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32);
505cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
506cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
507cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindImageTexture(ndxA, *textureA, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
508cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
509cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
510cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindTexture(GL_TEXTURE_2D_ARRAY, *textureB);
511cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 32, 32, 4);
512cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
513cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
514cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindImageTexture(ndxB, *textureB, 0, GL_FALSE, 2, GL_READ_ONLY, GL_RGBA8UI);
515cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
516cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
517cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_NAME, ndxA, *textureA, m_verifierType);
518cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_NAME, ndxB, *textureB, m_verifierType);
519cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
520cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
521cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	result.setTestContextResult(m_testCtx);
522cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	return STOP;
523cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
524cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
525cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryclass ImageBindingLevelCase : public TestCase
526cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
527cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrypublic:
528cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry						ImageBindingLevelCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
529cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
530cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryprivate:
531cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	IterateResult		iterate					(void);
532cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
533cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const QueryType		m_verifierType;
534cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry};
535cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
536cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryImageBindingLevelCase::ImageBindingLevelCase (Context& context, const char* name, const char* desc, QueryType verifierType)
537cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	: TestCase			(context, name, desc)
538cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_verifierType	(verifierType)
539cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
540cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
541cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
542cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryImageBindingLevelCase::IterateResult ImageBindingLevelCase::iterate (void)
543cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
544cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	glu::CallLogWrapper		gl			(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
545cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	tcu::ResultCollector	result		(m_testCtx.getLog(), " // ERROR: ");
546cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	int						maxImages	= -1;
547cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
548cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.enableLogging(true);
549cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
550cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.glGetIntegerv(GL_MAX_IMAGE_UNITS, &maxImages);
551cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
552cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
553cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
554cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
555cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
556cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		for (int ndx = 0; ndx < maxImages; ++ndx)
557cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_LEVEL, ndx, 0, m_verifierType);
558cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
559cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
560cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
561cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection	superSection	(m_testCtx.getLog(), "AfterSetting", "After setting");
562cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Texture				textureA		(m_context.getRenderContext());
563cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Texture				textureB		(m_context.getRenderContext());
564cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxA			= 0;
565cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxB			= maxImages / 2;
566cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
567cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindTexture(GL_TEXTURE_2D, *textureA);
568cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32);
569cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
570cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
571cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindImageTexture(ndxA, *textureA, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
572cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
573cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
574cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindTexture(GL_TEXTURE_2D, *textureB);
575cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glTexStorage2D(GL_TEXTURE_2D, 3, GL_RGBA8, 32, 32);
576cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
577cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
578cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindImageTexture(ndxB, *textureB, 2, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
579cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
580cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
581cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_LEVEL, ndxA, 0, m_verifierType);
582cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_LEVEL, ndxB, 2, m_verifierType);
583cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
584cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
585cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	result.setTestContextResult(m_testCtx);
586cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	return STOP;
587cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
588cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
589cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryclass ImageBindingLayeredCase : public TestCase
590cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
591cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrypublic:
592cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry						ImageBindingLayeredCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
593cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
594cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryprivate:
595cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	IterateResult		iterate					(void);
596cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
597cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const QueryType		m_verifierType;
598cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry};
599cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
600cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryImageBindingLayeredCase::ImageBindingLayeredCase (Context& context, const char* name, const char* desc, QueryType verifierType)
601cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	: TestCase			(context, name, desc)
602cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_verifierType	(verifierType)
603cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
604cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
605cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
606cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryImageBindingLayeredCase::IterateResult ImageBindingLayeredCase::iterate (void)
607cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
608cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	glu::CallLogWrapper		gl			(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
609cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	tcu::ResultCollector	result		(m_testCtx.getLog(), " // ERROR: ");
610cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	int						maxImages	= -1;
611cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
612cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.enableLogging(true);
613cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
614cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.glGetIntegerv(GL_MAX_IMAGE_UNITS, &maxImages);
615cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
616cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
617cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
618cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
619cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
620cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		for (int ndx = 0; ndx < maxImages; ++ndx)
621cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedBoolean(result, gl, GL_IMAGE_BINDING_LAYERED, ndx, false, m_verifierType);
622cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
623cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
624cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
625cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection	superSection	(m_testCtx.getLog(), "AfterSetting", "After setting");
626cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Texture				textureA		(m_context.getRenderContext());
627cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Texture				textureB		(m_context.getRenderContext());
628cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxA			= 0;
629cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxB			= maxImages / 2;
630cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
631cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindTexture(GL_TEXTURE_2D, *textureA);
632cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32);
633cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
634cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
635cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindImageTexture(ndxA, *textureA, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
636cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
637cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
638cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindTexture(GL_TEXTURE_2D_ARRAY, *textureB);
639cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 32, 32, 4);
640cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
641cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
642cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindImageTexture(ndxB, *textureB, 0, GL_TRUE, 2, GL_READ_ONLY, GL_RGBA8UI);
643cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
644cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
645cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		verifyStateIndexedBoolean(result, gl, GL_IMAGE_BINDING_LAYERED, ndxA, false, m_verifierType);
646cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		verifyStateIndexedBoolean(result, gl, GL_IMAGE_BINDING_LAYERED, ndxB, true, m_verifierType);
647cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
648cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
649cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	result.setTestContextResult(m_testCtx);
650cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	return STOP;
651cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
652cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
653cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryclass ImageBindingLayerCase : public TestCase
654cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
655cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrypublic:
656cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry						ImageBindingLayerCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
657cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
658cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryprivate:
659cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	IterateResult		iterate					(void);
660cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
661cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const QueryType		m_verifierType;
662cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry};
663cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
664cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryImageBindingLayerCase::ImageBindingLayerCase (Context& context, const char* name, const char* desc, QueryType verifierType)
665cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	: TestCase			(context, name, desc)
666cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_verifierType	(verifierType)
667cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
668cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
669cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
670cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryImageBindingLayerCase::IterateResult ImageBindingLayerCase::iterate (void)
671cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
672cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	glu::CallLogWrapper		gl			(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
673cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	tcu::ResultCollector	result		(m_testCtx.getLog(), " // ERROR: ");
674cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	int						maxImages	= -1;
675cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
676cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.enableLogging(true);
677cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
678cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.glGetIntegerv(GL_MAX_IMAGE_UNITS, &maxImages);
679cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
680cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
681cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
682cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
683cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
684cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		for (int ndx = 0; ndx < maxImages; ++ndx)
685cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_LAYER, ndx, 0, m_verifierType);
686cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
687cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
688cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
689cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection	superSection	(m_testCtx.getLog(), "AfterSetting", "After setting");
690cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Texture				textureA		(m_context.getRenderContext());
691cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Texture				textureB		(m_context.getRenderContext());
692cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxA			= 0;
693cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxB			= maxImages / 2;
694cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
695cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindTexture(GL_TEXTURE_2D, *textureA);
696cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32);
697cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
698cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
699cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindImageTexture(ndxA, *textureA, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
700cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
701cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
702cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindTexture(GL_TEXTURE_2D_ARRAY, *textureB);
703cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 32, 32, 4);
704cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
705cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
706cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindImageTexture(ndxB, *textureB, 0, GL_TRUE, 2, GL_READ_ONLY, GL_RGBA8UI);
707cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
708cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
709cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_LAYER, ndxA, 0, m_verifierType);
710cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_LAYER, ndxB, 2, m_verifierType);
711cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
712cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
713cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	result.setTestContextResult(m_testCtx);
714cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	return STOP;
715cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
716cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
717cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryclass ImageBindingAccessCase : public TestCase
718cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
719cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrypublic:
720cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry						ImageBindingAccessCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
721cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
722cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryprivate:
723cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	IterateResult		iterate					(void);
724cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
725cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const QueryType		m_verifierType;
726cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry};
727cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
728cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryImageBindingAccessCase::ImageBindingAccessCase (Context& context, const char* name, const char* desc, QueryType verifierType)
729cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	: TestCase			(context, name, desc)
730cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_verifierType	(verifierType)
731cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
732cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
733cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
734cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryImageBindingAccessCase::IterateResult ImageBindingAccessCase::iterate (void)
735cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
736cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	glu::CallLogWrapper		gl			(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
737cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	tcu::ResultCollector	result		(m_testCtx.getLog(), " // ERROR: ");
738cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	int						maxImages	= -1;
739cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
740cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.enableLogging(true);
741cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
742cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.glGetIntegerv(GL_MAX_IMAGE_UNITS, &maxImages);
743cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
744cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
745cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
746cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
747cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
748cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		for (int ndx = 0; ndx < maxImages; ++ndx)
749cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_ACCESS, ndx, GL_READ_ONLY, m_verifierType);
750cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
751cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
752cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
753cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection	superSection	(m_testCtx.getLog(), "AfterSetting", "After setting");
754cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Texture				textureA		(m_context.getRenderContext());
755cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Texture				textureB		(m_context.getRenderContext());
756cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxA			= 0;
757cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxB			= maxImages / 2;
758cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
759cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindTexture(GL_TEXTURE_2D, *textureA);
760cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32);
761cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
762cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
763cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindImageTexture(ndxA, *textureA, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
764cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
765cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
766cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindTexture(GL_TEXTURE_2D_ARRAY, *textureB);
767cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, 32, 32, 4);
768cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
769cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
770cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindImageTexture(ndxB, *textureB, 0, GL_TRUE, 2, GL_READ_WRITE, GL_RGBA8UI);
771cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
772cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
773cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_ACCESS, ndxA, GL_READ_ONLY, m_verifierType);
774cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_ACCESS, ndxB, GL_READ_WRITE, m_verifierType);
775cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
776cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
777cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	result.setTestContextResult(m_testCtx);
778cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	return STOP;
779cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
780cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
781cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryclass ImageBindingFormatCase : public TestCase
782cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
783cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyrypublic:
784cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry						ImageBindingFormatCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
785cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
786cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryprivate:
787cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	IterateResult		iterate					(void);
788cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
789cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	const QueryType		m_verifierType;
790cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry};
791cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
792cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryImageBindingFormatCase::ImageBindingFormatCase (Context& context, const char* name, const char* desc, QueryType verifierType)
793cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	: TestCase			(context, name, desc)
794cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	, m_verifierType	(verifierType)
795cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
796cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
797cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
798cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryImageBindingFormatCase::IterateResult ImageBindingFormatCase::iterate (void)
799cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
800cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	glu::CallLogWrapper		gl			(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
801cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	tcu::ResultCollector	result		(m_testCtx.getLog(), " // ERROR: ");
802cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	int						maxImages	= -1;
803cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
804cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.enableLogging(true);
805cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
806cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	gl.glGetIntegerv(GL_MAX_IMAGE_UNITS, &maxImages);
807cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
808cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
809cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
810cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
811cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
812cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		for (int ndx = 0; ndx < maxImages; ++ndx)
813cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry			verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_FORMAT, ndx, GL_R32UI, m_verifierType);
814cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
815cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
816cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{
817cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const tcu::ScopedLogSection	superSection	(m_testCtx.getLog(), "AfterSetting", "After setting");
818cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Texture				textureA		(m_context.getRenderContext());
819cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		glu::Texture				textureB		(m_context.getRenderContext());
820cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxA			= 0;
821cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const int					ndxB			= maxImages / 2;
822cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
823cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindTexture(GL_TEXTURE_2D, *textureA);
824cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 32, 32);
825cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
826cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
827cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindImageTexture(ndxA, *textureA, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8UI);
828cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
829cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
830cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindTexture(GL_TEXTURE_2D_ARRAY, *textureB);
831cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_R32F, 32, 32, 4);
832cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "gen tex");
833cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
834cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		gl.glBindImageTexture(ndxB, *textureB, 0, GL_TRUE, 2, GL_READ_WRITE, GL_R32F);
835cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		GLU_EXPECT_NO_ERROR(gl.glGetError(), "bind unit");
836cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
837cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_FORMAT, ndxA, GL_RGBA8UI, m_verifierType);
838cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		verifyStateIndexedInteger(result, gl, GL_IMAGE_BINDING_FORMAT, ndxB, GL_R32F, m_verifierType);
839cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
840cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
841cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	result.setTestContextResult(m_testCtx);
842cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	return STOP;
843cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
844cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
845591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärviclass EnableBlendCase : public TestCase
846591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
847591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvipublic:
848591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi						EnableBlendCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
849591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
850591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	void				init			(void);
851591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärviprivate:
852591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	IterateResult		iterate			(void);
853591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
854591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	const QueryType		m_verifierType;
855591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi};
856591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
857591173f18359cabb0d9d88adf3eeb381a21ffc04Mika IsojärviEnableBlendCase::EnableBlendCase (Context& context, const char* name, const char* desc, QueryType verifierType)
858591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	: TestCase			(context, name, desc)
859591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	, m_verifierType	(verifierType)
860591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
861591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
862591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
863591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvivoid EnableBlendCase::init (void)
864591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
865591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
866591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		throw tcu::NotSupportedError("Extension GL_EXT_draw_buffers_indexed not supported", "", __FILE__, __LINE__);
867591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
868591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
869591173f18359cabb0d9d88adf3eeb381a21ffc04Mika IsojärviEnableBlendCase::IterateResult EnableBlendCase::iterate (void)
870591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
871591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	glu::CallLogWrapper		gl				(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
872591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	tcu::ResultCollector	result			(m_testCtx.getLog(), " // ERROR: ");
873591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	deInt32					maxDrawBuffers = 0;
874591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
875591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	gl.enableLogging(true);
876591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
877591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	gl.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
878591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
879591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
880591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
881591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
882591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
883591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
884591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedBoolean(result, gl, GL_BLEND, ndx, false, m_verifierType);
885591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
886591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
887591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection	superSection	(m_testCtx.getLog(), "AfterSettingCommon", "After setting common");
888591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
889591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glEnable(GL_BLEND);
890591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
891591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
892591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedBoolean(result, gl, GL_BLEND, ndx, true, m_verifierType);
893591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
894591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
895591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
896591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection	superSection	(m_testCtx.getLog(), "AfterSettingIndexed", "After setting indexed");
897591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
898591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
899591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		{
900591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			if (ndx % 2 == 0)
901591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi				gl.glEnablei(GL_BLEND, ndx);
902591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			else
903591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi				gl.glDisablei(GL_BLEND, ndx);
904591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		}
905591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
906591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
907591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedBoolean(result, gl, GL_BLEND, ndx, (ndx % 2 == 0), m_verifierType);
908591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
909591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
910591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection	superSection	(m_testCtx.getLog(), "AfterResettingIndexedWithCommon", "After resetting indexed with common");
911591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
912591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
913591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		{
914591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			if (ndx % 2 == 0)
915591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi				gl.glEnablei(GL_BLEND, ndx);
916591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			else
917591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi				gl.glDisablei(GL_BLEND, ndx);
918591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		}
919591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
920591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glEnable(GL_BLEND);
921591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
922591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
923591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedBoolean(result, gl, GL_BLEND, ndx, true, m_verifierType);
924591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
925591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
926591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	result.setTestContextResult(m_testCtx);
927591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	return STOP;
928591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
929591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
930591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärviclass ColorMaskCase : public TestCase
931591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
932591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvipublic:
933591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi						ColorMaskCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
934591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
935591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	void				init			(void);
936591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärviprivate:
937591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	IterateResult		iterate			(void);
938591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
939591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	const QueryType		m_verifierType;
940591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi};
941591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
942591173f18359cabb0d9d88adf3eeb381a21ffc04Mika IsojärviColorMaskCase::ColorMaskCase (Context& context, const char* name, const char* desc, QueryType verifierType)
943591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	: TestCase			(context, name, desc)
944591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	, m_verifierType	(verifierType)
945591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
946591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
947591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
948591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvivoid ColorMaskCase::init (void)
949591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
950591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
951591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		throw tcu::NotSupportedError("Extension GL_EXT_draw_buffers_indexed not supported", "", __FILE__, __LINE__);
952591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
953591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
954591173f18359cabb0d9d88adf3eeb381a21ffc04Mika IsojärviColorMaskCase::IterateResult ColorMaskCase::iterate (void)
955591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
956591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	glu::CallLogWrapper		gl				(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
957591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	tcu::ResultCollector	result			(m_testCtx.getLog(), " // ERROR: ");
958591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	deInt32					maxDrawBuffers = 0;
959591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
960591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	gl.enableLogging(true);
961591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
962591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	gl.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
963591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
964591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
965591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
966591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
967591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
968591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
969591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedBooleanVec4(result, gl, GL_COLOR_WRITEMASK, ndx, tcu::BVec4(true), m_verifierType);
970591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
971591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
972591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingCommon", "After setting common");
973591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
974591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE);
975591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
976591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
977591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedBooleanVec4(result, gl, GL_COLOR_WRITEMASK, ndx, tcu::BVec4(false, true, true, false), m_verifierType);
978591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
979591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
980591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingIndexed", "After setting indexed");
981591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
982591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
983591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			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));
984591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
985591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
986591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedBooleanVec4(result, gl, GL_COLOR_WRITEMASK, ndx, (ndx % 2 == 0 ? tcu::BVec4(true, false, true, false) : tcu::BVec4(false, true, false, true)), m_verifierType);
987591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
988591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
989591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterResettingIndexedWithCommon", "After resetting indexed with common");
990591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
991591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
992591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			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));
993591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
994591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE);
995591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
996591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
997591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedBooleanVec4(result, gl, GL_COLOR_WRITEMASK, ndx, tcu::BVec4(false, true, true, false), m_verifierType);
998591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
999591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1000591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	result.setTestContextResult(m_testCtx);
1001591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	return STOP;
1002591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
1003591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1004591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärviclass BlendFuncCase : public TestCase
1005591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
1006591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvipublic:
1007591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi						BlendFuncCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
1008591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1009591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	void				init			(void);
1010591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärviprivate:
1011591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	IterateResult		iterate			(void);
1012591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1013591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	const QueryType		m_verifierType;
1014591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi};
1015591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1016591173f18359cabb0d9d88adf3eeb381a21ffc04Mika IsojärviBlendFuncCase::BlendFuncCase (Context& context, const char* name, const char* desc, QueryType verifierType)
1017591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	: TestCase			(context, name, desc)
1018591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	, m_verifierType	(verifierType)
1019591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
1020591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
1021591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1022591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvivoid BlendFuncCase::init (void)
1023591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
1024591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
1025591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		throw tcu::NotSupportedError("Extension GL_EXT_draw_buffers_indexed not supported", "", __FILE__, __LINE__);
1026591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
1027591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1028591173f18359cabb0d9d88adf3eeb381a21ffc04Mika IsojärviBlendFuncCase::IterateResult BlendFuncCase::iterate (void)
1029591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
1030591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	const deUint32 blendFuncs[] =
1031591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1032591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_ZERO,
1033591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_ONE,
1034591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_SRC_COLOR,
1035591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_ONE_MINUS_SRC_COLOR,
1036591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_DST_COLOR,
1037591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_ONE_MINUS_DST_COLOR,
1038591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_SRC_ALPHA,
1039591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_ONE_MINUS_SRC_ALPHA,
1040591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_DST_ALPHA,
1041591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_ONE_MINUS_DST_ALPHA,
1042591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_CONSTANT_COLOR,
1043591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_ONE_MINUS_CONSTANT_COLOR,
1044591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_CONSTANT_ALPHA,
1045591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_ONE_MINUS_CONSTANT_ALPHA,
1046591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_SRC_ALPHA_SATURATE
1047591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	};
1048591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1049591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	glu::CallLogWrapper		gl				(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
1050591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	tcu::ResultCollector	result			(m_testCtx.getLog(), " // ERROR: ");
1051591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	deInt32					maxDrawBuffers = 0;
1052591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1053591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	gl.enableLogging(true);
1054591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1055591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	gl.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
1056591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
1057591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1058591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1059591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
1060591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1061591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1062591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_RGB, ndx, GL_ONE, m_verifierType);
1063591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1064591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1065591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_DST_RGB, ndx, GL_ZERO, m_verifierType);
1066591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1067591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1068591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_ALPHA, ndx, GL_ONE, m_verifierType);
1069591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1070591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1071591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_DST_ALPHA, ndx, GL_ZERO, m_verifierType);
1072591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1073591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1074591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingCommon", "After setting common");
1075591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1076591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
1077591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1078591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1079591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_RGB, ndx, GL_SRC_ALPHA, m_verifierType);
1080591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1081591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1082591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_DST_RGB, ndx, GL_DST_ALPHA, m_verifierType);
1083591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1084591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1085591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_ALPHA, ndx, GL_SRC_ALPHA, m_verifierType);
1086591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1087591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1088591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_DST_ALPHA, ndx, GL_DST_ALPHA, m_verifierType);
1089591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1090591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1091591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingCommonSeparate", "After setting common separate");
1092591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1093591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glBlendFuncSeparate(GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA, GL_DST_COLOR, GL_ONE_MINUS_DST_ALPHA);
1094591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1095591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1096591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_RGB, ndx, GL_SRC_COLOR, m_verifierType);
1097591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1098591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1099591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_DST_RGB, ndx, GL_ONE_MINUS_SRC_ALPHA, m_verifierType);
1100591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1101591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1102591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_ALPHA, ndx, GL_DST_COLOR, m_verifierType);
1103591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1104591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1105591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_DST_ALPHA, ndx, GL_ONE_MINUS_DST_ALPHA, m_verifierType);
1106591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1107591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1108591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingIndexed", "After setting indexed");
1109591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1110591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1111591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			gl.glBlendFunci(ndx, blendFuncs[ndx % DE_LENGTH_OF_ARRAY(blendFuncs)], blendFuncs[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendFuncs)]);
1112591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1113591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1114591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_RGB, ndx, blendFuncs[ndx % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1115591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1116591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1117591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_DST_RGB, ndx, blendFuncs[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1118591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1119591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1120591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_ALPHA, ndx, blendFuncs[ndx % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1121591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1122591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1123591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_DST_ALPHA, ndx, blendFuncs[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1124591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1125591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1126591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingIndexedSeparate", "After setting indexed separate");
1127591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1128591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1129591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			gl.glBlendFuncSeparatei(ndx, blendFuncs[(ndx + 3) % DE_LENGTH_OF_ARRAY(blendFuncs)],
1130591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi										 blendFuncs[(ndx + 2) % DE_LENGTH_OF_ARRAY(blendFuncs)],
1131591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi										 blendFuncs[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendFuncs)],
1132591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi										 blendFuncs[(ndx + 0) % DE_LENGTH_OF_ARRAY(blendFuncs)]);
1133591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1134591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1135591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_RGB, ndx, blendFuncs[(ndx + 3) % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1136591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1137591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1138591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_DST_RGB, ndx, blendFuncs[(ndx + 2) % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1139591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1140591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1141591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_ALPHA, ndx, blendFuncs[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1142591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1143591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1144591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_DST_ALPHA, ndx, blendFuncs[(ndx + 0) % DE_LENGTH_OF_ARRAY(blendFuncs)], m_verifierType);
1145591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1146591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1147591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1148591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterResettingIndexedWithCommon", "After resetting indexed with common");
1149591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1150591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1151591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			gl.glBlendFunci(ndx, blendFuncs[ndx % DE_LENGTH_OF_ARRAY(blendFuncs)], blendFuncs[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendFuncs)]);
1152591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1153591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);
1154591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1155591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1156591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_RGB, ndx, GL_SRC_ALPHA, m_verifierType);
1157591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1158591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1159591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_DST_RGB, ndx, GL_DST_ALPHA, m_verifierType);
1160591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1161591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1162591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_ALPHA, ndx, GL_SRC_ALPHA, m_verifierType);
1163591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1164591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1165591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_DST_ALPHA, ndx, GL_DST_ALPHA, m_verifierType);
1166591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1167591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1168591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterResettingIndexedWithCommonSeparate", "After resetting indexed with common separate");
1169591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1170591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glBlendFuncSeparate(GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA, GL_DST_COLOR, GL_ONE_MINUS_DST_ALPHA);
1171591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1172591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1173591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			gl.glBlendFuncSeparatei(ndx, blendFuncs[(ndx + 3) % DE_LENGTH_OF_ARRAY(blendFuncs)],
1174591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi										 blendFuncs[(ndx + 2) % DE_LENGTH_OF_ARRAY(blendFuncs)],
1175591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi										 blendFuncs[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendFuncs)],
1176591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi										 blendFuncs[(ndx + 0) % DE_LENGTH_OF_ARRAY(blendFuncs)]);
1177591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1178591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glBlendFuncSeparate(GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA, GL_DST_COLOR, GL_ONE_MINUS_DST_ALPHA);
1179591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1180591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1181591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_RGB, ndx, GL_SRC_COLOR, m_verifierType);
1182591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1183591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1184591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_DST_RGB, ndx, GL_ONE_MINUS_SRC_ALPHA, m_verifierType);
1185591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1186591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1187591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_SRC_ALPHA, ndx, GL_DST_COLOR, m_verifierType);
1188591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1189591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1190591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_DST_ALPHA, ndx, GL_ONE_MINUS_DST_ALPHA, m_verifierType);
1191591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1192591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1193591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	result.setTestContextResult(m_testCtx);
1194591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	return STOP;
1195591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
1196591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1197591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärviclass BlendEquationCase : public TestCase
1198591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
1199591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvipublic:
1200591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi						BlendEquationCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
1201591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1202591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	void				init				(void);
1203591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärviprivate:
1204591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	IterateResult		iterate				(void);
1205591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1206591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	const QueryType		m_verifierType;
1207591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi};
1208591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1209591173f18359cabb0d9d88adf3eeb381a21ffc04Mika IsojärviBlendEquationCase::BlendEquationCase (Context& context, const char* name, const char* desc, QueryType verifierType)
1210591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	: TestCase			(context, name, desc)
1211591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	, m_verifierType	(verifierType)
1212591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
1213591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
1214591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1215591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvivoid BlendEquationCase::init (void)
1216591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
1217591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
1218591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		throw tcu::NotSupportedError("Extension GL_EXT_draw_buffers_indexed not supported", "", __FILE__, __LINE__);
1219591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
1220591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1221591173f18359cabb0d9d88adf3eeb381a21ffc04Mika IsojärviBlendEquationCase::IterateResult BlendEquationCase::iterate (void)
1222591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
1223591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	const deUint32 blendEquations[] =
1224591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1225591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_FUNC_ADD,
1226591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_FUNC_SUBTRACT,
1227591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_FUNC_REVERSE_SUBTRACT,
1228591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_MIN,
1229591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_MAX
1230591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	};
1231591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1232591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	glu::CallLogWrapper		gl				(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
1233591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	tcu::ResultCollector	result			(m_testCtx.getLog(), " // ERROR: ");
1234591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	deInt32					maxDrawBuffers = 0;
1235591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1236591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	gl.enableLogging(true);
1237591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1238591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	gl.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
1239591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
1240591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1241591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1242591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section(m_testCtx.getLog(), "Initial", "Initial value");
1243591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1244591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1245591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_FUNC_ADD, m_verifierType);
1246591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1247591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1248591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_FUNC_ADD, m_verifierType);
1249591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1250591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1251591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingCommon", "After setting common");
1252591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1253591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glBlendEquation(GL_FUNC_SUBTRACT);
1254591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1255591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1256591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_FUNC_SUBTRACT, m_verifierType);
1257591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1258591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1259591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_FUNC_SUBTRACT, m_verifierType);
1260591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1261591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1262591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingCommonSeparate", "After setting common separate");
1263591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1264591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glBlendEquationSeparate(GL_FUNC_REVERSE_SUBTRACT, GL_FUNC_SUBTRACT);
1265591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1266591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1267591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_FUNC_REVERSE_SUBTRACT, m_verifierType);
1268591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1269591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1270591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_FUNC_SUBTRACT, m_verifierType);
1271591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1272591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1273591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingIndexed", "After setting indexed");
1274591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1275591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1276591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			gl.glBlendEquationi(ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)]);
1277591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1278591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1279591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)], m_verifierType);
1280591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1281591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1282591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)], m_verifierType);
1283591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1284591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1285591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingIndexedSeparate", "After setting indexed separate");
1286591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1287591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1288591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			gl.glBlendEquationSeparatei(ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)], blendEquations[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendEquations)]);
1289591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1290591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1291591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)], m_verifierType);
1292591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1293591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1294591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, blendEquations[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendEquations)], m_verifierType);
1295591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1296591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1297591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterResettingIndexedWithCommon", "After resetting indexed with common");
1298591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1299591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1300591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			gl.glBlendEquationi(ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)]);
1301591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1302591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glBlendEquation(GL_FUNC_SUBTRACT);
1303591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1304591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1305591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_FUNC_SUBTRACT, m_verifierType);
1306591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1307591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1308591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_FUNC_SUBTRACT, m_verifierType);
1309591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1310591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1311591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterResettingIndexedWithCommonSeparate", "After resetting indexed with common separate");
1312591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1313591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1314591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			gl.glBlendEquationSeparatei(ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)], blendEquations[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendEquations)]);
1315591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1316591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glBlendEquationSeparate(GL_FUNC_REVERSE_SUBTRACT, GL_FUNC_SUBTRACT);
1317591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1318591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1319591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_FUNC_REVERSE_SUBTRACT, m_verifierType);
1320591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1321591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1322591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_FUNC_SUBTRACT, m_verifierType);
1323591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1324591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1325591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	result.setTestContextResult(m_testCtx);
1326591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	return STOP;
1327591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
1328591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1329591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärviclass BlendEquationAdvancedCase : public TestCase
1330591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
1331591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvipublic:
1332591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi						BlendEquationAdvancedCase	(Context& context, const char* name, const char* desc, QueryType verifierType);
1333591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1334591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	void				init				(void);
1335591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärviprivate:
1336591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	IterateResult		iterate				(void);
1337591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1338591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	const QueryType		m_verifierType;
1339591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi};
1340591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1341591173f18359cabb0d9d88adf3eeb381a21ffc04Mika IsojärviBlendEquationAdvancedCase::BlendEquationAdvancedCase (Context& context, const char* name, const char* desc, QueryType verifierType)
1342591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	: TestCase			(context, name, desc)
1343591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	, m_verifierType	(verifierType)
1344591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
1345591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
1346591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1347591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvivoid BlendEquationAdvancedCase::init (void)
1348591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
1349591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	if (!m_context.getContextInfo().isExtensionSupported("GL_EXT_draw_buffers_indexed"))
1350591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		throw tcu::NotSupportedError("Extension GL_EXT_draw_buffers_indexed not supported", "", __FILE__, __LINE__);
1351591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1352591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	if (!m_context.getContextInfo().isExtensionSupported("GL_KHR_blend_equation_advanced"))
1353591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		throw tcu::NotSupportedError("Extension GL_KHR_blend_equation_advanced not supported", "", __FILE__, __LINE__);
1354591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
1355591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1356591173f18359cabb0d9d88adf3eeb381a21ffc04Mika IsojärviBlendEquationAdvancedCase::IterateResult BlendEquationAdvancedCase::iterate (void)
1357591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi{
1358591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	const deUint32 blendEquations[] =
1359591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1360591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_FUNC_ADD,
1361591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_FUNC_SUBTRACT,
1362591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_FUNC_REVERSE_SUBTRACT,
1363591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_MIN,
1364591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_MAX
1365591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	};
1366591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1367591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	const deUint32 blendEquationAdvanced[] =
1368591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1369591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_MULTIPLY_KHR,
1370591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_SCREEN_KHR,
1371591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_OVERLAY_KHR,
1372591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_DARKEN_KHR,
1373591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_LIGHTEN_KHR,
1374591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_COLORDODGE_KHR,
1375591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_COLORBURN_KHR,
1376591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_HARDLIGHT_KHR,
1377591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_SOFTLIGHT_KHR,
1378591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_DIFFERENCE_KHR,
1379591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_EXCLUSION_KHR,
1380591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_HSL_HUE_KHR,
1381591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_HSL_SATURATION_KHR,
1382591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_HSL_COLOR_KHR,
1383591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		GL_HSL_LUMINOSITY_KHR
1384591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	};
1385591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1386591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	glu::CallLogWrapper		gl				(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
1387591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	tcu::ResultCollector	result			(m_testCtx.getLog(), " // ERROR: ");
1388591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	deInt32					maxDrawBuffers = 0;
1389591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1390591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	gl.enableLogging(true);
1391591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1392591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	gl.glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
1393591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	GLU_EXPECT_NO_ERROR(gl.glGetError(), "glGetIntegerv");
1394591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1395591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1396591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingCommon", "After setting common");
1397591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1398591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glBlendEquation(GL_SCREEN_KHR);
1399591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1400591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1401591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_SCREEN_KHR, m_verifierType);
1402591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1403591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1404591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_SCREEN_KHR, m_verifierType);
1405591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1406591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1407591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterSettingIndexed", "After setting indexed");
1408591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1409591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1410591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			gl.glBlendEquationi(ndx, blendEquationAdvanced[ndx % DE_LENGTH_OF_ARRAY(blendEquationAdvanced)]);
1411591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1412591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1413591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, blendEquationAdvanced[ndx % DE_LENGTH_OF_ARRAY(blendEquationAdvanced)], m_verifierType);
1414591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1415591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1416591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, blendEquationAdvanced[ndx % DE_LENGTH_OF_ARRAY(blendEquationAdvanced)], m_verifierType);
1417591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1418591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1419591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterResettingIndexedWithCommon", "After resetting indexed with common");
1420591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1421591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1422591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			gl.glBlendEquationi(ndx, blendEquationAdvanced[ndx % DE_LENGTH_OF_ARRAY(blendEquationAdvanced)]);
1423591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1424591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glBlendEquation(GL_MULTIPLY_KHR);
1425591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1426591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1427591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_MULTIPLY_KHR, m_verifierType);
1428591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1429591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1430591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_MULTIPLY_KHR, m_verifierType);
1431591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1432591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1433591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const tcu::ScopedLogSection section (m_testCtx.getLog(), "AfterResettingIndexedSeparateWithCommon", "After resetting indexed separate with common");
1434591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1435591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1436591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			gl.glBlendEquationSeparatei(ndx, blendEquations[ndx % DE_LENGTH_OF_ARRAY(blendEquations)], blendEquations[(ndx + 1) % DE_LENGTH_OF_ARRAY(blendEquations)]);
1437591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1438591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		gl.glBlendEquation(GL_LIGHTEN_KHR);
1439591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1440591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1441591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_RGB, ndx, GL_LIGHTEN_KHR, m_verifierType);
1442591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1443591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		for (int ndx = 0; ndx < maxDrawBuffers; ++ndx)
1444591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi			verifyStateIndexedInteger(result, gl, GL_BLEND_EQUATION_ALPHA, ndx, GL_LIGHTEN_KHR, m_verifierType);
1445591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1446591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1447591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	result.setTestContextResult(m_testCtx);
1448591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	return STOP;
1449591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi}
1450591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1451cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry} // anonymous
1452cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
1453cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryIndexedStateQueryTests::IndexedStateQueryTests (Context& context)
1454cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	: TestCaseGroup(context, "indexed", "Indexed state queries")
1455cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
1456cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
1457cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
1458cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko PöyryIndexedStateQueryTests::~IndexedStateQueryTests (void)
1459cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
1460cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
1461cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
1462cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyryvoid IndexedStateQueryTests::init (void)
1463cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry{
1464cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	static const QueryType verifiers[] = { QUERY_INDEXED_BOOLEAN, QUERY_INDEXED_INTEGER, QUERY_INDEXED_INTEGER64 };
1465591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	static const QueryType vec4Verifiers[] = { QUERY_INDEXED_BOOLEAN_VEC4, QUERY_INDEXED_INTEGER_VEC4, QUERY_INDEXED_INTEGER64_VEC4 };
1466cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
1467cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#define FOR_EACH_VERIFIER(X) \
1468cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx)	\
1469cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	{																						\
1470cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		const QueryType verifier = verifiers[verifierNdx];									\
1471591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const char* verifierSuffix = getVerifierSuffix(verifier);							\
1472cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry		this->addChild(X);																	\
1473cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	}
1474cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
1475591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi#define FOR_EACH_VEC4_VERIFIER(X) \
1476591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(vec4Verifiers); ++verifierNdx)	\
1477591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{																							\
1478591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const QueryType verifier = vec4Verifiers[verifierNdx];									\
1479591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const char* verifierSuffix = getVerifierSuffix(verifier);								\
1480591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		this->addChild(X);																		\
1481591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1482591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1483cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	FOR_EACH_VERIFIER(new SampleMaskCase			(m_context, (std::string() + "sample_mask_value_" + verifierSuffix).c_str(), 				"Test SAMPLE_MASK_VALUE", verifier))
1484cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
1485cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	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))
1486cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	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))
1487cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
1488cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	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))
1489cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	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))
1490cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	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))
1491cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
1492cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	FOR_EACH_VERIFIER(new BufferBindingCase			(m_context, (std::string() + "shader_storager_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))
1493cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	FOR_EACH_VERIFIER(new BufferStartCase			(m_context, (std::string() + "shader_storager_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))
1494cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	FOR_EACH_VERIFIER(new BufferSizeCase			(m_context, (std::string() + "shader_storager_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))
1495cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
1496cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	FOR_EACH_VERIFIER(new ImageBindingNameCase		(m_context, (std::string() + "image_binding_name_" + verifierSuffix).c_str(),				"Test IMAGE_BINDING_NAME",				verifier))
1497cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	FOR_EACH_VERIFIER(new ImageBindingLevelCase		(m_context, (std::string() + "image_binding_level_" + verifierSuffix).c_str(),				"Test IMAGE_BINDING_LEVEL",				verifier))
1498cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	FOR_EACH_VERIFIER(new ImageBindingLayeredCase	(m_context, (std::string() + "image_binding_layered_" + verifierSuffix).c_str(),			"Test IMAGE_BINDING_LAYERED",			verifier))
1499cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	FOR_EACH_VERIFIER(new ImageBindingLayerCase		(m_context, (std::string() + "image_binding_layer_" + verifierSuffix).c_str(),				"Test IMAGE_BINDING_LAYER",				verifier))
1500cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	FOR_EACH_VERIFIER(new ImageBindingAccessCase	(m_context, (std::string() + "image_binding_access_" + verifierSuffix).c_str(),				"Test IMAGE_BINDING_ACCESS",			verifier))
1501cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry	FOR_EACH_VERIFIER(new ImageBindingFormatCase	(m_context, (std::string() + "image_binding_format_" + verifierSuffix).c_str(),				"Test IMAGE_BINDING_FORMAT",			verifier))
1502cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
1503591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	{
1504591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const QueryType verifier = QUERY_INDEXED_ISENABLED;
1505591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		const char* verifierSuffix = getVerifierSuffix(verifier);
1506591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi		this->addChild(new EnableBlendCase			(m_context, (std::string() + "blend_" + verifierSuffix).c_str(),							"BLEND",								verifier));
1507591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	}
1508591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	FOR_EACH_VEC4_VERIFIER(new ColorMaskCase		(m_context, (std::string() + "color_mask_" + verifierSuffix).c_str(),						"COLOR_WRITEMASK",						verifier))
1509591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	FOR_EACH_VERIFIER(new BlendFuncCase				(m_context, (std::string() + "blend_func_" + verifierSuffix).c_str(),						"BLEND_SRC and BLEND_DST",				verifier))
1510591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	FOR_EACH_VERIFIER(new BlendEquationCase			(m_context, (std::string() + "blend_equation_" + verifierSuffix).c_str(),					"BLEND_EQUATION_RGB and BLEND_DST",		verifier))
1511591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi	FOR_EACH_VERIFIER(new BlendEquationAdvancedCase	(m_context, (std::string() + "blend_equation_advanced_" + verifierSuffix).c_str(),			"BLEND_EQUATION_RGB and BLEND_DST",		verifier))
1512591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi
1513591173f18359cabb0d9d88adf3eeb381a21ffc04Mika Isojärvi#undef FOR_EACH_VEC4_VERIFIER
1514cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry#undef FOR_EACH_VERIFIER
1515cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry}
1516cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry
1517cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry} // Functional
1518cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry} // gles31
1519cb82ed72dcbbfd8a6d07736c3259605227bc984fJarkko Pöyry} // deqp
1520