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