xref: /aosp_15_r20/external/deqp/modules/gles2/stress/es2sVertexArrayTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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