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 and buffer unaligned access stress tests
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es3sVertexArrayTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsVertexArrayTests.hpp"
26*35238bceSAndroid Build Coastguard Worker
27*35238bceSAndroid Build Coastguard Worker #include <sstream>
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 gles3
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 class SingleVertexArrayUsageGroup : public TestCaseGroup
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker public:
43*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageGroup(Context &context, Array::Usage usage);
44*35238bceSAndroid Build Coastguard Worker virtual ~SingleVertexArrayUsageGroup(void);
45*35238bceSAndroid Build Coastguard Worker
46*35238bceSAndroid Build Coastguard Worker virtual void init(void);
47*35238bceSAndroid Build Coastguard Worker
48*35238bceSAndroid Build Coastguard Worker private:
49*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageGroup(const SingleVertexArrayUsageGroup &other);
50*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageGroup &operator=(const SingleVertexArrayUsageGroup &other);
51*35238bceSAndroid Build Coastguard Worker
52*35238bceSAndroid Build Coastguard Worker Array::Usage m_usage;
53*35238bceSAndroid Build Coastguard Worker };
54*35238bceSAndroid Build Coastguard Worker
SingleVertexArrayUsageGroup(Context & context,Array::Usage usage)55*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageGroup::SingleVertexArrayUsageGroup(Context &context, Array::Usage usage)
56*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, Array::usageTypeToString(usage).c_str(), Array::usageTypeToString(usage).c_str())
57*35238bceSAndroid Build Coastguard Worker , m_usage(usage)
58*35238bceSAndroid Build Coastguard Worker {
59*35238bceSAndroid Build Coastguard Worker }
60*35238bceSAndroid Build Coastguard Worker
~SingleVertexArrayUsageGroup(void)61*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageGroup::~SingleVertexArrayUsageGroup(void)
62*35238bceSAndroid Build Coastguard Worker {
63*35238bceSAndroid Build Coastguard Worker }
64*35238bceSAndroid Build Coastguard Worker
65*35238bceSAndroid Build Coastguard Worker template <class T>
typeToString(T t)66*35238bceSAndroid Build Coastguard Worker static std::string typeToString(T t)
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker std::stringstream strm;
69*35238bceSAndroid Build Coastguard Worker strm << t;
70*35238bceSAndroid Build Coastguard Worker return strm.str();
71*35238bceSAndroid Build Coastguard Worker }
72*35238bceSAndroid Build Coastguard Worker
init(void)73*35238bceSAndroid Build Coastguard Worker void SingleVertexArrayUsageGroup::init(void)
74*35238bceSAndroid Build Coastguard Worker {
75*35238bceSAndroid Build Coastguard Worker int counts[] = {1, 256};
76*35238bceSAndroid Build Coastguard Worker int strides[] = {0, -1, 17, 32}; // Tread negative value as sizeof input. Same as 0, but done outside of GL.
77*35238bceSAndroid Build Coastguard Worker Array::InputType inputTypes[] = {Array::INPUTTYPE_FLOAT, Array::INPUTTYPE_FIXED, Array::INPUTTYPE_SHORT,
78*35238bceSAndroid Build Coastguard Worker Array::INPUTTYPE_BYTE};
79*35238bceSAndroid Build Coastguard Worker
80*35238bceSAndroid Build Coastguard Worker for (int inputTypeNdx = 0; inputTypeNdx < DE_LENGTH_OF_ARRAY(inputTypes); inputTypeNdx++)
81*35238bceSAndroid Build Coastguard Worker {
82*35238bceSAndroid Build Coastguard Worker for (int countNdx = 0; countNdx < DE_LENGTH_OF_ARRAY(counts); countNdx++)
83*35238bceSAndroid Build Coastguard Worker {
84*35238bceSAndroid Build Coastguard Worker for (int strideNdx = 0; strideNdx < DE_LENGTH_OF_ARRAY(strides); strideNdx++)
85*35238bceSAndroid Build Coastguard Worker {
86*35238bceSAndroid Build Coastguard Worker const int stride =
87*35238bceSAndroid Build Coastguard Worker (strides[strideNdx] < 0 ? Array::inputTypeSize(inputTypes[inputTypeNdx]) * 2 : strides[strideNdx]);
88*35238bceSAndroid Build Coastguard Worker const bool aligned = (stride % Array::inputTypeSize(inputTypes[inputTypeNdx])) == 0;
89*35238bceSAndroid Build Coastguard Worker const std::string name = "stride" + typeToString(stride) + "_" +
90*35238bceSAndroid Build Coastguard Worker Array::inputTypeToString(inputTypes[inputTypeNdx]) + "_quads" +
91*35238bceSAndroid Build Coastguard Worker typeToString(counts[countNdx]);
92*35238bceSAndroid Build Coastguard Worker
93*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec::ArraySpec arraySpec(inputTypes[inputTypeNdx], Array::OUTPUTTYPE_VEC2,
94*35238bceSAndroid Build Coastguard Worker Array::STORAGE_BUFFER, m_usage, 2, 0, stride, false,
95*35238bceSAndroid Build Coastguard Worker GLValue::getMinValue(inputTypes[inputTypeNdx]),
96*35238bceSAndroid Build Coastguard Worker GLValue::getMaxValue(inputTypes[inputTypeNdx]));
97*35238bceSAndroid Build Coastguard Worker
98*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec spec;
99*35238bceSAndroid Build Coastguard Worker spec.primitive = Array::PRIMITIVE_TRIANGLES;
100*35238bceSAndroid Build Coastguard Worker spec.drawCount = counts[countNdx];
101*35238bceSAndroid Build Coastguard Worker spec.first = 0;
102*35238bceSAndroid Build Coastguard Worker spec.arrays.push_back(arraySpec);
103*35238bceSAndroid Build Coastguard Worker
104*35238bceSAndroid Build Coastguard Worker if (!aligned)
105*35238bceSAndroid Build Coastguard Worker addChild(new MultiVertexArrayTest(m_testCtx, m_context.getRenderContext(), spec, name.c_str(),
106*35238bceSAndroid Build Coastguard Worker name.c_str()));
107*35238bceSAndroid Build Coastguard Worker }
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 class SingleVertexArrayUsageTests : public TestCaseGroup
113*35238bceSAndroid Build Coastguard Worker {
114*35238bceSAndroid Build Coastguard Worker public:
115*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageTests(Context &context);
116*35238bceSAndroid Build Coastguard Worker virtual ~SingleVertexArrayUsageTests(void);
117*35238bceSAndroid Build Coastguard Worker
118*35238bceSAndroid Build Coastguard Worker virtual void init(void);
119*35238bceSAndroid Build Coastguard Worker
120*35238bceSAndroid Build Coastguard Worker private:
121*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageTests(const SingleVertexArrayUsageTests &other);
122*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageTests &operator=(const SingleVertexArrayUsageTests &other);
123*35238bceSAndroid Build Coastguard Worker };
124*35238bceSAndroid Build Coastguard Worker
SingleVertexArrayUsageTests(Context & context)125*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageTests::SingleVertexArrayUsageTests(Context &context)
126*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "usages", "Single vertex atribute, usage")
127*35238bceSAndroid Build Coastguard Worker {
128*35238bceSAndroid Build Coastguard Worker }
129*35238bceSAndroid Build Coastguard Worker
~SingleVertexArrayUsageTests(void)130*35238bceSAndroid Build Coastguard Worker SingleVertexArrayUsageTests::~SingleVertexArrayUsageTests(void)
131*35238bceSAndroid Build Coastguard Worker {
132*35238bceSAndroid Build Coastguard Worker }
133*35238bceSAndroid Build Coastguard Worker
init(void)134*35238bceSAndroid Build Coastguard Worker void SingleVertexArrayUsageTests::init(void)
135*35238bceSAndroid Build Coastguard Worker {
136*35238bceSAndroid Build Coastguard Worker // Test usage
137*35238bceSAndroid Build Coastguard Worker Array::Usage usages[] = {Array::USAGE_STATIC_DRAW, Array::USAGE_STREAM_DRAW, Array::USAGE_DYNAMIC_DRAW,
138*35238bceSAndroid Build Coastguard Worker Array::USAGE_STATIC_COPY, Array::USAGE_STREAM_COPY, Array::USAGE_DYNAMIC_COPY,
139*35238bceSAndroid Build Coastguard Worker Array::USAGE_STATIC_READ, Array::USAGE_STREAM_READ, Array::USAGE_DYNAMIC_READ};
140*35238bceSAndroid Build Coastguard Worker for (int usageNdx = 0; usageNdx < DE_LENGTH_OF_ARRAY(usages); usageNdx++)
141*35238bceSAndroid Build Coastguard Worker {
142*35238bceSAndroid Build Coastguard Worker addChild(new SingleVertexArrayUsageGroup(m_context, usages[usageNdx]));
143*35238bceSAndroid Build Coastguard Worker }
144*35238bceSAndroid Build Coastguard Worker }
145*35238bceSAndroid Build Coastguard Worker
146*35238bceSAndroid Build Coastguard Worker class SingleVertexArrayStrideGroup : public TestCaseGroup
147*35238bceSAndroid Build Coastguard Worker {
148*35238bceSAndroid Build Coastguard Worker public:
149*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideGroup(Context &context, Array::InputType type);
150*35238bceSAndroid Build Coastguard Worker virtual ~SingleVertexArrayStrideGroup(void);
151*35238bceSAndroid Build Coastguard Worker
152*35238bceSAndroid Build Coastguard Worker virtual void init(void);
153*35238bceSAndroid Build Coastguard Worker
154*35238bceSAndroid Build Coastguard Worker private:
155*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideGroup(const SingleVertexArrayStrideGroup &other);
156*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideGroup &operator=(const SingleVertexArrayStrideGroup &other);
157*35238bceSAndroid Build Coastguard Worker
158*35238bceSAndroid Build Coastguard Worker Array::InputType m_type;
159*35238bceSAndroid Build Coastguard Worker };
160*35238bceSAndroid Build Coastguard Worker
SingleVertexArrayStrideGroup(Context & context,Array::InputType type)161*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideGroup::SingleVertexArrayStrideGroup(Context &context, Array::InputType type)
162*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, Array::inputTypeToString(type).c_str(), Array::inputTypeToString(type).c_str())
163*35238bceSAndroid Build Coastguard Worker , m_type(type)
164*35238bceSAndroid Build Coastguard Worker {
165*35238bceSAndroid Build Coastguard Worker }
166*35238bceSAndroid Build Coastguard Worker
~SingleVertexArrayStrideGroup(void)167*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideGroup::~SingleVertexArrayStrideGroup(void)
168*35238bceSAndroid Build Coastguard Worker {
169*35238bceSAndroid Build Coastguard Worker }
170*35238bceSAndroid Build Coastguard Worker
init(void)171*35238bceSAndroid Build Coastguard Worker void SingleVertexArrayStrideGroup::init(void)
172*35238bceSAndroid Build Coastguard Worker {
173*35238bceSAndroid Build Coastguard Worker Array::Storage storages[] = {Array::STORAGE_USER, Array::STORAGE_BUFFER};
174*35238bceSAndroid Build Coastguard Worker int counts[] = {1, 256};
175*35238bceSAndroid Build Coastguard Worker int strides[] = {/*0,*/ -1, 17, 32}; // Tread negative value as sizeof input. Same as 0, but done outside of GL.
176*35238bceSAndroid Build Coastguard Worker
177*35238bceSAndroid Build Coastguard Worker for (int storageNdx = 0; storageNdx < DE_LENGTH_OF_ARRAY(storages); storageNdx++)
178*35238bceSAndroid Build Coastguard Worker {
179*35238bceSAndroid Build Coastguard Worker for (int componentCount = 2; componentCount < 5; componentCount++)
180*35238bceSAndroid Build Coastguard Worker {
181*35238bceSAndroid Build Coastguard Worker for (int countNdx = 0; countNdx < DE_LENGTH_OF_ARRAY(counts); countNdx++)
182*35238bceSAndroid Build Coastguard Worker {
183*35238bceSAndroid Build Coastguard Worker for (int strideNdx = 0; strideNdx < DE_LENGTH_OF_ARRAY(strides); strideNdx++)
184*35238bceSAndroid Build Coastguard Worker {
185*35238bceSAndroid Build Coastguard Worker const bool packed =
186*35238bceSAndroid Build Coastguard Worker m_type == Array::INPUTTYPE_UNSIGNED_INT_2_10_10_10 || m_type == Array::INPUTTYPE_INT_2_10_10_10;
187*35238bceSAndroid Build Coastguard Worker const int stride = (strides[strideNdx] < 0) ?
188*35238bceSAndroid Build Coastguard Worker ((packed) ? (16) : (Array::inputTypeSize(m_type) * componentCount)) :
189*35238bceSAndroid Build Coastguard Worker (strides[strideNdx]);
190*35238bceSAndroid Build Coastguard Worker const int alignment =
191*35238bceSAndroid Build Coastguard Worker (packed) ? (Array::inputTypeSize(m_type) * componentCount) : (Array::inputTypeSize(m_type));
192*35238bceSAndroid Build Coastguard Worker const bool bufferUnaligned =
193*35238bceSAndroid Build Coastguard Worker (storages[storageNdx] == Array::STORAGE_BUFFER) && (stride % alignment) != 0;
194*35238bceSAndroid Build Coastguard Worker
195*35238bceSAndroid Build Coastguard Worker std::string name = Array::storageToString(storages[storageNdx]) + "_stride" + typeToString(stride) +
196*35238bceSAndroid Build Coastguard Worker "_components" + typeToString(componentCount) + "_quads" +
197*35238bceSAndroid Build Coastguard Worker typeToString(counts[countNdx]);
198*35238bceSAndroid Build Coastguard Worker
199*35238bceSAndroid Build Coastguard Worker if ((m_type == Array::INPUTTYPE_UNSIGNED_INT_2_10_10_10 ||
200*35238bceSAndroid Build Coastguard Worker m_type == Array::INPUTTYPE_INT_2_10_10_10) &&
201*35238bceSAndroid Build Coastguard Worker componentCount != 4)
202*35238bceSAndroid Build Coastguard Worker continue;
203*35238bceSAndroid Build Coastguard Worker
204*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec::ArraySpec arraySpec(
205*35238bceSAndroid Build Coastguard Worker m_type, Array::OUTPUTTYPE_VEC4, storages[storageNdx], Array::USAGE_DYNAMIC_DRAW, componentCount,
206*35238bceSAndroid Build Coastguard Worker 0, stride, false, GLValue::getMinValue(m_type), GLValue::getMaxValue(m_type));
207*35238bceSAndroid Build Coastguard Worker
208*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec spec;
209*35238bceSAndroid Build Coastguard Worker spec.primitive = Array::PRIMITIVE_TRIANGLES;
210*35238bceSAndroid Build Coastguard Worker spec.drawCount = counts[countNdx];
211*35238bceSAndroid Build Coastguard Worker spec.first = 0;
212*35238bceSAndroid Build Coastguard Worker spec.arrays.push_back(arraySpec);
213*35238bceSAndroid Build Coastguard Worker
214*35238bceSAndroid Build Coastguard Worker if (bufferUnaligned)
215*35238bceSAndroid Build Coastguard Worker addChild(new MultiVertexArrayTest(m_testCtx, m_context.getRenderContext(), spec, name.c_str(),
216*35238bceSAndroid Build Coastguard Worker name.c_str()));
217*35238bceSAndroid Build Coastguard Worker }
218*35238bceSAndroid Build Coastguard Worker }
219*35238bceSAndroid Build Coastguard Worker }
220*35238bceSAndroid Build Coastguard Worker }
221*35238bceSAndroid Build Coastguard Worker }
222*35238bceSAndroid Build Coastguard Worker
223*35238bceSAndroid Build Coastguard Worker class SingleVertexArrayStrideTests : public TestCaseGroup
224*35238bceSAndroid Build Coastguard Worker {
225*35238bceSAndroid Build Coastguard Worker public:
226*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideTests(Context &context);
227*35238bceSAndroid Build Coastguard Worker virtual ~SingleVertexArrayStrideTests(void);
228*35238bceSAndroid Build Coastguard Worker
229*35238bceSAndroid Build Coastguard Worker virtual void init(void);
230*35238bceSAndroid Build Coastguard Worker
231*35238bceSAndroid Build Coastguard Worker private:
232*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideTests(const SingleVertexArrayStrideTests &other);
233*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideTests &operator=(const SingleVertexArrayStrideTests &other);
234*35238bceSAndroid Build Coastguard Worker };
235*35238bceSAndroid Build Coastguard Worker
SingleVertexArrayStrideTests(Context & context)236*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideTests::SingleVertexArrayStrideTests(Context &context)
237*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "strides", "Single stride vertex atribute")
238*35238bceSAndroid Build Coastguard Worker {
239*35238bceSAndroid Build Coastguard Worker }
240*35238bceSAndroid Build Coastguard Worker
~SingleVertexArrayStrideTests(void)241*35238bceSAndroid Build Coastguard Worker SingleVertexArrayStrideTests::~SingleVertexArrayStrideTests(void)
242*35238bceSAndroid Build Coastguard Worker {
243*35238bceSAndroid Build Coastguard Worker }
244*35238bceSAndroid Build Coastguard Worker
init(void)245*35238bceSAndroid Build Coastguard Worker void SingleVertexArrayStrideTests::init(void)
246*35238bceSAndroid Build Coastguard Worker {
247*35238bceSAndroid Build Coastguard Worker Array::InputType inputTypes[] = {
248*35238bceSAndroid Build Coastguard Worker Array::INPUTTYPE_FLOAT, Array::INPUTTYPE_SHORT,
249*35238bceSAndroid Build Coastguard Worker /*Array::INPUTTYPE_UNSIGNED_SHORT, Array::INPUTTYPE_UNSIGNED_BYTE,*/ Array::INPUTTYPE_FIXED,
250*35238bceSAndroid Build Coastguard Worker Array::INPUTTYPE_INT_2_10_10_10};
251*35238bceSAndroid Build Coastguard Worker
252*35238bceSAndroid Build Coastguard Worker for (int inputTypeNdx = 0; inputTypeNdx < DE_LENGTH_OF_ARRAY(inputTypes); inputTypeNdx++)
253*35238bceSAndroid Build Coastguard Worker {
254*35238bceSAndroid Build Coastguard Worker addChild(new SingleVertexArrayStrideGroup(m_context, inputTypes[inputTypeNdx]));
255*35238bceSAndroid Build Coastguard Worker }
256*35238bceSAndroid Build Coastguard Worker }
257*35238bceSAndroid Build Coastguard Worker
258*35238bceSAndroid Build Coastguard Worker class SingleVertexArrayFirstGroup : public TestCaseGroup
259*35238bceSAndroid Build Coastguard Worker {
260*35238bceSAndroid Build Coastguard Worker public:
261*35238bceSAndroid Build Coastguard Worker SingleVertexArrayFirstGroup(Context &context, Array::InputType type);
262*35238bceSAndroid Build Coastguard Worker virtual ~SingleVertexArrayFirstGroup(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 SingleVertexArrayFirstGroup(const SingleVertexArrayFirstGroup &other);
268*35238bceSAndroid Build Coastguard Worker SingleVertexArrayFirstGroup &operator=(const SingleVertexArrayFirstGroup &other);
269*35238bceSAndroid Build Coastguard Worker Array::InputType m_type;
270*35238bceSAndroid Build Coastguard Worker };
271*35238bceSAndroid Build Coastguard Worker
SingleVertexArrayFirstGroup(Context & context,Array::InputType type)272*35238bceSAndroid Build Coastguard Worker SingleVertexArrayFirstGroup::SingleVertexArrayFirstGroup(Context &context, Array::InputType type)
273*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, Array::inputTypeToString(type).c_str(), Array::inputTypeToString(type).c_str())
274*35238bceSAndroid Build Coastguard Worker , m_type(type)
275*35238bceSAndroid Build Coastguard Worker {
276*35238bceSAndroid Build Coastguard Worker }
277*35238bceSAndroid Build Coastguard Worker
~SingleVertexArrayFirstGroup(void)278*35238bceSAndroid Build Coastguard Worker SingleVertexArrayFirstGroup::~SingleVertexArrayFirstGroup(void)
279*35238bceSAndroid Build Coastguard Worker {
280*35238bceSAndroid Build Coastguard Worker }
281*35238bceSAndroid Build Coastguard Worker
init(void)282*35238bceSAndroid Build Coastguard Worker void SingleVertexArrayFirstGroup::init(void)
283*35238bceSAndroid Build Coastguard Worker {
284*35238bceSAndroid Build Coastguard Worker int counts[] = {5, 256};
285*35238bceSAndroid Build Coastguard Worker int firsts[] = {6, 24};
286*35238bceSAndroid Build Coastguard Worker int offsets[] = {1, 17};
287*35238bceSAndroid Build Coastguard Worker int strides[] = {/*0,*/ -1, 17, 32}; // Tread negative value as sizeof input. Same as 0, but done outside of GL.
288*35238bceSAndroid Build Coastguard Worker
289*35238bceSAndroid Build Coastguard Worker for (int offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(offsets); offsetNdx++)
290*35238bceSAndroid Build Coastguard Worker {
291*35238bceSAndroid Build Coastguard Worker for (int countNdx = 0; countNdx < DE_LENGTH_OF_ARRAY(counts); countNdx++)
292*35238bceSAndroid Build Coastguard Worker {
293*35238bceSAndroid Build Coastguard Worker for (int strideNdx = 0; strideNdx < DE_LENGTH_OF_ARRAY(strides); strideNdx++)
294*35238bceSAndroid Build Coastguard Worker {
295*35238bceSAndroid Build Coastguard Worker for (int firstNdx = 0; firstNdx < DE_LENGTH_OF_ARRAY(firsts); firstNdx++)
296*35238bceSAndroid Build Coastguard Worker {
297*35238bceSAndroid Build Coastguard Worker const bool packed =
298*35238bceSAndroid Build Coastguard Worker m_type == Array::INPUTTYPE_UNSIGNED_INT_2_10_10_10 || m_type == Array::INPUTTYPE_INT_2_10_10_10;
299*35238bceSAndroid Build Coastguard Worker const int componentCount = (packed) ? (4) : (2);
300*35238bceSAndroid Build Coastguard Worker const int stride = (strides[strideNdx] < 0) ?
301*35238bceSAndroid Build Coastguard Worker ((packed) ? (8) : (Array::inputTypeSize(m_type) * componentCount)) :
302*35238bceSAndroid Build Coastguard Worker (strides[strideNdx]);
303*35238bceSAndroid Build Coastguard Worker const int alignment =
304*35238bceSAndroid Build Coastguard Worker (packed) ? (Array::inputTypeSize(m_type) * componentCount) : (Array::inputTypeSize(m_type));
305*35238bceSAndroid Build Coastguard Worker const bool aligned = ((stride % alignment) == 0) && ((offsets[offsetNdx] % alignment) == 0);
306*35238bceSAndroid Build Coastguard Worker std::string name = "first" + typeToString(firsts[firstNdx]) + "_offset" +
307*35238bceSAndroid Build Coastguard Worker typeToString(offsets[offsetNdx]) + "_stride" + typeToString(stride) + "_quads" +
308*35238bceSAndroid Build Coastguard Worker typeToString(counts[countNdx]);
309*35238bceSAndroid Build Coastguard Worker
310*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec::ArraySpec arraySpec(
311*35238bceSAndroid Build Coastguard Worker m_type, Array::OUTPUTTYPE_VEC2, Array::STORAGE_BUFFER, Array::USAGE_DYNAMIC_DRAW,
312*35238bceSAndroid Build Coastguard Worker componentCount, offsets[offsetNdx], stride, false, GLValue::getMinValue(m_type),
313*35238bceSAndroid Build Coastguard Worker GLValue::getMaxValue(m_type));
314*35238bceSAndroid Build Coastguard Worker
315*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec spec;
316*35238bceSAndroid Build Coastguard Worker spec.primitive = Array::PRIMITIVE_TRIANGLES;
317*35238bceSAndroid Build Coastguard Worker spec.drawCount = counts[countNdx];
318*35238bceSAndroid Build Coastguard Worker spec.first = firsts[firstNdx];
319*35238bceSAndroid Build Coastguard Worker spec.arrays.push_back(arraySpec);
320*35238bceSAndroid Build Coastguard Worker
321*35238bceSAndroid Build Coastguard Worker if (!aligned)
322*35238bceSAndroid Build Coastguard Worker addChild(new MultiVertexArrayTest(m_testCtx, m_context.getRenderContext(), spec, name.c_str(),
323*35238bceSAndroid Build Coastguard Worker name.c_str()));
324*35238bceSAndroid Build Coastguard Worker }
325*35238bceSAndroid Build Coastguard Worker }
326*35238bceSAndroid Build Coastguard Worker }
327*35238bceSAndroid Build Coastguard Worker }
328*35238bceSAndroid Build Coastguard Worker }
329*35238bceSAndroid Build Coastguard Worker
330*35238bceSAndroid Build Coastguard Worker class SingleVertexArrayFirstTests : public TestCaseGroup
331*35238bceSAndroid Build Coastguard Worker {
332*35238bceSAndroid Build Coastguard Worker public:
333*35238bceSAndroid Build Coastguard Worker SingleVertexArrayFirstTests(Context &context);
334*35238bceSAndroid Build Coastguard Worker virtual ~SingleVertexArrayFirstTests(void);
335*35238bceSAndroid Build Coastguard Worker
336*35238bceSAndroid Build Coastguard Worker virtual void init(void);
337*35238bceSAndroid Build Coastguard Worker
338*35238bceSAndroid Build Coastguard Worker private:
339*35238bceSAndroid Build Coastguard Worker SingleVertexArrayFirstTests(const SingleVertexArrayFirstTests &other);
340*35238bceSAndroid Build Coastguard Worker SingleVertexArrayFirstTests &operator=(const SingleVertexArrayFirstTests &other);
341*35238bceSAndroid Build Coastguard Worker };
342*35238bceSAndroid Build Coastguard Worker
SingleVertexArrayFirstTests(Context & context)343*35238bceSAndroid Build Coastguard Worker SingleVertexArrayFirstTests::SingleVertexArrayFirstTests(Context &context)
344*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "first", "Single vertex attribute, different first values to drawArrays")
345*35238bceSAndroid Build Coastguard Worker {
346*35238bceSAndroid Build Coastguard Worker }
347*35238bceSAndroid Build Coastguard Worker
~SingleVertexArrayFirstTests(void)348*35238bceSAndroid Build Coastguard Worker SingleVertexArrayFirstTests::~SingleVertexArrayFirstTests(void)
349*35238bceSAndroid Build Coastguard Worker {
350*35238bceSAndroid Build Coastguard Worker }
351*35238bceSAndroid Build Coastguard Worker
init(void)352*35238bceSAndroid Build Coastguard Worker void SingleVertexArrayFirstTests::init(void)
353*35238bceSAndroid Build Coastguard Worker {
354*35238bceSAndroid Build Coastguard Worker // Test offset with different input types, component counts and storage, Usage(?)
355*35238bceSAndroid Build Coastguard Worker Array::InputType inputTypes[] = {Array::INPUTTYPE_FLOAT, Array::INPUTTYPE_INT_2_10_10_10};
356*35238bceSAndroid Build Coastguard Worker
357*35238bceSAndroid Build Coastguard Worker for (int inputTypeNdx = 0; inputTypeNdx < DE_LENGTH_OF_ARRAY(inputTypes); inputTypeNdx++)
358*35238bceSAndroid Build Coastguard Worker {
359*35238bceSAndroid Build Coastguard Worker addChild(new SingleVertexArrayFirstGroup(m_context, inputTypes[inputTypeNdx]));
360*35238bceSAndroid Build Coastguard Worker }
361*35238bceSAndroid Build Coastguard Worker }
362*35238bceSAndroid Build Coastguard Worker
363*35238bceSAndroid Build Coastguard Worker class SingleVertexArrayOffsetGroup : public TestCaseGroup
364*35238bceSAndroid Build Coastguard Worker {
365*35238bceSAndroid Build Coastguard Worker public:
366*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetGroup(Context &context, Array::InputType type);
367*35238bceSAndroid Build Coastguard Worker virtual ~SingleVertexArrayOffsetGroup(void);
368*35238bceSAndroid Build Coastguard Worker
369*35238bceSAndroid Build Coastguard Worker virtual void init(void);
370*35238bceSAndroid Build Coastguard Worker
371*35238bceSAndroid Build Coastguard Worker private:
372*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetGroup(const SingleVertexArrayOffsetGroup &other);
373*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetGroup &operator=(const SingleVertexArrayOffsetGroup &other);
374*35238bceSAndroid Build Coastguard Worker Array::InputType m_type;
375*35238bceSAndroid Build Coastguard Worker };
376*35238bceSAndroid Build Coastguard Worker
SingleVertexArrayOffsetGroup(Context & context,Array::InputType type)377*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetGroup::SingleVertexArrayOffsetGroup(Context &context, Array::InputType type)
378*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, Array::inputTypeToString(type).c_str(), Array::inputTypeToString(type).c_str())
379*35238bceSAndroid Build Coastguard Worker , m_type(type)
380*35238bceSAndroid Build Coastguard Worker {
381*35238bceSAndroid Build Coastguard Worker }
382*35238bceSAndroid Build Coastguard Worker
~SingleVertexArrayOffsetGroup(void)383*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetGroup::~SingleVertexArrayOffsetGroup(void)
384*35238bceSAndroid Build Coastguard Worker {
385*35238bceSAndroid Build Coastguard Worker }
386*35238bceSAndroid Build Coastguard Worker
init(void)387*35238bceSAndroid Build Coastguard Worker void SingleVertexArrayOffsetGroup::init(void)
388*35238bceSAndroid Build Coastguard Worker {
389*35238bceSAndroid Build Coastguard Worker int counts[] = {1, 256};
390*35238bceSAndroid Build Coastguard Worker int offsets[] = {1, 4, 17, 32};
391*35238bceSAndroid Build Coastguard Worker int strides[] = {/*0,*/ -1, 17, 32}; // Tread negative value as sizeof input. Same as 0, but done outside of GL.
392*35238bceSAndroid Build Coastguard Worker
393*35238bceSAndroid Build Coastguard Worker for (int offsetNdx = 0; offsetNdx < DE_LENGTH_OF_ARRAY(offsets); offsetNdx++)
394*35238bceSAndroid Build Coastguard Worker {
395*35238bceSAndroid Build Coastguard Worker for (int countNdx = 0; countNdx < DE_LENGTH_OF_ARRAY(counts); countNdx++)
396*35238bceSAndroid Build Coastguard Worker {
397*35238bceSAndroid Build Coastguard Worker for (int strideNdx = 0; strideNdx < DE_LENGTH_OF_ARRAY(strides); strideNdx++)
398*35238bceSAndroid Build Coastguard Worker {
399*35238bceSAndroid Build Coastguard Worker const bool packed =
400*35238bceSAndroid Build Coastguard Worker m_type == Array::INPUTTYPE_UNSIGNED_INT_2_10_10_10 || m_type == Array::INPUTTYPE_INT_2_10_10_10;
401*35238bceSAndroid Build Coastguard Worker const int componentCount = (packed) ? (4) : (2);
402*35238bceSAndroid Build Coastguard Worker const int stride =
403*35238bceSAndroid Build Coastguard Worker (strides[strideNdx] < 0 ? Array::inputTypeSize(m_type) * componentCount : strides[strideNdx]);
404*35238bceSAndroid Build Coastguard Worker const int alignment =
405*35238bceSAndroid Build Coastguard Worker (packed) ? (Array::inputTypeSize(m_type) * componentCount) : (Array::inputTypeSize(m_type));
406*35238bceSAndroid Build Coastguard Worker const bool aligned = ((stride % alignment) == 0) && ((offsets[offsetNdx] % alignment) == 0);
407*35238bceSAndroid Build Coastguard Worker const std::string name = "offset" + typeToString(offsets[offsetNdx]) + "_stride" +
408*35238bceSAndroid Build Coastguard Worker typeToString(strides[strideNdx]) + "_quads" + typeToString(counts[countNdx]);
409*35238bceSAndroid Build Coastguard Worker
410*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec::ArraySpec arraySpec(
411*35238bceSAndroid Build Coastguard Worker m_type, Array::OUTPUTTYPE_VEC2, Array::STORAGE_BUFFER, Array::USAGE_DYNAMIC_DRAW, componentCount,
412*35238bceSAndroid Build Coastguard Worker offsets[offsetNdx], stride, false, GLValue::getMinValue(m_type), GLValue::getMaxValue(m_type));
413*35238bceSAndroid Build Coastguard Worker
414*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec spec;
415*35238bceSAndroid Build Coastguard Worker spec.primitive = Array::PRIMITIVE_TRIANGLES;
416*35238bceSAndroid Build Coastguard Worker spec.drawCount = counts[countNdx];
417*35238bceSAndroid Build Coastguard Worker spec.first = 0;
418*35238bceSAndroid Build Coastguard Worker spec.arrays.push_back(arraySpec);
419*35238bceSAndroid Build Coastguard Worker
420*35238bceSAndroid Build Coastguard Worker if (!aligned)
421*35238bceSAndroid Build Coastguard Worker addChild(new MultiVertexArrayTest(m_testCtx, m_context.getRenderContext(), spec, name.c_str(),
422*35238bceSAndroid Build Coastguard Worker name.c_str()));
423*35238bceSAndroid Build Coastguard Worker }
424*35238bceSAndroid Build Coastguard Worker }
425*35238bceSAndroid Build Coastguard Worker }
426*35238bceSAndroid Build Coastguard Worker }
427*35238bceSAndroid Build Coastguard Worker
428*35238bceSAndroid Build Coastguard Worker class SingleVertexArrayOffsetTests : public TestCaseGroup
429*35238bceSAndroid Build Coastguard Worker {
430*35238bceSAndroid Build Coastguard Worker public:
431*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetTests(Context &context);
432*35238bceSAndroid Build Coastguard Worker virtual ~SingleVertexArrayOffsetTests(void);
433*35238bceSAndroid Build Coastguard Worker
434*35238bceSAndroid Build Coastguard Worker virtual void init(void);
435*35238bceSAndroid Build Coastguard Worker
436*35238bceSAndroid Build Coastguard Worker private:
437*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetTests(const SingleVertexArrayOffsetTests &other);
438*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetTests &operator=(const SingleVertexArrayOffsetTests &other);
439*35238bceSAndroid Build Coastguard Worker };
440*35238bceSAndroid Build Coastguard Worker
SingleVertexArrayOffsetTests(Context & context)441*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetTests::SingleVertexArrayOffsetTests(Context &context)
442*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "offset", "Single vertex atribute offset element")
443*35238bceSAndroid Build Coastguard Worker {
444*35238bceSAndroid Build Coastguard Worker }
445*35238bceSAndroid Build Coastguard Worker
~SingleVertexArrayOffsetTests(void)446*35238bceSAndroid Build Coastguard Worker SingleVertexArrayOffsetTests::~SingleVertexArrayOffsetTests(void)
447*35238bceSAndroid Build Coastguard Worker {
448*35238bceSAndroid Build Coastguard Worker }
449*35238bceSAndroid Build Coastguard Worker
init(void)450*35238bceSAndroid Build Coastguard Worker void SingleVertexArrayOffsetTests::init(void)
451*35238bceSAndroid Build Coastguard Worker {
452*35238bceSAndroid Build Coastguard Worker // Test offset with different input types, component counts and storage, Usage(?)
453*35238bceSAndroid Build Coastguard Worker Array::InputType inputTypes[] = {Array::INPUTTYPE_FLOAT, Array::INPUTTYPE_INT_2_10_10_10};
454*35238bceSAndroid Build Coastguard Worker
455*35238bceSAndroid Build Coastguard Worker for (int inputTypeNdx = 0; inputTypeNdx < DE_LENGTH_OF_ARRAY(inputTypes); inputTypeNdx++)
456*35238bceSAndroid Build Coastguard Worker {
457*35238bceSAndroid Build Coastguard Worker addChild(new SingleVertexArrayOffsetGroup(m_context, inputTypes[inputTypeNdx]));
458*35238bceSAndroid Build Coastguard Worker }
459*35238bceSAndroid Build Coastguard Worker }
460*35238bceSAndroid Build Coastguard Worker
461*35238bceSAndroid Build Coastguard Worker } // namespace
462*35238bceSAndroid Build Coastguard Worker
VertexArrayTests(Context & context)463*35238bceSAndroid Build Coastguard Worker VertexArrayTests::VertexArrayTests(Context &context)
464*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "vertex_arrays", "Vertex array and array tests")
465*35238bceSAndroid Build Coastguard Worker {
466*35238bceSAndroid Build Coastguard Worker }
467*35238bceSAndroid Build Coastguard Worker
~VertexArrayTests(void)468*35238bceSAndroid Build Coastguard Worker VertexArrayTests::~VertexArrayTests(void)
469*35238bceSAndroid Build Coastguard Worker {
470*35238bceSAndroid Build Coastguard Worker }
471*35238bceSAndroid Build Coastguard Worker
init(void)472*35238bceSAndroid Build Coastguard Worker void VertexArrayTests::init(void)
473*35238bceSAndroid Build Coastguard Worker {
474*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *const group = new tcu::TestCaseGroup(m_testCtx, "single_attribute", "Single attribute");
475*35238bceSAndroid Build Coastguard Worker addChild(group);
476*35238bceSAndroid Build Coastguard Worker
477*35238bceSAndroid Build Coastguard Worker // .single_attribute
478*35238bceSAndroid Build Coastguard Worker {
479*35238bceSAndroid Build Coastguard Worker group->addChild(new SingleVertexArrayStrideTests(m_context));
480*35238bceSAndroid Build Coastguard Worker group->addChild(new SingleVertexArrayUsageTests(m_context));
481*35238bceSAndroid Build Coastguard Worker group->addChild(new SingleVertexArrayOffsetTests(m_context));
482*35238bceSAndroid Build Coastguard Worker group->addChild(new SingleVertexArrayFirstTests(m_context));
483*35238bceSAndroid Build Coastguard Worker }
484*35238bceSAndroid Build Coastguard Worker }
485*35238bceSAndroid Build Coastguard Worker
486*35238bceSAndroid Build Coastguard Worker } // namespace Stress
487*35238bceSAndroid Build Coastguard Worker } // namespace gles3
488*35238bceSAndroid Build Coastguard Worker } // namespace deqp
489