xref: /aosp_15_r20/external/deqp/modules/gles3/stress/es3sVertexArrayTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.0 Module
3*35238bceSAndroid Build Coastguard Worker  * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Vertex array 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