1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.1 Module
3*35238bceSAndroid Build Coastguard Worker  * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Vertex attribute binding state query tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es31fVertexAttributeBindingStateQueryTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluCallLogWrapper.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluObjectWrapper.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "glsStateQueryUtil.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "glsStateQueryUtil.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker namespace deqp
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker namespace gles31
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker namespace Functional
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker namespace
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker 
45*35238bceSAndroid Build Coastguard Worker using namespace gls::StateQueryUtil;
46*35238bceSAndroid Build Coastguard Worker 
47*35238bceSAndroid Build Coastguard Worker class AttributeCase : public TestCase
48*35238bceSAndroid Build Coastguard Worker {
49*35238bceSAndroid Build Coastguard Worker public:
50*35238bceSAndroid Build Coastguard Worker     AttributeCase(Context &context, const char *name, const char *desc, QueryType verifier);
51*35238bceSAndroid Build Coastguard Worker 
52*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
53*35238bceSAndroid Build Coastguard Worker     virtual void test(tcu::ResultCollector &result) = 0;
54*35238bceSAndroid Build Coastguard Worker 
55*35238bceSAndroid Build Coastguard Worker protected:
56*35238bceSAndroid Build Coastguard Worker     const QueryType m_verifier;
57*35238bceSAndroid Build Coastguard Worker };
58*35238bceSAndroid Build Coastguard Worker 
AttributeCase(Context & context,const char * name,const char * desc,QueryType verifier)59*35238bceSAndroid Build Coastguard Worker AttributeCase::AttributeCase(Context &context, const char *name, const char *desc, QueryType verifier)
60*35238bceSAndroid Build Coastguard Worker     : TestCase(context, name, desc)
61*35238bceSAndroid Build Coastguard Worker     , m_verifier(verifier)
62*35238bceSAndroid Build Coastguard Worker {
63*35238bceSAndroid Build Coastguard Worker }
64*35238bceSAndroid Build Coastguard Worker 
iterate(void)65*35238bceSAndroid Build Coastguard Worker AttributeCase::IterateResult AttributeCase::iterate(void)
66*35238bceSAndroid Build Coastguard Worker {
67*35238bceSAndroid Build Coastguard Worker     tcu::ResultCollector result(m_testCtx.getLog(), " // ERROR: ");
68*35238bceSAndroid Build Coastguard Worker 
69*35238bceSAndroid Build Coastguard Worker     test(result);
70*35238bceSAndroid Build Coastguard Worker 
71*35238bceSAndroid Build Coastguard Worker     result.setTestContextResult(m_testCtx);
72*35238bceSAndroid Build Coastguard Worker     return STOP;
73*35238bceSAndroid Build Coastguard Worker }
74*35238bceSAndroid Build Coastguard Worker 
75*35238bceSAndroid Build Coastguard Worker class AttributeBindingCase : public AttributeCase
76*35238bceSAndroid Build Coastguard Worker {
77*35238bceSAndroid Build Coastguard Worker public:
78*35238bceSAndroid Build Coastguard Worker     AttributeBindingCase(Context &context, const char *name, const char *desc, QueryType verifier);
79*35238bceSAndroid Build Coastguard Worker     void test(tcu::ResultCollector &result);
80*35238bceSAndroid Build Coastguard Worker };
81*35238bceSAndroid Build Coastguard Worker 
AttributeBindingCase(Context & context,const char * name,const char * desc,QueryType verifier)82*35238bceSAndroid Build Coastguard Worker AttributeBindingCase::AttributeBindingCase(Context &context, const char *name, const char *desc, QueryType verifier)
83*35238bceSAndroid Build Coastguard Worker     : AttributeCase(context, name, desc, verifier)
84*35238bceSAndroid Build Coastguard Worker {
85*35238bceSAndroid Build Coastguard Worker }
86*35238bceSAndroid Build Coastguard Worker 
test(tcu::ResultCollector & result)87*35238bceSAndroid Build Coastguard Worker void AttributeBindingCase::test(tcu::ResultCollector &result)
88*35238bceSAndroid Build Coastguard Worker {
89*35238bceSAndroid Build Coastguard Worker     glu::CallLogWrapper gl(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
90*35238bceSAndroid Build Coastguard Worker     glu::VertexArray vao(m_context.getRenderContext());
91*35238bceSAndroid Build Coastguard Worker     glw::GLint maxAttrs = -1;
92*35238bceSAndroid Build Coastguard Worker 
93*35238bceSAndroid Build Coastguard Worker     gl.enableLogging(true);
94*35238bceSAndroid Build Coastguard Worker 
95*35238bceSAndroid Build Coastguard Worker     gl.glBindVertexArray(*vao);
96*35238bceSAndroid Build Coastguard Worker     gl.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxAttrs);
97*35238bceSAndroid Build Coastguard Worker     GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
98*35238bceSAndroid Build Coastguard Worker 
99*35238bceSAndroid Build Coastguard Worker     // initial
100*35238bceSAndroid Build Coastguard Worker     {
101*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "initial", "Initial values");
102*35238bceSAndroid Build Coastguard Worker 
103*35238bceSAndroid Build Coastguard Worker         for (int attr = 0; attr < de::max(16, maxAttrs); ++attr)
104*35238bceSAndroid Build Coastguard Worker             verifyStateAttributeInteger(result, gl, GL_VERTEX_ATTRIB_BINDING, attr, attr, m_verifier);
105*35238bceSAndroid Build Coastguard Worker     }
106*35238bceSAndroid Build Coastguard Worker 
107*35238bceSAndroid Build Coastguard Worker     // is part of vao
108*35238bceSAndroid Build Coastguard Worker     {
109*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "vao", "VAO state");
110*35238bceSAndroid Build Coastguard Worker         glu::VertexArray otherVao(m_context.getRenderContext());
111*35238bceSAndroid Build Coastguard Worker 
112*35238bceSAndroid Build Coastguard Worker         // set to value A in vao1
113*35238bceSAndroid Build Coastguard Worker         gl.glVertexAttribBinding(1, 4);
114*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glVertexAttribBinding");
115*35238bceSAndroid Build Coastguard Worker 
116*35238bceSAndroid Build Coastguard Worker         // set to value B in vao2
117*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(*otherVao);
118*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexArray");
119*35238bceSAndroid Build Coastguard Worker 
120*35238bceSAndroid Build Coastguard Worker         gl.glVertexAttribBinding(1, 7);
121*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glVertexAttribBinding");
122*35238bceSAndroid Build Coastguard Worker 
123*35238bceSAndroid Build Coastguard Worker         // check value is still ok in original vao
124*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(*vao);
125*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexArray");
126*35238bceSAndroid Build Coastguard Worker 
127*35238bceSAndroid Build Coastguard Worker         verifyStateAttributeInteger(result, gl, GL_VERTEX_ATTRIB_BINDING, 1, 4, m_verifier);
128*35238bceSAndroid Build Coastguard Worker     }
129*35238bceSAndroid Build Coastguard Worker 
130*35238bceSAndroid Build Coastguard Worker     // random values
131*35238bceSAndroid Build Coastguard Worker     {
132*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "random", "Random values");
133*35238bceSAndroid Build Coastguard Worker         de::Random rnd(0xabc);
134*35238bceSAndroid Build Coastguard Worker         const int numRandomTests = 10;
135*35238bceSAndroid Build Coastguard Worker 
136*35238bceSAndroid Build Coastguard Worker         for (int randomTestNdx = 0; randomTestNdx < numRandomTests; ++randomTestNdx)
137*35238bceSAndroid Build Coastguard Worker         {
138*35238bceSAndroid Build Coastguard Worker             // switch random va to random binding
139*35238bceSAndroid Build Coastguard Worker             const int va      = rnd.getInt(0, de::max(16, maxAttrs) - 1);
140*35238bceSAndroid Build Coastguard Worker             const int binding = rnd.getInt(0, 16);
141*35238bceSAndroid Build Coastguard Worker 
142*35238bceSAndroid Build Coastguard Worker             gl.glVertexAttribBinding(va, binding);
143*35238bceSAndroid Build Coastguard Worker             GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glVertexAttribBinding");
144*35238bceSAndroid Build Coastguard Worker 
145*35238bceSAndroid Build Coastguard Worker             verifyStateAttributeInteger(result, gl, GL_VERTEX_ATTRIB_BINDING, va, binding, m_verifier);
146*35238bceSAndroid Build Coastguard Worker         }
147*35238bceSAndroid Build Coastguard Worker     }
148*35238bceSAndroid Build Coastguard Worker }
149*35238bceSAndroid Build Coastguard Worker 
150*35238bceSAndroid Build Coastguard Worker class AttributeRelativeOffsetCase : public AttributeCase
151*35238bceSAndroid Build Coastguard Worker {
152*35238bceSAndroid Build Coastguard Worker public:
153*35238bceSAndroid Build Coastguard Worker     AttributeRelativeOffsetCase(Context &context, const char *name, const char *desc, QueryType verifier);
154*35238bceSAndroid Build Coastguard Worker     void test(tcu::ResultCollector &result);
155*35238bceSAndroid Build Coastguard Worker };
156*35238bceSAndroid Build Coastguard Worker 
AttributeRelativeOffsetCase(Context & context,const char * name,const char * desc,QueryType verifier)157*35238bceSAndroid Build Coastguard Worker AttributeRelativeOffsetCase::AttributeRelativeOffsetCase(Context &context, const char *name, const char *desc,
158*35238bceSAndroid Build Coastguard Worker                                                          QueryType verifier)
159*35238bceSAndroid Build Coastguard Worker     : AttributeCase(context, name, desc, verifier)
160*35238bceSAndroid Build Coastguard Worker {
161*35238bceSAndroid Build Coastguard Worker }
162*35238bceSAndroid Build Coastguard Worker 
test(tcu::ResultCollector & result)163*35238bceSAndroid Build Coastguard Worker void AttributeRelativeOffsetCase::test(tcu::ResultCollector &result)
164*35238bceSAndroid Build Coastguard Worker {
165*35238bceSAndroid Build Coastguard Worker     glu::CallLogWrapper gl(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
166*35238bceSAndroid Build Coastguard Worker     glu::VertexArray vao(m_context.getRenderContext());
167*35238bceSAndroid Build Coastguard Worker     glw::GLint maxAttrs = -1;
168*35238bceSAndroid Build Coastguard Worker 
169*35238bceSAndroid Build Coastguard Worker     gl.enableLogging(true);
170*35238bceSAndroid Build Coastguard Worker 
171*35238bceSAndroid Build Coastguard Worker     gl.glBindVertexArray(*vao);
172*35238bceSAndroid Build Coastguard Worker     gl.glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxAttrs);
173*35238bceSAndroid Build Coastguard Worker     GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
174*35238bceSAndroid Build Coastguard Worker 
175*35238bceSAndroid Build Coastguard Worker     // initial
176*35238bceSAndroid Build Coastguard Worker     {
177*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "initial", "Initial values");
178*35238bceSAndroid Build Coastguard Worker 
179*35238bceSAndroid Build Coastguard Worker         for (int attr = 0; attr < de::max(16, maxAttrs); ++attr)
180*35238bceSAndroid Build Coastguard Worker             verifyStateAttributeInteger(result, gl, GL_VERTEX_ATTRIB_RELATIVE_OFFSET, attr, 0, m_verifier);
181*35238bceSAndroid Build Coastguard Worker     }
182*35238bceSAndroid Build Coastguard Worker 
183*35238bceSAndroid Build Coastguard Worker     // is part of vao
184*35238bceSAndroid Build Coastguard Worker     {
185*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "vao", "VAO state");
186*35238bceSAndroid Build Coastguard Worker         glu::VertexArray otherVao(m_context.getRenderContext());
187*35238bceSAndroid Build Coastguard Worker 
188*35238bceSAndroid Build Coastguard Worker         // set to value A in vao1
189*35238bceSAndroid Build Coastguard Worker         gl.glVertexAttribFormat(1, 4, GL_FLOAT, GL_FALSE, 9);
190*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glVertexAttribFormat");
191*35238bceSAndroid Build Coastguard Worker 
192*35238bceSAndroid Build Coastguard Worker         // set to value B in vao2
193*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(*otherVao);
194*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexArray");
195*35238bceSAndroid Build Coastguard Worker 
196*35238bceSAndroid Build Coastguard Worker         gl.glVertexAttribFormat(1, 4, GL_FLOAT, GL_FALSE, 21);
197*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glVertexAttribFormat");
198*35238bceSAndroid Build Coastguard Worker 
199*35238bceSAndroid Build Coastguard Worker         // check value is still ok in original vao
200*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(*vao);
201*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexArray");
202*35238bceSAndroid Build Coastguard Worker 
203*35238bceSAndroid Build Coastguard Worker         verifyStateAttributeInteger(result, gl, GL_VERTEX_ATTRIB_RELATIVE_OFFSET, 1, 9, m_verifier);
204*35238bceSAndroid Build Coastguard Worker     }
205*35238bceSAndroid Build Coastguard Worker 
206*35238bceSAndroid Build Coastguard Worker     // random values
207*35238bceSAndroid Build Coastguard Worker     {
208*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "random", "Random values");
209*35238bceSAndroid Build Coastguard Worker         de::Random rnd(0xabc);
210*35238bceSAndroid Build Coastguard Worker         const int numRandomTests = 10;
211*35238bceSAndroid Build Coastguard Worker 
212*35238bceSAndroid Build Coastguard Worker         for (int randomTestNdx = 0; randomTestNdx < numRandomTests; ++randomTestNdx)
213*35238bceSAndroid Build Coastguard Worker         {
214*35238bceSAndroid Build Coastguard Worker             const int va     = rnd.getInt(0, de::max(16, maxAttrs) - 1);
215*35238bceSAndroid Build Coastguard Worker             const int offset = rnd.getInt(0, 2047);
216*35238bceSAndroid Build Coastguard Worker 
217*35238bceSAndroid Build Coastguard Worker             gl.glVertexAttribFormat(va, 4, GL_FLOAT, GL_FALSE, offset);
218*35238bceSAndroid Build Coastguard Worker             GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glVertexAttribFormat");
219*35238bceSAndroid Build Coastguard Worker 
220*35238bceSAndroid Build Coastguard Worker             verifyStateAttributeInteger(result, gl, GL_VERTEX_ATTRIB_RELATIVE_OFFSET, va, offset, m_verifier);
221*35238bceSAndroid Build Coastguard Worker         }
222*35238bceSAndroid Build Coastguard Worker     }
223*35238bceSAndroid Build Coastguard Worker }
224*35238bceSAndroid Build Coastguard Worker 
225*35238bceSAndroid Build Coastguard Worker class IndexedCase : public TestCase
226*35238bceSAndroid Build Coastguard Worker {
227*35238bceSAndroid Build Coastguard Worker public:
228*35238bceSAndroid Build Coastguard Worker     IndexedCase(Context &context, const char *name, const char *desc, QueryType verifier);
229*35238bceSAndroid Build Coastguard Worker 
230*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
231*35238bceSAndroid Build Coastguard Worker     virtual void test(tcu::ResultCollector &result) = 0;
232*35238bceSAndroid Build Coastguard Worker 
233*35238bceSAndroid Build Coastguard Worker protected:
234*35238bceSAndroid Build Coastguard Worker     const QueryType m_verifier;
235*35238bceSAndroid Build Coastguard Worker };
236*35238bceSAndroid Build Coastguard Worker 
IndexedCase(Context & context,const char * name,const char * desc,QueryType verifier)237*35238bceSAndroid Build Coastguard Worker IndexedCase::IndexedCase(Context &context, const char *name, const char *desc, QueryType verifier)
238*35238bceSAndroid Build Coastguard Worker     : TestCase(context, name, desc)
239*35238bceSAndroid Build Coastguard Worker     , m_verifier(verifier)
240*35238bceSAndroid Build Coastguard Worker {
241*35238bceSAndroid Build Coastguard Worker }
242*35238bceSAndroid Build Coastguard Worker 
iterate(void)243*35238bceSAndroid Build Coastguard Worker IndexedCase::IterateResult IndexedCase::iterate(void)
244*35238bceSAndroid Build Coastguard Worker {
245*35238bceSAndroid Build Coastguard Worker     tcu::ResultCollector result(m_testCtx.getLog(), " // ERROR: ");
246*35238bceSAndroid Build Coastguard Worker 
247*35238bceSAndroid Build Coastguard Worker     test(result);
248*35238bceSAndroid Build Coastguard Worker 
249*35238bceSAndroid Build Coastguard Worker     result.setTestContextResult(m_testCtx);
250*35238bceSAndroid Build Coastguard Worker     return STOP;
251*35238bceSAndroid Build Coastguard Worker }
252*35238bceSAndroid Build Coastguard Worker 
253*35238bceSAndroid Build Coastguard Worker class VertexBindingDivisorCase : public IndexedCase
254*35238bceSAndroid Build Coastguard Worker {
255*35238bceSAndroid Build Coastguard Worker public:
256*35238bceSAndroid Build Coastguard Worker     VertexBindingDivisorCase(Context &context, const char *name, const char *desc, QueryType verifier);
257*35238bceSAndroid Build Coastguard Worker     void test(tcu::ResultCollector &result);
258*35238bceSAndroid Build Coastguard Worker };
259*35238bceSAndroid Build Coastguard Worker 
VertexBindingDivisorCase(Context & context,const char * name,const char * desc,QueryType verifier)260*35238bceSAndroid Build Coastguard Worker VertexBindingDivisorCase::VertexBindingDivisorCase(Context &context, const char *name, const char *desc,
261*35238bceSAndroid Build Coastguard Worker                                                    QueryType verifier)
262*35238bceSAndroid Build Coastguard Worker     : IndexedCase(context, name, desc, verifier)
263*35238bceSAndroid Build Coastguard Worker {
264*35238bceSAndroid Build Coastguard Worker }
265*35238bceSAndroid Build Coastguard Worker 
test(tcu::ResultCollector & result)266*35238bceSAndroid Build Coastguard Worker void VertexBindingDivisorCase::test(tcu::ResultCollector &result)
267*35238bceSAndroid Build Coastguard Worker {
268*35238bceSAndroid Build Coastguard Worker     glu::CallLogWrapper gl(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
269*35238bceSAndroid Build Coastguard Worker     glu::VertexArray vao(m_context.getRenderContext());
270*35238bceSAndroid Build Coastguard Worker     glw::GLint reportedMaxBindings = -1;
271*35238bceSAndroid Build Coastguard Worker     glw::GLint maxBindings;
272*35238bceSAndroid Build Coastguard Worker 
273*35238bceSAndroid Build Coastguard Worker     gl.enableLogging(true);
274*35238bceSAndroid Build Coastguard Worker 
275*35238bceSAndroid Build Coastguard Worker     gl.glBindVertexArray(*vao);
276*35238bceSAndroid Build Coastguard Worker     gl.glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &reportedMaxBindings);
277*35238bceSAndroid Build Coastguard Worker     GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
278*35238bceSAndroid Build Coastguard Worker 
279*35238bceSAndroid Build Coastguard Worker     maxBindings = de::max(16, reportedMaxBindings);
280*35238bceSAndroid Build Coastguard Worker 
281*35238bceSAndroid Build Coastguard Worker     // initial
282*35238bceSAndroid Build Coastguard Worker     {
283*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "initial", "Initial values");
284*35238bceSAndroid Build Coastguard Worker 
285*35238bceSAndroid Build Coastguard Worker         for (int binding = 0; binding < maxBindings; ++binding)
286*35238bceSAndroid Build Coastguard Worker             verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_DIVISOR, binding, 0, m_verifier);
287*35238bceSAndroid Build Coastguard Worker     }
288*35238bceSAndroid Build Coastguard Worker 
289*35238bceSAndroid Build Coastguard Worker     // is part of vao
290*35238bceSAndroid Build Coastguard Worker     {
291*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "vao", "VAO state");
292*35238bceSAndroid Build Coastguard Worker         glu::VertexArray otherVao(m_context.getRenderContext());
293*35238bceSAndroid Build Coastguard Worker 
294*35238bceSAndroid Build Coastguard Worker         // set to value A in vao1
295*35238bceSAndroid Build Coastguard Worker         gl.glVertexBindingDivisor(1, 4);
296*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glVertexBindingDivisor");
297*35238bceSAndroid Build Coastguard Worker 
298*35238bceSAndroid Build Coastguard Worker         // set to value B in vao2
299*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(*otherVao);
300*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexArray");
301*35238bceSAndroid Build Coastguard Worker 
302*35238bceSAndroid Build Coastguard Worker         gl.glVertexBindingDivisor(1, 9);
303*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glVertexBindingDivisor");
304*35238bceSAndroid Build Coastguard Worker 
305*35238bceSAndroid Build Coastguard Worker         // check value is still ok in original vao
306*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(*vao);
307*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexArray");
308*35238bceSAndroid Build Coastguard Worker 
309*35238bceSAndroid Build Coastguard Worker         verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_DIVISOR, 1, 4, m_verifier);
310*35238bceSAndroid Build Coastguard Worker     }
311*35238bceSAndroid Build Coastguard Worker 
312*35238bceSAndroid Build Coastguard Worker     // random values
313*35238bceSAndroid Build Coastguard Worker     {
314*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "random", "Random values");
315*35238bceSAndroid Build Coastguard Worker         de::Random rnd(0xabc);
316*35238bceSAndroid Build Coastguard Worker         const int numRandomTests = 10;
317*35238bceSAndroid Build Coastguard Worker 
318*35238bceSAndroid Build Coastguard Worker         for (int randomTestNdx = 0; randomTestNdx < numRandomTests; ++randomTestNdx)
319*35238bceSAndroid Build Coastguard Worker         {
320*35238bceSAndroid Build Coastguard Worker             const int binding = rnd.getInt(0, maxBindings - 1);
321*35238bceSAndroid Build Coastguard Worker             const int divisor = rnd.getInt(0, 2047);
322*35238bceSAndroid Build Coastguard Worker 
323*35238bceSAndroid Build Coastguard Worker             gl.glVertexBindingDivisor(binding, divisor);
324*35238bceSAndroid Build Coastguard Worker             GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glVertexBindingDivisor");
325*35238bceSAndroid Build Coastguard Worker 
326*35238bceSAndroid Build Coastguard Worker             verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_DIVISOR, binding, divisor, m_verifier);
327*35238bceSAndroid Build Coastguard Worker         }
328*35238bceSAndroid Build Coastguard Worker     }
329*35238bceSAndroid Build Coastguard Worker }
330*35238bceSAndroid Build Coastguard Worker 
331*35238bceSAndroid Build Coastguard Worker class VertexBindingOffsetCase : public IndexedCase
332*35238bceSAndroid Build Coastguard Worker {
333*35238bceSAndroid Build Coastguard Worker public:
334*35238bceSAndroid Build Coastguard Worker     VertexBindingOffsetCase(Context &context, const char *name, const char *desc, QueryType verifier);
335*35238bceSAndroid Build Coastguard Worker     void test(tcu::ResultCollector &result);
336*35238bceSAndroid Build Coastguard Worker };
337*35238bceSAndroid Build Coastguard Worker 
VertexBindingOffsetCase(Context & context,const char * name,const char * desc,QueryType verifier)338*35238bceSAndroid Build Coastguard Worker VertexBindingOffsetCase::VertexBindingOffsetCase(Context &context, const char *name, const char *desc,
339*35238bceSAndroid Build Coastguard Worker                                                  QueryType verifier)
340*35238bceSAndroid Build Coastguard Worker     : IndexedCase(context, name, desc, verifier)
341*35238bceSAndroid Build Coastguard Worker {
342*35238bceSAndroid Build Coastguard Worker }
343*35238bceSAndroid Build Coastguard Worker 
test(tcu::ResultCollector & result)344*35238bceSAndroid Build Coastguard Worker void VertexBindingOffsetCase::test(tcu::ResultCollector &result)
345*35238bceSAndroid Build Coastguard Worker {
346*35238bceSAndroid Build Coastguard Worker     glu::CallLogWrapper gl(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
347*35238bceSAndroid Build Coastguard Worker     glu::VertexArray vao(m_context.getRenderContext());
348*35238bceSAndroid Build Coastguard Worker     glu::Buffer buffer(m_context.getRenderContext());
349*35238bceSAndroid Build Coastguard Worker     glw::GLint reportedMaxBindings = -1;
350*35238bceSAndroid Build Coastguard Worker     glw::GLint maxBindings;
351*35238bceSAndroid Build Coastguard Worker 
352*35238bceSAndroid Build Coastguard Worker     gl.enableLogging(true);
353*35238bceSAndroid Build Coastguard Worker 
354*35238bceSAndroid Build Coastguard Worker     gl.glBindVertexArray(*vao);
355*35238bceSAndroid Build Coastguard Worker     gl.glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &reportedMaxBindings);
356*35238bceSAndroid Build Coastguard Worker     GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
357*35238bceSAndroid Build Coastguard Worker 
358*35238bceSAndroid Build Coastguard Worker     maxBindings = de::max(16, reportedMaxBindings);
359*35238bceSAndroid Build Coastguard Worker 
360*35238bceSAndroid Build Coastguard Worker     // initial
361*35238bceSAndroid Build Coastguard Worker     {
362*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "initial", "Initial values");
363*35238bceSAndroid Build Coastguard Worker 
364*35238bceSAndroid Build Coastguard Worker         for (int binding = 0; binding < maxBindings; ++binding)
365*35238bceSAndroid Build Coastguard Worker             verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_OFFSET, binding, 0, m_verifier);
366*35238bceSAndroid Build Coastguard Worker     }
367*35238bceSAndroid Build Coastguard Worker 
368*35238bceSAndroid Build Coastguard Worker     // is part of vao
369*35238bceSAndroid Build Coastguard Worker     {
370*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "vao", "VAO state");
371*35238bceSAndroid Build Coastguard Worker         glu::VertexArray otherVao(m_context.getRenderContext());
372*35238bceSAndroid Build Coastguard Worker 
373*35238bceSAndroid Build Coastguard Worker         // set to value A in vao1
374*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexBuffer(1, *buffer, 4, 32);
375*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexBuffer");
376*35238bceSAndroid Build Coastguard Worker 
377*35238bceSAndroid Build Coastguard Worker         // set to value B in vao2
378*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(*otherVao);
379*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexArray");
380*35238bceSAndroid Build Coastguard Worker 
381*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexBuffer(1, *buffer, 13, 32);
382*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexBuffer");
383*35238bceSAndroid Build Coastguard Worker 
384*35238bceSAndroid Build Coastguard Worker         // check value is still ok in original vao
385*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(*vao);
386*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexArray");
387*35238bceSAndroid Build Coastguard Worker 
388*35238bceSAndroid Build Coastguard Worker         verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_OFFSET, 1, 4, m_verifier);
389*35238bceSAndroid Build Coastguard Worker     }
390*35238bceSAndroid Build Coastguard Worker 
391*35238bceSAndroid Build Coastguard Worker     // random values
392*35238bceSAndroid Build Coastguard Worker     {
393*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "random", "Random values");
394*35238bceSAndroid Build Coastguard Worker         de::Random rnd(0xabc);
395*35238bceSAndroid Build Coastguard Worker         const int numRandomTests = 10;
396*35238bceSAndroid Build Coastguard Worker 
397*35238bceSAndroid Build Coastguard Worker         for (int randomTestNdx = 0; randomTestNdx < numRandomTests; ++randomTestNdx)
398*35238bceSAndroid Build Coastguard Worker         {
399*35238bceSAndroid Build Coastguard Worker             const int binding = rnd.getInt(0, maxBindings - 1);
400*35238bceSAndroid Build Coastguard Worker             const int offset  = rnd.getInt(0, 4000);
401*35238bceSAndroid Build Coastguard Worker 
402*35238bceSAndroid Build Coastguard Worker             gl.glBindVertexBuffer(binding, *buffer, offset, 32);
403*35238bceSAndroid Build Coastguard Worker             GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexBuffer");
404*35238bceSAndroid Build Coastguard Worker 
405*35238bceSAndroid Build Coastguard Worker             verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_OFFSET, binding, offset, m_verifier);
406*35238bceSAndroid Build Coastguard Worker         }
407*35238bceSAndroid Build Coastguard Worker     }
408*35238bceSAndroid Build Coastguard Worker }
409*35238bceSAndroid Build Coastguard Worker 
410*35238bceSAndroid Build Coastguard Worker class VertexBindingStrideCase : public IndexedCase
411*35238bceSAndroid Build Coastguard Worker {
412*35238bceSAndroid Build Coastguard Worker public:
413*35238bceSAndroid Build Coastguard Worker     VertexBindingStrideCase(Context &context, const char *name, const char *desc, QueryType verifier);
414*35238bceSAndroid Build Coastguard Worker     void test(tcu::ResultCollector &result);
415*35238bceSAndroid Build Coastguard Worker };
416*35238bceSAndroid Build Coastguard Worker 
VertexBindingStrideCase(Context & context,const char * name,const char * desc,QueryType verifier)417*35238bceSAndroid Build Coastguard Worker VertexBindingStrideCase::VertexBindingStrideCase(Context &context, const char *name, const char *desc,
418*35238bceSAndroid Build Coastguard Worker                                                  QueryType verifier)
419*35238bceSAndroid Build Coastguard Worker     : IndexedCase(context, name, desc, verifier)
420*35238bceSAndroid Build Coastguard Worker {
421*35238bceSAndroid Build Coastguard Worker }
422*35238bceSAndroid Build Coastguard Worker 
test(tcu::ResultCollector & result)423*35238bceSAndroid Build Coastguard Worker void VertexBindingStrideCase::test(tcu::ResultCollector &result)
424*35238bceSAndroid Build Coastguard Worker {
425*35238bceSAndroid Build Coastguard Worker     glu::CallLogWrapper gl(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
426*35238bceSAndroid Build Coastguard Worker     glu::VertexArray vao(m_context.getRenderContext());
427*35238bceSAndroid Build Coastguard Worker     glu::Buffer buffer(m_context.getRenderContext());
428*35238bceSAndroid Build Coastguard Worker     glw::GLint reportedMaxBindings = -1;
429*35238bceSAndroid Build Coastguard Worker     glw::GLint maxBindings;
430*35238bceSAndroid Build Coastguard Worker 
431*35238bceSAndroid Build Coastguard Worker     gl.enableLogging(true);
432*35238bceSAndroid Build Coastguard Worker 
433*35238bceSAndroid Build Coastguard Worker     gl.glBindVertexArray(*vao);
434*35238bceSAndroid Build Coastguard Worker     gl.glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &reportedMaxBindings);
435*35238bceSAndroid Build Coastguard Worker     GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
436*35238bceSAndroid Build Coastguard Worker 
437*35238bceSAndroid Build Coastguard Worker     maxBindings = de::max(16, reportedMaxBindings);
438*35238bceSAndroid Build Coastguard Worker 
439*35238bceSAndroid Build Coastguard Worker     // initial
440*35238bceSAndroid Build Coastguard Worker     {
441*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "initial", "Initial values");
442*35238bceSAndroid Build Coastguard Worker 
443*35238bceSAndroid Build Coastguard Worker         for (int binding = 0; binding < maxBindings; ++binding)
444*35238bceSAndroid Build Coastguard Worker             verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_STRIDE, binding, 16, m_verifier);
445*35238bceSAndroid Build Coastguard Worker     }
446*35238bceSAndroid Build Coastguard Worker 
447*35238bceSAndroid Build Coastguard Worker     // is part of vao
448*35238bceSAndroid Build Coastguard Worker     {
449*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "vao", "VAO state");
450*35238bceSAndroid Build Coastguard Worker         glu::VertexArray otherVao(m_context.getRenderContext());
451*35238bceSAndroid Build Coastguard Worker 
452*35238bceSAndroid Build Coastguard Worker         // set to value A in vao1
453*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexBuffer(1, *buffer, 0, 32);
454*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexBuffer");
455*35238bceSAndroid Build Coastguard Worker 
456*35238bceSAndroid Build Coastguard Worker         // set to value B in vao2
457*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(*otherVao);
458*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexArray");
459*35238bceSAndroid Build Coastguard Worker 
460*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexBuffer(1, *buffer, 0, 64);
461*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexBuffer");
462*35238bceSAndroid Build Coastguard Worker 
463*35238bceSAndroid Build Coastguard Worker         // check value is still ok in original vao
464*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(*vao);
465*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexArray");
466*35238bceSAndroid Build Coastguard Worker 
467*35238bceSAndroid Build Coastguard Worker         verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_STRIDE, 1, 32, m_verifier);
468*35238bceSAndroid Build Coastguard Worker     }
469*35238bceSAndroid Build Coastguard Worker 
470*35238bceSAndroid Build Coastguard Worker     // random values
471*35238bceSAndroid Build Coastguard Worker     {
472*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "random", "Random values");
473*35238bceSAndroid Build Coastguard Worker         de::Random rnd(0xabc);
474*35238bceSAndroid Build Coastguard Worker         const int numRandomTests = 10;
475*35238bceSAndroid Build Coastguard Worker 
476*35238bceSAndroid Build Coastguard Worker         for (int randomTestNdx = 0; randomTestNdx < numRandomTests; ++randomTestNdx)
477*35238bceSAndroid Build Coastguard Worker         {
478*35238bceSAndroid Build Coastguard Worker             const int binding = rnd.getInt(0, maxBindings - 1);
479*35238bceSAndroid Build Coastguard Worker             const int stride  = rnd.getInt(0, 2048);
480*35238bceSAndroid Build Coastguard Worker 
481*35238bceSAndroid Build Coastguard Worker             gl.glBindVertexBuffer(binding, *buffer, 0, stride);
482*35238bceSAndroid Build Coastguard Worker             GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexBuffer");
483*35238bceSAndroid Build Coastguard Worker 
484*35238bceSAndroid Build Coastguard Worker             verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_STRIDE, binding, stride, m_verifier);
485*35238bceSAndroid Build Coastguard Worker         }
486*35238bceSAndroid Build Coastguard Worker     }
487*35238bceSAndroid Build Coastguard Worker }
488*35238bceSAndroid Build Coastguard Worker 
489*35238bceSAndroid Build Coastguard Worker class VertexBindingBufferCase : public IndexedCase
490*35238bceSAndroid Build Coastguard Worker {
491*35238bceSAndroid Build Coastguard Worker public:
492*35238bceSAndroid Build Coastguard Worker     VertexBindingBufferCase(Context &context, const char *name, const char *desc, QueryType verifier);
493*35238bceSAndroid Build Coastguard Worker     void test(tcu::ResultCollector &result);
494*35238bceSAndroid Build Coastguard Worker };
495*35238bceSAndroid Build Coastguard Worker 
VertexBindingBufferCase(Context & context,const char * name,const char * desc,QueryType verifier)496*35238bceSAndroid Build Coastguard Worker VertexBindingBufferCase::VertexBindingBufferCase(Context &context, const char *name, const char *desc,
497*35238bceSAndroid Build Coastguard Worker                                                  QueryType verifier)
498*35238bceSAndroid Build Coastguard Worker     : IndexedCase(context, name, desc, verifier)
499*35238bceSAndroid Build Coastguard Worker {
500*35238bceSAndroid Build Coastguard Worker }
501*35238bceSAndroid Build Coastguard Worker 
test(tcu::ResultCollector & result)502*35238bceSAndroid Build Coastguard Worker void VertexBindingBufferCase::test(tcu::ResultCollector &result)
503*35238bceSAndroid Build Coastguard Worker {
504*35238bceSAndroid Build Coastguard Worker     glu::CallLogWrapper gl(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
505*35238bceSAndroid Build Coastguard Worker     glu::VertexArray vao(m_context.getRenderContext());
506*35238bceSAndroid Build Coastguard Worker     glu::Buffer buffer(m_context.getRenderContext());
507*35238bceSAndroid Build Coastguard Worker     glw::GLint reportedMaxBindings = -1;
508*35238bceSAndroid Build Coastguard Worker     glw::GLint maxBindings;
509*35238bceSAndroid Build Coastguard Worker 
510*35238bceSAndroid Build Coastguard Worker     gl.enableLogging(true);
511*35238bceSAndroid Build Coastguard Worker 
512*35238bceSAndroid Build Coastguard Worker     gl.glBindVertexArray(*vao);
513*35238bceSAndroid Build Coastguard Worker     gl.glGetIntegerv(GL_MAX_VERTEX_ATTRIB_BINDINGS, &reportedMaxBindings);
514*35238bceSAndroid Build Coastguard Worker     GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glGetIntegerv");
515*35238bceSAndroid Build Coastguard Worker 
516*35238bceSAndroid Build Coastguard Worker     maxBindings = de::max(16, reportedMaxBindings);
517*35238bceSAndroid Build Coastguard Worker 
518*35238bceSAndroid Build Coastguard Worker     // initial
519*35238bceSAndroid Build Coastguard Worker     {
520*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "initial", "Initial values");
521*35238bceSAndroid Build Coastguard Worker 
522*35238bceSAndroid Build Coastguard Worker         for (int binding = 0; binding < maxBindings; ++binding)
523*35238bceSAndroid Build Coastguard Worker             verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_BUFFER, binding, 0, m_verifier);
524*35238bceSAndroid Build Coastguard Worker     }
525*35238bceSAndroid Build Coastguard Worker 
526*35238bceSAndroid Build Coastguard Worker     // is part of vao
527*35238bceSAndroid Build Coastguard Worker     {
528*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "vao", "VAO state");
529*35238bceSAndroid Build Coastguard Worker         glu::VertexArray otherVao(m_context.getRenderContext());
530*35238bceSAndroid Build Coastguard Worker         glu::Buffer otherBuffer(m_context.getRenderContext());
531*35238bceSAndroid Build Coastguard Worker 
532*35238bceSAndroid Build Coastguard Worker         // set to value A in vao1
533*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexBuffer(1, *buffer, 0, 32);
534*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexBuffer");
535*35238bceSAndroid Build Coastguard Worker 
536*35238bceSAndroid Build Coastguard Worker         // set to value B in vao2
537*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(*otherVao);
538*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexArray");
539*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexBuffer(1, *otherBuffer, 0, 32);
540*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexBuffer");
541*35238bceSAndroid Build Coastguard Worker 
542*35238bceSAndroid Build Coastguard Worker         // check value is still ok in original vao
543*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(*vao);
544*35238bceSAndroid Build Coastguard Worker         GLS_COLLECT_GL_ERROR(result, gl.glGetError(), "glBindVertexArray");
545*35238bceSAndroid Build Coastguard Worker 
546*35238bceSAndroid Build Coastguard Worker         verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_BUFFER, 1, *buffer, m_verifier);
547*35238bceSAndroid Build Coastguard Worker     }
548*35238bceSAndroid Build Coastguard Worker 
549*35238bceSAndroid Build Coastguard Worker     // Is detached in delete from active vao and not from deactive
550*35238bceSAndroid Build Coastguard Worker     {
551*35238bceSAndroid Build Coastguard Worker         const tcu::ScopedLogSection section(m_testCtx.getLog(), "autoUnbind", "Unbind on delete");
552*35238bceSAndroid Build Coastguard Worker         glu::VertexArray otherVao(m_context.getRenderContext());
553*35238bceSAndroid Build Coastguard Worker         glw::GLuint otherBuffer = -1;
554*35238bceSAndroid Build Coastguard Worker 
555*35238bceSAndroid Build Coastguard Worker         gl.glGenBuffers(1, &otherBuffer);
556*35238bceSAndroid Build Coastguard Worker 
557*35238bceSAndroid Build Coastguard Worker         // set in vao1 and vao2
558*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexBuffer(1, otherBuffer, 0, 32);
559*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(*otherVao);
560*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexBuffer(1, otherBuffer, 0, 32);
561*35238bceSAndroid Build Coastguard Worker 
562*35238bceSAndroid Build Coastguard Worker         // delete buffer. This unbinds it from active (vao2) but not from unactive
563*35238bceSAndroid Build Coastguard Worker         gl.glDeleteBuffers(1, &otherBuffer);
564*35238bceSAndroid Build Coastguard Worker         verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_BUFFER, 1, 0, m_verifier);
565*35238bceSAndroid Build Coastguard Worker 
566*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(*vao);
567*35238bceSAndroid Build Coastguard Worker         verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_BUFFER, 1, otherBuffer, m_verifier);
568*35238bceSAndroid Build Coastguard Worker     }
569*35238bceSAndroid Build Coastguard Worker }
570*35238bceSAndroid Build Coastguard Worker 
571*35238bceSAndroid Build Coastguard Worker class MixedVertexBindingDivisorCase : public IndexedCase
572*35238bceSAndroid Build Coastguard Worker {
573*35238bceSAndroid Build Coastguard Worker public:
574*35238bceSAndroid Build Coastguard Worker     MixedVertexBindingDivisorCase(Context &context, const char *name, const char *desc);
575*35238bceSAndroid Build Coastguard Worker     void test(tcu::ResultCollector &result);
576*35238bceSAndroid Build Coastguard Worker };
577*35238bceSAndroid Build Coastguard Worker 
MixedVertexBindingDivisorCase(Context & context,const char * name,const char * desc)578*35238bceSAndroid Build Coastguard Worker MixedVertexBindingDivisorCase::MixedVertexBindingDivisorCase(Context &context, const char *name, const char *desc)
579*35238bceSAndroid Build Coastguard Worker     : IndexedCase(context, name, desc, QUERY_INDEXED_INTEGER)
580*35238bceSAndroid Build Coastguard Worker {
581*35238bceSAndroid Build Coastguard Worker }
582*35238bceSAndroid Build Coastguard Worker 
test(tcu::ResultCollector & result)583*35238bceSAndroid Build Coastguard Worker void MixedVertexBindingDivisorCase::test(tcu::ResultCollector &result)
584*35238bceSAndroid Build Coastguard Worker {
585*35238bceSAndroid Build Coastguard Worker     glu::CallLogWrapper gl(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
586*35238bceSAndroid Build Coastguard Worker     glu::VertexArray vao(m_context.getRenderContext());
587*35238bceSAndroid Build Coastguard Worker 
588*35238bceSAndroid Build Coastguard Worker     gl.enableLogging(true);
589*35238bceSAndroid Build Coastguard Worker 
590*35238bceSAndroid Build Coastguard Worker     gl.glBindVertexArray(*vao);
591*35238bceSAndroid Build Coastguard Worker     gl.glVertexAttribDivisor(1, 4);
592*35238bceSAndroid Build Coastguard Worker     verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_DIVISOR, 1, 4, m_verifier);
593*35238bceSAndroid Build Coastguard Worker }
594*35238bceSAndroid Build Coastguard Worker 
595*35238bceSAndroid Build Coastguard Worker class MixedVertexBindingOffsetCase : public IndexedCase
596*35238bceSAndroid Build Coastguard Worker {
597*35238bceSAndroid Build Coastguard Worker public:
598*35238bceSAndroid Build Coastguard Worker     MixedVertexBindingOffsetCase(Context &context, const char *name, const char *desc);
599*35238bceSAndroid Build Coastguard Worker     void test(tcu::ResultCollector &result);
600*35238bceSAndroid Build Coastguard Worker };
601*35238bceSAndroid Build Coastguard Worker 
MixedVertexBindingOffsetCase(Context & context,const char * name,const char * desc)602*35238bceSAndroid Build Coastguard Worker MixedVertexBindingOffsetCase::MixedVertexBindingOffsetCase(Context &context, const char *name, const char *desc)
603*35238bceSAndroid Build Coastguard Worker     : IndexedCase(context, name, desc, QUERY_INDEXED_INTEGER)
604*35238bceSAndroid Build Coastguard Worker {
605*35238bceSAndroid Build Coastguard Worker }
606*35238bceSAndroid Build Coastguard Worker 
test(tcu::ResultCollector & result)607*35238bceSAndroid Build Coastguard Worker void MixedVertexBindingOffsetCase::test(tcu::ResultCollector &result)
608*35238bceSAndroid Build Coastguard Worker {
609*35238bceSAndroid Build Coastguard Worker     glu::RenderContext &renderContext = m_context.getRenderContext();
610*35238bceSAndroid Build Coastguard Worker     glu::CallLogWrapper gl(renderContext.getFunctions(), m_testCtx.getLog());
611*35238bceSAndroid Build Coastguard Worker     glu::Buffer buffer(renderContext);
612*35238bceSAndroid Build Coastguard Worker     uint32_t vao = 0;
613*35238bceSAndroid Build Coastguard Worker 
614*35238bceSAndroid Build Coastguard Worker     gl.enableLogging(true);
615*35238bceSAndroid Build Coastguard Worker 
616*35238bceSAndroid Build Coastguard Worker     if (!glu::isContextTypeES(renderContext.getType()))
617*35238bceSAndroid Build Coastguard Worker     {
618*35238bceSAndroid Build Coastguard Worker         gl.glGenVertexArrays(1, &vao);
619*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(vao);
620*35238bceSAndroid Build Coastguard Worker     }
621*35238bceSAndroid Build Coastguard Worker 
622*35238bceSAndroid Build Coastguard Worker     gl.glBindBuffer(GL_ARRAY_BUFFER, *buffer);
623*35238bceSAndroid Build Coastguard Worker     gl.glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, glu::BufferOffsetAsPointer(12));
624*35238bceSAndroid Build Coastguard Worker 
625*35238bceSAndroid Build Coastguard Worker     verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_OFFSET, 1, 12, m_verifier);
626*35238bceSAndroid Build Coastguard Worker 
627*35238bceSAndroid Build Coastguard Worker     if (vao)
628*35238bceSAndroid Build Coastguard Worker         gl.glDeleteVertexArrays(1, &vao);
629*35238bceSAndroid Build Coastguard Worker }
630*35238bceSAndroid Build Coastguard Worker 
631*35238bceSAndroid Build Coastguard Worker class MixedVertexBindingStrideCase : public IndexedCase
632*35238bceSAndroid Build Coastguard Worker {
633*35238bceSAndroid Build Coastguard Worker public:
634*35238bceSAndroid Build Coastguard Worker     MixedVertexBindingStrideCase(Context &context, const char *name, const char *desc);
635*35238bceSAndroid Build Coastguard Worker     void test(tcu::ResultCollector &result);
636*35238bceSAndroid Build Coastguard Worker };
637*35238bceSAndroid Build Coastguard Worker 
MixedVertexBindingStrideCase(Context & context,const char * name,const char * desc)638*35238bceSAndroid Build Coastguard Worker MixedVertexBindingStrideCase::MixedVertexBindingStrideCase(Context &context, const char *name, const char *desc)
639*35238bceSAndroid Build Coastguard Worker     : IndexedCase(context, name, desc, QUERY_INDEXED_INTEGER)
640*35238bceSAndroid Build Coastguard Worker {
641*35238bceSAndroid Build Coastguard Worker }
642*35238bceSAndroid Build Coastguard Worker 
test(tcu::ResultCollector & result)643*35238bceSAndroid Build Coastguard Worker void MixedVertexBindingStrideCase::test(tcu::ResultCollector &result)
644*35238bceSAndroid Build Coastguard Worker {
645*35238bceSAndroid Build Coastguard Worker     glu::RenderContext &renderContext = m_context.getRenderContext();
646*35238bceSAndroid Build Coastguard Worker     glu::CallLogWrapper gl(renderContext.getFunctions(), m_testCtx.getLog());
647*35238bceSAndroid Build Coastguard Worker     glu::Buffer buffer(renderContext);
648*35238bceSAndroid Build Coastguard Worker     uint32_t vao = 0;
649*35238bceSAndroid Build Coastguard Worker 
650*35238bceSAndroid Build Coastguard Worker     gl.enableLogging(true);
651*35238bceSAndroid Build Coastguard Worker 
652*35238bceSAndroid Build Coastguard Worker     if (!glu::isContextTypeES(renderContext.getType()))
653*35238bceSAndroid Build Coastguard Worker     {
654*35238bceSAndroid Build Coastguard Worker         gl.glGenVertexArrays(1, &vao);
655*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(vao);
656*35238bceSAndroid Build Coastguard Worker     }
657*35238bceSAndroid Build Coastguard Worker 
658*35238bceSAndroid Build Coastguard Worker     gl.glBindBuffer(GL_ARRAY_BUFFER, *buffer);
659*35238bceSAndroid Build Coastguard Worker     gl.glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 12, 0);
660*35238bceSAndroid Build Coastguard Worker     verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_STRIDE, 1, 12, m_verifier);
661*35238bceSAndroid Build Coastguard Worker 
662*35238bceSAndroid Build Coastguard Worker     // test effectiveStride
663*35238bceSAndroid Build Coastguard Worker     gl.glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);
664*35238bceSAndroid Build Coastguard Worker     verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_STRIDE, 1, 16, m_verifier);
665*35238bceSAndroid Build Coastguard Worker 
666*35238bceSAndroid Build Coastguard Worker     if (vao)
667*35238bceSAndroid Build Coastguard Worker         gl.glDeleteVertexArrays(1, &vao);
668*35238bceSAndroid Build Coastguard Worker }
669*35238bceSAndroid Build Coastguard Worker 
670*35238bceSAndroid Build Coastguard Worker class MixedVertexBindingBufferCase : public IndexedCase
671*35238bceSAndroid Build Coastguard Worker {
672*35238bceSAndroid Build Coastguard Worker public:
673*35238bceSAndroid Build Coastguard Worker     MixedVertexBindingBufferCase(Context &context, const char *name, const char *desc);
674*35238bceSAndroid Build Coastguard Worker     void test(tcu::ResultCollector &result);
675*35238bceSAndroid Build Coastguard Worker };
676*35238bceSAndroid Build Coastguard Worker 
MixedVertexBindingBufferCase(Context & context,const char * name,const char * desc)677*35238bceSAndroid Build Coastguard Worker MixedVertexBindingBufferCase::MixedVertexBindingBufferCase(Context &context, const char *name, const char *desc)
678*35238bceSAndroid Build Coastguard Worker     : IndexedCase(context, name, desc, QUERY_INDEXED_INTEGER)
679*35238bceSAndroid Build Coastguard Worker {
680*35238bceSAndroid Build Coastguard Worker }
681*35238bceSAndroid Build Coastguard Worker 
test(tcu::ResultCollector & result)682*35238bceSAndroid Build Coastguard Worker void MixedVertexBindingBufferCase::test(tcu::ResultCollector &result)
683*35238bceSAndroid Build Coastguard Worker {
684*35238bceSAndroid Build Coastguard Worker     glu::RenderContext &renderContext = m_context.getRenderContext();
685*35238bceSAndroid Build Coastguard Worker     glu::CallLogWrapper gl(renderContext.getFunctions(), m_testCtx.getLog());
686*35238bceSAndroid Build Coastguard Worker     glu::Buffer buffer(renderContext);
687*35238bceSAndroid Build Coastguard Worker     uint32_t vao = 0;
688*35238bceSAndroid Build Coastguard Worker 
689*35238bceSAndroid Build Coastguard Worker     gl.enableLogging(true);
690*35238bceSAndroid Build Coastguard Worker 
691*35238bceSAndroid Build Coastguard Worker     if (!glu::isContextTypeES(renderContext.getType()))
692*35238bceSAndroid Build Coastguard Worker     {
693*35238bceSAndroid Build Coastguard Worker         gl.glGenVertexArrays(1, &vao);
694*35238bceSAndroid Build Coastguard Worker         gl.glBindVertexArray(vao);
695*35238bceSAndroid Build Coastguard Worker     }
696*35238bceSAndroid Build Coastguard Worker 
697*35238bceSAndroid Build Coastguard Worker     gl.glBindBuffer(GL_ARRAY_BUFFER, *buffer);
698*35238bceSAndroid Build Coastguard Worker     gl.glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);
699*35238bceSAndroid Build Coastguard Worker     verifyStateIndexedInteger(result, gl, GL_VERTEX_BINDING_BUFFER, 1, *buffer, m_verifier);
700*35238bceSAndroid Build Coastguard Worker 
701*35238bceSAndroid Build Coastguard Worker     if (vao)
702*35238bceSAndroid Build Coastguard Worker         gl.glDeleteVertexArrays(1, &vao);
703*35238bceSAndroid Build Coastguard Worker }
704*35238bceSAndroid Build Coastguard Worker 
705*35238bceSAndroid Build Coastguard Worker } // namespace
706*35238bceSAndroid Build Coastguard Worker 
VertexAttributeBindingStateQueryTests(Context & context)707*35238bceSAndroid Build Coastguard Worker VertexAttributeBindingStateQueryTests::VertexAttributeBindingStateQueryTests(Context &context)
708*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "vertex_attribute_binding", "Query vertex attribute binding state.")
709*35238bceSAndroid Build Coastguard Worker {
710*35238bceSAndroid Build Coastguard Worker }
711*35238bceSAndroid Build Coastguard Worker 
~VertexAttributeBindingStateQueryTests(void)712*35238bceSAndroid Build Coastguard Worker VertexAttributeBindingStateQueryTests::~VertexAttributeBindingStateQueryTests(void)
713*35238bceSAndroid Build Coastguard Worker {
714*35238bceSAndroid Build Coastguard Worker }
715*35238bceSAndroid Build Coastguard Worker 
init(void)716*35238bceSAndroid Build Coastguard Worker void VertexAttributeBindingStateQueryTests::init(void)
717*35238bceSAndroid Build Coastguard Worker {
718*35238bceSAndroid Build Coastguard Worker     tcu::TestCaseGroup *const attributeGroup = new TestCaseGroup(m_context, "vertex_attrib", "Vertex attribute state");
719*35238bceSAndroid Build Coastguard Worker     tcu::TestCaseGroup *const indexedGroup   = new TestCaseGroup(m_context, "indexed", "Indexed state");
720*35238bceSAndroid Build Coastguard Worker 
721*35238bceSAndroid Build Coastguard Worker     addChild(attributeGroup);
722*35238bceSAndroid Build Coastguard Worker     addChild(indexedGroup);
723*35238bceSAndroid Build Coastguard Worker 
724*35238bceSAndroid Build Coastguard Worker     // .vertex_attrib
725*35238bceSAndroid Build Coastguard Worker     {
726*35238bceSAndroid Build Coastguard Worker         static const struct Verifier
727*35238bceSAndroid Build Coastguard Worker         {
728*35238bceSAndroid Build Coastguard Worker             const char *suffix;
729*35238bceSAndroid Build Coastguard Worker             QueryType type;
730*35238bceSAndroid Build Coastguard Worker         } verifiers[] = {
731*35238bceSAndroid Build Coastguard Worker             {"", QUERY_ATTRIBUTE_INTEGER}, // avoid renaming tests
732*35238bceSAndroid Build Coastguard Worker             {"_getvertexattribfv", QUERY_ATTRIBUTE_FLOAT},
733*35238bceSAndroid Build Coastguard Worker             {"_getvertexattribiiv", QUERY_ATTRIBUTE_PURE_INTEGER},
734*35238bceSAndroid Build Coastguard Worker             {"_getvertexattribiuiv", QUERY_ATTRIBUTE_PURE_UNSIGNED_INTEGER},
735*35238bceSAndroid Build Coastguard Worker         };
736*35238bceSAndroid Build Coastguard Worker 
737*35238bceSAndroid Build Coastguard Worker         for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx)
738*35238bceSAndroid Build Coastguard Worker         {
739*35238bceSAndroid Build Coastguard Worker             attributeGroup->addChild(new AttributeBindingCase(
740*35238bceSAndroid Build Coastguard Worker                 m_context, (std::string("vertex_attrib_binding") + verifiers[verifierNdx].suffix).c_str(),
741*35238bceSAndroid Build Coastguard Worker                 "Test VERTEX_ATTRIB_BINDING", verifiers[verifierNdx].type));
742*35238bceSAndroid Build Coastguard Worker             attributeGroup->addChild(new AttributeRelativeOffsetCase(
743*35238bceSAndroid Build Coastguard Worker                 m_context, (std::string("vertex_attrib_relative_offset") + verifiers[verifierNdx].suffix).c_str(),
744*35238bceSAndroid Build Coastguard Worker                 "Test VERTEX_ATTRIB_RELATIVE_OFFSET", verifiers[verifierNdx].type));
745*35238bceSAndroid Build Coastguard Worker         }
746*35238bceSAndroid Build Coastguard Worker     }
747*35238bceSAndroid Build Coastguard Worker 
748*35238bceSAndroid Build Coastguard Worker     // .indexed
749*35238bceSAndroid Build Coastguard Worker     {
750*35238bceSAndroid Build Coastguard Worker         static const struct Verifier
751*35238bceSAndroid Build Coastguard Worker         {
752*35238bceSAndroid Build Coastguard Worker             const char *name;
753*35238bceSAndroid Build Coastguard Worker             QueryType type;
754*35238bceSAndroid Build Coastguard Worker         } verifiers[] = {
755*35238bceSAndroid Build Coastguard Worker             {"getintegeri", QUERY_INDEXED_INTEGER},
756*35238bceSAndroid Build Coastguard Worker             {"getintegeri64", QUERY_INDEXED_INTEGER64},
757*35238bceSAndroid Build Coastguard Worker             {"getboolean", QUERY_INDEXED_BOOLEAN},
758*35238bceSAndroid Build Coastguard Worker         };
759*35238bceSAndroid Build Coastguard Worker 
760*35238bceSAndroid Build Coastguard Worker         // states
761*35238bceSAndroid Build Coastguard Worker 
762*35238bceSAndroid Build Coastguard Worker         for (int verifierNdx = 0; verifierNdx < DE_LENGTH_OF_ARRAY(verifiers); ++verifierNdx)
763*35238bceSAndroid Build Coastguard Worker         {
764*35238bceSAndroid Build Coastguard Worker             indexedGroup->addChild(new VertexBindingDivisorCase(
765*35238bceSAndroid Build Coastguard Worker                 m_context, (std::string("vertex_binding_divisor_") + verifiers[verifierNdx].name).c_str(),
766*35238bceSAndroid Build Coastguard Worker                 "Test VERTEX_BINDING_DIVISOR", verifiers[verifierNdx].type));
767*35238bceSAndroid Build Coastguard Worker             indexedGroup->addChild(new VertexBindingOffsetCase(
768*35238bceSAndroid Build Coastguard Worker                 m_context, (std::string("vertex_binding_offset_") + verifiers[verifierNdx].name).c_str(),
769*35238bceSAndroid Build Coastguard Worker                 "Test VERTEX_BINDING_OFFSET", verifiers[verifierNdx].type));
770*35238bceSAndroid Build Coastguard Worker             indexedGroup->addChild(new VertexBindingStrideCase(
771*35238bceSAndroid Build Coastguard Worker                 m_context, (std::string("vertex_binding_stride_") + verifiers[verifierNdx].name).c_str(),
772*35238bceSAndroid Build Coastguard Worker                 "Test VERTEX_BINDING_STRIDE", verifiers[verifierNdx].type));
773*35238bceSAndroid Build Coastguard Worker             indexedGroup->addChild(new VertexBindingBufferCase(
774*35238bceSAndroid Build Coastguard Worker                 m_context, (std::string("vertex_binding_buffer_") + verifiers[verifierNdx].name).c_str(),
775*35238bceSAndroid Build Coastguard Worker                 "Test VERTEX_BINDING_BUFFER", verifiers[verifierNdx].type));
776*35238bceSAndroid Build Coastguard Worker         }
777*35238bceSAndroid Build Coastguard Worker 
778*35238bceSAndroid Build Coastguard Worker         // mixed apis
779*35238bceSAndroid Build Coastguard Worker 
780*35238bceSAndroid Build Coastguard Worker         indexedGroup->addChild(new MixedVertexBindingDivisorCase(m_context, "vertex_binding_divisor_mixed",
781*35238bceSAndroid Build Coastguard Worker                                                                  "Test VERTEX_BINDING_DIVISOR"));
782*35238bceSAndroid Build Coastguard Worker         indexedGroup->addChild(
783*35238bceSAndroid Build Coastguard Worker             new MixedVertexBindingOffsetCase(m_context, "vertex_binding_offset_mixed", "Test VERTEX_BINDING_OFFSET"));
784*35238bceSAndroid Build Coastguard Worker         indexedGroup->addChild(
785*35238bceSAndroid Build Coastguard Worker             new MixedVertexBindingStrideCase(m_context, "vertex_binding_stride_mixed", "Test VERTEX_BINDING_STRIDE"));
786*35238bceSAndroid Build Coastguard Worker         indexedGroup->addChild(
787*35238bceSAndroid Build Coastguard Worker             new MixedVertexBindingBufferCase(m_context, "vertex_binding_buffer_mixed", "Test VERTEX_BINDING_BUFFER"));
788*35238bceSAndroid Build Coastguard Worker     }
789*35238bceSAndroid Build Coastguard Worker }
790*35238bceSAndroid Build Coastguard Worker 
791*35238bceSAndroid Build Coastguard Worker } // namespace Functional
792*35238bceSAndroid Build Coastguard Worker } // namespace gles31
793*35238bceSAndroid Build Coastguard Worker } // namespace deqp
794