1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 2.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 and buffer unaligned access stress tests
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es2sVertexArrayTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsVertexArrayTests.hpp"
26*35238bceSAndroid Build Coastguard Worker
27*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
28*35238bceSAndroid Build Coastguard Worker
29*35238bceSAndroid Build Coastguard Worker using namespace deqp::gls;
30*35238bceSAndroid Build Coastguard Worker
31*35238bceSAndroid Build Coastguard Worker namespace deqp
32*35238bceSAndroid Build Coastguard Worker {
33*35238bceSAndroid Build Coastguard Worker namespace gles2
34*35238bceSAndroid Build Coastguard Worker {
35*35238bceSAndroid Build Coastguard Worker namespace Stress
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker namespace
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker
40*35238bceSAndroid Build Coastguard Worker template <class T>
typeToString(T t)41*35238bceSAndroid Build Coastguard Worker static std::string typeToString(T t)
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker std::stringstream strm;
44*35238bceSAndroid Build Coastguard Worker strm << t;
45*35238bceSAndroid Build Coastguard Worker return strm.str();
46*35238bceSAndroid Build Coastguard Worker }
47*35238bceSAndroid Build Coastguard Worker
48*35238bceSAndroid Build Coastguard Worker class SingleVertexArrayUsageTests : public TestCaseGroup
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker public:
51*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageTests(Context &context);
52*35238bceSAndroid Build Coastguard Worker virtual ~SingleVertexArrayUsageTests(void);
53*35238bceSAndroid Build Coastguard Worker
54*35238bceSAndroid Build Coastguard Worker virtual void init(void);
55*35238bceSAndroid Build Coastguard Worker
56*35238bceSAndroid Build Coastguard Worker private:
57*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageTests(const SingleVertexArrayUsageTests &other);
58*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageTests &operator=(const SingleVertexArrayUsageTests &other);
59*35238bceSAndroid Build Coastguard Worker };
60*35238bceSAndroid Build Coastguard Worker
SingleVertexArrayUsageTests(Context & context)61*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageTests::SingleVertexArrayUsageTests(Context &context)
62*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "usages", "Single vertex atribute, usage")
63*35238bceSAndroid Build Coastguard Worker {
64*35238bceSAndroid Build Coastguard Worker }
65*35238bceSAndroid Build Coastguard Worker
~SingleVertexArrayUsageTests(void)66*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageTests::~SingleVertexArrayUsageTests(void)
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker }
69*35238bceSAndroid Build Coastguard Worker
init(void)70*35238bceSAndroid Build Coastguard Worker void SingleVertexArrayUsageTests::init(void)
71*35238bceSAndroid Build Coastguard Worker {
72*35238bceSAndroid Build Coastguard Worker // Test usage
73*35238bceSAndroid Build Coastguard Worker Array::Usage usages[] = {Array::USAGE_STATIC_DRAW, Array::USAGE_STREAM_DRAW, Array::USAGE_DYNAMIC_DRAW};
74*35238bceSAndroid Build Coastguard Worker int counts[] = {1, 256};
75*35238bceSAndroid Build Coastguard Worker int strides[] = {17};
76*35238bceSAndroid Build Coastguard Worker Array::InputType inputTypes[] = {Array::INPUTTYPE_FLOAT, Array::INPUTTYPE_FIXED, Array::INPUTTYPE_SHORT,
77*35238bceSAndroid Build Coastguard Worker Array::INPUTTYPE_BYTE};
78*35238bceSAndroid Build Coastguard Worker
79*35238bceSAndroid Build Coastguard Worker for (int inputTypeNdx = 0; inputTypeNdx < DE_LENGTH_OF_ARRAY(inputTypes); inputTypeNdx++)
80*35238bceSAndroid Build Coastguard Worker {
81*35238bceSAndroid Build Coastguard Worker for (int countNdx = 0; countNdx < DE_LENGTH_OF_ARRAY(counts); countNdx++)
82*35238bceSAndroid Build Coastguard Worker {
83*35238bceSAndroid Build Coastguard Worker for (int strideNdx = 0; strideNdx < DE_LENGTH_OF_ARRAY(strides); strideNdx++)
84*35238bceSAndroid Build Coastguard Worker {
85*35238bceSAndroid Build Coastguard Worker for (int usageNdx = 0; usageNdx < DE_LENGTH_OF_ARRAY(usages); usageNdx++)
86*35238bceSAndroid Build Coastguard Worker {
87*35238bceSAndroid Build Coastguard Worker const int componentCount = 2;
88*35238bceSAndroid Build Coastguard Worker const int stride =
89*35238bceSAndroid Build Coastguard Worker (strides[strideNdx] < 0 ? Array::inputTypeSize(inputTypes[inputTypeNdx]) * componentCount :
90*35238bceSAndroid Build Coastguard Worker strides[strideNdx]);
91*35238bceSAndroid Build Coastguard Worker const bool aligned = (stride % Array::inputTypeSize(inputTypes[inputTypeNdx])) == 0;
92*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec::ArraySpec arraySpec(
93*35238bceSAndroid Build Coastguard Worker inputTypes[inputTypeNdx], Array::OUTPUTTYPE_VEC2, Array::STORAGE_BUFFER, usages[usageNdx],
94*35238bceSAndroid Build Coastguard Worker componentCount, 0, stride, false, GLValue::getMinValue(inputTypes[inputTypeNdx]),
95*35238bceSAndroid Build Coastguard Worker GLValue::getMaxValue(inputTypes[inputTypeNdx]));
96*35238bceSAndroid Build Coastguard Worker
97*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec spec;
98*35238bceSAndroid Build Coastguard Worker spec.primitive = Array::PRIMITIVE_TRIANGLES;
99*35238bceSAndroid Build Coastguard Worker spec.drawCount = counts[countNdx];
100*35238bceSAndroid Build Coastguard Worker spec.first = 0;
101*35238bceSAndroid Build Coastguard Worker spec.arrays.push_back(arraySpec);
102*35238bceSAndroid Build Coastguard Worker
103*35238bceSAndroid Build Coastguard Worker std::string name = spec.getName();
104*35238bceSAndroid Build Coastguard Worker
105*35238bceSAndroid Build Coastguard Worker if (!aligned)
106*35238bceSAndroid Build Coastguard Worker addChild(new MultiVertexArrayTest(m_testCtx, m_context.getRenderContext(), spec, name.c_str(),
107*35238bceSAndroid Build Coastguard Worker name.c_str()));
108*35238bceSAndroid Build Coastguard Worker }
109*35238bceSAndroid Build Coastguard Worker }
110*35238bceSAndroid Build Coastguard Worker }
111*35238bceSAndroid Build Coastguard Worker }
112*35238bceSAndroid Build Coastguard Worker }
113*35238bceSAndroid Build Coastguard Worker
114*35238bceSAndroid Build Coastguard Worker class SingleVertexArrayStrideTests : public TestCaseGroup
115*35238bceSAndroid Build Coastguard Worker {
116*35238bceSAndroid Build Coastguard Worker public:
117*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideTests(Context &context);
118*35238bceSAndroid Build Coastguard Worker virtual ~SingleVertexArrayStrideTests(void);
119*35238bceSAndroid Build Coastguard Worker
120*35238bceSAndroid Build Coastguard Worker virtual void init(void);
121*35238bceSAndroid Build Coastguard Worker
122*35238bceSAndroid Build Coastguard Worker private:
123*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideTests(const SingleVertexArrayStrideTests &other);
124*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideTests &operator=(const SingleVertexArrayStrideTests &other);
125*35238bceSAndroid Build Coastguard Worker };
126*35238bceSAndroid Build Coastguard Worker
SingleVertexArrayStrideTests(Context & context)127*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideTests::SingleVertexArrayStrideTests(Context &context)
128*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "strides", "Single stride vertex atribute")
129*35238bceSAndroid Build Coastguard Worker {
130*35238bceSAndroid Build Coastguard Worker }
131*35238bceSAndroid Build Coastguard Worker
~SingleVertexArrayStrideTests(void)132*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideTests::~SingleVertexArrayStrideTests(void)
133*35238bceSAndroid Build Coastguard Worker {
134*35238bceSAndroid Build Coastguard Worker }
135*35238bceSAndroid Build Coastguard Worker
init(void)136*35238bceSAndroid Build Coastguard Worker void SingleVertexArrayStrideTests::init(void)
137*35238bceSAndroid Build Coastguard Worker {
138*35238bceSAndroid Build Coastguard Worker // Test strides with different input types, component counts and storage, Usage(?)
139*35238bceSAndroid Build Coastguard Worker Array::InputType inputTypes[] = {
140*35238bceSAndroid Build Coastguard Worker Array::INPUTTYPE_FLOAT, Array::INPUTTYPE_SHORT, Array::INPUTTYPE_BYTE,
141*35238bceSAndroid Build Coastguard Worker /*Array::INPUTTYPE_UNSIGNED_SHORT, Array::INPUTTYPE_UNSIGNED_BYTE,*/ Array::INPUTTYPE_FIXED};
142*35238bceSAndroid Build Coastguard Worker Array::Storage storages[] = {Array::STORAGE_BUFFER};
143*35238bceSAndroid Build Coastguard Worker int counts[] = {1, 256};
144*35238bceSAndroid Build Coastguard Worker int strides[] = {17};
145*35238bceSAndroid Build Coastguard Worker
146*35238bceSAndroid Build Coastguard Worker for (int inputTypeNdx = 0; inputTypeNdx < DE_LENGTH_OF_ARRAY(inputTypes); inputTypeNdx++)
147*35238bceSAndroid Build Coastguard Worker {
148*35238bceSAndroid Build Coastguard Worker for (int storageNdx = 0; storageNdx < DE_LENGTH_OF_ARRAY(storages); storageNdx++)
149*35238bceSAndroid Build Coastguard Worker {
150*35238bceSAndroid Build Coastguard Worker for (int componentCount = 2; componentCount < 5; componentCount++)
151*35238bceSAndroid Build Coastguard Worker {
152*35238bceSAndroid Build Coastguard Worker for (int countNdx = 0; countNdx < DE_LENGTH_OF_ARRAY(counts); countNdx++)
153*35238bceSAndroid Build Coastguard Worker {
154*35238bceSAndroid Build Coastguard Worker for (int strideNdx = 0; strideNdx < DE_LENGTH_OF_ARRAY(strides); strideNdx++)
155*35238bceSAndroid Build Coastguard Worker {
156*35238bceSAndroid Build Coastguard Worker const int stride =
157*35238bceSAndroid Build Coastguard Worker (strides[strideNdx] < 0 ? Array::inputTypeSize(inputTypes[inputTypeNdx]) * componentCount :
158*35238bceSAndroid Build Coastguard Worker strides[strideNdx]);
159*35238bceSAndroid Build Coastguard Worker const bool bufferUnaligned = (storages[storageNdx] == Array::STORAGE_BUFFER) &&
160*35238bceSAndroid Build Coastguard Worker (stride % Array::inputTypeSize(inputTypes[inputTypeNdx])) != 0;
161*35238bceSAndroid Build Coastguard Worker
162*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec::ArraySpec arraySpec(
163*35238bceSAndroid Build Coastguard Worker inputTypes[inputTypeNdx], Array::OUTPUTTYPE_VEC4, storages[storageNdx],
164*35238bceSAndroid Build Coastguard Worker Array::USAGE_DYNAMIC_DRAW, componentCount, 0, stride, false,
165*35238bceSAndroid Build Coastguard Worker GLValue::getMinValue(inputTypes[inputTypeNdx]),
166*35238bceSAndroid Build Coastguard Worker GLValue::getMaxValue(inputTypes[inputTypeNdx]));
167*35238bceSAndroid Build Coastguard Worker
168*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec spec;
169*35238bceSAndroid Build Coastguard Worker spec.primitive = Array::PRIMITIVE_TRIANGLES;
170*35238bceSAndroid Build Coastguard Worker spec.drawCount = counts[countNdx];
171*35238bceSAndroid Build Coastguard Worker spec.first = 0;
172*35238bceSAndroid Build Coastguard Worker spec.arrays.push_back(arraySpec);
173*35238bceSAndroid Build Coastguard Worker
174*35238bceSAndroid Build Coastguard Worker std::string name = spec.getName();
175*35238bceSAndroid Build Coastguard Worker if (bufferUnaligned)
176*35238bceSAndroid Build Coastguard Worker addChild(new MultiVertexArrayTest(m_testCtx, m_context.getRenderContext(), spec,
177*35238bceSAndroid Build Coastguard Worker name.c_str(), name.c_str()));
178*35238bceSAndroid Build Coastguard Worker }
179*35238bceSAndroid Build Coastguard Worker }
180*35238bceSAndroid Build Coastguard Worker }
181*35238bceSAndroid Build Coastguard Worker }
182*35238bceSAndroid Build Coastguard Worker }
183*35238bceSAndroid Build Coastguard Worker }
184*35238bceSAndroid Build Coastguard Worker
185*35238bceSAndroid Build Coastguard Worker class SingleVertexArrayFirstTests : public TestCaseGroup
186*35238bceSAndroid Build Coastguard Worker {
187*35238bceSAndroid Build Coastguard Worker public:
188*35238bceSAndroid Build Coastguard Worker SingleVertexArrayFirstTests(Context &context);
189*35238bceSAndroid Build Coastguard Worker virtual ~SingleVertexArrayFirstTests(void);
190*35238bceSAndroid Build Coastguard Worker
191*35238bceSAndroid Build Coastguard Worker virtual void init(void);
192*35238bceSAndroid Build Coastguard Worker
193*35238bceSAndroid Build Coastguard Worker private:
194*35238bceSAndroid Build Coastguard Worker SingleVertexArrayFirstTests(const SingleVertexArrayFirstTests &other);
195*35238bceSAndroid Build Coastguard Worker SingleVertexArrayFirstTests &operator=(const SingleVertexArrayFirstTests &other);
196*35238bceSAndroid Build Coastguard Worker };
197*35238bceSAndroid Build Coastguard Worker
SingleVertexArrayFirstTests(Context & context)198*35238bceSAndroid Build Coastguard Worker SingleVertexArrayFirstTests::SingleVertexArrayFirstTests(Context &context)
199*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "first", "Single vertex atribute different first values")
200*35238bceSAndroid Build Coastguard Worker {
201*35238bceSAndroid Build Coastguard Worker }
202*35238bceSAndroid Build Coastguard Worker
~SingleVertexArrayFirstTests(void)203*35238bceSAndroid Build Coastguard Worker SingleVertexArrayFirstTests::~SingleVertexArrayFirstTests(void)
204*35238bceSAndroid Build Coastguard Worker {
205*35238bceSAndroid Build Coastguard Worker }
206*35238bceSAndroid Build Coastguard Worker
init(void)207*35238bceSAndroid Build Coastguard Worker void SingleVertexArrayFirstTests::init(void)
208*35238bceSAndroid Build Coastguard Worker {
209*35238bceSAndroid Build Coastguard Worker // Test strides with different input types, component counts and storage, Usage(?)
210*35238bceSAndroid Build Coastguard Worker Array::InputType inputTypes[] = {Array::INPUTTYPE_FLOAT, Array::INPUTTYPE_BYTE, Array::INPUTTYPE_FIXED};
211*35238bceSAndroid Build Coastguard Worker int counts[] = {5, 256};
212*35238bceSAndroid Build Coastguard Worker int firsts[] = {6, 24};
213*35238bceSAndroid Build Coastguard Worker int offsets[] = {1, 17};
214*35238bceSAndroid Build Coastguard Worker int strides[] = {/*0,*/ -1, 17, 32}; // Tread negative value as sizeof input. Same as 0, but done outside of GL.
215*35238bceSAndroid Build Coastguard Worker
216*35238bceSAndroid Build Coastguard Worker for (int inputTypeNdx = 0; inputTypeNdx < DE_LENGTH_OF_ARRAY(inputTypes); inputTypeNdx++)
217*35238bceSAndroid Build Coastguard Worker {
218*35238bceSAndroid Build Coastguard Worker for (int offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(offsets); offsetNdx++)
219*35238bceSAndroid Build Coastguard Worker {
220*35238bceSAndroid Build Coastguard Worker for (int countNdx = 0; countNdx < DE_LENGTH_OF_ARRAY(counts); countNdx++)
221*35238bceSAndroid Build Coastguard Worker {
222*35238bceSAndroid Build Coastguard Worker for (int strideNdx = 0; strideNdx < DE_LENGTH_OF_ARRAY(strides); strideNdx++)
223*35238bceSAndroid Build Coastguard Worker {
224*35238bceSAndroid Build Coastguard Worker for (int firstNdx = 0; firstNdx < DE_LENGTH_OF_ARRAY(firsts); firstNdx++)
225*35238bceSAndroid Build Coastguard Worker {
226*35238bceSAndroid Build Coastguard Worker const int stride =
227*35238bceSAndroid Build Coastguard Worker (strides[strideNdx] < 0 ? Array::inputTypeSize(inputTypes[inputTypeNdx]) * 2 :
228*35238bceSAndroid Build Coastguard Worker strides[strideNdx]);
229*35238bceSAndroid Build Coastguard Worker const bool aligned = ((stride % Array::inputTypeSize(inputTypes[inputTypeNdx])) == 0) &&
230*35238bceSAndroid Build Coastguard Worker (offsets[offsetNdx] % Array::inputTypeSize(inputTypes[inputTypeNdx]) == 0);
231*35238bceSAndroid Build Coastguard Worker
232*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec::ArraySpec arraySpec(
233*35238bceSAndroid Build Coastguard Worker inputTypes[inputTypeNdx], Array::OUTPUTTYPE_VEC2, Array::STORAGE_BUFFER,
234*35238bceSAndroid Build Coastguard Worker Array::USAGE_DYNAMIC_DRAW, 2, offsets[offsetNdx], stride, false,
235*35238bceSAndroid Build Coastguard Worker GLValue::getMinValue(inputTypes[inputTypeNdx]),
236*35238bceSAndroid Build Coastguard Worker GLValue::getMaxValue(inputTypes[inputTypeNdx]));
237*35238bceSAndroid Build Coastguard Worker
238*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec spec;
239*35238bceSAndroid Build Coastguard Worker spec.primitive = Array::PRIMITIVE_TRIANGLES;
240*35238bceSAndroid Build Coastguard Worker spec.drawCount = counts[countNdx];
241*35238bceSAndroid Build Coastguard Worker spec.first = firsts[firstNdx];
242*35238bceSAndroid Build Coastguard Worker spec.arrays.push_back(arraySpec);
243*35238bceSAndroid Build Coastguard Worker
244*35238bceSAndroid Build Coastguard Worker std::string name = Array::inputTypeToString(inputTypes[inputTypeNdx]) + "_first" +
245*35238bceSAndroid Build Coastguard Worker typeToString(firsts[firstNdx]) + "_offset" +
246*35238bceSAndroid Build Coastguard Worker typeToString(offsets[offsetNdx]) + "_stride" + typeToString(stride) +
247*35238bceSAndroid Build Coastguard Worker "_quads" + typeToString(counts[countNdx]);
248*35238bceSAndroid Build Coastguard Worker if (!aligned)
249*35238bceSAndroid Build Coastguard Worker addChild(new MultiVertexArrayTest(m_testCtx, m_context.getRenderContext(), spec,
250*35238bceSAndroid Build Coastguard Worker name.c_str(), name.c_str()));
251*35238bceSAndroid Build Coastguard Worker }
252*35238bceSAndroid Build Coastguard Worker }
253*35238bceSAndroid Build Coastguard Worker }
254*35238bceSAndroid Build Coastguard Worker }
255*35238bceSAndroid Build Coastguard Worker }
256*35238bceSAndroid Build Coastguard Worker }
257*35238bceSAndroid Build Coastguard Worker
258*35238bceSAndroid Build Coastguard Worker class SingleVertexArrayOffsetTests : public TestCaseGroup
259*35238bceSAndroid Build Coastguard Worker {
260*35238bceSAndroid Build Coastguard Worker public:
261*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetTests(Context &context);
262*35238bceSAndroid Build Coastguard Worker virtual ~SingleVertexArrayOffsetTests(void);
263*35238bceSAndroid Build Coastguard Worker
264*35238bceSAndroid Build Coastguard Worker virtual void init(void);
265*35238bceSAndroid Build Coastguard Worker
266*35238bceSAndroid Build Coastguard Worker private:
267*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetTests(const SingleVertexArrayOffsetTests &other);
268*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetTests &operator=(const SingleVertexArrayOffsetTests &other);
269*35238bceSAndroid Build Coastguard Worker };
270*35238bceSAndroid Build Coastguard Worker
SingleVertexArrayOffsetTests(Context & context)271*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetTests::SingleVertexArrayOffsetTests(Context &context)
272*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "offset", "Single vertex atribute offset element")
273*35238bceSAndroid Build Coastguard Worker {
274*35238bceSAndroid Build Coastguard Worker }
275*35238bceSAndroid Build Coastguard Worker
~SingleVertexArrayOffsetTests(void)276*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetTests::~SingleVertexArrayOffsetTests(void)
277*35238bceSAndroid Build Coastguard Worker {
278*35238bceSAndroid Build Coastguard Worker }
279*35238bceSAndroid Build Coastguard Worker
init(void)280*35238bceSAndroid Build Coastguard Worker void SingleVertexArrayOffsetTests::init(void)
281*35238bceSAndroid Build Coastguard Worker {
282*35238bceSAndroid Build Coastguard Worker // Test strides with different input types, component counts and storage, Usage(?)
283*35238bceSAndroid Build Coastguard Worker Array::InputType inputTypes[] = {Array::INPUTTYPE_FLOAT, Array::INPUTTYPE_BYTE, Array::INPUTTYPE_FIXED};
284*35238bceSAndroid Build Coastguard Worker int counts[] = {1, 256};
285*35238bceSAndroid Build Coastguard Worker int offsets[] = {1, 4, 17, 32};
286*35238bceSAndroid Build Coastguard Worker int strides[] = {/*0,*/ -1, 17, 32}; // Tread negative value as sizeof input. Same as 0, but done outside of GL.
287*35238bceSAndroid Build Coastguard Worker
288*35238bceSAndroid Build Coastguard Worker for (int inputTypeNdx = 0; inputTypeNdx < DE_LENGTH_OF_ARRAY(inputTypes); inputTypeNdx++)
289*35238bceSAndroid Build Coastguard Worker {
290*35238bceSAndroid Build Coastguard Worker for (int offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(offsets); offsetNdx++)
291*35238bceSAndroid Build Coastguard Worker {
292*35238bceSAndroid Build Coastguard Worker for (int countNdx = 0; countNdx < DE_LENGTH_OF_ARRAY(counts); countNdx++)
293*35238bceSAndroid Build Coastguard Worker {
294*35238bceSAndroid Build Coastguard Worker for (int strideNdx = 0; strideNdx < DE_LENGTH_OF_ARRAY(strides); strideNdx++)
295*35238bceSAndroid Build Coastguard Worker {
296*35238bceSAndroid Build Coastguard Worker const int stride = (strides[strideNdx] < 0 ? Array::inputTypeSize(inputTypes[inputTypeNdx]) * 2 :
297*35238bceSAndroid Build Coastguard Worker strides[strideNdx]);
298*35238bceSAndroid Build Coastguard Worker const bool aligned = ((stride % Array::inputTypeSize(inputTypes[inputTypeNdx])) == 0) &&
299*35238bceSAndroid Build Coastguard Worker ((offsets[offsetNdx] % Array::inputTypeSize(inputTypes[inputTypeNdx])) == 0);
300*35238bceSAndroid Build Coastguard Worker
301*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec::ArraySpec arraySpec(
302*35238bceSAndroid Build Coastguard Worker inputTypes[inputTypeNdx], Array::OUTPUTTYPE_VEC2, Array::STORAGE_BUFFER,
303*35238bceSAndroid Build Coastguard Worker Array::USAGE_DYNAMIC_DRAW, 2, offsets[offsetNdx], stride, false,
304*35238bceSAndroid Build Coastguard Worker GLValue::getMinValue(inputTypes[inputTypeNdx]), GLValue::getMaxValue(inputTypes[inputTypeNdx]));
305*35238bceSAndroid Build Coastguard Worker
306*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec spec;
307*35238bceSAndroid Build Coastguard Worker spec.primitive = Array::PRIMITIVE_TRIANGLES;
308*35238bceSAndroid Build Coastguard Worker spec.drawCount = counts[countNdx];
309*35238bceSAndroid Build Coastguard Worker spec.first = 0;
310*35238bceSAndroid Build Coastguard Worker spec.arrays.push_back(arraySpec);
311*35238bceSAndroid Build Coastguard Worker
312*35238bceSAndroid Build Coastguard Worker std::string name = spec.getName();
313*35238bceSAndroid Build Coastguard Worker if (!aligned)
314*35238bceSAndroid Build Coastguard Worker addChild(new MultiVertexArrayTest(m_testCtx, m_context.getRenderContext(), spec, name.c_str(),
315*35238bceSAndroid Build Coastguard Worker name.c_str()));
316*35238bceSAndroid Build Coastguard Worker }
317*35238bceSAndroid Build Coastguard Worker }
318*35238bceSAndroid Build Coastguard Worker }
319*35238bceSAndroid Build Coastguard Worker }
320*35238bceSAndroid Build Coastguard Worker }
321*35238bceSAndroid Build Coastguard Worker
322*35238bceSAndroid Build Coastguard Worker } // namespace
323*35238bceSAndroid Build Coastguard Worker
VertexArrayTests(Context & context)324*35238bceSAndroid Build Coastguard Worker VertexArrayTests::VertexArrayTests(Context &context)
325*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "vertex_arrays", "Vertex array and array tests")
326*35238bceSAndroid Build Coastguard Worker {
327*35238bceSAndroid Build Coastguard Worker }
328*35238bceSAndroid Build Coastguard Worker
~VertexArrayTests(void)329*35238bceSAndroid Build Coastguard Worker VertexArrayTests::~VertexArrayTests(void)
330*35238bceSAndroid Build Coastguard Worker {
331*35238bceSAndroid Build Coastguard Worker }
332*35238bceSAndroid Build Coastguard Worker
init(void)333*35238bceSAndroid Build Coastguard Worker void VertexArrayTests::init(void)
334*35238bceSAndroid Build Coastguard Worker {
335*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const group = new tcu::TestCaseGroup(m_testCtx, "single_attribute", "Single attribute");
336*35238bceSAndroid Build Coastguard Worker addChild(group);
337*35238bceSAndroid Build Coastguard Worker
338*35238bceSAndroid Build Coastguard Worker // .single_attribute
339*35238bceSAndroid Build Coastguard Worker {
340*35238bceSAndroid Build Coastguard Worker group->addChild(new SingleVertexArrayStrideTests(m_context));
341*35238bceSAndroid Build Coastguard Worker group->addChild(new SingleVertexArrayUsageTests(m_context));
342*35238bceSAndroid Build Coastguard Worker group->addChild(new SingleVertexArrayOffsetTests(m_context));
343*35238bceSAndroid Build Coastguard Worker group->addChild(new SingleVertexArrayFirstTests(m_context));
344*35238bceSAndroid Build Coastguard Worker }
345*35238bceSAndroid Build Coastguard Worker }
346*35238bceSAndroid Build Coastguard Worker
347*35238bceSAndroid Build Coastguard Worker } // namespace Stress
348*35238bceSAndroid Build Coastguard Worker } // namespace gles2
349*35238bceSAndroid Build Coastguard Worker } // namespace deqp
350