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