xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fVertexArrayObjectTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.0 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 array object tests
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker #include "es3fVertexArrayObjectTests.hpp"
24*35238bceSAndroid Build Coastguard Worker 
25*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "tcuImageCompare.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "deString.h"
36*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
37*35238bceSAndroid Build Coastguard Worker 
38*35238bceSAndroid Build Coastguard Worker #include <vector>
39*35238bceSAndroid Build Coastguard Worker #include <string>
40*35238bceSAndroid Build Coastguard Worker #include <memory>
41*35238bceSAndroid Build Coastguard Worker 
42*35238bceSAndroid Build Coastguard Worker #include "glw.h"
43*35238bceSAndroid Build Coastguard Worker 
44*35238bceSAndroid Build Coastguard Worker using std::string;
45*35238bceSAndroid Build Coastguard Worker using std::vector;
46*35238bceSAndroid Build Coastguard Worker 
47*35238bceSAndroid Build Coastguard Worker namespace deqp
48*35238bceSAndroid Build Coastguard Worker {
49*35238bceSAndroid Build Coastguard Worker namespace gles3
50*35238bceSAndroid Build Coastguard Worker {
51*35238bceSAndroid Build Coastguard Worker namespace Functional
52*35238bceSAndroid Build Coastguard Worker {
53*35238bceSAndroid Build Coastguard Worker 
54*35238bceSAndroid Build Coastguard Worker namespace
55*35238bceSAndroid Build Coastguard Worker {
56*35238bceSAndroid Build Coastguard Worker struct Attribute
57*35238bceSAndroid Build Coastguard Worker {
58*35238bceSAndroid Build Coastguard Worker     Attribute(void);
59*35238bceSAndroid Build Coastguard Worker     GLboolean enabled;
60*35238bceSAndroid Build Coastguard Worker     GLint size;
61*35238bceSAndroid Build Coastguard Worker     GLint stride;
62*35238bceSAndroid Build Coastguard Worker     GLenum type;
63*35238bceSAndroid Build Coastguard Worker     GLboolean integer;
64*35238bceSAndroid Build Coastguard Worker     GLint divisor;
65*35238bceSAndroid Build Coastguard Worker     GLint offset;
66*35238bceSAndroid Build Coastguard Worker     GLboolean normalized;
67*35238bceSAndroid Build Coastguard Worker 
68*35238bceSAndroid Build Coastguard Worker     int bufferNdx;
69*35238bceSAndroid Build Coastguard Worker };
70*35238bceSAndroid Build Coastguard Worker 
71*35238bceSAndroid Build Coastguard Worker struct VertexArrayState
72*35238bceSAndroid Build Coastguard Worker {
73*35238bceSAndroid Build Coastguard Worker     VertexArrayState(void);
74*35238bceSAndroid Build Coastguard Worker 
75*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
76*35238bceSAndroid Build Coastguard Worker     int elementArrayBuffer;
77*35238bceSAndroid Build Coastguard Worker };
78*35238bceSAndroid Build Coastguard Worker 
VertexArrayState(void)79*35238bceSAndroid Build Coastguard Worker VertexArrayState::VertexArrayState(void) : elementArrayBuffer(-1)
80*35238bceSAndroid Build Coastguard Worker {
81*35238bceSAndroid Build Coastguard Worker }
82*35238bceSAndroid Build Coastguard Worker 
Attribute(void)83*35238bceSAndroid Build Coastguard Worker Attribute::Attribute(void)
84*35238bceSAndroid Build Coastguard Worker     : enabled(GL_FALSE)
85*35238bceSAndroid Build Coastguard Worker     , size(1)
86*35238bceSAndroid Build Coastguard Worker     , stride(0)
87*35238bceSAndroid Build Coastguard Worker     , type(GL_FLOAT)
88*35238bceSAndroid Build Coastguard Worker     , integer(GL_FALSE)
89*35238bceSAndroid Build Coastguard Worker     , divisor(0)
90*35238bceSAndroid Build Coastguard Worker     , offset(0)
91*35238bceSAndroid Build Coastguard Worker     , normalized(GL_FALSE)
92*35238bceSAndroid Build Coastguard Worker     , bufferNdx(0)
93*35238bceSAndroid Build Coastguard Worker {
94*35238bceSAndroid Build Coastguard Worker }
95*35238bceSAndroid Build Coastguard Worker 
96*35238bceSAndroid Build Coastguard Worker struct BufferSpec
97*35238bceSAndroid Build Coastguard Worker {
98*35238bceSAndroid Build Coastguard Worker     int count;
99*35238bceSAndroid Build Coastguard Worker     int size;
100*35238bceSAndroid Build Coastguard Worker     int componentCount;
101*35238bceSAndroid Build Coastguard Worker     int stride;
102*35238bceSAndroid Build Coastguard Worker     int offset;
103*35238bceSAndroid Build Coastguard Worker 
104*35238bceSAndroid Build Coastguard Worker     GLenum type;
105*35238bceSAndroid Build Coastguard Worker 
106*35238bceSAndroid Build Coastguard Worker     int intRangeMin;
107*35238bceSAndroid Build Coastguard Worker     int intRangeMax;
108*35238bceSAndroid Build Coastguard Worker 
109*35238bceSAndroid Build Coastguard Worker     float floatRangeMin;
110*35238bceSAndroid Build Coastguard Worker     float floatRangeMax;
111*35238bceSAndroid Build Coastguard Worker };
112*35238bceSAndroid Build Coastguard Worker 
113*35238bceSAndroid Build Coastguard Worker struct Spec
114*35238bceSAndroid Build Coastguard Worker {
115*35238bceSAndroid Build Coastguard Worker     Spec(void);
116*35238bceSAndroid Build Coastguard Worker 
117*35238bceSAndroid Build Coastguard Worker     int count;
118*35238bceSAndroid Build Coastguard Worker     int instances;
119*35238bceSAndroid Build Coastguard Worker     bool useDrawElements;
120*35238bceSAndroid Build Coastguard Worker     GLenum indexType;
121*35238bceSAndroid Build Coastguard Worker     int indexOffset;
122*35238bceSAndroid Build Coastguard Worker     int indexRangeMin;
123*35238bceSAndroid Build Coastguard Worker     int indexRangeMax;
124*35238bceSAndroid Build Coastguard Worker     int indexCount;
125*35238bceSAndroid Build Coastguard Worker     VertexArrayState state;
126*35238bceSAndroid Build Coastguard Worker     VertexArrayState vao;
127*35238bceSAndroid Build Coastguard Worker     vector<BufferSpec> buffers;
128*35238bceSAndroid Build Coastguard Worker };
129*35238bceSAndroid Build Coastguard Worker 
Spec(void)130*35238bceSAndroid Build Coastguard Worker Spec::Spec(void)
131*35238bceSAndroid Build Coastguard Worker     : count(-1)
132*35238bceSAndroid Build Coastguard Worker     , instances(-1)
133*35238bceSAndroid Build Coastguard Worker     , useDrawElements(false)
134*35238bceSAndroid Build Coastguard Worker     , indexType(GL_NONE)
135*35238bceSAndroid Build Coastguard Worker     , indexOffset(-1)
136*35238bceSAndroid Build Coastguard Worker     , indexRangeMin(-1)
137*35238bceSAndroid Build Coastguard Worker     , indexRangeMax(-1)
138*35238bceSAndroid Build Coastguard Worker     , indexCount(-1)
139*35238bceSAndroid Build Coastguard Worker {
140*35238bceSAndroid Build Coastguard Worker }
141*35238bceSAndroid Build Coastguard Worker 
142*35238bceSAndroid Build Coastguard Worker } // namespace
143*35238bceSAndroid Build Coastguard Worker 
144*35238bceSAndroid Build Coastguard Worker class VertexArrayObjectTest : public TestCase
145*35238bceSAndroid Build Coastguard Worker {
146*35238bceSAndroid Build Coastguard Worker public:
147*35238bceSAndroid Build Coastguard Worker     VertexArrayObjectTest(Context &context, const Spec &spec, const char *name, const char *description);
148*35238bceSAndroid Build Coastguard Worker     ~VertexArrayObjectTest(void);
149*35238bceSAndroid Build Coastguard Worker     virtual void init(void);
150*35238bceSAndroid Build Coastguard Worker     virtual void deinit(void);
151*35238bceSAndroid Build Coastguard Worker     virtual IterateResult iterate(void);
152*35238bceSAndroid Build Coastguard Worker 
153*35238bceSAndroid Build Coastguard Worker private:
154*35238bceSAndroid Build Coastguard Worker     Spec m_spec;
155*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &m_log;
156*35238bceSAndroid Build Coastguard Worker     vector<GLuint> m_buffers;
157*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *m_vaoProgram;
158*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *m_stateProgram;
159*35238bceSAndroid Build Coastguard Worker     de::Random m_random;
160*35238bceSAndroid Build Coastguard Worker     uint8_t *m_indices;
161*35238bceSAndroid Build Coastguard Worker 
162*35238bceSAndroid Build Coastguard Worker     void logVertexArrayState(tcu::TestLog &log, const VertexArrayState &state, const std::string &msg);
163*35238bceSAndroid Build Coastguard Worker     uint8_t *createRandomBufferData(const BufferSpec &buffer);
164*35238bceSAndroid Build Coastguard Worker     uint8_t *generateIndices(void);
165*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *createProgram(const VertexArrayState &state);
166*35238bceSAndroid Build Coastguard Worker     void setState(const VertexArrayState &state);
167*35238bceSAndroid Build Coastguard Worker     void render(tcu::Surface &vaoResult, tcu::Surface &defaultResult);
168*35238bceSAndroid Build Coastguard Worker     void makeDrawCall(const VertexArrayState &state);
169*35238bceSAndroid Build Coastguard Worker     void genReferences(tcu::Surface &vaoRef, tcu::Surface &defaultRef);
170*35238bceSAndroid Build Coastguard Worker 
171*35238bceSAndroid Build Coastguard Worker     VertexArrayObjectTest(const VertexArrayObjectTest &);
172*35238bceSAndroid Build Coastguard Worker     VertexArrayObjectTest &operator=(const VertexArrayObjectTest &);
173*35238bceSAndroid Build Coastguard Worker };
174*35238bceSAndroid Build Coastguard Worker 
VertexArrayObjectTest(Context & context,const Spec & spec,const char * name,const char * description)175*35238bceSAndroid Build Coastguard Worker VertexArrayObjectTest::VertexArrayObjectTest(Context &context, const Spec &spec, const char *name,
176*35238bceSAndroid Build Coastguard Worker                                              const char *description)
177*35238bceSAndroid Build Coastguard Worker     : TestCase(context, name, description)
178*35238bceSAndroid Build Coastguard Worker     , m_spec(spec)
179*35238bceSAndroid Build Coastguard Worker     , m_log(context.getTestContext().getLog())
180*35238bceSAndroid Build Coastguard Worker     , m_vaoProgram(NULL)
181*35238bceSAndroid Build Coastguard Worker     , m_stateProgram(NULL)
182*35238bceSAndroid Build Coastguard Worker     , m_random(deStringHash(name))
183*35238bceSAndroid Build Coastguard Worker     , m_indices(NULL)
184*35238bceSAndroid Build Coastguard Worker {
185*35238bceSAndroid Build Coastguard Worker     // Makes zero to zero mapping for buffers
186*35238bceSAndroid Build Coastguard Worker     m_buffers.push_back(0);
187*35238bceSAndroid Build Coastguard Worker }
188*35238bceSAndroid Build Coastguard Worker 
~VertexArrayObjectTest(void)189*35238bceSAndroid Build Coastguard Worker VertexArrayObjectTest::~VertexArrayObjectTest(void)
190*35238bceSAndroid Build Coastguard Worker {
191*35238bceSAndroid Build Coastguard Worker }
192*35238bceSAndroid Build Coastguard Worker 
logVertexArrayState(tcu::TestLog & log,const VertexArrayState & state,const std::string & msg)193*35238bceSAndroid Build Coastguard Worker void VertexArrayObjectTest::logVertexArrayState(tcu::TestLog &log, const VertexArrayState &state,
194*35238bceSAndroid Build Coastguard Worker                                                 const std::string &msg)
195*35238bceSAndroid Build Coastguard Worker {
196*35238bceSAndroid Build Coastguard Worker     std::stringstream message;
197*35238bceSAndroid Build Coastguard Worker 
198*35238bceSAndroid Build Coastguard Worker     message << msg << "\n";
199*35238bceSAndroid Build Coastguard Worker     message << "GL_ELEMENT_ARRAY_BUFFER : " << state.elementArrayBuffer << "\n";
200*35238bceSAndroid Build Coastguard Worker 
201*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++)
202*35238bceSAndroid Build Coastguard Worker     {
203*35238bceSAndroid Build Coastguard Worker         message << "attribute : " << attribNdx << "\n"
204*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_ENABLED : "
205*35238bceSAndroid Build Coastguard Worker                 << (state.attributes[attribNdx].enabled ? "GL_TRUE" : "GL_FALSE") << "\n"
206*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_SIZE : " << state.attributes[attribNdx].size << "\n"
207*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_STRIDE : " << state.attributes[attribNdx].stride << "\n"
208*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_TYPE : " << state.attributes[attribNdx].type << "\n"
209*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_NORMALIZED : "
210*35238bceSAndroid Build Coastguard Worker                 << (state.attributes[attribNdx].normalized ? "GL_TRUE" : "GL_FALSE") << "\n"
211*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_INTEGER : "
212*35238bceSAndroid Build Coastguard Worker                 << (state.attributes[attribNdx].integer ? "GL_TRUE" : "GL_FALSE") << "\n"
213*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_DIVISOR : " << state.attributes[attribNdx].divisor << "\n"
214*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_POINTER : " << state.attributes[attribNdx].offset << "\n"
215*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING : " << m_buffers[state.attributes[attribNdx].bufferNdx]
216*35238bceSAndroid Build Coastguard Worker                 << "\n";
217*35238bceSAndroid Build Coastguard Worker     }
218*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << message.str() << tcu::TestLog::EndMessage;
219*35238bceSAndroid Build Coastguard Worker }
220*35238bceSAndroid Build Coastguard Worker 
init(void)221*35238bceSAndroid Build Coastguard Worker void VertexArrayObjectTest::init(void)
222*35238bceSAndroid Build Coastguard Worker {
223*35238bceSAndroid Build Coastguard Worker     // \note [mika] Index 0 is reserved for 0 buffer
224*35238bceSAndroid Build Coastguard Worker     for (int bufferNdx = 0; bufferNdx < (int)m_spec.buffers.size(); bufferNdx++)
225*35238bceSAndroid Build Coastguard Worker     {
226*35238bceSAndroid Build Coastguard Worker         uint8_t *data = createRandomBufferData(m_spec.buffers[bufferNdx]);
227*35238bceSAndroid Build Coastguard Worker 
228*35238bceSAndroid Build Coastguard Worker         try
229*35238bceSAndroid Build Coastguard Worker         {
230*35238bceSAndroid Build Coastguard Worker             GLuint buffer;
231*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glGenBuffers(1, &buffer));
232*35238bceSAndroid Build Coastguard Worker             m_buffers.push_back(buffer);
233*35238bceSAndroid Build Coastguard Worker 
234*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, buffer));
235*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glBufferData(GL_ARRAY_BUFFER, m_spec.buffers[bufferNdx].size, data, GL_DYNAMIC_DRAW));
236*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, 0));
237*35238bceSAndroid Build Coastguard Worker         }
238*35238bceSAndroid Build Coastguard Worker         catch (...)
239*35238bceSAndroid Build Coastguard Worker         {
240*35238bceSAndroid Build Coastguard Worker             delete[] data;
241*35238bceSAndroid Build Coastguard Worker             throw;
242*35238bceSAndroid Build Coastguard Worker         }
243*35238bceSAndroid Build Coastguard Worker 
244*35238bceSAndroid Build Coastguard Worker         delete[] data;
245*35238bceSAndroid Build Coastguard Worker     }
246*35238bceSAndroid Build Coastguard Worker 
247*35238bceSAndroid Build Coastguard Worker     m_vaoProgram = createProgram(m_spec.vao);
248*35238bceSAndroid Build Coastguard Worker     m_log << tcu::TestLog::Message << "Program used with Vertex Array Object" << tcu::TestLog::EndMessage;
249*35238bceSAndroid Build Coastguard Worker     m_log << *m_vaoProgram;
250*35238bceSAndroid Build Coastguard Worker     m_stateProgram = createProgram(m_spec.state);
251*35238bceSAndroid Build Coastguard Worker     m_log << tcu::TestLog::Message << "Program used with Vertex Array State" << tcu::TestLog::EndMessage;
252*35238bceSAndroid Build Coastguard Worker     m_log << *m_stateProgram;
253*35238bceSAndroid Build Coastguard Worker 
254*35238bceSAndroid Build Coastguard Worker     if (!m_vaoProgram->isOk() || !m_stateProgram->isOk())
255*35238bceSAndroid Build Coastguard Worker         TCU_FAIL("Failed to compile shaders");
256*35238bceSAndroid Build Coastguard Worker 
257*35238bceSAndroid Build Coastguard Worker     if (m_spec.useDrawElements && (m_spec.vao.elementArrayBuffer == 0 || m_spec.state.elementArrayBuffer == 0))
258*35238bceSAndroid Build Coastguard Worker         m_indices = generateIndices();
259*35238bceSAndroid Build Coastguard Worker }
260*35238bceSAndroid Build Coastguard Worker 
deinit(void)261*35238bceSAndroid Build Coastguard Worker void VertexArrayObjectTest::deinit(void)
262*35238bceSAndroid Build Coastguard Worker {
263*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glDeleteBuffers((GLsizei)m_buffers.size(), &(m_buffers[0])));
264*35238bceSAndroid Build Coastguard Worker     m_buffers.clear();
265*35238bceSAndroid Build Coastguard Worker     delete m_vaoProgram;
266*35238bceSAndroid Build Coastguard Worker     delete m_stateProgram;
267*35238bceSAndroid Build Coastguard Worker     delete[] m_indices;
268*35238bceSAndroid Build Coastguard Worker }
269*35238bceSAndroid Build Coastguard Worker 
generateIndices(void)270*35238bceSAndroid Build Coastguard Worker uint8_t *VertexArrayObjectTest::generateIndices(void)
271*35238bceSAndroid Build Coastguard Worker {
272*35238bceSAndroid Build Coastguard Worker     int typeSize = 0;
273*35238bceSAndroid Build Coastguard Worker     switch (m_spec.indexType)
274*35238bceSAndroid Build Coastguard Worker     {
275*35238bceSAndroid Build Coastguard Worker     case GL_UNSIGNED_INT:
276*35238bceSAndroid Build Coastguard Worker         typeSize = sizeof(GLuint);
277*35238bceSAndroid Build Coastguard Worker         break;
278*35238bceSAndroid Build Coastguard Worker     case GL_UNSIGNED_SHORT:
279*35238bceSAndroid Build Coastguard Worker         typeSize = sizeof(GLushort);
280*35238bceSAndroid Build Coastguard Worker         break;
281*35238bceSAndroid Build Coastguard Worker     case GL_UNSIGNED_BYTE:
282*35238bceSAndroid Build Coastguard Worker         typeSize = sizeof(GLubyte);
283*35238bceSAndroid Build Coastguard Worker         break;
284*35238bceSAndroid Build Coastguard Worker     default:
285*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
286*35238bceSAndroid Build Coastguard Worker     }
287*35238bceSAndroid Build Coastguard Worker 
288*35238bceSAndroid Build Coastguard Worker     uint8_t *indices = new uint8_t[m_spec.indexCount * typeSize];
289*35238bceSAndroid Build Coastguard Worker 
290*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < m_spec.indexCount; i++)
291*35238bceSAndroid Build Coastguard Worker     {
292*35238bceSAndroid Build Coastguard Worker         uint8_t *pos = indices + typeSize * i;
293*35238bceSAndroid Build Coastguard Worker 
294*35238bceSAndroid Build Coastguard Worker         switch (m_spec.indexType)
295*35238bceSAndroid Build Coastguard Worker         {
296*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_INT:
297*35238bceSAndroid Build Coastguard Worker         {
298*35238bceSAndroid Build Coastguard Worker             GLuint v = (GLuint)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax);
299*35238bceSAndroid Build Coastguard Worker             deMemcpy(pos, &v, sizeof(v));
300*35238bceSAndroid Build Coastguard Worker             break;
301*35238bceSAndroid Build Coastguard Worker         }
302*35238bceSAndroid Build Coastguard Worker 
303*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_SHORT:
304*35238bceSAndroid Build Coastguard Worker         {
305*35238bceSAndroid Build Coastguard Worker             GLushort v = (GLushort)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax);
306*35238bceSAndroid Build Coastguard Worker             deMemcpy(pos, &v, sizeof(v));
307*35238bceSAndroid Build Coastguard Worker             break;
308*35238bceSAndroid Build Coastguard Worker         }
309*35238bceSAndroid Build Coastguard Worker 
310*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_BYTE:
311*35238bceSAndroid Build Coastguard Worker         {
312*35238bceSAndroid Build Coastguard Worker             GLubyte v = (GLubyte)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax);
313*35238bceSAndroid Build Coastguard Worker             deMemcpy(pos, &v, sizeof(v));
314*35238bceSAndroid Build Coastguard Worker             break;
315*35238bceSAndroid Build Coastguard Worker         }
316*35238bceSAndroid Build Coastguard Worker 
317*35238bceSAndroid Build Coastguard Worker         default:
318*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
319*35238bceSAndroid Build Coastguard Worker         }
320*35238bceSAndroid Build Coastguard Worker     }
321*35238bceSAndroid Build Coastguard Worker 
322*35238bceSAndroid Build Coastguard Worker     return indices;
323*35238bceSAndroid Build Coastguard Worker }
324*35238bceSAndroid Build Coastguard Worker 
createRandomBufferData(const BufferSpec & buffer)325*35238bceSAndroid Build Coastguard Worker uint8_t *VertexArrayObjectTest::createRandomBufferData(const BufferSpec &buffer)
326*35238bceSAndroid Build Coastguard Worker {
327*35238bceSAndroid Build Coastguard Worker     uint8_t *data = new uint8_t[buffer.size];
328*35238bceSAndroid Build Coastguard Worker 
329*35238bceSAndroid Build Coastguard Worker     int stride;
330*35238bceSAndroid Build Coastguard Worker 
331*35238bceSAndroid Build Coastguard Worker     if (buffer.stride != 0)
332*35238bceSAndroid Build Coastguard Worker     {
333*35238bceSAndroid Build Coastguard Worker         stride = buffer.stride;
334*35238bceSAndroid Build Coastguard Worker     }
335*35238bceSAndroid Build Coastguard Worker     else
336*35238bceSAndroid Build Coastguard Worker     {
337*35238bceSAndroid Build Coastguard Worker         switch (buffer.type)
338*35238bceSAndroid Build Coastguard Worker         {
339*35238bceSAndroid Build Coastguard Worker         case GL_FLOAT:
340*35238bceSAndroid Build Coastguard Worker             stride = buffer.componentCount * (int)sizeof(GLfloat);
341*35238bceSAndroid Build Coastguard Worker             break;
342*35238bceSAndroid Build Coastguard Worker         case GL_INT:
343*35238bceSAndroid Build Coastguard Worker             stride = buffer.componentCount * (int)sizeof(GLint);
344*35238bceSAndroid Build Coastguard Worker             break;
345*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_INT:
346*35238bceSAndroid Build Coastguard Worker             stride = buffer.componentCount * (int)sizeof(GLuint);
347*35238bceSAndroid Build Coastguard Worker             break;
348*35238bceSAndroid Build Coastguard Worker         case GL_SHORT:
349*35238bceSAndroid Build Coastguard Worker             stride = buffer.componentCount * (int)sizeof(GLshort);
350*35238bceSAndroid Build Coastguard Worker             break;
351*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_SHORT:
352*35238bceSAndroid Build Coastguard Worker             stride = buffer.componentCount * (int)sizeof(GLushort);
353*35238bceSAndroid Build Coastguard Worker             break;
354*35238bceSAndroid Build Coastguard Worker         case GL_BYTE:
355*35238bceSAndroid Build Coastguard Worker             stride = buffer.componentCount * (int)sizeof(GLbyte);
356*35238bceSAndroid Build Coastguard Worker             break;
357*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_BYTE:
358*35238bceSAndroid Build Coastguard Worker             stride = buffer.componentCount * (int)sizeof(GLubyte);
359*35238bceSAndroid Build Coastguard Worker             break;
360*35238bceSAndroid Build Coastguard Worker 
361*35238bceSAndroid Build Coastguard Worker         default:
362*35238bceSAndroid Build Coastguard Worker             stride = 0;
363*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
364*35238bceSAndroid Build Coastguard Worker         }
365*35238bceSAndroid Build Coastguard Worker     }
366*35238bceSAndroid Build Coastguard Worker 
367*35238bceSAndroid Build Coastguard Worker     uint8_t *itr = data;
368*35238bceSAndroid Build Coastguard Worker 
369*35238bceSAndroid Build Coastguard Worker     for (int pos = 0; pos < buffer.count; pos++)
370*35238bceSAndroid Build Coastguard Worker     {
371*35238bceSAndroid Build Coastguard Worker         uint8_t *componentItr = itr;
372*35238bceSAndroid Build Coastguard Worker         for (int componentNdx = 0; componentNdx < buffer.componentCount; componentNdx++)
373*35238bceSAndroid Build Coastguard Worker         {
374*35238bceSAndroid Build Coastguard Worker             switch (buffer.type)
375*35238bceSAndroid Build Coastguard Worker             {
376*35238bceSAndroid Build Coastguard Worker             case GL_FLOAT:
377*35238bceSAndroid Build Coastguard Worker             {
378*35238bceSAndroid Build Coastguard Worker                 float v = buffer.floatRangeMin + (buffer.floatRangeMax - buffer.floatRangeMin) * m_random.getFloat();
379*35238bceSAndroid Build Coastguard Worker                 deMemcpy(componentItr, &v, sizeof(v));
380*35238bceSAndroid Build Coastguard Worker                 componentItr += sizeof(v);
381*35238bceSAndroid Build Coastguard Worker                 break;
382*35238bceSAndroid Build Coastguard Worker             }
383*35238bceSAndroid Build Coastguard Worker 
384*35238bceSAndroid Build Coastguard Worker             case GL_INT:
385*35238bceSAndroid Build Coastguard Worker             {
386*35238bceSAndroid Build Coastguard Worker                 GLint v = m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
387*35238bceSAndroid Build Coastguard Worker                 deMemcpy(componentItr, &v, sizeof(v));
388*35238bceSAndroid Build Coastguard Worker                 componentItr += sizeof(v);
389*35238bceSAndroid Build Coastguard Worker                 break;
390*35238bceSAndroid Build Coastguard Worker             }
391*35238bceSAndroid Build Coastguard Worker 
392*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_INT:
393*35238bceSAndroid Build Coastguard Worker             {
394*35238bceSAndroid Build Coastguard Worker                 GLuint v = m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
395*35238bceSAndroid Build Coastguard Worker                 deMemcpy(componentItr, &v, sizeof(v));
396*35238bceSAndroid Build Coastguard Worker                 componentItr += sizeof(v);
397*35238bceSAndroid Build Coastguard Worker                 break;
398*35238bceSAndroid Build Coastguard Worker             }
399*35238bceSAndroid Build Coastguard Worker 
400*35238bceSAndroid Build Coastguard Worker             case GL_SHORT:
401*35238bceSAndroid Build Coastguard Worker             {
402*35238bceSAndroid Build Coastguard Worker                 GLshort v = (GLshort)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
403*35238bceSAndroid Build Coastguard Worker                 deMemcpy(componentItr, &v, sizeof(v));
404*35238bceSAndroid Build Coastguard Worker                 componentItr += sizeof(v);
405*35238bceSAndroid Build Coastguard Worker                 break;
406*35238bceSAndroid Build Coastguard Worker             }
407*35238bceSAndroid Build Coastguard Worker 
408*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_SHORT:
409*35238bceSAndroid Build Coastguard Worker             {
410*35238bceSAndroid Build Coastguard Worker                 GLushort v = (GLushort)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
411*35238bceSAndroid Build Coastguard Worker                 deMemcpy(componentItr, &v, sizeof(v));
412*35238bceSAndroid Build Coastguard Worker                 componentItr += sizeof(v);
413*35238bceSAndroid Build Coastguard Worker                 break;
414*35238bceSAndroid Build Coastguard Worker             }
415*35238bceSAndroid Build Coastguard Worker 
416*35238bceSAndroid Build Coastguard Worker             case GL_BYTE:
417*35238bceSAndroid Build Coastguard Worker             {
418*35238bceSAndroid Build Coastguard Worker                 GLbyte v = (GLbyte)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
419*35238bceSAndroid Build Coastguard Worker                 deMemcpy(componentItr, &v, sizeof(v));
420*35238bceSAndroid Build Coastguard Worker                 componentItr += sizeof(v);
421*35238bceSAndroid Build Coastguard Worker                 break;
422*35238bceSAndroid Build Coastguard Worker             }
423*35238bceSAndroid Build Coastguard Worker 
424*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_BYTE:
425*35238bceSAndroid Build Coastguard Worker             {
426*35238bceSAndroid Build Coastguard Worker                 GLubyte v = (GLubyte)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
427*35238bceSAndroid Build Coastguard Worker                 deMemcpy(componentItr, &v, sizeof(v));
428*35238bceSAndroid Build Coastguard Worker                 componentItr += sizeof(v);
429*35238bceSAndroid Build Coastguard Worker                 break;
430*35238bceSAndroid Build Coastguard Worker             }
431*35238bceSAndroid Build Coastguard Worker 
432*35238bceSAndroid Build Coastguard Worker             default:
433*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
434*35238bceSAndroid Build Coastguard Worker             }
435*35238bceSAndroid Build Coastguard Worker         }
436*35238bceSAndroid Build Coastguard Worker 
437*35238bceSAndroid Build Coastguard Worker         itr += stride;
438*35238bceSAndroid Build Coastguard Worker     }
439*35238bceSAndroid Build Coastguard Worker 
440*35238bceSAndroid Build Coastguard Worker     return data;
441*35238bceSAndroid Build Coastguard Worker }
442*35238bceSAndroid Build Coastguard Worker 
createProgram(const VertexArrayState & state)443*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram *VertexArrayObjectTest::createProgram(const VertexArrayState &state)
444*35238bceSAndroid Build Coastguard Worker {
445*35238bceSAndroid Build Coastguard Worker     std::stringstream vertexShaderStream;
446*35238bceSAndroid Build Coastguard Worker     std::stringstream value;
447*35238bceSAndroid Build Coastguard Worker 
448*35238bceSAndroid Build Coastguard Worker     vertexShaderStream << "#version 300 es\n";
449*35238bceSAndroid Build Coastguard Worker 
450*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++)
451*35238bceSAndroid Build Coastguard Worker     {
452*35238bceSAndroid Build Coastguard Worker         if (state.attributes[attribNdx].integer)
453*35238bceSAndroid Build Coastguard Worker             vertexShaderStream << "layout(location = " << attribNdx << ") in mediump ivec4 a_attrib" << attribNdx
454*35238bceSAndroid Build Coastguard Worker                                << ";\n";
455*35238bceSAndroid Build Coastguard Worker         else
456*35238bceSAndroid Build Coastguard Worker             vertexShaderStream << "layout(location = " << attribNdx << ") in mediump vec4 a_attrib" << attribNdx
457*35238bceSAndroid Build Coastguard Worker                                << ";\n";
458*35238bceSAndroid Build Coastguard Worker 
459*35238bceSAndroid Build Coastguard Worker         if (state.attributes[attribNdx].integer)
460*35238bceSAndroid Build Coastguard Worker         {
461*35238bceSAndroid Build Coastguard Worker             float scale = 0.0f;
462*35238bceSAndroid Build Coastguard Worker 
463*35238bceSAndroid Build Coastguard Worker             switch (state.attributes[0].type)
464*35238bceSAndroid Build Coastguard Worker             {
465*35238bceSAndroid Build Coastguard Worker             case GL_SHORT:
466*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 14) - 1u));
467*35238bceSAndroid Build Coastguard Worker                 break;
468*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_SHORT:
469*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 15) - 1u));
470*35238bceSAndroid Build Coastguard Worker                 break;
471*35238bceSAndroid Build Coastguard Worker             case GL_INT:
472*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 30) - 1u));
473*35238bceSAndroid Build Coastguard Worker                 break;
474*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_INT:
475*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 31) - 1u));
476*35238bceSAndroid Build Coastguard Worker                 break;
477*35238bceSAndroid Build Coastguard Worker             case GL_BYTE:
478*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 6) - 1u));
479*35238bceSAndroid Build Coastguard Worker                 break;
480*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_BYTE:
481*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 7) - 1u));
482*35238bceSAndroid Build Coastguard Worker                 break;
483*35238bceSAndroid Build Coastguard Worker 
484*35238bceSAndroid Build Coastguard Worker             default:
485*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
486*35238bceSAndroid Build Coastguard Worker             }
487*35238bceSAndroid Build Coastguard Worker             value << (attribNdx != 0 ? " + " : "") << scale << " * vec4(a_attrib" << attribNdx << ")";
488*35238bceSAndroid Build Coastguard Worker         }
489*35238bceSAndroid Build Coastguard Worker         else if (state.attributes[attribNdx].type != GL_FLOAT && !state.attributes[attribNdx].normalized)
490*35238bceSAndroid Build Coastguard Worker         {
491*35238bceSAndroid Build Coastguard Worker             float scale = 0.0f;
492*35238bceSAndroid Build Coastguard Worker 
493*35238bceSAndroid Build Coastguard Worker             switch (state.attributes[0].type)
494*35238bceSAndroid Build Coastguard Worker             {
495*35238bceSAndroid Build Coastguard Worker             case GL_SHORT:
496*35238bceSAndroid Build Coastguard Worker                 scale = (0.5f / float((1u << 14) - 1u));
497*35238bceSAndroid Build Coastguard Worker                 break;
498*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_SHORT:
499*35238bceSAndroid Build Coastguard Worker                 scale = (0.5f / float((1u << 15) - 1u));
500*35238bceSAndroid Build Coastguard Worker                 break;
501*35238bceSAndroid Build Coastguard Worker             case GL_INT:
502*35238bceSAndroid Build Coastguard Worker                 scale = (0.5f / float((1u << 30) - 1u));
503*35238bceSAndroid Build Coastguard Worker                 break;
504*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_INT:
505*35238bceSAndroid Build Coastguard Worker                 scale = (0.5f / float((1u << 31) - 1u));
506*35238bceSAndroid Build Coastguard Worker                 break;
507*35238bceSAndroid Build Coastguard Worker             case GL_BYTE:
508*35238bceSAndroid Build Coastguard Worker                 scale = (0.5f / float((1u << 6) - 1u));
509*35238bceSAndroid Build Coastguard Worker                 break;
510*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_BYTE:
511*35238bceSAndroid Build Coastguard Worker                 scale = (0.5f / float((1u << 7) - 1u));
512*35238bceSAndroid Build Coastguard Worker                 break;
513*35238bceSAndroid Build Coastguard Worker 
514*35238bceSAndroid Build Coastguard Worker             default:
515*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
516*35238bceSAndroid Build Coastguard Worker             }
517*35238bceSAndroid Build Coastguard Worker             value << (attribNdx != 0 ? " + " : "") << scale << " * a_attrib" << attribNdx;
518*35238bceSAndroid Build Coastguard Worker         }
519*35238bceSAndroid Build Coastguard Worker         else
520*35238bceSAndroid Build Coastguard Worker             value << (attribNdx != 0 ? " + " : "") << "a_attrib" << attribNdx;
521*35238bceSAndroid Build Coastguard Worker     }
522*35238bceSAndroid Build Coastguard Worker 
523*35238bceSAndroid Build Coastguard Worker     vertexShaderStream << "out mediump vec4 v_value;\n"
524*35238bceSAndroid Build Coastguard Worker                        << "void main (void)\n"
525*35238bceSAndroid Build Coastguard Worker                        << "{\n"
526*35238bceSAndroid Build Coastguard Worker                        << "\tv_value = " << value.str() << ";\n";
527*35238bceSAndroid Build Coastguard Worker 
528*35238bceSAndroid Build Coastguard Worker     if (state.attributes[0].integer)
529*35238bceSAndroid Build Coastguard Worker     {
530*35238bceSAndroid Build Coastguard Worker         float scale = 0.0f;
531*35238bceSAndroid Build Coastguard Worker 
532*35238bceSAndroid Build Coastguard Worker         switch (state.attributes[0].type)
533*35238bceSAndroid Build Coastguard Worker         {
534*35238bceSAndroid Build Coastguard Worker         case GL_SHORT:
535*35238bceSAndroid Build Coastguard Worker             scale = (1.0f / float((1u << 14) - 1u));
536*35238bceSAndroid Build Coastguard Worker             break;
537*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_SHORT:
538*35238bceSAndroid Build Coastguard Worker             scale = (1.0f / float((1u << 15) - 1u));
539*35238bceSAndroid Build Coastguard Worker             break;
540*35238bceSAndroid Build Coastguard Worker         case GL_INT:
541*35238bceSAndroid Build Coastguard Worker             scale = (1.0f / float((1u << 30) - 1u));
542*35238bceSAndroid Build Coastguard Worker             break;
543*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_INT:
544*35238bceSAndroid Build Coastguard Worker             scale = (1.0f / float((1u << 31) - 1u));
545*35238bceSAndroid Build Coastguard Worker             break;
546*35238bceSAndroid Build Coastguard Worker         case GL_BYTE:
547*35238bceSAndroid Build Coastguard Worker             scale = (1.0f / float((1u << 6) - 1u));
548*35238bceSAndroid Build Coastguard Worker             break;
549*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_BYTE:
550*35238bceSAndroid Build Coastguard Worker             scale = (1.0f / float((1u << 7) - 1u));
551*35238bceSAndroid Build Coastguard Worker             break;
552*35238bceSAndroid Build Coastguard Worker 
553*35238bceSAndroid Build Coastguard Worker         default:
554*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
555*35238bceSAndroid Build Coastguard Worker         }
556*35238bceSAndroid Build Coastguard Worker 
557*35238bceSAndroid Build Coastguard Worker         vertexShaderStream << "\tgl_Position = vec4(" << scale << " * "
558*35238bceSAndroid Build Coastguard Worker                            << "vec3(a_attrib0.xyz), 1.0);\n"
559*35238bceSAndroid Build Coastguard Worker                            << "}";
560*35238bceSAndroid Build Coastguard Worker     }
561*35238bceSAndroid Build Coastguard Worker     else
562*35238bceSAndroid Build Coastguard Worker     {
563*35238bceSAndroid Build Coastguard Worker         if (state.attributes[0].normalized || state.attributes[0].type == GL_FLOAT)
564*35238bceSAndroid Build Coastguard Worker         {
565*35238bceSAndroid Build Coastguard Worker             vertexShaderStream << "\tgl_Position = vec4(a_attrib0.xyz, 1.0);\n"
566*35238bceSAndroid Build Coastguard Worker                                << "}";
567*35238bceSAndroid Build Coastguard Worker         }
568*35238bceSAndroid Build Coastguard Worker         else
569*35238bceSAndroid Build Coastguard Worker         {
570*35238bceSAndroid Build Coastguard Worker             float scale = 0.0f;
571*35238bceSAndroid Build Coastguard Worker 
572*35238bceSAndroid Build Coastguard Worker             switch (state.attributes[0].type)
573*35238bceSAndroid Build Coastguard Worker             {
574*35238bceSAndroid Build Coastguard Worker             case GL_SHORT:
575*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 14) - 1u));
576*35238bceSAndroid Build Coastguard Worker                 break;
577*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_SHORT:
578*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 15) - 1u));
579*35238bceSAndroid Build Coastguard Worker                 break;
580*35238bceSAndroid Build Coastguard Worker             case GL_INT:
581*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 30) - 1u));
582*35238bceSAndroid Build Coastguard Worker                 break;
583*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_INT:
584*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 31) - 1u));
585*35238bceSAndroid Build Coastguard Worker                 break;
586*35238bceSAndroid Build Coastguard Worker             case GL_BYTE:
587*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 6) - 1u));
588*35238bceSAndroid Build Coastguard Worker                 break;
589*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_BYTE:
590*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 7) - 1u));
591*35238bceSAndroid Build Coastguard Worker                 break;
592*35238bceSAndroid Build Coastguard Worker 
593*35238bceSAndroid Build Coastguard Worker             default:
594*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
595*35238bceSAndroid Build Coastguard Worker             }
596*35238bceSAndroid Build Coastguard Worker 
597*35238bceSAndroid Build Coastguard Worker             scale *= 0.5f;
598*35238bceSAndroid Build Coastguard Worker 
599*35238bceSAndroid Build Coastguard Worker             vertexShaderStream << "\tgl_Position = vec4(" << scale << " * "
600*35238bceSAndroid Build Coastguard Worker                                << "a_attrib0.xyz, 1.0);\n"
601*35238bceSAndroid Build Coastguard Worker                                << "}";
602*35238bceSAndroid Build Coastguard Worker         }
603*35238bceSAndroid Build Coastguard Worker     }
604*35238bceSAndroid Build Coastguard Worker 
605*35238bceSAndroid Build Coastguard Worker     const char *fragmentShader = "#version 300 es\n"
606*35238bceSAndroid Build Coastguard Worker                                  "in mediump vec4 v_value;\n"
607*35238bceSAndroid Build Coastguard Worker                                  "layout(location = 0) out mediump vec4 fragColor;\n"
608*35238bceSAndroid Build Coastguard Worker                                  "void main (void)\n"
609*35238bceSAndroid Build Coastguard Worker                                  "{\n"
610*35238bceSAndroid Build Coastguard Worker                                  "\tfragColor = vec4(v_value.xyz, 1.0);\n"
611*35238bceSAndroid Build Coastguard Worker                                  "}";
612*35238bceSAndroid Build Coastguard Worker 
613*35238bceSAndroid Build Coastguard Worker     return new glu::ShaderProgram(m_context.getRenderContext(),
614*35238bceSAndroid Build Coastguard Worker                                   glu::makeVtxFragSources(vertexShaderStream.str(), fragmentShader));
615*35238bceSAndroid Build Coastguard Worker }
616*35238bceSAndroid Build Coastguard Worker 
setState(const VertexArrayState & state)617*35238bceSAndroid Build Coastguard Worker void VertexArrayObjectTest::setState(const VertexArrayState &state)
618*35238bceSAndroid Build Coastguard Worker {
619*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_buffers[state.elementArrayBuffer]));
620*35238bceSAndroid Build Coastguard Worker 
621*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++)
622*35238bceSAndroid Build Coastguard Worker     {
623*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_buffers[state.attributes[attribNdx].bufferNdx]));
624*35238bceSAndroid Build Coastguard Worker         if (state.attributes[attribNdx].enabled)
625*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glEnableVertexAttribArray(attribNdx));
626*35238bceSAndroid Build Coastguard Worker         else
627*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glDisableVertexAttribArray(attribNdx));
628*35238bceSAndroid Build Coastguard Worker 
629*35238bceSAndroid Build Coastguard Worker         if (state.attributes[attribNdx].integer)
630*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glVertexAttribIPointer(attribNdx, state.attributes[attribNdx].size,
631*35238bceSAndroid Build Coastguard Worker                                                   state.attributes[attribNdx].type, state.attributes[attribNdx].stride,
632*35238bceSAndroid Build Coastguard Worker                                                   (const GLvoid *)((GLintptr)state.attributes[attribNdx].offset)));
633*35238bceSAndroid Build Coastguard Worker         else
634*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(
635*35238bceSAndroid Build Coastguard Worker                 glVertexAttribPointer(attribNdx, state.attributes[attribNdx].size, state.attributes[attribNdx].type,
636*35238bceSAndroid Build Coastguard Worker                                       state.attributes[attribNdx].normalized, state.attributes[attribNdx].stride,
637*35238bceSAndroid Build Coastguard Worker                                       (const GLvoid *)((GLintptr)state.attributes[attribNdx].offset)));
638*35238bceSAndroid Build Coastguard Worker 
639*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glVertexAttribDivisor(attribNdx, state.attributes[attribNdx].divisor));
640*35238bceSAndroid Build Coastguard Worker     }
641*35238bceSAndroid Build Coastguard Worker }
642*35238bceSAndroid Build Coastguard Worker 
makeDrawCall(const VertexArrayState & state)643*35238bceSAndroid Build Coastguard Worker void VertexArrayObjectTest::makeDrawCall(const VertexArrayState &state)
644*35238bceSAndroid Build Coastguard Worker {
645*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glClearColor(0.7f, 0.7f, 0.7f, 1.0f));
646*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glClear(GL_COLOR_BUFFER_BIT));
647*35238bceSAndroid Build Coastguard Worker 
648*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++)
649*35238bceSAndroid Build Coastguard Worker     {
650*35238bceSAndroid Build Coastguard Worker         if (state.attributes[attribNdx].integer)
651*35238bceSAndroid Build Coastguard Worker             glVertexAttribI4i(attribNdx, 0, 0, 0, 1);
652*35238bceSAndroid Build Coastguard Worker         else
653*35238bceSAndroid Build Coastguard Worker             glVertexAttrib4f(attribNdx, 0.0f, 0.0f, 0.0f, 1.0f);
654*35238bceSAndroid Build Coastguard Worker     }
655*35238bceSAndroid Build Coastguard Worker 
656*35238bceSAndroid Build Coastguard Worker     if (m_spec.useDrawElements)
657*35238bceSAndroid Build Coastguard Worker     {
658*35238bceSAndroid Build Coastguard Worker         if (state.elementArrayBuffer == 0)
659*35238bceSAndroid Build Coastguard Worker         {
660*35238bceSAndroid Build Coastguard Worker             if (m_spec.instances == 0)
661*35238bceSAndroid Build Coastguard Worker                 GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, m_spec.count, m_spec.indexType, m_indices));
662*35238bceSAndroid Build Coastguard Worker             else
663*35238bceSAndroid Build Coastguard Worker                 GLU_CHECK_CALL(
664*35238bceSAndroid Build Coastguard Worker                     glDrawElementsInstanced(GL_TRIANGLES, m_spec.count, m_spec.indexType, m_indices, m_spec.instances));
665*35238bceSAndroid Build Coastguard Worker         }
666*35238bceSAndroid Build Coastguard Worker         else
667*35238bceSAndroid Build Coastguard Worker         {
668*35238bceSAndroid Build Coastguard Worker             if (m_spec.instances == 0)
669*35238bceSAndroid Build Coastguard Worker                 GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, m_spec.count, m_spec.indexType,
670*35238bceSAndroid Build Coastguard Worker                                               (GLvoid *)((GLintptr)m_spec.indexOffset)));
671*35238bceSAndroid Build Coastguard Worker             else
672*35238bceSAndroid Build Coastguard Worker                 GLU_CHECK_CALL(glDrawElementsInstanced(GL_TRIANGLES, m_spec.count, m_spec.indexType,
673*35238bceSAndroid Build Coastguard Worker                                                        (GLvoid *)((GLintptr)m_spec.indexOffset), m_spec.instances));
674*35238bceSAndroid Build Coastguard Worker         }
675*35238bceSAndroid Build Coastguard Worker     }
676*35238bceSAndroid Build Coastguard Worker     else
677*35238bceSAndroid Build Coastguard Worker     {
678*35238bceSAndroid Build Coastguard Worker         if (m_spec.instances == 0)
679*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glDrawArrays(GL_TRIANGLES, 0, m_spec.count));
680*35238bceSAndroid Build Coastguard Worker         else
681*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glDrawArraysInstanced(GL_TRIANGLES, 0, m_spec.count, m_spec.instances));
682*35238bceSAndroid Build Coastguard Worker     }
683*35238bceSAndroid Build Coastguard Worker }
684*35238bceSAndroid Build Coastguard Worker 
render(tcu::Surface & vaoResult,tcu::Surface & defaultResult)685*35238bceSAndroid Build Coastguard Worker void VertexArrayObjectTest::render(tcu::Surface &vaoResult, tcu::Surface &defaultResult)
686*35238bceSAndroid Build Coastguard Worker {
687*35238bceSAndroid Build Coastguard Worker     GLuint vao = 0;
688*35238bceSAndroid Build Coastguard Worker 
689*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glGenVertexArrays(1, &vao));
690*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindVertexArray(vao));
691*35238bceSAndroid Build Coastguard Worker     setState(m_spec.vao);
692*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindVertexArray(0));
693*35238bceSAndroid Build Coastguard Worker 
694*35238bceSAndroid Build Coastguard Worker     setState(m_spec.state);
695*35238bceSAndroid Build Coastguard Worker 
696*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindVertexArray(vao));
697*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glUseProgram(m_vaoProgram->getProgram()));
698*35238bceSAndroid Build Coastguard Worker     makeDrawCall(m_spec.vao);
699*35238bceSAndroid Build Coastguard Worker     glu::readPixels(m_context.getRenderContext(), 0, 0, vaoResult.getAccess());
700*35238bceSAndroid Build Coastguard Worker     setState(m_spec.vao);
701*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindVertexArray(0));
702*35238bceSAndroid Build Coastguard Worker 
703*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glUseProgram(m_stateProgram->getProgram()));
704*35238bceSAndroid Build Coastguard Worker     makeDrawCall(m_spec.state);
705*35238bceSAndroid Build Coastguard Worker     glu::readPixels(m_context.getRenderContext(), 0, 0, defaultResult.getAccess());
706*35238bceSAndroid Build Coastguard Worker }
707*35238bceSAndroid Build Coastguard Worker 
genReferences(tcu::Surface & vaoRef,tcu::Surface & defaultRef)708*35238bceSAndroid Build Coastguard Worker void VertexArrayObjectTest::genReferences(tcu::Surface &vaoRef, tcu::Surface &defaultRef)
709*35238bceSAndroid Build Coastguard Worker {
710*35238bceSAndroid Build Coastguard Worker     setState(m_spec.vao);
711*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glUseProgram(m_vaoProgram->getProgram()));
712*35238bceSAndroid Build Coastguard Worker     makeDrawCall(m_spec.vao);
713*35238bceSAndroid Build Coastguard Worker     glu::readPixels(m_context.getRenderContext(), 0, 0, vaoRef.getAccess());
714*35238bceSAndroid Build Coastguard Worker 
715*35238bceSAndroid Build Coastguard Worker     setState(m_spec.state);
716*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glUseProgram(m_stateProgram->getProgram()));
717*35238bceSAndroid Build Coastguard Worker     makeDrawCall(m_spec.state);
718*35238bceSAndroid Build Coastguard Worker     glu::readPixels(m_context.getRenderContext(), 0, 0, defaultRef.getAccess());
719*35238bceSAndroid Build Coastguard Worker }
720*35238bceSAndroid Build Coastguard Worker 
iterate(void)721*35238bceSAndroid Build Coastguard Worker TestCase::IterateResult VertexArrayObjectTest::iterate(void)
722*35238bceSAndroid Build Coastguard Worker {
723*35238bceSAndroid Build Coastguard Worker     tcu::Surface vaoReference(m_context.getRenderContext().getRenderTarget().getWidth(),
724*35238bceSAndroid Build Coastguard Worker                               m_context.getRenderContext().getRenderTarget().getHeight());
725*35238bceSAndroid Build Coastguard Worker     tcu::Surface stateReference(m_context.getRenderContext().getRenderTarget().getWidth(),
726*35238bceSAndroid Build Coastguard Worker                                 m_context.getRenderContext().getRenderTarget().getHeight());
727*35238bceSAndroid Build Coastguard Worker 
728*35238bceSAndroid Build Coastguard Worker     tcu::Surface vaoResult(m_context.getRenderContext().getRenderTarget().getWidth(),
729*35238bceSAndroid Build Coastguard Worker                            m_context.getRenderContext().getRenderTarget().getHeight());
730*35238bceSAndroid Build Coastguard Worker     tcu::Surface stateResult(m_context.getRenderContext().getRenderTarget().getWidth(),
731*35238bceSAndroid Build Coastguard Worker                              m_context.getRenderContext().getRenderTarget().getHeight());
732*35238bceSAndroid Build Coastguard Worker 
733*35238bceSAndroid Build Coastguard Worker     bool isOk;
734*35238bceSAndroid Build Coastguard Worker 
735*35238bceSAndroid Build Coastguard Worker     logVertexArrayState(m_log, m_spec.vao, "Vertex Array Object State");
736*35238bceSAndroid Build Coastguard Worker     logVertexArrayState(m_log, m_spec.state, "OpenGL Vertex Array State");
737*35238bceSAndroid Build Coastguard Worker     genReferences(stateReference, vaoReference);
738*35238bceSAndroid Build Coastguard Worker     render(stateResult, vaoResult);
739*35238bceSAndroid Build Coastguard Worker 
740*35238bceSAndroid Build Coastguard Worker     isOk = tcu::pixelThresholdCompare(m_log, "Results", "Comparison result from rendering with Vertex Array State",
741*35238bceSAndroid Build Coastguard Worker                                       stateReference, stateResult, tcu::RGBA(0, 0, 0, 0), tcu::COMPARE_LOG_RESULT);
742*35238bceSAndroid Build Coastguard Worker     isOk = isOk &&
743*35238bceSAndroid Build Coastguard Worker            tcu::pixelThresholdCompare(m_log, "Results", "Comparison result from rendering with Vertex Array Object",
744*35238bceSAndroid Build Coastguard Worker                                       vaoReference, vaoResult, tcu::RGBA(0, 0, 0, 0), tcu::COMPARE_LOG_RESULT);
745*35238bceSAndroid Build Coastguard Worker 
746*35238bceSAndroid Build Coastguard Worker     if (isOk)
747*35238bceSAndroid Build Coastguard Worker     {
748*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
749*35238bceSAndroid Build Coastguard Worker         return STOP;
750*35238bceSAndroid Build Coastguard Worker     }
751*35238bceSAndroid Build Coastguard Worker     else
752*35238bceSAndroid Build Coastguard Worker     {
753*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
754*35238bceSAndroid Build Coastguard Worker         return STOP;
755*35238bceSAndroid Build Coastguard Worker     }
756*35238bceSAndroid Build Coastguard Worker }
757*35238bceSAndroid Build Coastguard Worker 
758*35238bceSAndroid Build Coastguard Worker class MultiVertexArrayObjectTest : public TestCase
759*35238bceSAndroid Build Coastguard Worker {
760*35238bceSAndroid Build Coastguard Worker public:
761*35238bceSAndroid Build Coastguard Worker     MultiVertexArrayObjectTest(Context &context, const char *name, const char *description);
762*35238bceSAndroid Build Coastguard Worker     ~MultiVertexArrayObjectTest(void);
763*35238bceSAndroid Build Coastguard Worker     virtual void init(void);
764*35238bceSAndroid Build Coastguard Worker     virtual void deinit(void);
765*35238bceSAndroid Build Coastguard Worker     virtual IterateResult iterate(void);
766*35238bceSAndroid Build Coastguard Worker 
767*35238bceSAndroid Build Coastguard Worker private:
768*35238bceSAndroid Build Coastguard Worker     Spec m_spec;
769*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &m_log;
770*35238bceSAndroid Build Coastguard Worker     vector<GLuint> m_buffers;
771*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *m_vaoProgram;
772*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *m_stateProgram;
773*35238bceSAndroid Build Coastguard Worker     de::Random m_random;
774*35238bceSAndroid Build Coastguard Worker     uint8_t *m_indices;
775*35238bceSAndroid Build Coastguard Worker 
776*35238bceSAndroid Build Coastguard Worker     void logVertexArrayState(tcu::TestLog &log, const VertexArrayState &state, const std::string &msg);
777*35238bceSAndroid Build Coastguard Worker     uint8_t *createRandomBufferData(const BufferSpec &buffer);
778*35238bceSAndroid Build Coastguard Worker     uint8_t *generateIndices(void);
779*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *createProgram(const VertexArrayState &state);
780*35238bceSAndroid Build Coastguard Worker     void setState(const VertexArrayState &state);
781*35238bceSAndroid Build Coastguard Worker     void render(tcu::Surface &vaoResult, tcu::Surface &defaultResult);
782*35238bceSAndroid Build Coastguard Worker     void makeDrawCall(const VertexArrayState &state);
783*35238bceSAndroid Build Coastguard Worker     void genReferences(tcu::Surface &vaoRef, tcu::Surface &defaultRef);
784*35238bceSAndroid Build Coastguard Worker 
785*35238bceSAndroid Build Coastguard Worker     MultiVertexArrayObjectTest(const MultiVertexArrayObjectTest &);
786*35238bceSAndroid Build Coastguard Worker     MultiVertexArrayObjectTest &operator=(const MultiVertexArrayObjectTest &);
787*35238bceSAndroid Build Coastguard Worker };
788*35238bceSAndroid Build Coastguard Worker 
MultiVertexArrayObjectTest(Context & context,const char * name,const char * description)789*35238bceSAndroid Build Coastguard Worker MultiVertexArrayObjectTest::MultiVertexArrayObjectTest(Context &context, const char *name, const char *description)
790*35238bceSAndroid Build Coastguard Worker     : TestCase(context, name, description)
791*35238bceSAndroid Build Coastguard Worker     , m_log(context.getTestContext().getLog())
792*35238bceSAndroid Build Coastguard Worker     , m_vaoProgram(NULL)
793*35238bceSAndroid Build Coastguard Worker     , m_stateProgram(NULL)
794*35238bceSAndroid Build Coastguard Worker     , m_random(deStringHash(name))
795*35238bceSAndroid Build Coastguard Worker     , m_indices(NULL)
796*35238bceSAndroid Build Coastguard Worker {
797*35238bceSAndroid Build Coastguard Worker     // Makes zero to zero mapping for buffers
798*35238bceSAndroid Build Coastguard Worker     m_buffers.push_back(0);
799*35238bceSAndroid Build Coastguard Worker }
800*35238bceSAndroid Build Coastguard Worker 
~MultiVertexArrayObjectTest(void)801*35238bceSAndroid Build Coastguard Worker MultiVertexArrayObjectTest::~MultiVertexArrayObjectTest(void)
802*35238bceSAndroid Build Coastguard Worker {
803*35238bceSAndroid Build Coastguard Worker }
804*35238bceSAndroid Build Coastguard Worker 
logVertexArrayState(tcu::TestLog & log,const VertexArrayState & state,const std::string & msg)805*35238bceSAndroid Build Coastguard Worker void MultiVertexArrayObjectTest::logVertexArrayState(tcu::TestLog &log, const VertexArrayState &state,
806*35238bceSAndroid Build Coastguard Worker                                                      const std::string &msg)
807*35238bceSAndroid Build Coastguard Worker {
808*35238bceSAndroid Build Coastguard Worker     std::stringstream message;
809*35238bceSAndroid Build Coastguard Worker 
810*35238bceSAndroid Build Coastguard Worker     message << msg << "\n";
811*35238bceSAndroid Build Coastguard Worker     message << "GL_ELEMENT_ARRAY_BUFFER : " << state.elementArrayBuffer << "\n";
812*35238bceSAndroid Build Coastguard Worker 
813*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++)
814*35238bceSAndroid Build Coastguard Worker     {
815*35238bceSAndroid Build Coastguard Worker         message << "attribute : " << attribNdx << "\n"
816*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_ENABLED : "
817*35238bceSAndroid Build Coastguard Worker                 << (state.attributes[attribNdx].enabled ? "GL_TRUE" : "GL_FALSE") << "\n"
818*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_SIZE : " << state.attributes[attribNdx].size << "\n"
819*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_STRIDE : " << state.attributes[attribNdx].stride << "\n"
820*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_TYPE : " << state.attributes[attribNdx].type << "\n"
821*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_NORMALIZED : "
822*35238bceSAndroid Build Coastguard Worker                 << (state.attributes[attribNdx].normalized ? "GL_TRUE" : "GL_FALSE") << "\n"
823*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_INTEGER : "
824*35238bceSAndroid Build Coastguard Worker                 << (state.attributes[attribNdx].integer ? "GL_TRUE" : "GL_FALSE") << "\n"
825*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_DIVISOR : " << state.attributes[attribNdx].divisor << "\n"
826*35238bceSAndroid Build Coastguard Worker                 << "\tGL_VERTEX_ATTRIB_ARRAY_POINTER : " << state.attributes[attribNdx].offset << "\n"
827*35238bceSAndroid Build Coastguard Worker                 << "\t GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING : " << m_buffers[state.attributes[attribNdx].bufferNdx]
828*35238bceSAndroid Build Coastguard Worker                 << "\n";
829*35238bceSAndroid Build Coastguard Worker     }
830*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << message.str() << tcu::TestLog::EndMessage;
831*35238bceSAndroid Build Coastguard Worker }
832*35238bceSAndroid Build Coastguard Worker 
init(void)833*35238bceSAndroid Build Coastguard Worker void MultiVertexArrayObjectTest::init(void)
834*35238bceSAndroid Build Coastguard Worker {
835*35238bceSAndroid Build Coastguard Worker     GLint attribCount;
836*35238bceSAndroid Build Coastguard Worker 
837*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &attribCount));
838*35238bceSAndroid Build Coastguard Worker 
839*35238bceSAndroid Build Coastguard Worker     m_spec.useDrawElements          = false;
840*35238bceSAndroid Build Coastguard Worker     m_spec.instances                = 0;
841*35238bceSAndroid Build Coastguard Worker     m_spec.count                    = 24;
842*35238bceSAndroid Build Coastguard Worker     m_spec.indexOffset              = 0;
843*35238bceSAndroid Build Coastguard Worker     m_spec.indexRangeMin            = 0;
844*35238bceSAndroid Build Coastguard Worker     m_spec.indexRangeMax            = 0;
845*35238bceSAndroid Build Coastguard Worker     m_spec.indexType                = GL_NONE;
846*35238bceSAndroid Build Coastguard Worker     m_spec.indexCount               = 0;
847*35238bceSAndroid Build Coastguard Worker     m_spec.vao.elementArrayBuffer   = 0;
848*35238bceSAndroid Build Coastguard Worker     m_spec.state.elementArrayBuffer = 0;
849*35238bceSAndroid Build Coastguard Worker 
850*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < attribCount; attribNdx++)
851*35238bceSAndroid Build Coastguard Worker     {
852*35238bceSAndroid Build Coastguard Worker         BufferSpec shortCoordBuffer48 = {48, 2 * 384, 4, 0, 0, GL_SHORT, -32768, 32768, 0.0f, 0.0f};
853*35238bceSAndroid Build Coastguard Worker         m_spec.buffers.push_back(shortCoordBuffer48);
854*35238bceSAndroid Build Coastguard Worker 
855*35238bceSAndroid Build Coastguard Worker         m_spec.state.attributes.push_back(Attribute());
856*35238bceSAndroid Build Coastguard Worker         m_spec.state.attributes[attribNdx].enabled    = (m_random.getInt(0, 4) == 0) ? GL_FALSE : GL_TRUE;
857*35238bceSAndroid Build Coastguard Worker         m_spec.state.attributes[attribNdx].size       = m_random.getInt(2, 4);
858*35238bceSAndroid Build Coastguard Worker         m_spec.state.attributes[attribNdx].stride     = 2 * m_random.getInt(1, 3);
859*35238bceSAndroid Build Coastguard Worker         m_spec.state.attributes[attribNdx].type       = GL_SHORT;
860*35238bceSAndroid Build Coastguard Worker         m_spec.state.attributes[attribNdx].integer    = m_random.getBool();
861*35238bceSAndroid Build Coastguard Worker         m_spec.state.attributes[attribNdx].divisor    = m_random.getInt(0, 1);
862*35238bceSAndroid Build Coastguard Worker         m_spec.state.attributes[attribNdx].offset     = 2 * m_random.getInt(0, 2);
863*35238bceSAndroid Build Coastguard Worker         m_spec.state.attributes[attribNdx].normalized = m_random.getBool();
864*35238bceSAndroid Build Coastguard Worker         m_spec.state.attributes[attribNdx].bufferNdx  = attribNdx + 1;
865*35238bceSAndroid Build Coastguard Worker 
866*35238bceSAndroid Build Coastguard Worker         if (attribNdx == 0)
867*35238bceSAndroid Build Coastguard Worker         {
868*35238bceSAndroid Build Coastguard Worker             m_spec.state.attributes[attribNdx].divisor = 0;
869*35238bceSAndroid Build Coastguard Worker             m_spec.state.attributes[attribNdx].enabled = GL_TRUE;
870*35238bceSAndroid Build Coastguard Worker             m_spec.state.attributes[attribNdx].size    = 2;
871*35238bceSAndroid Build Coastguard Worker         }
872*35238bceSAndroid Build Coastguard Worker 
873*35238bceSAndroid Build Coastguard Worker         m_spec.vao.attributes.push_back(Attribute());
874*35238bceSAndroid Build Coastguard Worker         m_spec.vao.attributes[attribNdx].enabled    = (m_random.getInt(0, 4) == 0) ? GL_FALSE : GL_TRUE;
875*35238bceSAndroid Build Coastguard Worker         m_spec.vao.attributes[attribNdx].size       = m_random.getInt(2, 4);
876*35238bceSAndroid Build Coastguard Worker         m_spec.vao.attributes[attribNdx].stride     = 2 * m_random.getInt(1, 3);
877*35238bceSAndroid Build Coastguard Worker         m_spec.vao.attributes[attribNdx].type       = GL_SHORT;
878*35238bceSAndroid Build Coastguard Worker         m_spec.vao.attributes[attribNdx].integer    = m_random.getBool();
879*35238bceSAndroid Build Coastguard Worker         m_spec.vao.attributes[attribNdx].divisor    = m_random.getInt(0, 1);
880*35238bceSAndroid Build Coastguard Worker         m_spec.vao.attributes[attribNdx].offset     = 2 * m_random.getInt(0, 2);
881*35238bceSAndroid Build Coastguard Worker         m_spec.vao.attributes[attribNdx].normalized = m_random.getBool();
882*35238bceSAndroid Build Coastguard Worker         m_spec.vao.attributes[attribNdx].bufferNdx  = attribCount - attribNdx;
883*35238bceSAndroid Build Coastguard Worker 
884*35238bceSAndroid Build Coastguard Worker         if (attribNdx == 0)
885*35238bceSAndroid Build Coastguard Worker         {
886*35238bceSAndroid Build Coastguard Worker             m_spec.vao.attributes[attribNdx].divisor = 0;
887*35238bceSAndroid Build Coastguard Worker             m_spec.vao.attributes[attribNdx].enabled = GL_TRUE;
888*35238bceSAndroid Build Coastguard Worker             m_spec.vao.attributes[attribNdx].size    = 2;
889*35238bceSAndroid Build Coastguard Worker         }
890*35238bceSAndroid Build Coastguard Worker     }
891*35238bceSAndroid Build Coastguard Worker 
892*35238bceSAndroid Build Coastguard Worker     // \note [mika] Index 0 is reserved for 0 buffer
893*35238bceSAndroid Build Coastguard Worker     for (int bufferNdx = 0; bufferNdx < (int)m_spec.buffers.size(); bufferNdx++)
894*35238bceSAndroid Build Coastguard Worker     {
895*35238bceSAndroid Build Coastguard Worker         uint8_t *data = createRandomBufferData(m_spec.buffers[bufferNdx]);
896*35238bceSAndroid Build Coastguard Worker 
897*35238bceSAndroid Build Coastguard Worker         try
898*35238bceSAndroid Build Coastguard Worker         {
899*35238bceSAndroid Build Coastguard Worker             GLuint buffer;
900*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glGenBuffers(1, &buffer));
901*35238bceSAndroid Build Coastguard Worker             m_buffers.push_back(buffer);
902*35238bceSAndroid Build Coastguard Worker 
903*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, buffer));
904*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glBufferData(GL_ARRAY_BUFFER, m_spec.buffers[bufferNdx].size, data, GL_DYNAMIC_DRAW));
905*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, 0));
906*35238bceSAndroid Build Coastguard Worker         }
907*35238bceSAndroid Build Coastguard Worker         catch (...)
908*35238bceSAndroid Build Coastguard Worker         {
909*35238bceSAndroid Build Coastguard Worker             delete[] data;
910*35238bceSAndroid Build Coastguard Worker             throw;
911*35238bceSAndroid Build Coastguard Worker         }
912*35238bceSAndroid Build Coastguard Worker 
913*35238bceSAndroid Build Coastguard Worker         delete[] data;
914*35238bceSAndroid Build Coastguard Worker     }
915*35238bceSAndroid Build Coastguard Worker 
916*35238bceSAndroid Build Coastguard Worker     m_vaoProgram = createProgram(m_spec.vao);
917*35238bceSAndroid Build Coastguard Worker     m_log << tcu::TestLog::Message << "Program used with Vertex Array Object" << tcu::TestLog::EndMessage;
918*35238bceSAndroid Build Coastguard Worker     m_log << *m_vaoProgram;
919*35238bceSAndroid Build Coastguard Worker     m_stateProgram = createProgram(m_spec.state);
920*35238bceSAndroid Build Coastguard Worker     m_log << tcu::TestLog::Message << "Program used with Vertex Array State" << tcu::TestLog::EndMessage;
921*35238bceSAndroid Build Coastguard Worker     m_log << *m_stateProgram;
922*35238bceSAndroid Build Coastguard Worker 
923*35238bceSAndroid Build Coastguard Worker     if (!m_vaoProgram->isOk() || !m_stateProgram->isOk())
924*35238bceSAndroid Build Coastguard Worker         TCU_FAIL("Failed to compile shaders");
925*35238bceSAndroid Build Coastguard Worker 
926*35238bceSAndroid Build Coastguard Worker     if (m_spec.useDrawElements && (m_spec.vao.elementArrayBuffer == 0 || m_spec.state.elementArrayBuffer == 0))
927*35238bceSAndroid Build Coastguard Worker         m_indices = generateIndices();
928*35238bceSAndroid Build Coastguard Worker }
929*35238bceSAndroid Build Coastguard Worker 
deinit(void)930*35238bceSAndroid Build Coastguard Worker void MultiVertexArrayObjectTest::deinit(void)
931*35238bceSAndroid Build Coastguard Worker {
932*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glDeleteBuffers((GLsizei)m_buffers.size(), &(m_buffers[0])));
933*35238bceSAndroid Build Coastguard Worker     m_buffers.clear();
934*35238bceSAndroid Build Coastguard Worker     delete m_vaoProgram;
935*35238bceSAndroid Build Coastguard Worker     delete m_stateProgram;
936*35238bceSAndroid Build Coastguard Worker     delete[] m_indices;
937*35238bceSAndroid Build Coastguard Worker }
938*35238bceSAndroid Build Coastguard Worker 
generateIndices(void)939*35238bceSAndroid Build Coastguard Worker uint8_t *MultiVertexArrayObjectTest::generateIndices(void)
940*35238bceSAndroid Build Coastguard Worker {
941*35238bceSAndroid Build Coastguard Worker     int typeSize = 0;
942*35238bceSAndroid Build Coastguard Worker     switch (m_spec.indexType)
943*35238bceSAndroid Build Coastguard Worker     {
944*35238bceSAndroid Build Coastguard Worker     case GL_UNSIGNED_INT:
945*35238bceSAndroid Build Coastguard Worker         typeSize = sizeof(GLuint);
946*35238bceSAndroid Build Coastguard Worker         break;
947*35238bceSAndroid Build Coastguard Worker     case GL_UNSIGNED_SHORT:
948*35238bceSAndroid Build Coastguard Worker         typeSize = sizeof(GLushort);
949*35238bceSAndroid Build Coastguard Worker         break;
950*35238bceSAndroid Build Coastguard Worker     case GL_UNSIGNED_BYTE:
951*35238bceSAndroid Build Coastguard Worker         typeSize = sizeof(GLubyte);
952*35238bceSAndroid Build Coastguard Worker         break;
953*35238bceSAndroid Build Coastguard Worker     default:
954*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
955*35238bceSAndroid Build Coastguard Worker     }
956*35238bceSAndroid Build Coastguard Worker 
957*35238bceSAndroid Build Coastguard Worker     uint8_t *indices = new uint8_t[m_spec.indexCount * typeSize];
958*35238bceSAndroid Build Coastguard Worker 
959*35238bceSAndroid Build Coastguard Worker     for (int i = 0; i < m_spec.indexCount; i++)
960*35238bceSAndroid Build Coastguard Worker     {
961*35238bceSAndroid Build Coastguard Worker         uint8_t *pos = indices + typeSize * i;
962*35238bceSAndroid Build Coastguard Worker 
963*35238bceSAndroid Build Coastguard Worker         switch (m_spec.indexType)
964*35238bceSAndroid Build Coastguard Worker         {
965*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_INT:
966*35238bceSAndroid Build Coastguard Worker         {
967*35238bceSAndroid Build Coastguard Worker             GLuint v = (GLuint)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax);
968*35238bceSAndroid Build Coastguard Worker             deMemcpy(pos, &v, sizeof(v));
969*35238bceSAndroid Build Coastguard Worker             break;
970*35238bceSAndroid Build Coastguard Worker         }
971*35238bceSAndroid Build Coastguard Worker 
972*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_SHORT:
973*35238bceSAndroid Build Coastguard Worker         {
974*35238bceSAndroid Build Coastguard Worker             GLushort v = (GLushort)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax);
975*35238bceSAndroid Build Coastguard Worker             deMemcpy(pos, &v, sizeof(v));
976*35238bceSAndroid Build Coastguard Worker             break;
977*35238bceSAndroid Build Coastguard Worker         }
978*35238bceSAndroid Build Coastguard Worker 
979*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_BYTE:
980*35238bceSAndroid Build Coastguard Worker         {
981*35238bceSAndroid Build Coastguard Worker             GLubyte v = (GLubyte)m_random.getInt(m_spec.indexRangeMin, m_spec.indexRangeMax);
982*35238bceSAndroid Build Coastguard Worker             deMemcpy(pos, &v, sizeof(v));
983*35238bceSAndroid Build Coastguard Worker             break;
984*35238bceSAndroid Build Coastguard Worker         }
985*35238bceSAndroid Build Coastguard Worker 
986*35238bceSAndroid Build Coastguard Worker         default:
987*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
988*35238bceSAndroid Build Coastguard Worker         }
989*35238bceSAndroid Build Coastguard Worker     }
990*35238bceSAndroid Build Coastguard Worker 
991*35238bceSAndroid Build Coastguard Worker     return indices;
992*35238bceSAndroid Build Coastguard Worker }
993*35238bceSAndroid Build Coastguard Worker 
createRandomBufferData(const BufferSpec & buffer)994*35238bceSAndroid Build Coastguard Worker uint8_t *MultiVertexArrayObjectTest::createRandomBufferData(const BufferSpec &buffer)
995*35238bceSAndroid Build Coastguard Worker {
996*35238bceSAndroid Build Coastguard Worker     uint8_t *data = new uint8_t[buffer.size];
997*35238bceSAndroid Build Coastguard Worker 
998*35238bceSAndroid Build Coastguard Worker     int stride;
999*35238bceSAndroid Build Coastguard Worker 
1000*35238bceSAndroid Build Coastguard Worker     if (buffer.stride != 0)
1001*35238bceSAndroid Build Coastguard Worker     {
1002*35238bceSAndroid Build Coastguard Worker         stride = buffer.stride;
1003*35238bceSAndroid Build Coastguard Worker     }
1004*35238bceSAndroid Build Coastguard Worker     else
1005*35238bceSAndroid Build Coastguard Worker     {
1006*35238bceSAndroid Build Coastguard Worker         switch (buffer.type)
1007*35238bceSAndroid Build Coastguard Worker         {
1008*35238bceSAndroid Build Coastguard Worker         case GL_FLOAT:
1009*35238bceSAndroid Build Coastguard Worker             stride = buffer.componentCount * (int)sizeof(GLfloat);
1010*35238bceSAndroid Build Coastguard Worker             break;
1011*35238bceSAndroid Build Coastguard Worker         case GL_INT:
1012*35238bceSAndroid Build Coastguard Worker             stride = buffer.componentCount * (int)sizeof(GLint);
1013*35238bceSAndroid Build Coastguard Worker             break;
1014*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_INT:
1015*35238bceSAndroid Build Coastguard Worker             stride = buffer.componentCount * (int)sizeof(GLuint);
1016*35238bceSAndroid Build Coastguard Worker             break;
1017*35238bceSAndroid Build Coastguard Worker         case GL_SHORT:
1018*35238bceSAndroid Build Coastguard Worker             stride = buffer.componentCount * (int)sizeof(GLshort);
1019*35238bceSAndroid Build Coastguard Worker             break;
1020*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_SHORT:
1021*35238bceSAndroid Build Coastguard Worker             stride = buffer.componentCount * (int)sizeof(GLushort);
1022*35238bceSAndroid Build Coastguard Worker             break;
1023*35238bceSAndroid Build Coastguard Worker         case GL_BYTE:
1024*35238bceSAndroid Build Coastguard Worker             stride = buffer.componentCount * (int)sizeof(GLbyte);
1025*35238bceSAndroid Build Coastguard Worker             break;
1026*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_BYTE:
1027*35238bceSAndroid Build Coastguard Worker             stride = buffer.componentCount * (int)sizeof(GLubyte);
1028*35238bceSAndroid Build Coastguard Worker             break;
1029*35238bceSAndroid Build Coastguard Worker 
1030*35238bceSAndroid Build Coastguard Worker         default:
1031*35238bceSAndroid Build Coastguard Worker             stride = 0;
1032*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
1033*35238bceSAndroid Build Coastguard Worker         }
1034*35238bceSAndroid Build Coastguard Worker     }
1035*35238bceSAndroid Build Coastguard Worker 
1036*35238bceSAndroid Build Coastguard Worker     uint8_t *itr = data;
1037*35238bceSAndroid Build Coastguard Worker 
1038*35238bceSAndroid Build Coastguard Worker     for (int pos = 0; pos < buffer.count; pos++)
1039*35238bceSAndroid Build Coastguard Worker     {
1040*35238bceSAndroid Build Coastguard Worker         uint8_t *componentItr = itr;
1041*35238bceSAndroid Build Coastguard Worker         for (int componentNdx = 0; componentNdx < buffer.componentCount; componentNdx++)
1042*35238bceSAndroid Build Coastguard Worker         {
1043*35238bceSAndroid Build Coastguard Worker             switch (buffer.type)
1044*35238bceSAndroid Build Coastguard Worker             {
1045*35238bceSAndroid Build Coastguard Worker             case GL_FLOAT:
1046*35238bceSAndroid Build Coastguard Worker             {
1047*35238bceSAndroid Build Coastguard Worker                 float v = buffer.floatRangeMin + (buffer.floatRangeMax - buffer.floatRangeMin) * m_random.getFloat();
1048*35238bceSAndroid Build Coastguard Worker                 deMemcpy(componentItr, &v, sizeof(v));
1049*35238bceSAndroid Build Coastguard Worker                 componentItr += sizeof(v);
1050*35238bceSAndroid Build Coastguard Worker                 break;
1051*35238bceSAndroid Build Coastguard Worker             }
1052*35238bceSAndroid Build Coastguard Worker 
1053*35238bceSAndroid Build Coastguard Worker             case GL_INT:
1054*35238bceSAndroid Build Coastguard Worker             {
1055*35238bceSAndroid Build Coastguard Worker                 GLint v = m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
1056*35238bceSAndroid Build Coastguard Worker                 deMemcpy(componentItr, &v, sizeof(v));
1057*35238bceSAndroid Build Coastguard Worker                 componentItr += sizeof(v);
1058*35238bceSAndroid Build Coastguard Worker                 break;
1059*35238bceSAndroid Build Coastguard Worker             }
1060*35238bceSAndroid Build Coastguard Worker 
1061*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_INT:
1062*35238bceSAndroid Build Coastguard Worker             {
1063*35238bceSAndroid Build Coastguard Worker                 GLuint v = (GLuint)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
1064*35238bceSAndroid Build Coastguard Worker                 deMemcpy(componentItr, &v, sizeof(v));
1065*35238bceSAndroid Build Coastguard Worker                 componentItr += sizeof(v);
1066*35238bceSAndroid Build Coastguard Worker                 break;
1067*35238bceSAndroid Build Coastguard Worker             }
1068*35238bceSAndroid Build Coastguard Worker 
1069*35238bceSAndroid Build Coastguard Worker             case GL_SHORT:
1070*35238bceSAndroid Build Coastguard Worker             {
1071*35238bceSAndroid Build Coastguard Worker                 GLshort v = (GLshort)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
1072*35238bceSAndroid Build Coastguard Worker                 deMemcpy(componentItr, &v, sizeof(v));
1073*35238bceSAndroid Build Coastguard Worker                 componentItr += sizeof(v);
1074*35238bceSAndroid Build Coastguard Worker                 break;
1075*35238bceSAndroid Build Coastguard Worker             }
1076*35238bceSAndroid Build Coastguard Worker 
1077*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_SHORT:
1078*35238bceSAndroid Build Coastguard Worker             {
1079*35238bceSAndroid Build Coastguard Worker                 GLushort v = (GLushort)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
1080*35238bceSAndroid Build Coastguard Worker                 deMemcpy(componentItr, &v, sizeof(v));
1081*35238bceSAndroid Build Coastguard Worker                 componentItr += sizeof(v);
1082*35238bceSAndroid Build Coastguard Worker                 break;
1083*35238bceSAndroid Build Coastguard Worker             }
1084*35238bceSAndroid Build Coastguard Worker 
1085*35238bceSAndroid Build Coastguard Worker             case GL_BYTE:
1086*35238bceSAndroid Build Coastguard Worker             {
1087*35238bceSAndroid Build Coastguard Worker                 GLbyte v = (GLbyte)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
1088*35238bceSAndroid Build Coastguard Worker                 deMemcpy(componentItr, &v, sizeof(v));
1089*35238bceSAndroid Build Coastguard Worker                 componentItr += sizeof(v);
1090*35238bceSAndroid Build Coastguard Worker                 break;
1091*35238bceSAndroid Build Coastguard Worker             }
1092*35238bceSAndroid Build Coastguard Worker 
1093*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_BYTE:
1094*35238bceSAndroid Build Coastguard Worker             {
1095*35238bceSAndroid Build Coastguard Worker                 GLubyte v = (GLubyte)m_random.getInt(buffer.intRangeMin, buffer.intRangeMax);
1096*35238bceSAndroid Build Coastguard Worker                 deMemcpy(componentItr, &v, sizeof(v));
1097*35238bceSAndroid Build Coastguard Worker                 componentItr += sizeof(v);
1098*35238bceSAndroid Build Coastguard Worker                 break;
1099*35238bceSAndroid Build Coastguard Worker             }
1100*35238bceSAndroid Build Coastguard Worker 
1101*35238bceSAndroid Build Coastguard Worker             default:
1102*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
1103*35238bceSAndroid Build Coastguard Worker             }
1104*35238bceSAndroid Build Coastguard Worker         }
1105*35238bceSAndroid Build Coastguard Worker 
1106*35238bceSAndroid Build Coastguard Worker         itr += stride;
1107*35238bceSAndroid Build Coastguard Worker     }
1108*35238bceSAndroid Build Coastguard Worker 
1109*35238bceSAndroid Build Coastguard Worker     return data;
1110*35238bceSAndroid Build Coastguard Worker }
1111*35238bceSAndroid Build Coastguard Worker 
createProgram(const VertexArrayState & state)1112*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram *MultiVertexArrayObjectTest::createProgram(const VertexArrayState &state)
1113*35238bceSAndroid Build Coastguard Worker {
1114*35238bceSAndroid Build Coastguard Worker     std::stringstream vertexShaderStream;
1115*35238bceSAndroid Build Coastguard Worker     std::stringstream value;
1116*35238bceSAndroid Build Coastguard Worker 
1117*35238bceSAndroid Build Coastguard Worker     vertexShaderStream << "#version 300 es\n";
1118*35238bceSAndroid Build Coastguard Worker 
1119*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++)
1120*35238bceSAndroid Build Coastguard Worker     {
1121*35238bceSAndroid Build Coastguard Worker         if (state.attributes[attribNdx].integer)
1122*35238bceSAndroid Build Coastguard Worker             vertexShaderStream << "layout(location = " << attribNdx << ") in mediump ivec4 a_attrib" << attribNdx
1123*35238bceSAndroid Build Coastguard Worker                                << ";\n";
1124*35238bceSAndroid Build Coastguard Worker         else
1125*35238bceSAndroid Build Coastguard Worker             vertexShaderStream << "layout(location = " << attribNdx << ") in mediump vec4 a_attrib" << attribNdx
1126*35238bceSAndroid Build Coastguard Worker                                << ";\n";
1127*35238bceSAndroid Build Coastguard Worker 
1128*35238bceSAndroid Build Coastguard Worker         if (state.attributes[attribNdx].integer)
1129*35238bceSAndroid Build Coastguard Worker         {
1130*35238bceSAndroid Build Coastguard Worker             float scale = 0.0f;
1131*35238bceSAndroid Build Coastguard Worker 
1132*35238bceSAndroid Build Coastguard Worker             switch (state.attributes[0].type)
1133*35238bceSAndroid Build Coastguard Worker             {
1134*35238bceSAndroid Build Coastguard Worker             case GL_SHORT:
1135*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 14) - 1u));
1136*35238bceSAndroid Build Coastguard Worker                 break;
1137*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_SHORT:
1138*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 15) - 1u));
1139*35238bceSAndroid Build Coastguard Worker                 break;
1140*35238bceSAndroid Build Coastguard Worker             case GL_INT:
1141*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 30) - 1u));
1142*35238bceSAndroid Build Coastguard Worker                 break;
1143*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_INT:
1144*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 31) - 1u));
1145*35238bceSAndroid Build Coastguard Worker                 break;
1146*35238bceSAndroid Build Coastguard Worker             case GL_BYTE:
1147*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 6) - 1u));
1148*35238bceSAndroid Build Coastguard Worker                 break;
1149*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_BYTE:
1150*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 7) - 1u));
1151*35238bceSAndroid Build Coastguard Worker                 break;
1152*35238bceSAndroid Build Coastguard Worker 
1153*35238bceSAndroid Build Coastguard Worker             default:
1154*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
1155*35238bceSAndroid Build Coastguard Worker             }
1156*35238bceSAndroid Build Coastguard Worker             value << (attribNdx != 0 ? " + " : "") << scale << " * vec4(a_attrib" << attribNdx << ")";
1157*35238bceSAndroid Build Coastguard Worker         }
1158*35238bceSAndroid Build Coastguard Worker         else if (state.attributes[attribNdx].type != GL_FLOAT && !state.attributes[attribNdx].normalized)
1159*35238bceSAndroid Build Coastguard Worker         {
1160*35238bceSAndroid Build Coastguard Worker             float scale = 0.0f;
1161*35238bceSAndroid Build Coastguard Worker 
1162*35238bceSAndroid Build Coastguard Worker             switch (state.attributes[0].type)
1163*35238bceSAndroid Build Coastguard Worker             {
1164*35238bceSAndroid Build Coastguard Worker             case GL_SHORT:
1165*35238bceSAndroid Build Coastguard Worker                 scale = (0.5f / float((1u << 14) - 1u));
1166*35238bceSAndroid Build Coastguard Worker                 break;
1167*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_SHORT:
1168*35238bceSAndroid Build Coastguard Worker                 scale = (0.5f / float((1u << 15) - 1u));
1169*35238bceSAndroid Build Coastguard Worker                 break;
1170*35238bceSAndroid Build Coastguard Worker             case GL_INT:
1171*35238bceSAndroid Build Coastguard Worker                 scale = (0.5f / float((1u << 30) - 1u));
1172*35238bceSAndroid Build Coastguard Worker                 break;
1173*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_INT:
1174*35238bceSAndroid Build Coastguard Worker                 scale = (0.5f / float((1u << 31) - 1u));
1175*35238bceSAndroid Build Coastguard Worker                 break;
1176*35238bceSAndroid Build Coastguard Worker             case GL_BYTE:
1177*35238bceSAndroid Build Coastguard Worker                 scale = (0.5f / float((1u << 6) - 1u));
1178*35238bceSAndroid Build Coastguard Worker                 break;
1179*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_BYTE:
1180*35238bceSAndroid Build Coastguard Worker                 scale = (0.5f / float((1u << 7) - 1u));
1181*35238bceSAndroid Build Coastguard Worker                 break;
1182*35238bceSAndroid Build Coastguard Worker 
1183*35238bceSAndroid Build Coastguard Worker             default:
1184*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
1185*35238bceSAndroid Build Coastguard Worker             }
1186*35238bceSAndroid Build Coastguard Worker             value << (attribNdx != 0 ? " + " : "") << scale << " * a_attrib" << attribNdx;
1187*35238bceSAndroid Build Coastguard Worker         }
1188*35238bceSAndroid Build Coastguard Worker         else
1189*35238bceSAndroid Build Coastguard Worker             value << (attribNdx != 0 ? " + " : "") << "a_attrib" << attribNdx;
1190*35238bceSAndroid Build Coastguard Worker     }
1191*35238bceSAndroid Build Coastguard Worker 
1192*35238bceSAndroid Build Coastguard Worker     vertexShaderStream << "out mediump vec4 v_value;\n"
1193*35238bceSAndroid Build Coastguard Worker                        << "void main (void)\n"
1194*35238bceSAndroid Build Coastguard Worker                        << "{\n"
1195*35238bceSAndroid Build Coastguard Worker                        << "\tv_value = " << value.str() << ";\n";
1196*35238bceSAndroid Build Coastguard Worker 
1197*35238bceSAndroid Build Coastguard Worker     if (state.attributes[0].integer)
1198*35238bceSAndroid Build Coastguard Worker     {
1199*35238bceSAndroid Build Coastguard Worker         float scale = 0.0f;
1200*35238bceSAndroid Build Coastguard Worker 
1201*35238bceSAndroid Build Coastguard Worker         switch (state.attributes[0].type)
1202*35238bceSAndroid Build Coastguard Worker         {
1203*35238bceSAndroid Build Coastguard Worker         case GL_SHORT:
1204*35238bceSAndroid Build Coastguard Worker             scale = (1.0f / float((1u << 14) - 1u));
1205*35238bceSAndroid Build Coastguard Worker             break;
1206*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_SHORT:
1207*35238bceSAndroid Build Coastguard Worker             scale = (1.0f / float((1u << 15) - 1u));
1208*35238bceSAndroid Build Coastguard Worker             break;
1209*35238bceSAndroid Build Coastguard Worker         case GL_INT:
1210*35238bceSAndroid Build Coastguard Worker             scale = (1.0f / float((1u << 30) - 1u));
1211*35238bceSAndroid Build Coastguard Worker             break;
1212*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_INT:
1213*35238bceSAndroid Build Coastguard Worker             scale = (1.0f / float((1u << 31) - 1u));
1214*35238bceSAndroid Build Coastguard Worker             break;
1215*35238bceSAndroid Build Coastguard Worker         case GL_BYTE:
1216*35238bceSAndroid Build Coastguard Worker             scale = (1.0f / float((1u << 6) - 1u));
1217*35238bceSAndroid Build Coastguard Worker             break;
1218*35238bceSAndroid Build Coastguard Worker         case GL_UNSIGNED_BYTE:
1219*35238bceSAndroid Build Coastguard Worker             scale = (1.0f / float((1u << 7) - 1u));
1220*35238bceSAndroid Build Coastguard Worker             break;
1221*35238bceSAndroid Build Coastguard Worker 
1222*35238bceSAndroid Build Coastguard Worker         default:
1223*35238bceSAndroid Build Coastguard Worker             DE_ASSERT(false);
1224*35238bceSAndroid Build Coastguard Worker         }
1225*35238bceSAndroid Build Coastguard Worker 
1226*35238bceSAndroid Build Coastguard Worker         vertexShaderStream << "\tgl_Position = vec4(" << scale << " * "
1227*35238bceSAndroid Build Coastguard Worker                            << "a_attrib0.xyz, 1.0);\n"
1228*35238bceSAndroid Build Coastguard Worker                            << "}";
1229*35238bceSAndroid Build Coastguard Worker     }
1230*35238bceSAndroid Build Coastguard Worker     else
1231*35238bceSAndroid Build Coastguard Worker     {
1232*35238bceSAndroid Build Coastguard Worker         if (state.attributes[0].normalized || state.attributes[0].type == GL_FLOAT)
1233*35238bceSAndroid Build Coastguard Worker         {
1234*35238bceSAndroid Build Coastguard Worker             vertexShaderStream << "\tgl_Position = vec4(a_attrib0.xyz, 1.0);\n"
1235*35238bceSAndroid Build Coastguard Worker                                << "}";
1236*35238bceSAndroid Build Coastguard Worker         }
1237*35238bceSAndroid Build Coastguard Worker         else
1238*35238bceSAndroid Build Coastguard Worker         {
1239*35238bceSAndroid Build Coastguard Worker             float scale = 0.0f;
1240*35238bceSAndroid Build Coastguard Worker 
1241*35238bceSAndroid Build Coastguard Worker             switch (state.attributes[0].type)
1242*35238bceSAndroid Build Coastguard Worker             {
1243*35238bceSAndroid Build Coastguard Worker             case GL_SHORT:
1244*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 14) - 1u));
1245*35238bceSAndroid Build Coastguard Worker                 break;
1246*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_SHORT:
1247*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 15) - 1u));
1248*35238bceSAndroid Build Coastguard Worker                 break;
1249*35238bceSAndroid Build Coastguard Worker             case GL_INT:
1250*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 30) - 1u));
1251*35238bceSAndroid Build Coastguard Worker                 break;
1252*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_INT:
1253*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 31) - 1u));
1254*35238bceSAndroid Build Coastguard Worker                 break;
1255*35238bceSAndroid Build Coastguard Worker             case GL_BYTE:
1256*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 6) - 1u));
1257*35238bceSAndroid Build Coastguard Worker                 break;
1258*35238bceSAndroid Build Coastguard Worker             case GL_UNSIGNED_BYTE:
1259*35238bceSAndroid Build Coastguard Worker                 scale = (1.0f / float((1u << 7) - 1u));
1260*35238bceSAndroid Build Coastguard Worker                 break;
1261*35238bceSAndroid Build Coastguard Worker 
1262*35238bceSAndroid Build Coastguard Worker             default:
1263*35238bceSAndroid Build Coastguard Worker                 DE_ASSERT(false);
1264*35238bceSAndroid Build Coastguard Worker             }
1265*35238bceSAndroid Build Coastguard Worker 
1266*35238bceSAndroid Build Coastguard Worker             scale *= 0.5f;
1267*35238bceSAndroid Build Coastguard Worker 
1268*35238bceSAndroid Build Coastguard Worker             vertexShaderStream << "\tgl_Position = vec4(" << scale << " * "
1269*35238bceSAndroid Build Coastguard Worker                                << "vec3(a_attrib0.xyz), 1.0);\n"
1270*35238bceSAndroid Build Coastguard Worker                                << "}";
1271*35238bceSAndroid Build Coastguard Worker         }
1272*35238bceSAndroid Build Coastguard Worker     }
1273*35238bceSAndroid Build Coastguard Worker 
1274*35238bceSAndroid Build Coastguard Worker     const char *fragmentShader = "#version 300 es\n"
1275*35238bceSAndroid Build Coastguard Worker                                  "in mediump vec4 v_value;\n"
1276*35238bceSAndroid Build Coastguard Worker                                  "layout(location = 0) out mediump vec4 fragColor;\n"
1277*35238bceSAndroid Build Coastguard Worker                                  "void main (void)\n"
1278*35238bceSAndroid Build Coastguard Worker                                  "{\n"
1279*35238bceSAndroid Build Coastguard Worker                                  "\tfragColor = vec4(v_value.xyz, 1.0);\n"
1280*35238bceSAndroid Build Coastguard Worker                                  "}";
1281*35238bceSAndroid Build Coastguard Worker 
1282*35238bceSAndroid Build Coastguard Worker     return new glu::ShaderProgram(m_context.getRenderContext(),
1283*35238bceSAndroid Build Coastguard Worker                                   glu::makeVtxFragSources(vertexShaderStream.str(), fragmentShader));
1284*35238bceSAndroid Build Coastguard Worker }
1285*35238bceSAndroid Build Coastguard Worker 
setState(const VertexArrayState & state)1286*35238bceSAndroid Build Coastguard Worker void MultiVertexArrayObjectTest::setState(const VertexArrayState &state)
1287*35238bceSAndroid Build Coastguard Worker {
1288*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_buffers[state.elementArrayBuffer]));
1289*35238bceSAndroid Build Coastguard Worker 
1290*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < (int)state.attributes.size(); attribNdx++)
1291*35238bceSAndroid Build Coastguard Worker     {
1292*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glBindBuffer(GL_ARRAY_BUFFER, m_buffers[state.attributes[attribNdx].bufferNdx]));
1293*35238bceSAndroid Build Coastguard Worker         if (state.attributes[attribNdx].enabled)
1294*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glEnableVertexAttribArray(attribNdx));
1295*35238bceSAndroid Build Coastguard Worker         else
1296*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glDisableVertexAttribArray(attribNdx));
1297*35238bceSAndroid Build Coastguard Worker 
1298*35238bceSAndroid Build Coastguard Worker         if (state.attributes[attribNdx].integer)
1299*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glVertexAttribIPointer(attribNdx, state.attributes[attribNdx].size,
1300*35238bceSAndroid Build Coastguard Worker                                                   state.attributes[attribNdx].type, state.attributes[attribNdx].stride,
1301*35238bceSAndroid Build Coastguard Worker                                                   (const GLvoid *)((GLintptr)state.attributes[attribNdx].offset)));
1302*35238bceSAndroid Build Coastguard Worker         else
1303*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(
1304*35238bceSAndroid Build Coastguard Worker                 glVertexAttribPointer(attribNdx, state.attributes[attribNdx].size, state.attributes[attribNdx].type,
1305*35238bceSAndroid Build Coastguard Worker                                       state.attributes[attribNdx].normalized, state.attributes[attribNdx].stride,
1306*35238bceSAndroid Build Coastguard Worker                                       (const GLvoid *)((GLintptr)state.attributes[attribNdx].offset)));
1307*35238bceSAndroid Build Coastguard Worker 
1308*35238bceSAndroid Build Coastguard Worker         GLU_CHECK_CALL(glVertexAttribDivisor(attribNdx, state.attributes[attribNdx].divisor));
1309*35238bceSAndroid Build Coastguard Worker     }
1310*35238bceSAndroid Build Coastguard Worker }
1311*35238bceSAndroid Build Coastguard Worker 
makeDrawCall(const VertexArrayState & state)1312*35238bceSAndroid Build Coastguard Worker void MultiVertexArrayObjectTest::makeDrawCall(const VertexArrayState &state)
1313*35238bceSAndroid Build Coastguard Worker {
1314*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glClearColor(0.7f, 0.7f, 0.7f, 1.0f));
1315*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glClear(GL_COLOR_BUFFER_BIT));
1316*35238bceSAndroid Build Coastguard Worker 
1317*35238bceSAndroid Build Coastguard Worker     if (m_spec.useDrawElements)
1318*35238bceSAndroid Build Coastguard Worker     {
1319*35238bceSAndroid Build Coastguard Worker         if (state.elementArrayBuffer == 0)
1320*35238bceSAndroid Build Coastguard Worker         {
1321*35238bceSAndroid Build Coastguard Worker             if (m_spec.instances == 0)
1322*35238bceSAndroid Build Coastguard Worker                 GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, m_spec.count, m_spec.indexType, m_indices));
1323*35238bceSAndroid Build Coastguard Worker             else
1324*35238bceSAndroid Build Coastguard Worker                 GLU_CHECK_CALL(
1325*35238bceSAndroid Build Coastguard Worker                     glDrawElementsInstanced(GL_TRIANGLES, m_spec.count, m_spec.indexType, m_indices, m_spec.instances));
1326*35238bceSAndroid Build Coastguard Worker         }
1327*35238bceSAndroid Build Coastguard Worker         else
1328*35238bceSAndroid Build Coastguard Worker         {
1329*35238bceSAndroid Build Coastguard Worker             if (m_spec.instances == 0)
1330*35238bceSAndroid Build Coastguard Worker                 GLU_CHECK_CALL(glDrawElements(GL_TRIANGLES, m_spec.count, m_spec.indexType,
1331*35238bceSAndroid Build Coastguard Worker                                               (GLvoid *)((GLintptr)m_spec.indexOffset)));
1332*35238bceSAndroid Build Coastguard Worker             else
1333*35238bceSAndroid Build Coastguard Worker                 GLU_CHECK_CALL(glDrawElementsInstanced(GL_TRIANGLES, m_spec.count, m_spec.indexType,
1334*35238bceSAndroid Build Coastguard Worker                                                        (GLvoid *)((GLintptr)m_spec.indexOffset), m_spec.instances));
1335*35238bceSAndroid Build Coastguard Worker         }
1336*35238bceSAndroid Build Coastguard Worker     }
1337*35238bceSAndroid Build Coastguard Worker     else
1338*35238bceSAndroid Build Coastguard Worker     {
1339*35238bceSAndroid Build Coastguard Worker         if (m_spec.instances == 0)
1340*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glDrawArrays(GL_TRIANGLES, 0, m_spec.count));
1341*35238bceSAndroid Build Coastguard Worker         else
1342*35238bceSAndroid Build Coastguard Worker             GLU_CHECK_CALL(glDrawArraysInstanced(GL_TRIANGLES, 0, m_spec.count, m_spec.instances));
1343*35238bceSAndroid Build Coastguard Worker     }
1344*35238bceSAndroid Build Coastguard Worker }
1345*35238bceSAndroid Build Coastguard Worker 
render(tcu::Surface & vaoResult,tcu::Surface & defaultResult)1346*35238bceSAndroid Build Coastguard Worker void MultiVertexArrayObjectTest::render(tcu::Surface &vaoResult, tcu::Surface &defaultResult)
1347*35238bceSAndroid Build Coastguard Worker {
1348*35238bceSAndroid Build Coastguard Worker     GLuint vao = 0;
1349*35238bceSAndroid Build Coastguard Worker 
1350*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glGenVertexArrays(1, &vao));
1351*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindVertexArray(vao));
1352*35238bceSAndroid Build Coastguard Worker     setState(m_spec.vao);
1353*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindVertexArray(0));
1354*35238bceSAndroid Build Coastguard Worker 
1355*35238bceSAndroid Build Coastguard Worker     setState(m_spec.state);
1356*35238bceSAndroid Build Coastguard Worker 
1357*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindVertexArray(vao));
1358*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glUseProgram(m_vaoProgram->getProgram()));
1359*35238bceSAndroid Build Coastguard Worker     makeDrawCall(m_spec.vao);
1360*35238bceSAndroid Build Coastguard Worker     glu::readPixels(m_context.getRenderContext(), 0, 0, vaoResult.getAccess());
1361*35238bceSAndroid Build Coastguard Worker     setState(m_spec.vao);
1362*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glBindVertexArray(0));
1363*35238bceSAndroid Build Coastguard Worker 
1364*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glUseProgram(m_stateProgram->getProgram()));
1365*35238bceSAndroid Build Coastguard Worker     makeDrawCall(m_spec.state);
1366*35238bceSAndroid Build Coastguard Worker     glu::readPixels(m_context.getRenderContext(), 0, 0, defaultResult.getAccess());
1367*35238bceSAndroid Build Coastguard Worker }
1368*35238bceSAndroid Build Coastguard Worker 
genReferences(tcu::Surface & vaoRef,tcu::Surface & defaultRef)1369*35238bceSAndroid Build Coastguard Worker void MultiVertexArrayObjectTest::genReferences(tcu::Surface &vaoRef, tcu::Surface &defaultRef)
1370*35238bceSAndroid Build Coastguard Worker {
1371*35238bceSAndroid Build Coastguard Worker     setState(m_spec.vao);
1372*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glUseProgram(m_vaoProgram->getProgram()));
1373*35238bceSAndroid Build Coastguard Worker     makeDrawCall(m_spec.vao);
1374*35238bceSAndroid Build Coastguard Worker     glu::readPixels(m_context.getRenderContext(), 0, 0, vaoRef.getAccess());
1375*35238bceSAndroid Build Coastguard Worker 
1376*35238bceSAndroid Build Coastguard Worker     setState(m_spec.state);
1377*35238bceSAndroid Build Coastguard Worker     GLU_CHECK_CALL(glUseProgram(m_stateProgram->getProgram()));
1378*35238bceSAndroid Build Coastguard Worker     makeDrawCall(m_spec.state);
1379*35238bceSAndroid Build Coastguard Worker     glu::readPixels(m_context.getRenderContext(), 0, 0, defaultRef.getAccess());
1380*35238bceSAndroid Build Coastguard Worker }
1381*35238bceSAndroid Build Coastguard Worker 
iterate(void)1382*35238bceSAndroid Build Coastguard Worker TestCase::IterateResult MultiVertexArrayObjectTest::iterate(void)
1383*35238bceSAndroid Build Coastguard Worker {
1384*35238bceSAndroid Build Coastguard Worker     tcu::Surface vaoReference(m_context.getRenderContext().getRenderTarget().getWidth(),
1385*35238bceSAndroid Build Coastguard Worker                               m_context.getRenderContext().getRenderTarget().getHeight());
1386*35238bceSAndroid Build Coastguard Worker     tcu::Surface stateReference(m_context.getRenderContext().getRenderTarget().getWidth(),
1387*35238bceSAndroid Build Coastguard Worker                                 m_context.getRenderContext().getRenderTarget().getHeight());
1388*35238bceSAndroid Build Coastguard Worker 
1389*35238bceSAndroid Build Coastguard Worker     tcu::Surface vaoResult(m_context.getRenderContext().getRenderTarget().getWidth(),
1390*35238bceSAndroid Build Coastguard Worker                            m_context.getRenderContext().getRenderTarget().getHeight());
1391*35238bceSAndroid Build Coastguard Worker     tcu::Surface stateResult(m_context.getRenderContext().getRenderTarget().getWidth(),
1392*35238bceSAndroid Build Coastguard Worker                              m_context.getRenderContext().getRenderTarget().getHeight());
1393*35238bceSAndroid Build Coastguard Worker 
1394*35238bceSAndroid Build Coastguard Worker     bool isOk;
1395*35238bceSAndroid Build Coastguard Worker 
1396*35238bceSAndroid Build Coastguard Worker     logVertexArrayState(m_log, m_spec.vao, "Vertex Array Object State");
1397*35238bceSAndroid Build Coastguard Worker     logVertexArrayState(m_log, m_spec.state, "OpenGL Vertex Array State");
1398*35238bceSAndroid Build Coastguard Worker     genReferences(stateReference, vaoReference);
1399*35238bceSAndroid Build Coastguard Worker     render(stateResult, vaoResult);
1400*35238bceSAndroid Build Coastguard Worker 
1401*35238bceSAndroid Build Coastguard Worker     isOk = tcu::pixelThresholdCompare(m_log, "Results", "Comparison result from rendering with Vertex Array State",
1402*35238bceSAndroid Build Coastguard Worker                                       stateReference, stateResult, tcu::RGBA(0, 0, 0, 0), tcu::COMPARE_LOG_RESULT);
1403*35238bceSAndroid Build Coastguard Worker     isOk = isOk &&
1404*35238bceSAndroid Build Coastguard Worker            tcu::pixelThresholdCompare(m_log, "Results", "Comparison result from rendering with Vertex Array Object",
1405*35238bceSAndroid Build Coastguard Worker                                       vaoReference, vaoResult, tcu::RGBA(0, 0, 0, 0), tcu::COMPARE_LOG_RESULT);
1406*35238bceSAndroid Build Coastguard Worker 
1407*35238bceSAndroid Build Coastguard Worker     if (isOk)
1408*35238bceSAndroid Build Coastguard Worker     {
1409*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1410*35238bceSAndroid Build Coastguard Worker         return STOP;
1411*35238bceSAndroid Build Coastguard Worker     }
1412*35238bceSAndroid Build Coastguard Worker     else
1413*35238bceSAndroid Build Coastguard Worker     {
1414*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
1415*35238bceSAndroid Build Coastguard Worker         return STOP;
1416*35238bceSAndroid Build Coastguard Worker     }
1417*35238bceSAndroid Build Coastguard Worker }
1418*35238bceSAndroid Build Coastguard Worker 
VertexArrayObjectTestGroup(Context & context)1419*35238bceSAndroid Build Coastguard Worker VertexArrayObjectTestGroup::VertexArrayObjectTestGroup(Context &context)
1420*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "vertex_array_objects", "Vertex array object test cases")
1421*35238bceSAndroid Build Coastguard Worker {
1422*35238bceSAndroid Build Coastguard Worker }
1423*35238bceSAndroid Build Coastguard Worker 
~VertexArrayObjectTestGroup(void)1424*35238bceSAndroid Build Coastguard Worker VertexArrayObjectTestGroup::~VertexArrayObjectTestGroup(void)
1425*35238bceSAndroid Build Coastguard Worker {
1426*35238bceSAndroid Build Coastguard Worker }
1427*35238bceSAndroid Build Coastguard Worker 
init(void)1428*35238bceSAndroid Build Coastguard Worker void VertexArrayObjectTestGroup::init(void)
1429*35238bceSAndroid Build Coastguard Worker {
1430*35238bceSAndroid Build Coastguard Worker     BufferSpec floatCoordBuffer48_1 = {48, 384, 2, 0, 0, GL_FLOAT, 0, 0, -1.0f, 1.0f};
1431*35238bceSAndroid Build Coastguard Worker     BufferSpec floatCoordBuffer48_2 = {48, 384, 2, 0, 0, GL_FLOAT, 0, 0, -1.0f, 1.0f};
1432*35238bceSAndroid Build Coastguard Worker 
1433*35238bceSAndroid Build Coastguard Worker     BufferSpec shortCoordBuffer48 = {48, 192, 2, 0, 0, GL_SHORT, -32768, 32768, 0.0f, 0.0f};
1434*35238bceSAndroid Build Coastguard Worker 
1435*35238bceSAndroid Build Coastguard Worker     // Different buffer
1436*35238bceSAndroid Build Coastguard Worker     {
1437*35238bceSAndroid Build Coastguard Worker         Spec spec;
1438*35238bceSAndroid Build Coastguard Worker 
1439*35238bceSAndroid Build Coastguard Worker         VertexArrayState state;
1440*35238bceSAndroid Build Coastguard Worker 
1441*35238bceSAndroid Build Coastguard Worker         state.attributes.push_back(Attribute());
1442*35238bceSAndroid Build Coastguard Worker 
1443*35238bceSAndroid Build Coastguard Worker         state.attributes[0].enabled    = true;
1444*35238bceSAndroid Build Coastguard Worker         state.attributes[0].size       = 2;
1445*35238bceSAndroid Build Coastguard Worker         state.attributes[0].stride     = 0;
1446*35238bceSAndroid Build Coastguard Worker         state.attributes[0].type       = GL_FLOAT;
1447*35238bceSAndroid Build Coastguard Worker         state.attributes[0].integer    = GL_FALSE;
1448*35238bceSAndroid Build Coastguard Worker         state.attributes[0].divisor    = 0;
1449*35238bceSAndroid Build Coastguard Worker         state.attributes[0].offset     = 0;
1450*35238bceSAndroid Build Coastguard Worker         state.attributes[0].normalized = GL_FALSE;
1451*35238bceSAndroid Build Coastguard Worker 
1452*35238bceSAndroid Build Coastguard Worker         state.elementArrayBuffer = 0;
1453*35238bceSAndroid Build Coastguard Worker 
1454*35238bceSAndroid Build Coastguard Worker         spec.buffers.push_back(floatCoordBuffer48_1);
1455*35238bceSAndroid Build Coastguard Worker         spec.buffers.push_back(floatCoordBuffer48_2);
1456*35238bceSAndroid Build Coastguard Worker 
1457*35238bceSAndroid Build Coastguard Worker         spec.useDrawElements = false;
1458*35238bceSAndroid Build Coastguard Worker         spec.instances       = 0;
1459*35238bceSAndroid Build Coastguard Worker         spec.count           = 48;
1460*35238bceSAndroid Build Coastguard Worker         spec.vao             = state;
1461*35238bceSAndroid Build Coastguard Worker         spec.state           = state;
1462*35238bceSAndroid Build Coastguard Worker         spec.indexOffset     = 0;
1463*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMin   = 0;
1464*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMax   = 0;
1465*35238bceSAndroid Build Coastguard Worker         spec.indexType       = GL_NONE;
1466*35238bceSAndroid Build Coastguard Worker         spec.indexCount      = 0;
1467*35238bceSAndroid Build Coastguard Worker 
1468*35238bceSAndroid Build Coastguard Worker         spec.state.attributes[0].bufferNdx = 1;
1469*35238bceSAndroid Build Coastguard Worker         spec.vao.attributes[0].bufferNdx   = 2;
1470*35238bceSAndroid Build Coastguard Worker         addChild(new VertexArrayObjectTest(m_context, spec, "diff_buffer", "diff_buffer"));
1471*35238bceSAndroid Build Coastguard Worker     }
1472*35238bceSAndroid Build Coastguard Worker     // Different size
1473*35238bceSAndroid Build Coastguard Worker     {
1474*35238bceSAndroid Build Coastguard Worker         Spec spec;
1475*35238bceSAndroid Build Coastguard Worker 
1476*35238bceSAndroid Build Coastguard Worker         VertexArrayState state;
1477*35238bceSAndroid Build Coastguard Worker 
1478*35238bceSAndroid Build Coastguard Worker         state.attributes.push_back(Attribute());
1479*35238bceSAndroid Build Coastguard Worker 
1480*35238bceSAndroid Build Coastguard Worker         state.attributes[0].enabled    = true;
1481*35238bceSAndroid Build Coastguard Worker         state.attributes[0].size       = 2;
1482*35238bceSAndroid Build Coastguard Worker         state.attributes[0].stride     = 0;
1483*35238bceSAndroid Build Coastguard Worker         state.attributes[0].type       = GL_FLOAT;
1484*35238bceSAndroid Build Coastguard Worker         state.attributes[0].integer    = GL_FALSE;
1485*35238bceSAndroid Build Coastguard Worker         state.attributes[0].divisor    = 0;
1486*35238bceSAndroid Build Coastguard Worker         state.attributes[0].offset     = 0;
1487*35238bceSAndroid Build Coastguard Worker         state.attributes[0].normalized = GL_FALSE;
1488*35238bceSAndroid Build Coastguard Worker         state.attributes[0].bufferNdx  = 1;
1489*35238bceSAndroid Build Coastguard Worker 
1490*35238bceSAndroid Build Coastguard Worker         state.elementArrayBuffer = 0;
1491*35238bceSAndroid Build Coastguard Worker 
1492*35238bceSAndroid Build Coastguard Worker         spec.buffers.push_back(floatCoordBuffer48_1);
1493*35238bceSAndroid Build Coastguard Worker 
1494*35238bceSAndroid Build Coastguard Worker         spec.useDrawElements = false;
1495*35238bceSAndroid Build Coastguard Worker         spec.instances       = 0;
1496*35238bceSAndroid Build Coastguard Worker         spec.count           = 24;
1497*35238bceSAndroid Build Coastguard Worker         spec.vao             = state;
1498*35238bceSAndroid Build Coastguard Worker         spec.state           = state;
1499*35238bceSAndroid Build Coastguard Worker         spec.indexOffset     = 0;
1500*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMin   = 0;
1501*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMax   = 0;
1502*35238bceSAndroid Build Coastguard Worker         spec.indexType       = GL_NONE;
1503*35238bceSAndroid Build Coastguard Worker         spec.indexCount      = 0;
1504*35238bceSAndroid Build Coastguard Worker 
1505*35238bceSAndroid Build Coastguard Worker         spec.state.attributes[0].size = 2;
1506*35238bceSAndroid Build Coastguard Worker         spec.vao.attributes[0].size   = 3;
1507*35238bceSAndroid Build Coastguard Worker         addChild(new VertexArrayObjectTest(m_context, spec, "diff_size", "diff_size"));
1508*35238bceSAndroid Build Coastguard Worker     }
1509*35238bceSAndroid Build Coastguard Worker 
1510*35238bceSAndroid Build Coastguard Worker     // Different stride
1511*35238bceSAndroid Build Coastguard Worker     {
1512*35238bceSAndroid Build Coastguard Worker         Spec spec;
1513*35238bceSAndroid Build Coastguard Worker 
1514*35238bceSAndroid Build Coastguard Worker         VertexArrayState state;
1515*35238bceSAndroid Build Coastguard Worker 
1516*35238bceSAndroid Build Coastguard Worker         state.attributes.push_back(Attribute());
1517*35238bceSAndroid Build Coastguard Worker 
1518*35238bceSAndroid Build Coastguard Worker         state.attributes[0].enabled    = true;
1519*35238bceSAndroid Build Coastguard Worker         state.attributes[0].size       = 2;
1520*35238bceSAndroid Build Coastguard Worker         state.attributes[0].stride     = 0;
1521*35238bceSAndroid Build Coastguard Worker         state.attributes[0].type       = GL_SHORT;
1522*35238bceSAndroid Build Coastguard Worker         state.attributes[0].integer    = GL_FALSE;
1523*35238bceSAndroid Build Coastguard Worker         state.attributes[0].divisor    = 0;
1524*35238bceSAndroid Build Coastguard Worker         state.attributes[0].offset     = 0;
1525*35238bceSAndroid Build Coastguard Worker         state.attributes[0].normalized = GL_TRUE;
1526*35238bceSAndroid Build Coastguard Worker         state.attributes[0].bufferNdx  = 1;
1527*35238bceSAndroid Build Coastguard Worker 
1528*35238bceSAndroid Build Coastguard Worker         state.elementArrayBuffer = 0;
1529*35238bceSAndroid Build Coastguard Worker 
1530*35238bceSAndroid Build Coastguard Worker         spec.buffers.push_back(shortCoordBuffer48);
1531*35238bceSAndroid Build Coastguard Worker 
1532*35238bceSAndroid Build Coastguard Worker         spec.useDrawElements = false;
1533*35238bceSAndroid Build Coastguard Worker         spec.instances       = 0;
1534*35238bceSAndroid Build Coastguard Worker         spec.count           = 24;
1535*35238bceSAndroid Build Coastguard Worker         spec.vao             = state;
1536*35238bceSAndroid Build Coastguard Worker         spec.state           = state;
1537*35238bceSAndroid Build Coastguard Worker         spec.indexOffset     = 0;
1538*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMin   = 0;
1539*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMax   = 0;
1540*35238bceSAndroid Build Coastguard Worker         spec.indexType       = GL_NONE;
1541*35238bceSAndroid Build Coastguard Worker         spec.indexCount      = 0;
1542*35238bceSAndroid Build Coastguard Worker 
1543*35238bceSAndroid Build Coastguard Worker         spec.vao.attributes[0].stride   = 2;
1544*35238bceSAndroid Build Coastguard Worker         spec.state.attributes[0].stride = 4;
1545*35238bceSAndroid Build Coastguard Worker         addChild(new VertexArrayObjectTest(m_context, spec, "diff_stride", "diff_stride"));
1546*35238bceSAndroid Build Coastguard Worker     }
1547*35238bceSAndroid Build Coastguard Worker 
1548*35238bceSAndroid Build Coastguard Worker     // Different types
1549*35238bceSAndroid Build Coastguard Worker     {
1550*35238bceSAndroid Build Coastguard Worker         Spec spec;
1551*35238bceSAndroid Build Coastguard Worker 
1552*35238bceSAndroid Build Coastguard Worker         VertexArrayState state;
1553*35238bceSAndroid Build Coastguard Worker 
1554*35238bceSAndroid Build Coastguard Worker         state.attributes.push_back(Attribute());
1555*35238bceSAndroid Build Coastguard Worker 
1556*35238bceSAndroid Build Coastguard Worker         state.attributes[0].enabled    = true;
1557*35238bceSAndroid Build Coastguard Worker         state.attributes[0].size       = 2;
1558*35238bceSAndroid Build Coastguard Worker         state.attributes[0].stride     = 0;
1559*35238bceSAndroid Build Coastguard Worker         state.attributes[0].type       = GL_SHORT;
1560*35238bceSAndroid Build Coastguard Worker         state.attributes[0].integer    = GL_FALSE;
1561*35238bceSAndroid Build Coastguard Worker         state.attributes[0].divisor    = 0;
1562*35238bceSAndroid Build Coastguard Worker         state.attributes[0].offset     = 0;
1563*35238bceSAndroid Build Coastguard Worker         state.attributes[0].normalized = GL_TRUE;
1564*35238bceSAndroid Build Coastguard Worker         state.attributes[0].bufferNdx  = 1;
1565*35238bceSAndroid Build Coastguard Worker 
1566*35238bceSAndroid Build Coastguard Worker         state.elementArrayBuffer = 0;
1567*35238bceSAndroid Build Coastguard Worker 
1568*35238bceSAndroid Build Coastguard Worker         spec.buffers.push_back(shortCoordBuffer48);
1569*35238bceSAndroid Build Coastguard Worker 
1570*35238bceSAndroid Build Coastguard Worker         spec.useDrawElements = false;
1571*35238bceSAndroid Build Coastguard Worker         spec.instances       = 0;
1572*35238bceSAndroid Build Coastguard Worker         spec.count           = 24;
1573*35238bceSAndroid Build Coastguard Worker         spec.vao             = state;
1574*35238bceSAndroid Build Coastguard Worker         spec.state           = state;
1575*35238bceSAndroid Build Coastguard Worker         spec.indexOffset     = 0;
1576*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMin   = 0;
1577*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMax   = 0;
1578*35238bceSAndroid Build Coastguard Worker         spec.indexType       = GL_NONE;
1579*35238bceSAndroid Build Coastguard Worker         spec.indexCount      = 0;
1580*35238bceSAndroid Build Coastguard Worker 
1581*35238bceSAndroid Build Coastguard Worker         spec.vao.attributes[0].type   = GL_SHORT;
1582*35238bceSAndroid Build Coastguard Worker         spec.state.attributes[0].type = GL_BYTE;
1583*35238bceSAndroid Build Coastguard Worker         addChild(new VertexArrayObjectTest(m_context, spec, "diff_type", "diff_type"));
1584*35238bceSAndroid Build Coastguard Worker     }
1585*35238bceSAndroid Build Coastguard Worker     // Different "integer"
1586*35238bceSAndroid Build Coastguard Worker     {
1587*35238bceSAndroid Build Coastguard Worker         Spec spec;
1588*35238bceSAndroid Build Coastguard Worker 
1589*35238bceSAndroid Build Coastguard Worker         VertexArrayState state;
1590*35238bceSAndroid Build Coastguard Worker 
1591*35238bceSAndroid Build Coastguard Worker         state.attributes.push_back(Attribute());
1592*35238bceSAndroid Build Coastguard Worker 
1593*35238bceSAndroid Build Coastguard Worker         state.attributes[0].enabled    = true;
1594*35238bceSAndroid Build Coastguard Worker         state.attributes[0].size       = 2;
1595*35238bceSAndroid Build Coastguard Worker         state.attributes[0].stride     = 0;
1596*35238bceSAndroid Build Coastguard Worker         state.attributes[0].type       = GL_BYTE;
1597*35238bceSAndroid Build Coastguard Worker         state.attributes[0].integer    = GL_TRUE;
1598*35238bceSAndroid Build Coastguard Worker         state.attributes[0].divisor    = 0;
1599*35238bceSAndroid Build Coastguard Worker         state.attributes[0].offset     = 0;
1600*35238bceSAndroid Build Coastguard Worker         state.attributes[0].normalized = GL_FALSE;
1601*35238bceSAndroid Build Coastguard Worker         state.attributes[0].bufferNdx  = 1;
1602*35238bceSAndroid Build Coastguard Worker 
1603*35238bceSAndroid Build Coastguard Worker         state.elementArrayBuffer = 0;
1604*35238bceSAndroid Build Coastguard Worker 
1605*35238bceSAndroid Build Coastguard Worker         spec.buffers.push_back(shortCoordBuffer48);
1606*35238bceSAndroid Build Coastguard Worker 
1607*35238bceSAndroid Build Coastguard Worker         spec.useDrawElements = false;
1608*35238bceSAndroid Build Coastguard Worker         spec.count           = 24;
1609*35238bceSAndroid Build Coastguard Worker         spec.vao             = state;
1610*35238bceSAndroid Build Coastguard Worker         spec.state           = state;
1611*35238bceSAndroid Build Coastguard Worker         spec.instances       = 0;
1612*35238bceSAndroid Build Coastguard Worker         spec.indexOffset     = 0;
1613*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMin   = 0;
1614*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMax   = 0;
1615*35238bceSAndroid Build Coastguard Worker         spec.indexType       = GL_NONE;
1616*35238bceSAndroid Build Coastguard Worker         spec.indexCount      = 0;
1617*35238bceSAndroid Build Coastguard Worker 
1618*35238bceSAndroid Build Coastguard Worker         spec.state.attributes[0].integer = GL_FALSE;
1619*35238bceSAndroid Build Coastguard Worker         spec.vao.attributes[0].integer   = GL_TRUE;
1620*35238bceSAndroid Build Coastguard Worker         addChild(new VertexArrayObjectTest(m_context, spec, "diff_integer", "diff_integer"));
1621*35238bceSAndroid Build Coastguard Worker     }
1622*35238bceSAndroid Build Coastguard Worker     // Different divisor
1623*35238bceSAndroid Build Coastguard Worker     {
1624*35238bceSAndroid Build Coastguard Worker         Spec spec;
1625*35238bceSAndroid Build Coastguard Worker 
1626*35238bceSAndroid Build Coastguard Worker         VertexArrayState state;
1627*35238bceSAndroid Build Coastguard Worker 
1628*35238bceSAndroid Build Coastguard Worker         state.attributes.push_back(Attribute());
1629*35238bceSAndroid Build Coastguard Worker         state.attributes.push_back(Attribute());
1630*35238bceSAndroid Build Coastguard Worker 
1631*35238bceSAndroid Build Coastguard Worker         state.attributes[0].enabled    = true;
1632*35238bceSAndroid Build Coastguard Worker         state.attributes[0].size       = 2;
1633*35238bceSAndroid Build Coastguard Worker         state.attributes[0].stride     = 0;
1634*35238bceSAndroid Build Coastguard Worker         state.attributes[0].type       = GL_SHORT;
1635*35238bceSAndroid Build Coastguard Worker         state.attributes[0].integer    = GL_FALSE;
1636*35238bceSAndroid Build Coastguard Worker         state.attributes[0].divisor    = 0;
1637*35238bceSAndroid Build Coastguard Worker         state.attributes[0].offset     = 0;
1638*35238bceSAndroid Build Coastguard Worker         state.attributes[0].normalized = GL_TRUE;
1639*35238bceSAndroid Build Coastguard Worker         state.attributes[0].bufferNdx  = 1;
1640*35238bceSAndroid Build Coastguard Worker 
1641*35238bceSAndroid Build Coastguard Worker         state.attributes[1].enabled    = true;
1642*35238bceSAndroid Build Coastguard Worker         state.attributes[1].size       = 4;
1643*35238bceSAndroid Build Coastguard Worker         state.attributes[1].stride     = 0;
1644*35238bceSAndroid Build Coastguard Worker         state.attributes[1].type       = GL_FLOAT;
1645*35238bceSAndroid Build Coastguard Worker         state.attributes[1].integer    = GL_FALSE;
1646*35238bceSAndroid Build Coastguard Worker         state.attributes[1].divisor    = 0;
1647*35238bceSAndroid Build Coastguard Worker         state.attributes[1].offset     = 0;
1648*35238bceSAndroid Build Coastguard Worker         state.attributes[1].normalized = GL_FALSE;
1649*35238bceSAndroid Build Coastguard Worker         state.attributes[1].bufferNdx  = 2;
1650*35238bceSAndroid Build Coastguard Worker 
1651*35238bceSAndroid Build Coastguard Worker         state.elementArrayBuffer = 0;
1652*35238bceSAndroid Build Coastguard Worker 
1653*35238bceSAndroid Build Coastguard Worker         spec.buffers.push_back(shortCoordBuffer48);
1654*35238bceSAndroid Build Coastguard Worker         spec.buffers.push_back(floatCoordBuffer48_1);
1655*35238bceSAndroid Build Coastguard Worker 
1656*35238bceSAndroid Build Coastguard Worker         spec.useDrawElements = false;
1657*35238bceSAndroid Build Coastguard Worker         spec.instances       = 10;
1658*35238bceSAndroid Build Coastguard Worker         spec.count           = 12;
1659*35238bceSAndroid Build Coastguard Worker         spec.vao             = state;
1660*35238bceSAndroid Build Coastguard Worker         spec.state           = state;
1661*35238bceSAndroid Build Coastguard Worker         spec.indexOffset     = 0;
1662*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMin   = 0;
1663*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMax   = 0;
1664*35238bceSAndroid Build Coastguard Worker         spec.indexType       = GL_NONE;
1665*35238bceSAndroid Build Coastguard Worker         spec.indexCount      = 0;
1666*35238bceSAndroid Build Coastguard Worker 
1667*35238bceSAndroid Build Coastguard Worker         spec.vao.attributes[1].divisor   = 3;
1668*35238bceSAndroid Build Coastguard Worker         spec.state.attributes[1].divisor = 2;
1669*35238bceSAndroid Build Coastguard Worker 
1670*35238bceSAndroid Build Coastguard Worker         addChild(new VertexArrayObjectTest(m_context, spec, "diff_divisor", "diff_divisor"));
1671*35238bceSAndroid Build Coastguard Worker     }
1672*35238bceSAndroid Build Coastguard Worker     // Different offset
1673*35238bceSAndroid Build Coastguard Worker     {
1674*35238bceSAndroid Build Coastguard Worker         Spec spec;
1675*35238bceSAndroid Build Coastguard Worker 
1676*35238bceSAndroid Build Coastguard Worker         VertexArrayState state;
1677*35238bceSAndroid Build Coastguard Worker 
1678*35238bceSAndroid Build Coastguard Worker         state.attributes.push_back(Attribute());
1679*35238bceSAndroid Build Coastguard Worker 
1680*35238bceSAndroid Build Coastguard Worker         state.attributes[0].enabled    = true;
1681*35238bceSAndroid Build Coastguard Worker         state.attributes[0].size       = 2;
1682*35238bceSAndroid Build Coastguard Worker         state.attributes[0].stride     = 0;
1683*35238bceSAndroid Build Coastguard Worker         state.attributes[0].type       = GL_SHORT;
1684*35238bceSAndroid Build Coastguard Worker         state.attributes[0].integer    = GL_FALSE;
1685*35238bceSAndroid Build Coastguard Worker         state.attributes[0].divisor    = 0;
1686*35238bceSAndroid Build Coastguard Worker         state.attributes[0].offset     = 0;
1687*35238bceSAndroid Build Coastguard Worker         state.attributes[0].normalized = GL_TRUE;
1688*35238bceSAndroid Build Coastguard Worker         state.attributes[0].bufferNdx  = 1;
1689*35238bceSAndroid Build Coastguard Worker 
1690*35238bceSAndroid Build Coastguard Worker         state.elementArrayBuffer = 0;
1691*35238bceSAndroid Build Coastguard Worker 
1692*35238bceSAndroid Build Coastguard Worker         spec.buffers.push_back(shortCoordBuffer48);
1693*35238bceSAndroid Build Coastguard Worker 
1694*35238bceSAndroid Build Coastguard Worker         spec.useDrawElements = false;
1695*35238bceSAndroid Build Coastguard Worker         spec.instances       = 0;
1696*35238bceSAndroid Build Coastguard Worker         spec.count           = 24;
1697*35238bceSAndroid Build Coastguard Worker         spec.vao             = state;
1698*35238bceSAndroid Build Coastguard Worker         spec.state           = state;
1699*35238bceSAndroid Build Coastguard Worker         spec.indexOffset     = 0;
1700*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMin   = 0;
1701*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMax   = 0;
1702*35238bceSAndroid Build Coastguard Worker         spec.indexType       = GL_NONE;
1703*35238bceSAndroid Build Coastguard Worker         spec.indexCount      = 0;
1704*35238bceSAndroid Build Coastguard Worker 
1705*35238bceSAndroid Build Coastguard Worker         spec.vao.attributes[0].offset   = 2;
1706*35238bceSAndroid Build Coastguard Worker         spec.state.attributes[0].offset = 4;
1707*35238bceSAndroid Build Coastguard Worker         addChild(new VertexArrayObjectTest(m_context, spec, "diff_offset", "diff_offset"));
1708*35238bceSAndroid Build Coastguard Worker     }
1709*35238bceSAndroid Build Coastguard Worker     // Different normalize
1710*35238bceSAndroid Build Coastguard Worker     {
1711*35238bceSAndroid Build Coastguard Worker         Spec spec;
1712*35238bceSAndroid Build Coastguard Worker 
1713*35238bceSAndroid Build Coastguard Worker         VertexArrayState state;
1714*35238bceSAndroid Build Coastguard Worker 
1715*35238bceSAndroid Build Coastguard Worker         state.attributes.push_back(Attribute());
1716*35238bceSAndroid Build Coastguard Worker 
1717*35238bceSAndroid Build Coastguard Worker         state.attributes[0].enabled    = true;
1718*35238bceSAndroid Build Coastguard Worker         state.attributes[0].size       = 2;
1719*35238bceSAndroid Build Coastguard Worker         state.attributes[0].stride     = 0;
1720*35238bceSAndroid Build Coastguard Worker         state.attributes[0].type       = GL_SHORT;
1721*35238bceSAndroid Build Coastguard Worker         state.attributes[0].integer    = GL_FALSE;
1722*35238bceSAndroid Build Coastguard Worker         state.attributes[0].divisor    = 0;
1723*35238bceSAndroid Build Coastguard Worker         state.attributes[0].offset     = 0;
1724*35238bceSAndroid Build Coastguard Worker         state.attributes[0].normalized = GL_TRUE;
1725*35238bceSAndroid Build Coastguard Worker         state.attributes[0].bufferNdx  = 1;
1726*35238bceSAndroid Build Coastguard Worker 
1727*35238bceSAndroid Build Coastguard Worker         state.elementArrayBuffer = 0;
1728*35238bceSAndroid Build Coastguard Worker 
1729*35238bceSAndroid Build Coastguard Worker         spec.buffers.push_back(shortCoordBuffer48);
1730*35238bceSAndroid Build Coastguard Worker 
1731*35238bceSAndroid Build Coastguard Worker         spec.useDrawElements = false;
1732*35238bceSAndroid Build Coastguard Worker         spec.instances       = 0;
1733*35238bceSAndroid Build Coastguard Worker         spec.count           = 48;
1734*35238bceSAndroid Build Coastguard Worker         spec.vao             = state;
1735*35238bceSAndroid Build Coastguard Worker         spec.state           = state;
1736*35238bceSAndroid Build Coastguard Worker         spec.indexOffset     = 0;
1737*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMin   = 0;
1738*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMax   = 0;
1739*35238bceSAndroid Build Coastguard Worker         spec.indexType       = GL_NONE;
1740*35238bceSAndroid Build Coastguard Worker         spec.indexCount      = 0;
1741*35238bceSAndroid Build Coastguard Worker 
1742*35238bceSAndroid Build Coastguard Worker         spec.vao.attributes[0].normalized   = GL_TRUE;
1743*35238bceSAndroid Build Coastguard Worker         spec.state.attributes[0].normalized = GL_FALSE;
1744*35238bceSAndroid Build Coastguard Worker         addChild(new VertexArrayObjectTest(m_context, spec, "diff_normalize", "diff_normalize"));
1745*35238bceSAndroid Build Coastguard Worker     }
1746*35238bceSAndroid Build Coastguard Worker     // DrawElements with buffer / Pointer
1747*35238bceSAndroid Build Coastguard Worker     {
1748*35238bceSAndroid Build Coastguard Worker         Spec spec;
1749*35238bceSAndroid Build Coastguard Worker 
1750*35238bceSAndroid Build Coastguard Worker         VertexArrayState state;
1751*35238bceSAndroid Build Coastguard Worker 
1752*35238bceSAndroid Build Coastguard Worker         state.attributes.push_back(Attribute());
1753*35238bceSAndroid Build Coastguard Worker 
1754*35238bceSAndroid Build Coastguard Worker         state.attributes[0].enabled    = true;
1755*35238bceSAndroid Build Coastguard Worker         state.attributes[0].size       = 2;
1756*35238bceSAndroid Build Coastguard Worker         state.attributes[0].stride     = 0;
1757*35238bceSAndroid Build Coastguard Worker         state.attributes[0].type       = GL_FLOAT;
1758*35238bceSAndroid Build Coastguard Worker         state.attributes[0].integer    = GL_FALSE;
1759*35238bceSAndroid Build Coastguard Worker         state.attributes[0].divisor    = 0;
1760*35238bceSAndroid Build Coastguard Worker         state.attributes[0].offset     = 0;
1761*35238bceSAndroid Build Coastguard Worker         state.attributes[0].normalized = GL_TRUE;
1762*35238bceSAndroid Build Coastguard Worker         state.attributes[0].bufferNdx  = 1;
1763*35238bceSAndroid Build Coastguard Worker 
1764*35238bceSAndroid Build Coastguard Worker         state.elementArrayBuffer = 0;
1765*35238bceSAndroid Build Coastguard Worker 
1766*35238bceSAndroid Build Coastguard Worker         spec.buffers.push_back(floatCoordBuffer48_1);
1767*35238bceSAndroid Build Coastguard Worker 
1768*35238bceSAndroid Build Coastguard Worker         BufferSpec indexBuffer = {24, 192, 1, 0, 0, GL_UNSIGNED_SHORT, 0, 48, 0.0f, 0.0f};
1769*35238bceSAndroid Build Coastguard Worker         spec.buffers.push_back(indexBuffer);
1770*35238bceSAndroid Build Coastguard Worker 
1771*35238bceSAndroid Build Coastguard Worker         spec.useDrawElements = true;
1772*35238bceSAndroid Build Coastguard Worker         spec.count           = 24;
1773*35238bceSAndroid Build Coastguard Worker         spec.vao             = state;
1774*35238bceSAndroid Build Coastguard Worker         spec.state           = state;
1775*35238bceSAndroid Build Coastguard Worker         spec.instances       = 0;
1776*35238bceSAndroid Build Coastguard Worker         spec.indexOffset     = 0;
1777*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMin   = 0;
1778*35238bceSAndroid Build Coastguard Worker         spec.indexRangeMax   = 48;
1779*35238bceSAndroid Build Coastguard Worker         spec.indexType       = GL_UNSIGNED_SHORT;
1780*35238bceSAndroid Build Coastguard Worker         spec.indexCount      = 24;
1781*35238bceSAndroid Build Coastguard Worker 
1782*35238bceSAndroid Build Coastguard Worker         spec.state.elementArrayBuffer = 0;
1783*35238bceSAndroid Build Coastguard Worker         spec.vao.elementArrayBuffer   = 2;
1784*35238bceSAndroid Build Coastguard Worker         addChild(new VertexArrayObjectTest(m_context, spec, "diff_indices", "diff_indices"));
1785*35238bceSAndroid Build Coastguard Worker     }
1786*35238bceSAndroid Build Coastguard Worker     // Use all attributes
1787*35238bceSAndroid Build Coastguard Worker 
1788*35238bceSAndroid Build Coastguard Worker     addChild(new MultiVertexArrayObjectTest(m_context, "all_attributes", "all_attributes"));
1789*35238bceSAndroid Build Coastguard Worker }
1790*35238bceSAndroid Build Coastguard Worker 
1791*35238bceSAndroid Build Coastguard Worker } // namespace Functional
1792*35238bceSAndroid Build Coastguard Worker } // namespace gles3
1793*35238bceSAndroid Build Coastguard Worker } // namespace deqp
1794