1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.1 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 Basic Compute Shader Tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es31fAtomicCounterTests.hpp"
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluObjectWrapper.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
29*35238bceSAndroid Build Coastguard Worker
30*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
32*35238bceSAndroid Build Coastguard Worker
33*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
34*35238bceSAndroid Build Coastguard Worker
35*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
37*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
38*35238bceSAndroid Build Coastguard Worker
39*35238bceSAndroid Build Coastguard Worker #include <vector>
40*35238bceSAndroid Build Coastguard Worker #include <string>
41*35238bceSAndroid Build Coastguard Worker
42*35238bceSAndroid Build Coastguard Worker using namespace glw;
43*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
44*35238bceSAndroid Build Coastguard Worker
45*35238bceSAndroid Build Coastguard Worker using std::string;
46*35238bceSAndroid Build Coastguard Worker using std::vector;
47*35238bceSAndroid Build Coastguard Worker
48*35238bceSAndroid Build Coastguard Worker namespace deqp
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker namespace gles31
51*35238bceSAndroid Build Coastguard Worker {
52*35238bceSAndroid Build Coastguard Worker namespace Functional
53*35238bceSAndroid Build Coastguard Worker {
54*35238bceSAndroid Build Coastguard Worker namespace
55*35238bceSAndroid Build Coastguard Worker {
56*35238bceSAndroid Build Coastguard Worker
57*35238bceSAndroid Build Coastguard Worker class AtomicCounterTest : public TestCase
58*35238bceSAndroid Build Coastguard Worker {
59*35238bceSAndroid Build Coastguard Worker public:
60*35238bceSAndroid Build Coastguard Worker enum Operation
61*35238bceSAndroid Build Coastguard Worker {
62*35238bceSAndroid Build Coastguard Worker OPERATION_INC = (1 << 0),
63*35238bceSAndroid Build Coastguard Worker OPERATION_DEC = (1 << 1),
64*35238bceSAndroid Build Coastguard Worker OPERATION_GET = (1 << 2)
65*35238bceSAndroid Build Coastguard Worker };
66*35238bceSAndroid Build Coastguard Worker
67*35238bceSAndroid Build Coastguard Worker enum OffsetType
68*35238bceSAndroid Build Coastguard Worker {
69*35238bceSAndroid Build Coastguard Worker OFFSETTYPE_NONE = 0,
70*35238bceSAndroid Build Coastguard Worker OFFSETTYPE_BASIC,
71*35238bceSAndroid Build Coastguard Worker OFFSETTYPE_REVERSE,
72*35238bceSAndroid Build Coastguard Worker OFFSETTYPE_FIRST_AUTO,
73*35238bceSAndroid Build Coastguard Worker OFFSETTYPE_DEFAULT_AUTO,
74*35238bceSAndroid Build Coastguard Worker OFFSETTYPE_RESET_DEFAULT,
75*35238bceSAndroid Build Coastguard Worker OFFSETTYPE_INVALID,
76*35238bceSAndroid Build Coastguard Worker OFFSETTYPE_INVALID_OVERLAPPING,
77*35238bceSAndroid Build Coastguard Worker OFFSETTYPE_INVALID_DEFAULT
78*35238bceSAndroid Build Coastguard Worker };
79*35238bceSAndroid Build Coastguard Worker
80*35238bceSAndroid Build Coastguard Worker enum BindingType
81*35238bceSAndroid Build Coastguard Worker {
82*35238bceSAndroid Build Coastguard Worker BINDINGTYPE_BASIC = 0,
83*35238bceSAndroid Build Coastguard Worker BINDINGTYPE_INVALID,
84*35238bceSAndroid Build Coastguard Worker BINDINGTYPE_INVALID_DEFAULT
85*35238bceSAndroid Build Coastguard Worker };
86*35238bceSAndroid Build Coastguard Worker
87*35238bceSAndroid Build Coastguard Worker struct TestSpec
88*35238bceSAndroid Build Coastguard Worker {
TestSpecdeqp::gles31::Functional::__anon85d56dab0111::AtomicCounterTest::TestSpec89*35238bceSAndroid Build Coastguard Worker TestSpec(void)
90*35238bceSAndroid Build Coastguard Worker : atomicCounterCount(0)
91*35238bceSAndroid Build Coastguard Worker , operations((Operation)0)
92*35238bceSAndroid Build Coastguard Worker , callCount(0)
93*35238bceSAndroid Build Coastguard Worker , useBranches(false)
94*35238bceSAndroid Build Coastguard Worker , threadCount(0)
95*35238bceSAndroid Build Coastguard Worker , offsetType(OFFSETTYPE_NONE)
96*35238bceSAndroid Build Coastguard Worker , bindingType(BINDINGTYPE_BASIC)
97*35238bceSAndroid Build Coastguard Worker {
98*35238bceSAndroid Build Coastguard Worker }
99*35238bceSAndroid Build Coastguard Worker
100*35238bceSAndroid Build Coastguard Worker int atomicCounterCount;
101*35238bceSAndroid Build Coastguard Worker Operation operations;
102*35238bceSAndroid Build Coastguard Worker int callCount;
103*35238bceSAndroid Build Coastguard Worker bool useBranches;
104*35238bceSAndroid Build Coastguard Worker int threadCount;
105*35238bceSAndroid Build Coastguard Worker OffsetType offsetType;
106*35238bceSAndroid Build Coastguard Worker BindingType bindingType;
107*35238bceSAndroid Build Coastguard Worker };
108*35238bceSAndroid Build Coastguard Worker
109*35238bceSAndroid Build Coastguard Worker AtomicCounterTest(Context &context, const char *name, const char *description, const TestSpec &spec);
110*35238bceSAndroid Build Coastguard Worker ~AtomicCounterTest(void);
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard Worker void init(void);
113*35238bceSAndroid Build Coastguard Worker void deinit(void);
114*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
115*35238bceSAndroid Build Coastguard Worker
116*35238bceSAndroid Build Coastguard Worker private:
117*35238bceSAndroid Build Coastguard Worker const TestSpec m_spec;
118*35238bceSAndroid Build Coastguard Worker
119*35238bceSAndroid Build Coastguard Worker bool checkAndLogCounterValues(TestLog &log, const vector<uint32_t> &counters) const;
120*35238bceSAndroid Build Coastguard Worker bool checkAndLogCallValues(TestLog &log, const vector<uint32_t> &increments, const vector<uint32_t> &decrements,
121*35238bceSAndroid Build Coastguard Worker const vector<uint32_t> &preGets, const vector<uint32_t> &postGets,
122*35238bceSAndroid Build Coastguard Worker const vector<uint32_t> &gets) const;
123*35238bceSAndroid Build Coastguard Worker void splitBuffer(const vector<uint32_t> &buffer, vector<uint32_t> &increments, vector<uint32_t> &decrements,
124*35238bceSAndroid Build Coastguard Worker vector<uint32_t> &preGets, vector<uint32_t> &postGets, vector<uint32_t> &gets) const;
getInitialValue(void) const125*35238bceSAndroid Build Coastguard Worker uint32_t getInitialValue(void) const
126*35238bceSAndroid Build Coastguard Worker {
127*35238bceSAndroid Build Coastguard Worker return m_spec.callCount * m_spec.threadCount + 1;
128*35238bceSAndroid Build Coastguard Worker }
129*35238bceSAndroid Build Coastguard Worker
130*35238bceSAndroid Build Coastguard Worker static string generateShaderSource(const TestSpec &spec);
131*35238bceSAndroid Build Coastguard Worker static void getCountersValues(vector<uint32_t> &counterValues, const vector<uint32_t> &values, int ndx,
132*35238bceSAndroid Build Coastguard Worker int counterCount);
133*35238bceSAndroid Build Coastguard Worker static bool checkRange(TestLog &log, const vector<uint32_t> &values, const vector<uint32_t> &min,
134*35238bceSAndroid Build Coastguard Worker const vector<uint32_t> &max);
135*35238bceSAndroid Build Coastguard Worker static bool checkUniquenessAndLinearity(TestLog &log, const vector<uint32_t> &values);
136*35238bceSAndroid Build Coastguard Worker static bool checkPath(const vector<uint32_t> &increments, const vector<uint32_t> &decrements, int initialValue,
137*35238bceSAndroid Build Coastguard Worker const TestSpec &spec);
138*35238bceSAndroid Build Coastguard Worker
139*35238bceSAndroid Build Coastguard Worker int getOperationCount(void) const;
140*35238bceSAndroid Build Coastguard Worker
141*35238bceSAndroid Build Coastguard Worker AtomicCounterTest &operator=(const AtomicCounterTest &);
142*35238bceSAndroid Build Coastguard Worker AtomicCounterTest(const AtomicCounterTest &);
143*35238bceSAndroid Build Coastguard Worker };
144*35238bceSAndroid Build Coastguard Worker
getOperationCount(void) const145*35238bceSAndroid Build Coastguard Worker int AtomicCounterTest::getOperationCount(void) const
146*35238bceSAndroid Build Coastguard Worker {
147*35238bceSAndroid Build Coastguard Worker int count = 0;
148*35238bceSAndroid Build Coastguard Worker
149*35238bceSAndroid Build Coastguard Worker if (m_spec.operations & OPERATION_INC)
150*35238bceSAndroid Build Coastguard Worker count++;
151*35238bceSAndroid Build Coastguard Worker
152*35238bceSAndroid Build Coastguard Worker if (m_spec.operations & OPERATION_DEC)
153*35238bceSAndroid Build Coastguard Worker count++;
154*35238bceSAndroid Build Coastguard Worker
155*35238bceSAndroid Build Coastguard Worker if (m_spec.operations == OPERATION_GET)
156*35238bceSAndroid Build Coastguard Worker count++;
157*35238bceSAndroid Build Coastguard Worker else if (m_spec.operations & OPERATION_GET)
158*35238bceSAndroid Build Coastguard Worker count += 2;
159*35238bceSAndroid Build Coastguard Worker
160*35238bceSAndroid Build Coastguard Worker return count;
161*35238bceSAndroid Build Coastguard Worker }
162*35238bceSAndroid Build Coastguard Worker
AtomicCounterTest(Context & context,const char * name,const char * description,const TestSpec & spec)163*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::AtomicCounterTest(Context &context, const char *name, const char *description, const TestSpec &spec)
164*35238bceSAndroid Build Coastguard Worker : TestCase(context, name, description)
165*35238bceSAndroid Build Coastguard Worker , m_spec(spec)
166*35238bceSAndroid Build Coastguard Worker {
167*35238bceSAndroid Build Coastguard Worker }
168*35238bceSAndroid Build Coastguard Worker
~AtomicCounterTest(void)169*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::~AtomicCounterTest(void)
170*35238bceSAndroid Build Coastguard Worker {
171*35238bceSAndroid Build Coastguard Worker }
172*35238bceSAndroid Build Coastguard Worker
init(void)173*35238bceSAndroid Build Coastguard Worker void AtomicCounterTest::init(void)
174*35238bceSAndroid Build Coastguard Worker {
175*35238bceSAndroid Build Coastguard Worker }
176*35238bceSAndroid Build Coastguard Worker
deinit(void)177*35238bceSAndroid Build Coastguard Worker void AtomicCounterTest::deinit(void)
178*35238bceSAndroid Build Coastguard Worker {
179*35238bceSAndroid Build Coastguard Worker }
180*35238bceSAndroid Build Coastguard Worker
generateShaderSource(const TestSpec & spec)181*35238bceSAndroid Build Coastguard Worker string AtomicCounterTest::generateShaderSource(const TestSpec &spec)
182*35238bceSAndroid Build Coastguard Worker {
183*35238bceSAndroid Build Coastguard Worker std::ostringstream src;
184*35238bceSAndroid Build Coastguard Worker
185*35238bceSAndroid Build Coastguard Worker src << "#version 310 es\n"
186*35238bceSAndroid Build Coastguard Worker << "layout (local_size_x = 1, local_size_y = 1, local_size_z = 1) in;\n";
187*35238bceSAndroid Build Coastguard Worker
188*35238bceSAndroid Build Coastguard Worker {
189*35238bceSAndroid Build Coastguard Worker bool wroteLayout = false;
190*35238bceSAndroid Build Coastguard Worker
191*35238bceSAndroid Build Coastguard Worker switch (spec.bindingType)
192*35238bceSAndroid Build Coastguard Worker {
193*35238bceSAndroid Build Coastguard Worker case BINDINGTYPE_INVALID_DEFAULT:
194*35238bceSAndroid Build Coastguard Worker src << "layout(binding=10000";
195*35238bceSAndroid Build Coastguard Worker wroteLayout = true;
196*35238bceSAndroid Build Coastguard Worker break;
197*35238bceSAndroid Build Coastguard Worker
198*35238bceSAndroid Build Coastguard Worker default:
199*35238bceSAndroid Build Coastguard Worker // Do nothing
200*35238bceSAndroid Build Coastguard Worker break;
201*35238bceSAndroid Build Coastguard Worker }
202*35238bceSAndroid Build Coastguard Worker
203*35238bceSAndroid Build Coastguard Worker switch (spec.offsetType)
204*35238bceSAndroid Build Coastguard Worker {
205*35238bceSAndroid Build Coastguard Worker case OFFSETTYPE_DEFAULT_AUTO:
206*35238bceSAndroid Build Coastguard Worker if (!wroteLayout)
207*35238bceSAndroid Build Coastguard Worker src << "layout(binding=0, ";
208*35238bceSAndroid Build Coastguard Worker else
209*35238bceSAndroid Build Coastguard Worker src << ", ";
210*35238bceSAndroid Build Coastguard Worker
211*35238bceSAndroid Build Coastguard Worker src << "offset=4";
212*35238bceSAndroid Build Coastguard Worker wroteLayout = true;
213*35238bceSAndroid Build Coastguard Worker break;
214*35238bceSAndroid Build Coastguard Worker
215*35238bceSAndroid Build Coastguard Worker case OFFSETTYPE_RESET_DEFAULT:
216*35238bceSAndroid Build Coastguard Worker DE_ASSERT(spec.atomicCounterCount > 2);
217*35238bceSAndroid Build Coastguard Worker
218*35238bceSAndroid Build Coastguard Worker if (!wroteLayout)
219*35238bceSAndroid Build Coastguard Worker src << "layout(binding=0, ";
220*35238bceSAndroid Build Coastguard Worker else
221*35238bceSAndroid Build Coastguard Worker src << ", ";
222*35238bceSAndroid Build Coastguard Worker
223*35238bceSAndroid Build Coastguard Worker src << "offset=" << (4 * spec.atomicCounterCount / 2);
224*35238bceSAndroid Build Coastguard Worker wroteLayout = true;
225*35238bceSAndroid Build Coastguard Worker break;
226*35238bceSAndroid Build Coastguard Worker
227*35238bceSAndroid Build Coastguard Worker case OFFSETTYPE_INVALID_DEFAULT:
228*35238bceSAndroid Build Coastguard Worker if (!wroteLayout)
229*35238bceSAndroid Build Coastguard Worker src << "layout(binding=0, ";
230*35238bceSAndroid Build Coastguard Worker else
231*35238bceSAndroid Build Coastguard Worker src << ", ";
232*35238bceSAndroid Build Coastguard Worker
233*35238bceSAndroid Build Coastguard Worker src << "offset=1";
234*35238bceSAndroid Build Coastguard Worker wroteLayout = true;
235*35238bceSAndroid Build Coastguard Worker break;
236*35238bceSAndroid Build Coastguard Worker
237*35238bceSAndroid Build Coastguard Worker default:
238*35238bceSAndroid Build Coastguard Worker // Do nothing
239*35238bceSAndroid Build Coastguard Worker break;
240*35238bceSAndroid Build Coastguard Worker }
241*35238bceSAndroid Build Coastguard Worker
242*35238bceSAndroid Build Coastguard Worker if (wroteLayout)
243*35238bceSAndroid Build Coastguard Worker src << ") uniform atomic_uint;\n";
244*35238bceSAndroid Build Coastguard Worker }
245*35238bceSAndroid Build Coastguard Worker
246*35238bceSAndroid Build Coastguard Worker src << "layout(binding = 1, std430) buffer Output {\n";
247*35238bceSAndroid Build Coastguard Worker
248*35238bceSAndroid Build Coastguard Worker if ((spec.operations & OPERATION_GET) != 0 && spec.operations != OPERATION_GET)
249*35238bceSAndroid Build Coastguard Worker src << " uint preGet[" << spec.threadCount * spec.atomicCounterCount * spec.callCount << "];\n";
250*35238bceSAndroid Build Coastguard Worker
251*35238bceSAndroid Build Coastguard Worker if ((spec.operations & OPERATION_INC) != 0)
252*35238bceSAndroid Build Coastguard Worker src << " uint increment[" << spec.threadCount * spec.atomicCounterCount * spec.callCount << "];\n";
253*35238bceSAndroid Build Coastguard Worker
254*35238bceSAndroid Build Coastguard Worker if ((spec.operations & OPERATION_DEC) != 0)
255*35238bceSAndroid Build Coastguard Worker src << " uint decrement[" << spec.threadCount * spec.atomicCounterCount * spec.callCount << "];\n";
256*35238bceSAndroid Build Coastguard Worker
257*35238bceSAndroid Build Coastguard Worker if ((spec.operations & OPERATION_GET) != 0 && spec.operations != OPERATION_GET)
258*35238bceSAndroid Build Coastguard Worker src << " uint postGet[" << spec.threadCount * spec.atomicCounterCount * spec.callCount << "];\n";
259*35238bceSAndroid Build Coastguard Worker
260*35238bceSAndroid Build Coastguard Worker if (spec.operations == OPERATION_GET)
261*35238bceSAndroid Build Coastguard Worker src << " uint get[" << spec.threadCount * spec.atomicCounterCount * spec.callCount << "];\n";
262*35238bceSAndroid Build Coastguard Worker
263*35238bceSAndroid Build Coastguard Worker src << "} sb_in;\n\n";
264*35238bceSAndroid Build Coastguard Worker
265*35238bceSAndroid Build Coastguard Worker for (int counterNdx = 0; counterNdx < spec.atomicCounterCount; counterNdx++)
266*35238bceSAndroid Build Coastguard Worker {
267*35238bceSAndroid Build Coastguard Worker bool layoutStarted = false;
268*35238bceSAndroid Build Coastguard Worker
269*35238bceSAndroid Build Coastguard Worker if (spec.offsetType == OFFSETTYPE_RESET_DEFAULT && counterNdx == spec.atomicCounterCount / 2)
270*35238bceSAndroid Build Coastguard Worker src << "layout(binding=0, offset=0) uniform atomic_uint;\n";
271*35238bceSAndroid Build Coastguard Worker
272*35238bceSAndroid Build Coastguard Worker switch (spec.bindingType)
273*35238bceSAndroid Build Coastguard Worker {
274*35238bceSAndroid Build Coastguard Worker case BINDINGTYPE_BASIC:
275*35238bceSAndroid Build Coastguard Worker layoutStarted = true;
276*35238bceSAndroid Build Coastguard Worker src << "layout(binding=0";
277*35238bceSAndroid Build Coastguard Worker break;
278*35238bceSAndroid Build Coastguard Worker
279*35238bceSAndroid Build Coastguard Worker case BINDINGTYPE_INVALID:
280*35238bceSAndroid Build Coastguard Worker layoutStarted = true;
281*35238bceSAndroid Build Coastguard Worker src << "layout(binding=10000";
282*35238bceSAndroid Build Coastguard Worker break;
283*35238bceSAndroid Build Coastguard Worker
284*35238bceSAndroid Build Coastguard Worker case BINDINGTYPE_INVALID_DEFAULT:
285*35238bceSAndroid Build Coastguard Worker // Nothing
286*35238bceSAndroid Build Coastguard Worker break;
287*35238bceSAndroid Build Coastguard Worker
288*35238bceSAndroid Build Coastguard Worker default:
289*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
290*35238bceSAndroid Build Coastguard Worker }
291*35238bceSAndroid Build Coastguard Worker
292*35238bceSAndroid Build Coastguard Worker switch (spec.offsetType)
293*35238bceSAndroid Build Coastguard Worker {
294*35238bceSAndroid Build Coastguard Worker case OFFSETTYPE_NONE:
295*35238bceSAndroid Build Coastguard Worker if (layoutStarted)
296*35238bceSAndroid Build Coastguard Worker src << ") ";
297*35238bceSAndroid Build Coastguard Worker
298*35238bceSAndroid Build Coastguard Worker src << "uniform atomic_uint counter" << counterNdx << ";\n";
299*35238bceSAndroid Build Coastguard Worker
300*35238bceSAndroid Build Coastguard Worker break;
301*35238bceSAndroid Build Coastguard Worker
302*35238bceSAndroid Build Coastguard Worker case OFFSETTYPE_BASIC:
303*35238bceSAndroid Build Coastguard Worker if (!layoutStarted)
304*35238bceSAndroid Build Coastguard Worker src << "layout(";
305*35238bceSAndroid Build Coastguard Worker else
306*35238bceSAndroid Build Coastguard Worker src << ", ";
307*35238bceSAndroid Build Coastguard Worker
308*35238bceSAndroid Build Coastguard Worker src << "offset=" << (counterNdx * 4) << ") uniform atomic_uint counter" << counterNdx << ";\n";
309*35238bceSAndroid Build Coastguard Worker
310*35238bceSAndroid Build Coastguard Worker break;
311*35238bceSAndroid Build Coastguard Worker
312*35238bceSAndroid Build Coastguard Worker case OFFSETTYPE_INVALID_DEFAULT:
313*35238bceSAndroid Build Coastguard Worker if (layoutStarted)
314*35238bceSAndroid Build Coastguard Worker src << ") ";
315*35238bceSAndroid Build Coastguard Worker
316*35238bceSAndroid Build Coastguard Worker src << "uniform atomic_uint counter" << counterNdx << ";\n";
317*35238bceSAndroid Build Coastguard Worker
318*35238bceSAndroid Build Coastguard Worker break;
319*35238bceSAndroid Build Coastguard Worker
320*35238bceSAndroid Build Coastguard Worker case OFFSETTYPE_INVALID:
321*35238bceSAndroid Build Coastguard Worker if (!layoutStarted)
322*35238bceSAndroid Build Coastguard Worker src << "layout(";
323*35238bceSAndroid Build Coastguard Worker else
324*35238bceSAndroid Build Coastguard Worker src << ", ";
325*35238bceSAndroid Build Coastguard Worker
326*35238bceSAndroid Build Coastguard Worker src << "offset=" << (1 + counterNdx * 2) << ") uniform atomic_uint counter" << counterNdx << ";\n";
327*35238bceSAndroid Build Coastguard Worker
328*35238bceSAndroid Build Coastguard Worker break;
329*35238bceSAndroid Build Coastguard Worker
330*35238bceSAndroid Build Coastguard Worker case OFFSETTYPE_INVALID_OVERLAPPING:
331*35238bceSAndroid Build Coastguard Worker if (!layoutStarted)
332*35238bceSAndroid Build Coastguard Worker src << "layout(";
333*35238bceSAndroid Build Coastguard Worker else
334*35238bceSAndroid Build Coastguard Worker src << ", ";
335*35238bceSAndroid Build Coastguard Worker
336*35238bceSAndroid Build Coastguard Worker src << "offset=0) uniform atomic_uint counter" << counterNdx << ";\n";
337*35238bceSAndroid Build Coastguard Worker
338*35238bceSAndroid Build Coastguard Worker break;
339*35238bceSAndroid Build Coastguard Worker
340*35238bceSAndroid Build Coastguard Worker case OFFSETTYPE_REVERSE:
341*35238bceSAndroid Build Coastguard Worker if (!layoutStarted)
342*35238bceSAndroid Build Coastguard Worker src << "layout(";
343*35238bceSAndroid Build Coastguard Worker else
344*35238bceSAndroid Build Coastguard Worker src << ", ";
345*35238bceSAndroid Build Coastguard Worker
346*35238bceSAndroid Build Coastguard Worker src << "offset=" << (spec.atomicCounterCount - counterNdx - 1) * 4 << ") uniform atomic_uint counter"
347*35238bceSAndroid Build Coastguard Worker << (spec.atomicCounterCount - counterNdx - 1) << ";\n";
348*35238bceSAndroid Build Coastguard Worker
349*35238bceSAndroid Build Coastguard Worker break;
350*35238bceSAndroid Build Coastguard Worker
351*35238bceSAndroid Build Coastguard Worker case OFFSETTYPE_FIRST_AUTO:
352*35238bceSAndroid Build Coastguard Worker DE_ASSERT(spec.atomicCounterCount > 2);
353*35238bceSAndroid Build Coastguard Worker
354*35238bceSAndroid Build Coastguard Worker if (counterNdx + 1 == spec.atomicCounterCount)
355*35238bceSAndroid Build Coastguard Worker {
356*35238bceSAndroid Build Coastguard Worker if (!layoutStarted)
357*35238bceSAndroid Build Coastguard Worker src << "layout(";
358*35238bceSAndroid Build Coastguard Worker else
359*35238bceSAndroid Build Coastguard Worker src << ", ";
360*35238bceSAndroid Build Coastguard Worker
361*35238bceSAndroid Build Coastguard Worker src << "offset=0) uniform atomic_uint counter0;\n";
362*35238bceSAndroid Build Coastguard Worker }
363*35238bceSAndroid Build Coastguard Worker else if (counterNdx == 0)
364*35238bceSAndroid Build Coastguard Worker {
365*35238bceSAndroid Build Coastguard Worker if (!layoutStarted)
366*35238bceSAndroid Build Coastguard Worker src << "layout(";
367*35238bceSAndroid Build Coastguard Worker else
368*35238bceSAndroid Build Coastguard Worker src << ", ";
369*35238bceSAndroid Build Coastguard Worker
370*35238bceSAndroid Build Coastguard Worker src << "offset=4) uniform atomic_uint counter1;\n";
371*35238bceSAndroid Build Coastguard Worker }
372*35238bceSAndroid Build Coastguard Worker else
373*35238bceSAndroid Build Coastguard Worker {
374*35238bceSAndroid Build Coastguard Worker if (layoutStarted)
375*35238bceSAndroid Build Coastguard Worker src << ") ";
376*35238bceSAndroid Build Coastguard Worker
377*35238bceSAndroid Build Coastguard Worker src << "uniform atomic_uint counter" << (counterNdx + 1) << ";\n";
378*35238bceSAndroid Build Coastguard Worker }
379*35238bceSAndroid Build Coastguard Worker
380*35238bceSAndroid Build Coastguard Worker break;
381*35238bceSAndroid Build Coastguard Worker
382*35238bceSAndroid Build Coastguard Worker case OFFSETTYPE_DEFAULT_AUTO:
383*35238bceSAndroid Build Coastguard Worker if (counterNdx + 1 == spec.atomicCounterCount)
384*35238bceSAndroid Build Coastguard Worker {
385*35238bceSAndroid Build Coastguard Worker if (!layoutStarted)
386*35238bceSAndroid Build Coastguard Worker src << "layout(";
387*35238bceSAndroid Build Coastguard Worker else
388*35238bceSAndroid Build Coastguard Worker src << ", ";
389*35238bceSAndroid Build Coastguard Worker
390*35238bceSAndroid Build Coastguard Worker src << "offset=0) uniform atomic_uint counter0;\n";
391*35238bceSAndroid Build Coastguard Worker }
392*35238bceSAndroid Build Coastguard Worker else
393*35238bceSAndroid Build Coastguard Worker {
394*35238bceSAndroid Build Coastguard Worker if (layoutStarted)
395*35238bceSAndroid Build Coastguard Worker src << ") ";
396*35238bceSAndroid Build Coastguard Worker
397*35238bceSAndroid Build Coastguard Worker src << "uniform atomic_uint counter" << (counterNdx + 1) << ";\n";
398*35238bceSAndroid Build Coastguard Worker }
399*35238bceSAndroid Build Coastguard Worker
400*35238bceSAndroid Build Coastguard Worker break;
401*35238bceSAndroid Build Coastguard Worker
402*35238bceSAndroid Build Coastguard Worker case OFFSETTYPE_RESET_DEFAULT:
403*35238bceSAndroid Build Coastguard Worker if (layoutStarted)
404*35238bceSAndroid Build Coastguard Worker src << ") ";
405*35238bceSAndroid Build Coastguard Worker
406*35238bceSAndroid Build Coastguard Worker if (counterNdx < spec.atomicCounterCount / 2)
407*35238bceSAndroid Build Coastguard Worker src << "uniform atomic_uint counter" << (counterNdx + spec.atomicCounterCount / 2) << ";\n";
408*35238bceSAndroid Build Coastguard Worker else
409*35238bceSAndroid Build Coastguard Worker src << "uniform atomic_uint counter" << (counterNdx - spec.atomicCounterCount / 2) << ";\n";
410*35238bceSAndroid Build Coastguard Worker
411*35238bceSAndroid Build Coastguard Worker break;
412*35238bceSAndroid Build Coastguard Worker
413*35238bceSAndroid Build Coastguard Worker default:
414*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
415*35238bceSAndroid Build Coastguard Worker }
416*35238bceSAndroid Build Coastguard Worker }
417*35238bceSAndroid Build Coastguard Worker
418*35238bceSAndroid Build Coastguard Worker src << "\n"
419*35238bceSAndroid Build Coastguard Worker << "void main (void)\n"
420*35238bceSAndroid Build Coastguard Worker << "{\n";
421*35238bceSAndroid Build Coastguard Worker
422*35238bceSAndroid Build Coastguard Worker if (spec.callCount > 1)
423*35238bceSAndroid Build Coastguard Worker src << "\tfor (uint i = 0u; i < " << spec.callCount << "u; i++)\n";
424*35238bceSAndroid Build Coastguard Worker
425*35238bceSAndroid Build Coastguard Worker src << "\t{\n"
426*35238bceSAndroid Build Coastguard Worker << "\t\tuint id = (gl_GlobalInvocationID.x";
427*35238bceSAndroid Build Coastguard Worker
428*35238bceSAndroid Build Coastguard Worker if (spec.callCount > 1)
429*35238bceSAndroid Build Coastguard Worker src << " * " << spec.callCount << "u";
430*35238bceSAndroid Build Coastguard Worker
431*35238bceSAndroid Build Coastguard Worker if (spec.callCount > 1)
432*35238bceSAndroid Build Coastguard Worker src << " + i)";
433*35238bceSAndroid Build Coastguard Worker else
434*35238bceSAndroid Build Coastguard Worker src << ")";
435*35238bceSAndroid Build Coastguard Worker
436*35238bceSAndroid Build Coastguard Worker if (spec.atomicCounterCount > 1)
437*35238bceSAndroid Build Coastguard Worker src << " * " << spec.atomicCounterCount << "u";
438*35238bceSAndroid Build Coastguard Worker
439*35238bceSAndroid Build Coastguard Worker src << ";\n";
440*35238bceSAndroid Build Coastguard Worker
441*35238bceSAndroid Build Coastguard Worker for (int counterNdx = 0; counterNdx < spec.atomicCounterCount; counterNdx++)
442*35238bceSAndroid Build Coastguard Worker {
443*35238bceSAndroid Build Coastguard Worker if ((spec.operations & OPERATION_GET) != 0 && spec.operations != OPERATION_GET)
444*35238bceSAndroid Build Coastguard Worker src << "\t\tsb_in.preGet[id + " << counterNdx << "u] = atomicCounter(counter" << counterNdx << ");\n";
445*35238bceSAndroid Build Coastguard Worker
446*35238bceSAndroid Build Coastguard Worker if (spec.useBranches &&
447*35238bceSAndroid Build Coastguard Worker ((spec.operations & (OPERATION_INC | OPERATION_DEC)) == (OPERATION_INC | OPERATION_DEC)))
448*35238bceSAndroid Build Coastguard Worker {
449*35238bceSAndroid Build Coastguard Worker src << "\t\tif (((gl_GlobalInvocationID.x" << (spec.callCount > 1 ? " + i" : "") << ") % 2u) == 0u)\n"
450*35238bceSAndroid Build Coastguard Worker << "\t\t{\n"
451*35238bceSAndroid Build Coastguard Worker << "\t\t\tsb_in.increment[id + " << counterNdx << "u] = atomicCounterIncrement(counter" << counterNdx
452*35238bceSAndroid Build Coastguard Worker << ");\n"
453*35238bceSAndroid Build Coastguard Worker << "\t\t\tsb_in.decrement[id + " << counterNdx << "u] = uint(-1);\n"
454*35238bceSAndroid Build Coastguard Worker << "\t\t}\n"
455*35238bceSAndroid Build Coastguard Worker << "\t\telse\n"
456*35238bceSAndroid Build Coastguard Worker << "\t\t{\n"
457*35238bceSAndroid Build Coastguard Worker << "\t\t\tsb_in.decrement[id + " << counterNdx << "u] = atomicCounterDecrement(counter" << counterNdx
458*35238bceSAndroid Build Coastguard Worker << ") + 1u;\n"
459*35238bceSAndroid Build Coastguard Worker << "\t\t\tsb_in.increment[id + " << counterNdx << "u] = uint(-1);\n"
460*35238bceSAndroid Build Coastguard Worker << "\t\t}\n";
461*35238bceSAndroid Build Coastguard Worker }
462*35238bceSAndroid Build Coastguard Worker else
463*35238bceSAndroid Build Coastguard Worker {
464*35238bceSAndroid Build Coastguard Worker if ((spec.operations & OPERATION_INC) != 0)
465*35238bceSAndroid Build Coastguard Worker {
466*35238bceSAndroid Build Coastguard Worker if (spec.useBranches)
467*35238bceSAndroid Build Coastguard Worker {
468*35238bceSAndroid Build Coastguard Worker src << "\t\tif (((gl_GlobalInvocationID.x" << (spec.callCount > 1 ? " + i" : "")
469*35238bceSAndroid Build Coastguard Worker << ") % 2u) == 0u)\n"
470*35238bceSAndroid Build Coastguard Worker << "\t\t{\n"
471*35238bceSAndroid Build Coastguard Worker << "\t\t\tsb_in.increment[id + " << counterNdx << "u] = atomicCounterIncrement(counter"
472*35238bceSAndroid Build Coastguard Worker << counterNdx << ");\n"
473*35238bceSAndroid Build Coastguard Worker << "\t\t}\n"
474*35238bceSAndroid Build Coastguard Worker << "\t\telse\n"
475*35238bceSAndroid Build Coastguard Worker << "\t\t{\n"
476*35238bceSAndroid Build Coastguard Worker << "\t\t\tsb_in.increment[id + " << counterNdx << "u] = uint(-1);\n"
477*35238bceSAndroid Build Coastguard Worker << "\t\t}\n";
478*35238bceSAndroid Build Coastguard Worker }
479*35238bceSAndroid Build Coastguard Worker else
480*35238bceSAndroid Build Coastguard Worker src << "\t\tsb_in.increment[id + " << counterNdx << "u] = atomicCounterIncrement(counter"
481*35238bceSAndroid Build Coastguard Worker << counterNdx << ");\n";
482*35238bceSAndroid Build Coastguard Worker }
483*35238bceSAndroid Build Coastguard Worker
484*35238bceSAndroid Build Coastguard Worker if ((spec.operations & OPERATION_DEC) != 0)
485*35238bceSAndroid Build Coastguard Worker {
486*35238bceSAndroid Build Coastguard Worker if (spec.useBranches)
487*35238bceSAndroid Build Coastguard Worker {
488*35238bceSAndroid Build Coastguard Worker src << "\t\tif (((gl_GlobalInvocationID.x" << (spec.callCount > 1 ? " + i" : "")
489*35238bceSAndroid Build Coastguard Worker << ") % 2u) == 0u)\n"
490*35238bceSAndroid Build Coastguard Worker << "\t\t{\n"
491*35238bceSAndroid Build Coastguard Worker << "\t\t\tsb_in.decrement[id + " << counterNdx << "u] = atomicCounterDecrement(counter"
492*35238bceSAndroid Build Coastguard Worker << counterNdx << ") + 1u;\n"
493*35238bceSAndroid Build Coastguard Worker << "\t\t}\n"
494*35238bceSAndroid Build Coastguard Worker << "\t\telse\n"
495*35238bceSAndroid Build Coastguard Worker << "\t\t{\n"
496*35238bceSAndroid Build Coastguard Worker << "\t\t\tsb_in.decrement[id + " << counterNdx << "u] = uint(-1);\n"
497*35238bceSAndroid Build Coastguard Worker << "\t\t}\n";
498*35238bceSAndroid Build Coastguard Worker }
499*35238bceSAndroid Build Coastguard Worker else
500*35238bceSAndroid Build Coastguard Worker src << "\t\tsb_in.decrement[id + " << counterNdx << "u] = atomicCounterDecrement(counter"
501*35238bceSAndroid Build Coastguard Worker << counterNdx << ") + 1u;\n";
502*35238bceSAndroid Build Coastguard Worker }
503*35238bceSAndroid Build Coastguard Worker }
504*35238bceSAndroid Build Coastguard Worker
505*35238bceSAndroid Build Coastguard Worker if ((spec.operations & OPERATION_GET) != 0 && spec.operations != OPERATION_GET)
506*35238bceSAndroid Build Coastguard Worker src << "\t\tsb_in.postGet[id + " << counterNdx << "u] = atomicCounter(counter" << counterNdx << ");\n";
507*35238bceSAndroid Build Coastguard Worker
508*35238bceSAndroid Build Coastguard Worker if ((spec.operations == OPERATION_GET) != 0)
509*35238bceSAndroid Build Coastguard Worker {
510*35238bceSAndroid Build Coastguard Worker if (spec.useBranches)
511*35238bceSAndroid Build Coastguard Worker {
512*35238bceSAndroid Build Coastguard Worker src << "\t\tif (((gl_GlobalInvocationID.x" << (spec.callCount > 1 ? " + i" : "") << ") % 2u) == 0u)\n"
513*35238bceSAndroid Build Coastguard Worker << "\t\t{\n"
514*35238bceSAndroid Build Coastguard Worker << "\t\t\tsb_in.get[id + " << counterNdx << "u] = atomicCounter(counter" << counterNdx << ");\n"
515*35238bceSAndroid Build Coastguard Worker << "\t\t}\n"
516*35238bceSAndroid Build Coastguard Worker << "\t\telse\n"
517*35238bceSAndroid Build Coastguard Worker << "\t\t{\n"
518*35238bceSAndroid Build Coastguard Worker << "\t\t\tsb_in.get[id + " << counterNdx << "u] = uint(-1);\n"
519*35238bceSAndroid Build Coastguard Worker << "\t\t}\n";
520*35238bceSAndroid Build Coastguard Worker }
521*35238bceSAndroid Build Coastguard Worker else
522*35238bceSAndroid Build Coastguard Worker src << "\t\tsb_in.get[id + " << counterNdx << "u] = atomicCounter(counter" << counterNdx << ");\n";
523*35238bceSAndroid Build Coastguard Worker }
524*35238bceSAndroid Build Coastguard Worker }
525*35238bceSAndroid Build Coastguard Worker
526*35238bceSAndroid Build Coastguard Worker src << "\t}\n"
527*35238bceSAndroid Build Coastguard Worker << "}\n";
528*35238bceSAndroid Build Coastguard Worker
529*35238bceSAndroid Build Coastguard Worker return src.str();
530*35238bceSAndroid Build Coastguard Worker }
531*35238bceSAndroid Build Coastguard Worker
checkAndLogCounterValues(TestLog & log,const vector<uint32_t> & counters) const532*35238bceSAndroid Build Coastguard Worker bool AtomicCounterTest::checkAndLogCounterValues(TestLog &log, const vector<uint32_t> &counters) const
533*35238bceSAndroid Build Coastguard Worker {
534*35238bceSAndroid Build Coastguard Worker tcu::ScopedLogSection counterSection(log, "Counter info",
535*35238bceSAndroid Build Coastguard Worker "Show initial value, current value and expected value of each counter.");
536*35238bceSAndroid Build Coastguard Worker bool isOk = true;
537*35238bceSAndroid Build Coastguard Worker
538*35238bceSAndroid Build Coastguard Worker // Check that atomic counters have sensible results
539*35238bceSAndroid Build Coastguard Worker for (int counterNdx = 0; counterNdx < (int)counters.size(); counterNdx++)
540*35238bceSAndroid Build Coastguard Worker {
541*35238bceSAndroid Build Coastguard Worker const uint32_t value = counters[counterNdx];
542*35238bceSAndroid Build Coastguard Worker const uint32_t initialValue = getInitialValue();
543*35238bceSAndroid Build Coastguard Worker uint32_t expectedValue = (uint32_t)-1;
544*35238bceSAndroid Build Coastguard Worker
545*35238bceSAndroid Build Coastguard Worker if ((m_spec.operations & OPERATION_INC) != 0 && (m_spec.operations & OPERATION_DEC) == 0)
546*35238bceSAndroid Build Coastguard Worker expectedValue = initialValue + (m_spec.useBranches ? m_spec.threadCount * m_spec.callCount -
547*35238bceSAndroid Build Coastguard Worker m_spec.threadCount * m_spec.callCount / 2 :
548*35238bceSAndroid Build Coastguard Worker m_spec.threadCount * m_spec.callCount);
549*35238bceSAndroid Build Coastguard Worker
550*35238bceSAndroid Build Coastguard Worker if ((m_spec.operations & OPERATION_INC) == 0 && (m_spec.operations & OPERATION_DEC) != 0)
551*35238bceSAndroid Build Coastguard Worker expectedValue = initialValue - (m_spec.useBranches ? m_spec.threadCount * m_spec.callCount -
552*35238bceSAndroid Build Coastguard Worker m_spec.threadCount * m_spec.callCount / 2 :
553*35238bceSAndroid Build Coastguard Worker m_spec.threadCount * m_spec.callCount);
554*35238bceSAndroid Build Coastguard Worker
555*35238bceSAndroid Build Coastguard Worker if ((m_spec.operations & OPERATION_INC) != 0 && (m_spec.operations & OPERATION_DEC) != 0)
556*35238bceSAndroid Build Coastguard Worker expectedValue = initialValue +
557*35238bceSAndroid Build Coastguard Worker (m_spec.useBranches ?
558*35238bceSAndroid Build Coastguard Worker m_spec.threadCount * m_spec.callCount - m_spec.threadCount * m_spec.callCount / 2 :
559*35238bceSAndroid Build Coastguard Worker 0) -
560*35238bceSAndroid Build Coastguard Worker (m_spec.useBranches ? m_spec.threadCount * m_spec.callCount / 2 : 0);
561*35238bceSAndroid Build Coastguard Worker
562*35238bceSAndroid Build Coastguard Worker if ((m_spec.operations & OPERATION_INC) == 0 && (m_spec.operations & OPERATION_DEC) == 0)
563*35238bceSAndroid Build Coastguard Worker expectedValue = initialValue;
564*35238bceSAndroid Build Coastguard Worker
565*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "atomic_uint counter" << counterNdx << " initial value: " << initialValue
566*35238bceSAndroid Build Coastguard Worker << ", value: " << value << ", expected: " << expectedValue << (value == expectedValue ? "" : ", failed!")
567*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
568*35238bceSAndroid Build Coastguard Worker
569*35238bceSAndroid Build Coastguard Worker if (value != expectedValue)
570*35238bceSAndroid Build Coastguard Worker isOk = false;
571*35238bceSAndroid Build Coastguard Worker }
572*35238bceSAndroid Build Coastguard Worker
573*35238bceSAndroid Build Coastguard Worker return isOk;
574*35238bceSAndroid Build Coastguard Worker }
575*35238bceSAndroid Build Coastguard Worker
splitBuffer(const vector<uint32_t> & buffer,vector<uint32_t> & increments,vector<uint32_t> & decrements,vector<uint32_t> & preGets,vector<uint32_t> & postGets,vector<uint32_t> & gets) const576*35238bceSAndroid Build Coastguard Worker void AtomicCounterTest::splitBuffer(const vector<uint32_t> &buffer, vector<uint32_t> &increments,
577*35238bceSAndroid Build Coastguard Worker vector<uint32_t> &decrements, vector<uint32_t> &preGets, vector<uint32_t> &postGets,
578*35238bceSAndroid Build Coastguard Worker vector<uint32_t> &gets) const
579*35238bceSAndroid Build Coastguard Worker {
580*35238bceSAndroid Build Coastguard Worker const int bufferValueCount = m_spec.callCount * m_spec.threadCount * m_spec.atomicCounterCount;
581*35238bceSAndroid Build Coastguard Worker
582*35238bceSAndroid Build Coastguard Worker int firstPreGet = -1;
583*35238bceSAndroid Build Coastguard Worker int firstPostGet = -1;
584*35238bceSAndroid Build Coastguard Worker int firstGet = -1;
585*35238bceSAndroid Build Coastguard Worker int firstInc = -1;
586*35238bceSAndroid Build Coastguard Worker int firstDec = -1;
587*35238bceSAndroid Build Coastguard Worker
588*35238bceSAndroid Build Coastguard Worker increments.clear();
589*35238bceSAndroid Build Coastguard Worker decrements.clear();
590*35238bceSAndroid Build Coastguard Worker preGets.clear();
591*35238bceSAndroid Build Coastguard Worker postGets.clear();
592*35238bceSAndroid Build Coastguard Worker gets.clear();
593*35238bceSAndroid Build Coastguard Worker
594*35238bceSAndroid Build Coastguard Worker if (m_spec.operations == OPERATION_GET)
595*35238bceSAndroid Build Coastguard Worker firstGet = 0;
596*35238bceSAndroid Build Coastguard Worker else if (m_spec.operations == OPERATION_INC)
597*35238bceSAndroid Build Coastguard Worker firstInc = 0;
598*35238bceSAndroid Build Coastguard Worker else if (m_spec.operations == OPERATION_DEC)
599*35238bceSAndroid Build Coastguard Worker firstDec = 0;
600*35238bceSAndroid Build Coastguard Worker else if (m_spec.operations == (OPERATION_GET | OPERATION_INC))
601*35238bceSAndroid Build Coastguard Worker {
602*35238bceSAndroid Build Coastguard Worker firstPreGet = 0;
603*35238bceSAndroid Build Coastguard Worker firstInc = bufferValueCount;
604*35238bceSAndroid Build Coastguard Worker firstPostGet = bufferValueCount * 2;
605*35238bceSAndroid Build Coastguard Worker }
606*35238bceSAndroid Build Coastguard Worker else if (m_spec.operations == (OPERATION_GET | OPERATION_DEC))
607*35238bceSAndroid Build Coastguard Worker {
608*35238bceSAndroid Build Coastguard Worker firstPreGet = 0;
609*35238bceSAndroid Build Coastguard Worker firstDec = bufferValueCount;
610*35238bceSAndroid Build Coastguard Worker firstPostGet = bufferValueCount * 2;
611*35238bceSAndroid Build Coastguard Worker }
612*35238bceSAndroid Build Coastguard Worker else if (m_spec.operations == (OPERATION_GET | OPERATION_DEC | OPERATION_INC))
613*35238bceSAndroid Build Coastguard Worker {
614*35238bceSAndroid Build Coastguard Worker firstPreGet = 0;
615*35238bceSAndroid Build Coastguard Worker firstInc = bufferValueCount;
616*35238bceSAndroid Build Coastguard Worker firstDec = bufferValueCount * 2;
617*35238bceSAndroid Build Coastguard Worker firstPostGet = bufferValueCount * 3;
618*35238bceSAndroid Build Coastguard Worker }
619*35238bceSAndroid Build Coastguard Worker else if (m_spec.operations == (OPERATION_DEC | OPERATION_INC))
620*35238bceSAndroid Build Coastguard Worker {
621*35238bceSAndroid Build Coastguard Worker firstInc = 0;
622*35238bceSAndroid Build Coastguard Worker firstDec = bufferValueCount;
623*35238bceSAndroid Build Coastguard Worker }
624*35238bceSAndroid Build Coastguard Worker else
625*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
626*35238bceSAndroid Build Coastguard Worker
627*35238bceSAndroid Build Coastguard Worker for (int threadNdx = 0; threadNdx < m_spec.threadCount; threadNdx++)
628*35238bceSAndroid Build Coastguard Worker {
629*35238bceSAndroid Build Coastguard Worker for (int callNdx = 0; callNdx < m_spec.callCount; callNdx++)
630*35238bceSAndroid Build Coastguard Worker {
631*35238bceSAndroid Build Coastguard Worker for (int counterNdx = 0; counterNdx < m_spec.atomicCounterCount; counterNdx++)
632*35238bceSAndroid Build Coastguard Worker {
633*35238bceSAndroid Build Coastguard Worker const int id = ((threadNdx * m_spec.callCount) + callNdx) * m_spec.atomicCounterCount + counterNdx;
634*35238bceSAndroid Build Coastguard Worker
635*35238bceSAndroid Build Coastguard Worker if (firstInc != -1)
636*35238bceSAndroid Build Coastguard Worker increments.push_back(buffer[firstInc + id]);
637*35238bceSAndroid Build Coastguard Worker
638*35238bceSAndroid Build Coastguard Worker if (firstDec != -1)
639*35238bceSAndroid Build Coastguard Worker decrements.push_back(buffer[firstDec + id]);
640*35238bceSAndroid Build Coastguard Worker
641*35238bceSAndroid Build Coastguard Worker if (firstPreGet != -1)
642*35238bceSAndroid Build Coastguard Worker preGets.push_back(buffer[firstPreGet + id]);
643*35238bceSAndroid Build Coastguard Worker
644*35238bceSAndroid Build Coastguard Worker if (firstPostGet != -1)
645*35238bceSAndroid Build Coastguard Worker postGets.push_back(buffer[firstPostGet + id]);
646*35238bceSAndroid Build Coastguard Worker
647*35238bceSAndroid Build Coastguard Worker if (firstGet != -1)
648*35238bceSAndroid Build Coastguard Worker gets.push_back(buffer[firstGet + id]);
649*35238bceSAndroid Build Coastguard Worker }
650*35238bceSAndroid Build Coastguard Worker }
651*35238bceSAndroid Build Coastguard Worker }
652*35238bceSAndroid Build Coastguard Worker }
653*35238bceSAndroid Build Coastguard Worker
getCountersValues(vector<uint32_t> & counterValues,const vector<uint32_t> & values,int ndx,int counterCount)654*35238bceSAndroid Build Coastguard Worker void AtomicCounterTest::getCountersValues(vector<uint32_t> &counterValues, const vector<uint32_t> &values, int ndx,
655*35238bceSAndroid Build Coastguard Worker int counterCount)
656*35238bceSAndroid Build Coastguard Worker {
657*35238bceSAndroid Build Coastguard Worker counterValues.resize(values.size() / counterCount, 0);
658*35238bceSAndroid Build Coastguard Worker
659*35238bceSAndroid Build Coastguard Worker DE_ASSERT(values.size() % counterCount == 0);
660*35238bceSAndroid Build Coastguard Worker
661*35238bceSAndroid Build Coastguard Worker for (int valueNdx = 0; valueNdx < (int)counterValues.size(); valueNdx++)
662*35238bceSAndroid Build Coastguard Worker counterValues[valueNdx] = values[valueNdx * counterCount + ndx];
663*35238bceSAndroid Build Coastguard Worker }
664*35238bceSAndroid Build Coastguard Worker
checkRange(TestLog & log,const vector<uint32_t> & values,const vector<uint32_t> & min,const vector<uint32_t> & max)665*35238bceSAndroid Build Coastguard Worker bool AtomicCounterTest::checkRange(TestLog &log, const vector<uint32_t> &values, const vector<uint32_t> &min,
666*35238bceSAndroid Build Coastguard Worker const vector<uint32_t> &max)
667*35238bceSAndroid Build Coastguard Worker {
668*35238bceSAndroid Build Coastguard Worker int failedCount = 0;
669*35238bceSAndroid Build Coastguard Worker
670*35238bceSAndroid Build Coastguard Worker DE_ASSERT(values.size() == min.size());
671*35238bceSAndroid Build Coastguard Worker DE_ASSERT(values.size() == max.size());
672*35238bceSAndroid Build Coastguard Worker
673*35238bceSAndroid Build Coastguard Worker for (int valueNdx = 0; valueNdx < (int)values.size(); valueNdx++)
674*35238bceSAndroid Build Coastguard Worker {
675*35238bceSAndroid Build Coastguard Worker if (values[valueNdx] != (uint32_t)-1)
676*35238bceSAndroid Build Coastguard Worker {
677*35238bceSAndroid Build Coastguard Worker if (!deInRange32(values[valueNdx], min[valueNdx], max[valueNdx]))
678*35238bceSAndroid Build Coastguard Worker {
679*35238bceSAndroid Build Coastguard Worker if (failedCount < 20)
680*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Value " << values[valueNdx] << " not in range [" << min[valueNdx]
681*35238bceSAndroid Build Coastguard Worker << ", " << max[valueNdx] << "]." << TestLog::EndMessage;
682*35238bceSAndroid Build Coastguard Worker failedCount++;
683*35238bceSAndroid Build Coastguard Worker }
684*35238bceSAndroid Build Coastguard Worker }
685*35238bceSAndroid Build Coastguard Worker }
686*35238bceSAndroid Build Coastguard Worker
687*35238bceSAndroid Build Coastguard Worker if (failedCount > 20)
688*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Number of values not in range: " << failedCount << ", displaying first 20 values."
689*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
690*35238bceSAndroid Build Coastguard Worker
691*35238bceSAndroid Build Coastguard Worker return failedCount == 0;
692*35238bceSAndroid Build Coastguard Worker }
693*35238bceSAndroid Build Coastguard Worker
checkUniquenessAndLinearity(TestLog & log,const vector<uint32_t> & values)694*35238bceSAndroid Build Coastguard Worker bool AtomicCounterTest::checkUniquenessAndLinearity(TestLog &log, const vector<uint32_t> &values)
695*35238bceSAndroid Build Coastguard Worker {
696*35238bceSAndroid Build Coastguard Worker vector<uint32_t> counts;
697*35238bceSAndroid Build Coastguard Worker int failedCount = 0;
698*35238bceSAndroid Build Coastguard Worker uint32_t minValue = (uint32_t)-1;
699*35238bceSAndroid Build Coastguard Worker uint32_t maxValue = 0;
700*35238bceSAndroid Build Coastguard Worker
701*35238bceSAndroid Build Coastguard Worker DE_ASSERT(!values.empty());
702*35238bceSAndroid Build Coastguard Worker
703*35238bceSAndroid Build Coastguard Worker for (int valueNdx = 0; valueNdx < (int)values.size(); valueNdx++)
704*35238bceSAndroid Build Coastguard Worker {
705*35238bceSAndroid Build Coastguard Worker if (values[valueNdx] != (uint32_t)-1)
706*35238bceSAndroid Build Coastguard Worker {
707*35238bceSAndroid Build Coastguard Worker minValue = std::min(minValue, values[valueNdx]);
708*35238bceSAndroid Build Coastguard Worker maxValue = std::max(maxValue, values[valueNdx]);
709*35238bceSAndroid Build Coastguard Worker }
710*35238bceSAndroid Build Coastguard Worker }
711*35238bceSAndroid Build Coastguard Worker
712*35238bceSAndroid Build Coastguard Worker counts.resize(maxValue - minValue + 1, 0);
713*35238bceSAndroid Build Coastguard Worker
714*35238bceSAndroid Build Coastguard Worker for (int valueNdx = 0; valueNdx < (int)values.size(); valueNdx++)
715*35238bceSAndroid Build Coastguard Worker {
716*35238bceSAndroid Build Coastguard Worker if (values[valueNdx] != (uint32_t)-1)
717*35238bceSAndroid Build Coastguard Worker counts[values[valueNdx] - minValue]++;
718*35238bceSAndroid Build Coastguard Worker }
719*35238bceSAndroid Build Coastguard Worker
720*35238bceSAndroid Build Coastguard Worker for (int countNdx = 0; countNdx < (int)counts.size(); countNdx++)
721*35238bceSAndroid Build Coastguard Worker {
722*35238bceSAndroid Build Coastguard Worker if (counts[countNdx] != 1)
723*35238bceSAndroid Build Coastguard Worker {
724*35238bceSAndroid Build Coastguard Worker if (failedCount < 20)
725*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Value " << (minValue + countNdx) << " is not unique. Returned "
726*35238bceSAndroid Build Coastguard Worker << counts[countNdx] << " times." << TestLog::EndMessage;
727*35238bceSAndroid Build Coastguard Worker
728*35238bceSAndroid Build Coastguard Worker failedCount++;
729*35238bceSAndroid Build Coastguard Worker }
730*35238bceSAndroid Build Coastguard Worker }
731*35238bceSAndroid Build Coastguard Worker
732*35238bceSAndroid Build Coastguard Worker if (failedCount > 20)
733*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Number of values not unique: " << failedCount << ", displaying first 20 values."
734*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
735*35238bceSAndroid Build Coastguard Worker
736*35238bceSAndroid Build Coastguard Worker return failedCount == 0;
737*35238bceSAndroid Build Coastguard Worker }
738*35238bceSAndroid Build Coastguard Worker
checkPath(const vector<uint32_t> & increments,const vector<uint32_t> & decrements,int initialValue,const TestSpec & spec)739*35238bceSAndroid Build Coastguard Worker bool AtomicCounterTest::checkPath(const vector<uint32_t> &increments, const vector<uint32_t> &decrements,
740*35238bceSAndroid Build Coastguard Worker int initialValue, const TestSpec &spec)
741*35238bceSAndroid Build Coastguard Worker {
742*35238bceSAndroid Build Coastguard Worker const uint32_t lastValue =
743*35238bceSAndroid Build Coastguard Worker initialValue +
744*35238bceSAndroid Build Coastguard Worker (spec.useBranches ? spec.threadCount * spec.callCount - spec.threadCount * spec.callCount / 2 : 0) -
745*35238bceSAndroid Build Coastguard Worker (spec.useBranches ? spec.threadCount * spec.callCount / 2 : 0);
746*35238bceSAndroid Build Coastguard Worker bool isOk = true;
747*35238bceSAndroid Build Coastguard Worker
748*35238bceSAndroid Build Coastguard Worker vector<uint32_t> incrementCounts;
749*35238bceSAndroid Build Coastguard Worker vector<uint32_t> decrementCounts;
750*35238bceSAndroid Build Coastguard Worker
751*35238bceSAndroid Build Coastguard Worker uint32_t minValue = 0xFFFFFFFFu;
752*35238bceSAndroid Build Coastguard Worker uint32_t maxValue = 0;
753*35238bceSAndroid Build Coastguard Worker
754*35238bceSAndroid Build Coastguard Worker for (int valueNdx = 0; valueNdx < (int)increments.size(); valueNdx++)
755*35238bceSAndroid Build Coastguard Worker {
756*35238bceSAndroid Build Coastguard Worker if (increments[valueNdx] != (uint32_t)-1)
757*35238bceSAndroid Build Coastguard Worker {
758*35238bceSAndroid Build Coastguard Worker minValue = std::min(minValue, increments[valueNdx]);
759*35238bceSAndroid Build Coastguard Worker maxValue = std::max(maxValue, increments[valueNdx]);
760*35238bceSAndroid Build Coastguard Worker }
761*35238bceSAndroid Build Coastguard Worker }
762*35238bceSAndroid Build Coastguard Worker
763*35238bceSAndroid Build Coastguard Worker for (int valueNdx = 0; valueNdx < (int)decrements.size(); valueNdx++)
764*35238bceSAndroid Build Coastguard Worker {
765*35238bceSAndroid Build Coastguard Worker if (decrements[valueNdx] != (uint32_t)-1)
766*35238bceSAndroid Build Coastguard Worker {
767*35238bceSAndroid Build Coastguard Worker minValue = std::min(minValue, decrements[valueNdx]);
768*35238bceSAndroid Build Coastguard Worker maxValue = std::max(maxValue, decrements[valueNdx]);
769*35238bceSAndroid Build Coastguard Worker }
770*35238bceSAndroid Build Coastguard Worker }
771*35238bceSAndroid Build Coastguard Worker
772*35238bceSAndroid Build Coastguard Worker minValue = std::min(minValue, (uint32_t)initialValue);
773*35238bceSAndroid Build Coastguard Worker maxValue = std::max(maxValue, (uint32_t)initialValue);
774*35238bceSAndroid Build Coastguard Worker
775*35238bceSAndroid Build Coastguard Worker incrementCounts.resize(maxValue - minValue + 1, 0);
776*35238bceSAndroid Build Coastguard Worker decrementCounts.resize(maxValue - minValue + 1, 0);
777*35238bceSAndroid Build Coastguard Worker
778*35238bceSAndroid Build Coastguard Worker for (int valueNdx = 0; valueNdx < (int)increments.size(); valueNdx++)
779*35238bceSAndroid Build Coastguard Worker {
780*35238bceSAndroid Build Coastguard Worker if (increments[valueNdx] != (uint32_t)-1)
781*35238bceSAndroid Build Coastguard Worker incrementCounts[increments[valueNdx] - minValue]++;
782*35238bceSAndroid Build Coastguard Worker }
783*35238bceSAndroid Build Coastguard Worker
784*35238bceSAndroid Build Coastguard Worker for (int valueNdx = 0; valueNdx < (int)decrements.size(); valueNdx++)
785*35238bceSAndroid Build Coastguard Worker {
786*35238bceSAndroid Build Coastguard Worker if (decrements[valueNdx] != (uint32_t)-1)
787*35238bceSAndroid Build Coastguard Worker decrementCounts[decrements[valueNdx] - minValue]++;
788*35238bceSAndroid Build Coastguard Worker }
789*35238bceSAndroid Build Coastguard Worker
790*35238bceSAndroid Build Coastguard Worker int pos = initialValue - minValue;
791*35238bceSAndroid Build Coastguard Worker
792*35238bceSAndroid Build Coastguard Worker while (incrementCounts[pos] + decrementCounts[pos] != 0)
793*35238bceSAndroid Build Coastguard Worker {
794*35238bceSAndroid Build Coastguard Worker if (incrementCounts[pos] > 0 && pos >= (int)(lastValue - minValue))
795*35238bceSAndroid Build Coastguard Worker {
796*35238bceSAndroid Build Coastguard Worker // If can increment and incrementation would move us away from result value, increment
797*35238bceSAndroid Build Coastguard Worker incrementCounts[pos]--;
798*35238bceSAndroid Build Coastguard Worker pos++;
799*35238bceSAndroid Build Coastguard Worker }
800*35238bceSAndroid Build Coastguard Worker else if (decrementCounts[pos] > 0)
801*35238bceSAndroid Build Coastguard Worker {
802*35238bceSAndroid Build Coastguard Worker // If can, decrement
803*35238bceSAndroid Build Coastguard Worker decrementCounts[pos]--;
804*35238bceSAndroid Build Coastguard Worker pos--;
805*35238bceSAndroid Build Coastguard Worker }
806*35238bceSAndroid Build Coastguard Worker else if (incrementCounts[pos] > 0)
807*35238bceSAndroid Build Coastguard Worker {
808*35238bceSAndroid Build Coastguard Worker // If increment moves closer to result value and can't decrement, increment
809*35238bceSAndroid Build Coastguard Worker incrementCounts[pos]--;
810*35238bceSAndroid Build Coastguard Worker pos++;
811*35238bceSAndroid Build Coastguard Worker }
812*35238bceSAndroid Build Coastguard Worker else
813*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
814*35238bceSAndroid Build Coastguard Worker
815*35238bceSAndroid Build Coastguard Worker if (pos < 0 || pos >= (int)incrementCounts.size())
816*35238bceSAndroid Build Coastguard Worker break;
817*35238bceSAndroid Build Coastguard Worker }
818*35238bceSAndroid Build Coastguard Worker
819*35238bceSAndroid Build Coastguard Worker if (minValue + pos != lastValue)
820*35238bceSAndroid Build Coastguard Worker isOk = false;
821*35238bceSAndroid Build Coastguard Worker
822*35238bceSAndroid Build Coastguard Worker for (int valueNdx = 0; valueNdx < (int)incrementCounts.size(); valueNdx++)
823*35238bceSAndroid Build Coastguard Worker {
824*35238bceSAndroid Build Coastguard Worker if (incrementCounts[valueNdx] != 0)
825*35238bceSAndroid Build Coastguard Worker isOk = false;
826*35238bceSAndroid Build Coastguard Worker }
827*35238bceSAndroid Build Coastguard Worker
828*35238bceSAndroid Build Coastguard Worker for (int valueNdx = 0; valueNdx < (int)decrementCounts.size(); valueNdx++)
829*35238bceSAndroid Build Coastguard Worker {
830*35238bceSAndroid Build Coastguard Worker if (decrementCounts[valueNdx] != 0)
831*35238bceSAndroid Build Coastguard Worker isOk = false;
832*35238bceSAndroid Build Coastguard Worker }
833*35238bceSAndroid Build Coastguard Worker
834*35238bceSAndroid Build Coastguard Worker return isOk;
835*35238bceSAndroid Build Coastguard Worker }
836*35238bceSAndroid Build Coastguard Worker
checkAndLogCallValues(TestLog & log,const vector<uint32_t> & increments,const vector<uint32_t> & decrements,const vector<uint32_t> & preGets,const vector<uint32_t> & postGets,const vector<uint32_t> & gets) const837*35238bceSAndroid Build Coastguard Worker bool AtomicCounterTest::checkAndLogCallValues(TestLog &log, const vector<uint32_t> &increments,
838*35238bceSAndroid Build Coastguard Worker const vector<uint32_t> &decrements, const vector<uint32_t> &preGets,
839*35238bceSAndroid Build Coastguard Worker const vector<uint32_t> &postGets, const vector<uint32_t> &gets) const
840*35238bceSAndroid Build Coastguard Worker {
841*35238bceSAndroid Build Coastguard Worker bool isOk = true;
842*35238bceSAndroid Build Coastguard Worker
843*35238bceSAndroid Build Coastguard Worker for (int counterNdx = 0; counterNdx < m_spec.atomicCounterCount; counterNdx++)
844*35238bceSAndroid Build Coastguard Worker {
845*35238bceSAndroid Build Coastguard Worker vector<uint32_t> counterIncrements;
846*35238bceSAndroid Build Coastguard Worker vector<uint32_t> counterDecrements;
847*35238bceSAndroid Build Coastguard Worker vector<uint32_t> counterPreGets;
848*35238bceSAndroid Build Coastguard Worker vector<uint32_t> counterPostGets;
849*35238bceSAndroid Build Coastguard Worker vector<uint32_t> counterGets;
850*35238bceSAndroid Build Coastguard Worker
851*35238bceSAndroid Build Coastguard Worker getCountersValues(counterIncrements, increments, counterNdx, m_spec.atomicCounterCount);
852*35238bceSAndroid Build Coastguard Worker getCountersValues(counterDecrements, decrements, counterNdx, m_spec.atomicCounterCount);
853*35238bceSAndroid Build Coastguard Worker getCountersValues(counterPreGets, preGets, counterNdx, m_spec.atomicCounterCount);
854*35238bceSAndroid Build Coastguard Worker getCountersValues(counterPostGets, postGets, counterNdx, m_spec.atomicCounterCount);
855*35238bceSAndroid Build Coastguard Worker getCountersValues(counterGets, gets, counterNdx, m_spec.atomicCounterCount);
856*35238bceSAndroid Build Coastguard Worker
857*35238bceSAndroid Build Coastguard Worker if (m_spec.operations == OPERATION_GET)
858*35238bceSAndroid Build Coastguard Worker {
859*35238bceSAndroid Build Coastguard Worker tcu::ScopedLogSection valueCheck(
860*35238bceSAndroid Build Coastguard Worker log, ("counter" + de::toString(counterNdx) + " value check").c_str(),
861*35238bceSAndroid Build Coastguard Worker ("Check that counter" + de::toString(counterNdx) + " values haven't changed.").c_str());
862*35238bceSAndroid Build Coastguard Worker int changedValues = 0;
863*35238bceSAndroid Build Coastguard Worker
864*35238bceSAndroid Build Coastguard Worker for (int valueNdx = 0; valueNdx < (int)gets.size(); valueNdx++)
865*35238bceSAndroid Build Coastguard Worker {
866*35238bceSAndroid Build Coastguard Worker if ((!m_spec.useBranches || gets[valueNdx] != (uint32_t)-1) && gets[valueNdx] != getInitialValue())
867*35238bceSAndroid Build Coastguard Worker {
868*35238bceSAndroid Build Coastguard Worker if (changedValues < 20)
869*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "atomicCounter(counter" << counterNdx << ") returned "
870*35238bceSAndroid Build Coastguard Worker << gets[valueNdx] << " expected " << getInitialValue() << TestLog::EndMessage;
871*35238bceSAndroid Build Coastguard Worker isOk = false;
872*35238bceSAndroid Build Coastguard Worker changedValues++;
873*35238bceSAndroid Build Coastguard Worker }
874*35238bceSAndroid Build Coastguard Worker }
875*35238bceSAndroid Build Coastguard Worker
876*35238bceSAndroid Build Coastguard Worker if (changedValues == 0)
877*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "All values returned by atomicCounter(counter" << counterNdx
878*35238bceSAndroid Build Coastguard Worker << ") match initial value " << getInitialValue() << "." << TestLog::EndMessage;
879*35238bceSAndroid Build Coastguard Worker else if (changedValues > 20)
880*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Total number of invalid values returned by atomicCounter(counter"
881*35238bceSAndroid Build Coastguard Worker << counterNdx << ") " << changedValues << " displaying first 20 values." << TestLog::EndMessage;
882*35238bceSAndroid Build Coastguard Worker }
883*35238bceSAndroid Build Coastguard Worker else if ((m_spec.operations & (OPERATION_INC | OPERATION_DEC)) == (OPERATION_INC | OPERATION_DEC))
884*35238bceSAndroid Build Coastguard Worker {
885*35238bceSAndroid Build Coastguard Worker tcu::ScopedLogSection valueCheck(log, ("counter" + de::toString(counterNdx) + " path check").c_str(),
886*35238bceSAndroid Build Coastguard Worker ("Check that there is order in which counter" + de::toString(counterNdx) +
887*35238bceSAndroid Build Coastguard Worker " increments and decrements could have happened.")
888*35238bceSAndroid Build Coastguard Worker .c_str());
889*35238bceSAndroid Build Coastguard Worker if (!checkPath(counterIncrements, counterDecrements, getInitialValue(), m_spec))
890*35238bceSAndroid Build Coastguard Worker {
891*35238bceSAndroid Build Coastguard Worker isOk = false;
892*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "No possible order of calls to atomicCounterIncrement(counter" << counterNdx
893*35238bceSAndroid Build Coastguard Worker << ") and atomicCounterDecrement(counter" << counterNdx << ") found." << TestLog::EndMessage;
894*35238bceSAndroid Build Coastguard Worker }
895*35238bceSAndroid Build Coastguard Worker else
896*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Found possible order of calls to atomicCounterIncrement(counter"
897*35238bceSAndroid Build Coastguard Worker << counterNdx << ") and atomicCounterDecrement(counter" << counterNdx << ")."
898*35238bceSAndroid Build Coastguard Worker << TestLog::EndMessage;
899*35238bceSAndroid Build Coastguard Worker }
900*35238bceSAndroid Build Coastguard Worker else if ((m_spec.operations & OPERATION_INC) != 0)
901*35238bceSAndroid Build Coastguard Worker {
902*35238bceSAndroid Build Coastguard Worker {
903*35238bceSAndroid Build Coastguard Worker tcu::ScopedLogSection uniquenesCheck(
904*35238bceSAndroid Build Coastguard Worker log, ("counter" + de::toString(counterNdx) + " check uniqueness and linearity").c_str(),
905*35238bceSAndroid Build Coastguard Worker ("Check that counter" + de::toString(counterNdx) + " returned only unique and linear values.")
906*35238bceSAndroid Build Coastguard Worker .c_str());
907*35238bceSAndroid Build Coastguard Worker
908*35238bceSAndroid Build Coastguard Worker if (!checkUniquenessAndLinearity(log, counterIncrements))
909*35238bceSAndroid Build Coastguard Worker {
910*35238bceSAndroid Build Coastguard Worker isOk = false;
911*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "atomicCounterIncrement(counter" << counterNdx
912*35238bceSAndroid Build Coastguard Worker << ") returned non unique values." << TestLog::EndMessage;
913*35238bceSAndroid Build Coastguard Worker }
914*35238bceSAndroid Build Coastguard Worker else
915*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "atomicCounterIncrement(counter" << counterNdx
916*35238bceSAndroid Build Coastguard Worker << ") returned only unique values." << TestLog::EndMessage;
917*35238bceSAndroid Build Coastguard Worker }
918*35238bceSAndroid Build Coastguard Worker
919*35238bceSAndroid Build Coastguard Worker if (isOk && ((m_spec.operations & OPERATION_GET) != 0))
920*35238bceSAndroid Build Coastguard Worker {
921*35238bceSAndroid Build Coastguard Worker tcu::ScopedLogSection uniquenesCheck(
922*35238bceSAndroid Build Coastguard Worker log, ("counter" + de::toString(counterNdx) + " check range").c_str(),
923*35238bceSAndroid Build Coastguard Worker ("Check that counter" + de::toString(counterNdx) +
924*35238bceSAndroid Build Coastguard Worker " returned only values values between previous and next atomicCounter(counter" +
925*35238bceSAndroid Build Coastguard Worker de::toString(counterNdx) + ").")
926*35238bceSAndroid Build Coastguard Worker .c_str());
927*35238bceSAndroid Build Coastguard Worker
928*35238bceSAndroid Build Coastguard Worker if (!checkRange(log, counterIncrements, counterPreGets, counterPostGets))
929*35238bceSAndroid Build Coastguard Worker {
930*35238bceSAndroid Build Coastguard Worker isOk = false;
931*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "atomicCounterIncrement(counter" << counterNdx
932*35238bceSAndroid Build Coastguard Worker << ") returned value that is not between previous and next call to atomicCounter(counter"
933*35238bceSAndroid Build Coastguard Worker << counterNdx << ")." << TestLog::EndMessage;
934*35238bceSAndroid Build Coastguard Worker }
935*35238bceSAndroid Build Coastguard Worker else
936*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "atomicCounterIncrement(counter" << counterNdx
937*35238bceSAndroid Build Coastguard Worker << ") returned only values between previous and next call to atomicCounter(counter"
938*35238bceSAndroid Build Coastguard Worker << counterNdx << ")." << TestLog::EndMessage;
939*35238bceSAndroid Build Coastguard Worker }
940*35238bceSAndroid Build Coastguard Worker }
941*35238bceSAndroid Build Coastguard Worker else if ((m_spec.operations & OPERATION_DEC) != 0)
942*35238bceSAndroid Build Coastguard Worker {
943*35238bceSAndroid Build Coastguard Worker {
944*35238bceSAndroid Build Coastguard Worker tcu::ScopedLogSection uniquenesCheck(
945*35238bceSAndroid Build Coastguard Worker log, ("counter" + de::toString(counterNdx) + " check uniqueness and linearity").c_str(),
946*35238bceSAndroid Build Coastguard Worker ("Check that counter" + de::toString(counterNdx) + " returned only unique and linear values.")
947*35238bceSAndroid Build Coastguard Worker .c_str());
948*35238bceSAndroid Build Coastguard Worker
949*35238bceSAndroid Build Coastguard Worker if (!checkUniquenessAndLinearity(log, counterDecrements))
950*35238bceSAndroid Build Coastguard Worker {
951*35238bceSAndroid Build Coastguard Worker isOk = false;
952*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "atomicCounterDecrement(counter" << counterNdx
953*35238bceSAndroid Build Coastguard Worker << ") returned non unique values." << TestLog::EndMessage;
954*35238bceSAndroid Build Coastguard Worker }
955*35238bceSAndroid Build Coastguard Worker else
956*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "atomicCounterDecrement(counter" << counterNdx
957*35238bceSAndroid Build Coastguard Worker << ") returned only unique values." << TestLog::EndMessage;
958*35238bceSAndroid Build Coastguard Worker }
959*35238bceSAndroid Build Coastguard Worker
960*35238bceSAndroid Build Coastguard Worker if (isOk && ((m_spec.operations & OPERATION_GET) != 0))
961*35238bceSAndroid Build Coastguard Worker {
962*35238bceSAndroid Build Coastguard Worker tcu::ScopedLogSection uniquenesCheck(
963*35238bceSAndroid Build Coastguard Worker log, ("counter" + de::toString(counterNdx) + " check range").c_str(),
964*35238bceSAndroid Build Coastguard Worker ("Check that counter" + de::toString(counterNdx) +
965*35238bceSAndroid Build Coastguard Worker " returned only values values between previous and next atomicCounter(counter" +
966*35238bceSAndroid Build Coastguard Worker de::toString(counterNdx) + ".")
967*35238bceSAndroid Build Coastguard Worker .c_str());
968*35238bceSAndroid Build Coastguard Worker
969*35238bceSAndroid Build Coastguard Worker if (!checkRange(log, counterDecrements, counterPostGets, counterPreGets))
970*35238bceSAndroid Build Coastguard Worker {
971*35238bceSAndroid Build Coastguard Worker isOk = false;
972*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "atomicCounterDecrement(counter" << counterNdx
973*35238bceSAndroid Build Coastguard Worker << ") returned value that is not between previous and next call to atomicCounter(counter"
974*35238bceSAndroid Build Coastguard Worker << counterNdx << ")." << TestLog::EndMessage;
975*35238bceSAndroid Build Coastguard Worker }
976*35238bceSAndroid Build Coastguard Worker else
977*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "atomicCounterDecrement(counter" << counterNdx
978*35238bceSAndroid Build Coastguard Worker << ") returned only values between previous and next call to atomicCounter(counter"
979*35238bceSAndroid Build Coastguard Worker << counterNdx << ")." << TestLog::EndMessage;
980*35238bceSAndroid Build Coastguard Worker }
981*35238bceSAndroid Build Coastguard Worker }
982*35238bceSAndroid Build Coastguard Worker }
983*35238bceSAndroid Build Coastguard Worker
984*35238bceSAndroid Build Coastguard Worker return isOk;
985*35238bceSAndroid Build Coastguard Worker }
986*35238bceSAndroid Build Coastguard Worker
iterate(void)987*35238bceSAndroid Build Coastguard Worker TestCase::IterateResult AtomicCounterTest::iterate(void)
988*35238bceSAndroid Build Coastguard Worker {
989*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
990*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
991*35238bceSAndroid Build Coastguard Worker const glu::Buffer counterBuffer(m_context.getRenderContext());
992*35238bceSAndroid Build Coastguard Worker const glu::Buffer outputBuffer(m_context.getRenderContext());
993*35238bceSAndroid Build Coastguard Worker const glu::ShaderProgram program(m_context.getRenderContext(),
994*35238bceSAndroid Build Coastguard Worker glu::ProgramSources()
995*35238bceSAndroid Build Coastguard Worker << glu::ShaderSource(glu::SHADERTYPE_COMPUTE, generateShaderSource(m_spec)));
996*35238bceSAndroid Build Coastguard Worker
997*35238bceSAndroid Build Coastguard Worker const int32_t counterBufferSize = m_spec.atomicCounterCount * 4;
998*35238bceSAndroid Build Coastguard Worker const int32_t ssoSize = m_spec.atomicCounterCount * m_spec.callCount * m_spec.threadCount * 4 * getOperationCount();
999*35238bceSAndroid Build Coastguard Worker
1000*35238bceSAndroid Build Coastguard Worker log << program;
1001*35238bceSAndroid Build Coastguard Worker
1002*35238bceSAndroid Build Coastguard Worker if (m_spec.offsetType == OFFSETTYPE_INVALID || m_spec.offsetType == OFFSETTYPE_INVALID_DEFAULT ||
1003*35238bceSAndroid Build Coastguard Worker m_spec.bindingType == BINDINGTYPE_INVALID || m_spec.bindingType == BINDINGTYPE_INVALID_DEFAULT ||
1004*35238bceSAndroid Build Coastguard Worker m_spec.offsetType == OFFSETTYPE_INVALID_OVERLAPPING)
1005*35238bceSAndroid Build Coastguard Worker {
1006*35238bceSAndroid Build Coastguard Worker if (program.isOk())
1007*35238bceSAndroid Build Coastguard Worker {
1008*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Expected program to fail, but compilation passed." << TestLog::EndMessage;
1009*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Compile succeeded");
1010*35238bceSAndroid Build Coastguard Worker return STOP;
1011*35238bceSAndroid Build Coastguard Worker }
1012*35238bceSAndroid Build Coastguard Worker else
1013*35238bceSAndroid Build Coastguard Worker {
1014*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Compilation failed as expected." << TestLog::EndMessage;
1015*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Compile failed");
1016*35238bceSAndroid Build Coastguard Worker return STOP;
1017*35238bceSAndroid Build Coastguard Worker }
1018*35238bceSAndroid Build Coastguard Worker }
1019*35238bceSAndroid Build Coastguard Worker else if (!program.isOk())
1020*35238bceSAndroid Build Coastguard Worker {
1021*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Compile failed." << TestLog::EndMessage;
1022*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Compile failed");
1023*35238bceSAndroid Build Coastguard Worker return STOP;
1024*35238bceSAndroid Build Coastguard Worker }
1025*35238bceSAndroid Build Coastguard Worker
1026*35238bceSAndroid Build Coastguard Worker gl.useProgram(program.getProgram());
1027*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glUseProgram()");
1028*35238bceSAndroid Build Coastguard Worker
1029*35238bceSAndroid Build Coastguard Worker // Create output buffer
1030*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_SHADER_STORAGE_BUFFER, *outputBuffer);
1031*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_SHADER_STORAGE_BUFFER, ssoSize, NULL, GL_STATIC_DRAW);
1032*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to create output buffer");
1033*35238bceSAndroid Build Coastguard Worker
1034*35238bceSAndroid Build Coastguard Worker // Create atomic counter buffer
1035*35238bceSAndroid Build Coastguard Worker {
1036*35238bceSAndroid Build Coastguard Worker vector<uint32_t> data(m_spec.atomicCounterCount, getInitialValue());
1037*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_SHADER_STORAGE_BUFFER, *counterBuffer);
1038*35238bceSAndroid Build Coastguard Worker gl.bufferData(GL_SHADER_STORAGE_BUFFER, counterBufferSize, &(data[0]), GL_STATIC_DRAW);
1039*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to create buffer for atomic counters");
1040*35238bceSAndroid Build Coastguard Worker }
1041*35238bceSAndroid Build Coastguard Worker
1042*35238bceSAndroid Build Coastguard Worker // Bind output buffer
1043*35238bceSAndroid Build Coastguard Worker gl.bindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, *outputBuffer);
1044*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup output buffer");
1045*35238bceSAndroid Build Coastguard Worker
1046*35238bceSAndroid Build Coastguard Worker // Bind atomic counter buffer
1047*35238bceSAndroid Build Coastguard Worker gl.bindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, *counterBuffer);
1048*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Failed to setup atomic counter buffer");
1049*35238bceSAndroid Build Coastguard Worker
1050*35238bceSAndroid Build Coastguard Worker // Dispath compute
1051*35238bceSAndroid Build Coastguard Worker gl.dispatchCompute(m_spec.threadCount, 1, 1);
1052*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glDispatchCompute()");
1053*35238bceSAndroid Build Coastguard Worker
1054*35238bceSAndroid Build Coastguard Worker gl.finish();
1055*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glFinish()");
1056*35238bceSAndroid Build Coastguard Worker
1057*35238bceSAndroid Build Coastguard Worker vector<uint32_t> output(ssoSize / 4, 0);
1058*35238bceSAndroid Build Coastguard Worker vector<uint32_t> counters(m_spec.atomicCounterCount, 0);
1059*35238bceSAndroid Build Coastguard Worker
1060*35238bceSAndroid Build Coastguard Worker // Read back output buffer
1061*35238bceSAndroid Build Coastguard Worker {
1062*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_SHADER_STORAGE_BUFFER, *outputBuffer);
1063*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1064*35238bceSAndroid Build Coastguard Worker
1065*35238bceSAndroid Build Coastguard Worker void *ptr = gl.mapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, (GLsizeiptr)(output.size() * sizeof(uint32_t)),
1066*35238bceSAndroid Build Coastguard Worker GL_MAP_READ_BIT);
1067*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glMapBufferRange()");
1068*35238bceSAndroid Build Coastguard Worker
1069*35238bceSAndroid Build Coastguard Worker deMemcpy(&(output[0]), ptr, (int)output.size() * sizeof(uint32_t));
1070*35238bceSAndroid Build Coastguard Worker
1071*35238bceSAndroid Build Coastguard Worker if (!gl.unmapBuffer(GL_SHADER_STORAGE_BUFFER))
1072*35238bceSAndroid Build Coastguard Worker {
1073*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapBuffer()");
1074*35238bceSAndroid Build Coastguard Worker TCU_CHECK_MSG(false, "Mapped buffer corrupted");
1075*35238bceSAndroid Build Coastguard Worker }
1076*35238bceSAndroid Build Coastguard Worker
1077*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
1078*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1079*35238bceSAndroid Build Coastguard Worker }
1080*35238bceSAndroid Build Coastguard Worker
1081*35238bceSAndroid Build Coastguard Worker // Read back counter buffer
1082*35238bceSAndroid Build Coastguard Worker {
1083*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_SHADER_STORAGE_BUFFER, *counterBuffer);
1084*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1085*35238bceSAndroid Build Coastguard Worker
1086*35238bceSAndroid Build Coastguard Worker void *ptr = gl.mapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, (GLsizeiptr)(counters.size() * sizeof(uint32_t)),
1087*35238bceSAndroid Build Coastguard Worker GL_MAP_READ_BIT);
1088*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glMapBufferRange()");
1089*35238bceSAndroid Build Coastguard Worker
1090*35238bceSAndroid Build Coastguard Worker deMemcpy(&(counters[0]), ptr, (int)counters.size() * sizeof(uint32_t));
1091*35238bceSAndroid Build Coastguard Worker
1092*35238bceSAndroid Build Coastguard Worker if (!gl.unmapBuffer(GL_SHADER_STORAGE_BUFFER))
1093*35238bceSAndroid Build Coastguard Worker {
1094*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glUnmapBuffer()");
1095*35238bceSAndroid Build Coastguard Worker TCU_CHECK_MSG(false, "Mapped buffer corrupted");
1096*35238bceSAndroid Build Coastguard Worker }
1097*35238bceSAndroid Build Coastguard Worker
1098*35238bceSAndroid Build Coastguard Worker gl.bindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
1099*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "glBindBuffer()");
1100*35238bceSAndroid Build Coastguard Worker }
1101*35238bceSAndroid Build Coastguard Worker
1102*35238bceSAndroid Build Coastguard Worker bool isOk = true;
1103*35238bceSAndroid Build Coastguard Worker
1104*35238bceSAndroid Build Coastguard Worker if (!checkAndLogCounterValues(log, counters))
1105*35238bceSAndroid Build Coastguard Worker isOk = false;
1106*35238bceSAndroid Build Coastguard Worker
1107*35238bceSAndroid Build Coastguard Worker {
1108*35238bceSAndroid Build Coastguard Worker vector<uint32_t> increments;
1109*35238bceSAndroid Build Coastguard Worker vector<uint32_t> decrements;
1110*35238bceSAndroid Build Coastguard Worker vector<uint32_t> preGets;
1111*35238bceSAndroid Build Coastguard Worker vector<uint32_t> postGets;
1112*35238bceSAndroid Build Coastguard Worker vector<uint32_t> gets;
1113*35238bceSAndroid Build Coastguard Worker
1114*35238bceSAndroid Build Coastguard Worker splitBuffer(output, increments, decrements, preGets, postGets, gets);
1115*35238bceSAndroid Build Coastguard Worker
1116*35238bceSAndroid Build Coastguard Worker if (!checkAndLogCallValues(log, increments, decrements, preGets, postGets, gets))
1117*35238bceSAndroid Build Coastguard Worker isOk = false;
1118*35238bceSAndroid Build Coastguard Worker }
1119*35238bceSAndroid Build Coastguard Worker
1120*35238bceSAndroid Build Coastguard Worker if (isOk)
1121*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
1122*35238bceSAndroid Build Coastguard Worker else
1123*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
1124*35238bceSAndroid Build Coastguard Worker
1125*35238bceSAndroid Build Coastguard Worker return STOP;
1126*35238bceSAndroid Build Coastguard Worker }
1127*35238bceSAndroid Build Coastguard Worker
specToTestName(const AtomicCounterTest::TestSpec & spec)1128*35238bceSAndroid Build Coastguard Worker string specToTestName(const AtomicCounterTest::TestSpec &spec)
1129*35238bceSAndroid Build Coastguard Worker {
1130*35238bceSAndroid Build Coastguard Worker std::ostringstream stream;
1131*35238bceSAndroid Build Coastguard Worker
1132*35238bceSAndroid Build Coastguard Worker stream << spec.atomicCounterCount << (spec.atomicCounterCount == 1 ? "_counter" : "_counters");
1133*35238bceSAndroid Build Coastguard Worker stream << "_" << spec.callCount << (spec.callCount == 1 ? "_call" : "_calls");
1134*35238bceSAndroid Build Coastguard Worker stream << "_" << spec.threadCount << (spec.threadCount == 1 ? "_thread" : "_threads");
1135*35238bceSAndroid Build Coastguard Worker
1136*35238bceSAndroid Build Coastguard Worker return stream.str();
1137*35238bceSAndroid Build Coastguard Worker }
1138*35238bceSAndroid Build Coastguard Worker
specToTestDescription(const AtomicCounterTest::TestSpec & spec)1139*35238bceSAndroid Build Coastguard Worker string specToTestDescription(const AtomicCounterTest::TestSpec &spec)
1140*35238bceSAndroid Build Coastguard Worker {
1141*35238bceSAndroid Build Coastguard Worker std::ostringstream stream;
1142*35238bceSAndroid Build Coastguard Worker bool firstOperation = 0;
1143*35238bceSAndroid Build Coastguard Worker
1144*35238bceSAndroid Build Coastguard Worker stream << "Test ";
1145*35238bceSAndroid Build Coastguard Worker
1146*35238bceSAndroid Build Coastguard Worker if ((spec.operations & AtomicCounterTest::OPERATION_GET) != 0)
1147*35238bceSAndroid Build Coastguard Worker {
1148*35238bceSAndroid Build Coastguard Worker stream << "atomicCounter()";
1149*35238bceSAndroid Build Coastguard Worker firstOperation = false;
1150*35238bceSAndroid Build Coastguard Worker }
1151*35238bceSAndroid Build Coastguard Worker
1152*35238bceSAndroid Build Coastguard Worker if ((spec.operations & AtomicCounterTest::OPERATION_INC) != 0)
1153*35238bceSAndroid Build Coastguard Worker {
1154*35238bceSAndroid Build Coastguard Worker if (!firstOperation)
1155*35238bceSAndroid Build Coastguard Worker stream << ", ";
1156*35238bceSAndroid Build Coastguard Worker
1157*35238bceSAndroid Build Coastguard Worker stream << " atomicCounterIncrement()";
1158*35238bceSAndroid Build Coastguard Worker firstOperation = false;
1159*35238bceSAndroid Build Coastguard Worker }
1160*35238bceSAndroid Build Coastguard Worker
1161*35238bceSAndroid Build Coastguard Worker if ((spec.operations & AtomicCounterTest::OPERATION_DEC) != 0)
1162*35238bceSAndroid Build Coastguard Worker {
1163*35238bceSAndroid Build Coastguard Worker if (!firstOperation)
1164*35238bceSAndroid Build Coastguard Worker stream << ", ";
1165*35238bceSAndroid Build Coastguard Worker
1166*35238bceSAndroid Build Coastguard Worker stream << " atomicCounterDecrement()";
1167*35238bceSAndroid Build Coastguard Worker firstOperation = false;
1168*35238bceSAndroid Build Coastguard Worker }
1169*35238bceSAndroid Build Coastguard Worker
1170*35238bceSAndroid Build Coastguard Worker stream << " calls with ";
1171*35238bceSAndroid Build Coastguard Worker
1172*35238bceSAndroid Build Coastguard Worker if (spec.useBranches)
1173*35238bceSAndroid Build Coastguard Worker stream << " branches, ";
1174*35238bceSAndroid Build Coastguard Worker
1175*35238bceSAndroid Build Coastguard Worker stream << spec.atomicCounterCount << " atomic counters, " << spec.callCount << " calls and " << spec.threadCount
1176*35238bceSAndroid Build Coastguard Worker << " threads.";
1177*35238bceSAndroid Build Coastguard Worker
1178*35238bceSAndroid Build Coastguard Worker return stream.str();
1179*35238bceSAndroid Build Coastguard Worker }
1180*35238bceSAndroid Build Coastguard Worker
operationToName(const AtomicCounterTest::Operation & operations,bool useBranch)1181*35238bceSAndroid Build Coastguard Worker string operationToName(const AtomicCounterTest::Operation &operations, bool useBranch)
1182*35238bceSAndroid Build Coastguard Worker {
1183*35238bceSAndroid Build Coastguard Worker std::ostringstream stream;
1184*35238bceSAndroid Build Coastguard Worker bool first = true;
1185*35238bceSAndroid Build Coastguard Worker
1186*35238bceSAndroid Build Coastguard Worker if ((operations & AtomicCounterTest::OPERATION_GET) != 0)
1187*35238bceSAndroid Build Coastguard Worker {
1188*35238bceSAndroid Build Coastguard Worker stream << "get";
1189*35238bceSAndroid Build Coastguard Worker first = false;
1190*35238bceSAndroid Build Coastguard Worker }
1191*35238bceSAndroid Build Coastguard Worker
1192*35238bceSAndroid Build Coastguard Worker if ((operations & AtomicCounterTest::OPERATION_INC) != 0)
1193*35238bceSAndroid Build Coastguard Worker {
1194*35238bceSAndroid Build Coastguard Worker if (!first)
1195*35238bceSAndroid Build Coastguard Worker stream << "_";
1196*35238bceSAndroid Build Coastguard Worker
1197*35238bceSAndroid Build Coastguard Worker stream << "inc";
1198*35238bceSAndroid Build Coastguard Worker first = false;
1199*35238bceSAndroid Build Coastguard Worker }
1200*35238bceSAndroid Build Coastguard Worker
1201*35238bceSAndroid Build Coastguard Worker if ((operations & AtomicCounterTest::OPERATION_DEC) != 0)
1202*35238bceSAndroid Build Coastguard Worker {
1203*35238bceSAndroid Build Coastguard Worker if (!first)
1204*35238bceSAndroid Build Coastguard Worker stream << "_";
1205*35238bceSAndroid Build Coastguard Worker
1206*35238bceSAndroid Build Coastguard Worker stream << "dec";
1207*35238bceSAndroid Build Coastguard Worker first = false;
1208*35238bceSAndroid Build Coastguard Worker }
1209*35238bceSAndroid Build Coastguard Worker
1210*35238bceSAndroid Build Coastguard Worker if (useBranch)
1211*35238bceSAndroid Build Coastguard Worker stream << "_branch";
1212*35238bceSAndroid Build Coastguard Worker
1213*35238bceSAndroid Build Coastguard Worker return stream.str();
1214*35238bceSAndroid Build Coastguard Worker }
1215*35238bceSAndroid Build Coastguard Worker
operationToDescription(const AtomicCounterTest::Operation & operations,bool useBranch)1216*35238bceSAndroid Build Coastguard Worker string operationToDescription(const AtomicCounterTest::Operation &operations, bool useBranch)
1217*35238bceSAndroid Build Coastguard Worker {
1218*35238bceSAndroid Build Coastguard Worker std::ostringstream stream;
1219*35238bceSAndroid Build Coastguard Worker bool firstOperation = 0;
1220*35238bceSAndroid Build Coastguard Worker
1221*35238bceSAndroid Build Coastguard Worker stream << "Test ";
1222*35238bceSAndroid Build Coastguard Worker
1223*35238bceSAndroid Build Coastguard Worker if ((operations & AtomicCounterTest::OPERATION_GET) != 0)
1224*35238bceSAndroid Build Coastguard Worker {
1225*35238bceSAndroid Build Coastguard Worker stream << "atomicCounter()";
1226*35238bceSAndroid Build Coastguard Worker firstOperation = false;
1227*35238bceSAndroid Build Coastguard Worker }
1228*35238bceSAndroid Build Coastguard Worker
1229*35238bceSAndroid Build Coastguard Worker if ((operations & AtomicCounterTest::OPERATION_INC) != 0)
1230*35238bceSAndroid Build Coastguard Worker {
1231*35238bceSAndroid Build Coastguard Worker if (!firstOperation)
1232*35238bceSAndroid Build Coastguard Worker stream << ", ";
1233*35238bceSAndroid Build Coastguard Worker
1234*35238bceSAndroid Build Coastguard Worker stream << " atomicCounterIncrement()";
1235*35238bceSAndroid Build Coastguard Worker firstOperation = false;
1236*35238bceSAndroid Build Coastguard Worker }
1237*35238bceSAndroid Build Coastguard Worker
1238*35238bceSAndroid Build Coastguard Worker if ((operations & AtomicCounterTest::OPERATION_DEC) != 0)
1239*35238bceSAndroid Build Coastguard Worker {
1240*35238bceSAndroid Build Coastguard Worker if (!firstOperation)
1241*35238bceSAndroid Build Coastguard Worker stream << ", ";
1242*35238bceSAndroid Build Coastguard Worker
1243*35238bceSAndroid Build Coastguard Worker stream << " atomicCounterDecrement()";
1244*35238bceSAndroid Build Coastguard Worker firstOperation = false;
1245*35238bceSAndroid Build Coastguard Worker }
1246*35238bceSAndroid Build Coastguard Worker
1247*35238bceSAndroid Build Coastguard Worker if (useBranch)
1248*35238bceSAndroid Build Coastguard Worker stream << " calls with branches.";
1249*35238bceSAndroid Build Coastguard Worker else
1250*35238bceSAndroid Build Coastguard Worker stream << ".";
1251*35238bceSAndroid Build Coastguard Worker
1252*35238bceSAndroid Build Coastguard Worker return stream.str();
1253*35238bceSAndroid Build Coastguard Worker }
1254*35238bceSAndroid Build Coastguard Worker
layoutTypesToName(const AtomicCounterTest::BindingType & bindingType,const AtomicCounterTest::OffsetType & offsetType)1255*35238bceSAndroid Build Coastguard Worker string layoutTypesToName(const AtomicCounterTest::BindingType &bindingType,
1256*35238bceSAndroid Build Coastguard Worker const AtomicCounterTest::OffsetType &offsetType)
1257*35238bceSAndroid Build Coastguard Worker {
1258*35238bceSAndroid Build Coastguard Worker std::ostringstream stream;
1259*35238bceSAndroid Build Coastguard Worker
1260*35238bceSAndroid Build Coastguard Worker switch (bindingType)
1261*35238bceSAndroid Build Coastguard Worker {
1262*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::BINDINGTYPE_BASIC:
1263*35238bceSAndroid Build Coastguard Worker // Nothing
1264*35238bceSAndroid Build Coastguard Worker break;
1265*35238bceSAndroid Build Coastguard Worker
1266*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::BINDINGTYPE_INVALID:
1267*35238bceSAndroid Build Coastguard Worker stream << "invalid_binding";
1268*35238bceSAndroid Build Coastguard Worker break;
1269*35238bceSAndroid Build Coastguard Worker
1270*35238bceSAndroid Build Coastguard Worker default:
1271*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1272*35238bceSAndroid Build Coastguard Worker }
1273*35238bceSAndroid Build Coastguard Worker
1274*35238bceSAndroid Build Coastguard Worker if (bindingType != AtomicCounterTest::BINDINGTYPE_BASIC && offsetType != AtomicCounterTest::OFFSETTYPE_NONE)
1275*35238bceSAndroid Build Coastguard Worker stream << "_";
1276*35238bceSAndroid Build Coastguard Worker
1277*35238bceSAndroid Build Coastguard Worker switch (offsetType)
1278*35238bceSAndroid Build Coastguard Worker {
1279*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::OFFSETTYPE_BASIC:
1280*35238bceSAndroid Build Coastguard Worker stream << "basic_offset";
1281*35238bceSAndroid Build Coastguard Worker break;
1282*35238bceSAndroid Build Coastguard Worker
1283*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::OFFSETTYPE_REVERSE:
1284*35238bceSAndroid Build Coastguard Worker stream << "reverse_offset";
1285*35238bceSAndroid Build Coastguard Worker break;
1286*35238bceSAndroid Build Coastguard Worker
1287*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::OFFSETTYPE_INVALID:
1288*35238bceSAndroid Build Coastguard Worker stream << "invalid_offset";
1289*35238bceSAndroid Build Coastguard Worker break;
1290*35238bceSAndroid Build Coastguard Worker
1291*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::OFFSETTYPE_FIRST_AUTO:
1292*35238bceSAndroid Build Coastguard Worker stream << "first_offset_set";
1293*35238bceSAndroid Build Coastguard Worker break;
1294*35238bceSAndroid Build Coastguard Worker
1295*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::OFFSETTYPE_DEFAULT_AUTO:
1296*35238bceSAndroid Build Coastguard Worker stream << "default_offset_set";
1297*35238bceSAndroid Build Coastguard Worker break;
1298*35238bceSAndroid Build Coastguard Worker
1299*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::OFFSETTYPE_RESET_DEFAULT:
1300*35238bceSAndroid Build Coastguard Worker stream << "reset_default_offset";
1301*35238bceSAndroid Build Coastguard Worker break;
1302*35238bceSAndroid Build Coastguard Worker
1303*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::OFFSETTYPE_NONE:
1304*35238bceSAndroid Build Coastguard Worker // Do nothing
1305*35238bceSAndroid Build Coastguard Worker break;
1306*35238bceSAndroid Build Coastguard Worker
1307*35238bceSAndroid Build Coastguard Worker default:
1308*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1309*35238bceSAndroid Build Coastguard Worker }
1310*35238bceSAndroid Build Coastguard Worker
1311*35238bceSAndroid Build Coastguard Worker return stream.str();
1312*35238bceSAndroid Build Coastguard Worker }
1313*35238bceSAndroid Build Coastguard Worker
layoutTypesToDesc(const AtomicCounterTest::BindingType & bindingType,const AtomicCounterTest::OffsetType & offsetType)1314*35238bceSAndroid Build Coastguard Worker string layoutTypesToDesc(const AtomicCounterTest::BindingType &bindingType,
1315*35238bceSAndroid Build Coastguard Worker const AtomicCounterTest::OffsetType &offsetType)
1316*35238bceSAndroid Build Coastguard Worker {
1317*35238bceSAndroid Build Coastguard Worker std::ostringstream stream;
1318*35238bceSAndroid Build Coastguard Worker
1319*35238bceSAndroid Build Coastguard Worker switch (bindingType)
1320*35238bceSAndroid Build Coastguard Worker {
1321*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::BINDINGTYPE_BASIC:
1322*35238bceSAndroid Build Coastguard Worker stream << "Test using atomic counters with explicit layout bindings and";
1323*35238bceSAndroid Build Coastguard Worker break;
1324*35238bceSAndroid Build Coastguard Worker
1325*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::BINDINGTYPE_INVALID:
1326*35238bceSAndroid Build Coastguard Worker stream << "Test using atomic counters with invalid explicit layout bindings and";
1327*35238bceSAndroid Build Coastguard Worker break;
1328*35238bceSAndroid Build Coastguard Worker
1329*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::BINDINGTYPE_INVALID_DEFAULT:
1330*35238bceSAndroid Build Coastguard Worker stream << "Test using atomic counters with invalid default layout binding and";
1331*35238bceSAndroid Build Coastguard Worker break;
1332*35238bceSAndroid Build Coastguard Worker
1333*35238bceSAndroid Build Coastguard Worker default:
1334*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1335*35238bceSAndroid Build Coastguard Worker }
1336*35238bceSAndroid Build Coastguard Worker
1337*35238bceSAndroid Build Coastguard Worker switch (offsetType)
1338*35238bceSAndroid Build Coastguard Worker {
1339*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::OFFSETTYPE_NONE:
1340*35238bceSAndroid Build Coastguard Worker stream << " no explicit offsets.";
1341*35238bceSAndroid Build Coastguard Worker break;
1342*35238bceSAndroid Build Coastguard Worker
1343*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::OFFSETTYPE_BASIC:
1344*35238bceSAndroid Build Coastguard Worker stream << "explicit continuos offsets.";
1345*35238bceSAndroid Build Coastguard Worker break;
1346*35238bceSAndroid Build Coastguard Worker
1347*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::OFFSETTYPE_REVERSE:
1348*35238bceSAndroid Build Coastguard Worker stream << "reversed explicit offsets.";
1349*35238bceSAndroid Build Coastguard Worker break;
1350*35238bceSAndroid Build Coastguard Worker
1351*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::OFFSETTYPE_INVALID:
1352*35238bceSAndroid Build Coastguard Worker stream << "invalid explicit offsets.";
1353*35238bceSAndroid Build Coastguard Worker break;
1354*35238bceSAndroid Build Coastguard Worker
1355*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::OFFSETTYPE_FIRST_AUTO:
1356*35238bceSAndroid Build Coastguard Worker stream << "only first counter with explicit offset.";
1357*35238bceSAndroid Build Coastguard Worker break;
1358*35238bceSAndroid Build Coastguard Worker
1359*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::OFFSETTYPE_DEFAULT_AUTO:
1360*35238bceSAndroid Build Coastguard Worker stream << "default offset.";
1361*35238bceSAndroid Build Coastguard Worker break;
1362*35238bceSAndroid Build Coastguard Worker
1363*35238bceSAndroid Build Coastguard Worker case AtomicCounterTest::OFFSETTYPE_RESET_DEFAULT:
1364*35238bceSAndroid Build Coastguard Worker stream << "default offset specified twice.";
1365*35238bceSAndroid Build Coastguard Worker break;
1366*35238bceSAndroid Build Coastguard Worker
1367*35238bceSAndroid Build Coastguard Worker default:
1368*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1369*35238bceSAndroid Build Coastguard Worker }
1370*35238bceSAndroid Build Coastguard Worker
1371*35238bceSAndroid Build Coastguard Worker return stream.str();
1372*35238bceSAndroid Build Coastguard Worker }
1373*35238bceSAndroid Build Coastguard Worker
1374*35238bceSAndroid Build Coastguard Worker } // namespace
1375*35238bceSAndroid Build Coastguard Worker
AtomicCounterTests(Context & context)1376*35238bceSAndroid Build Coastguard Worker AtomicCounterTests::AtomicCounterTests(Context &context)
1377*35238bceSAndroid Build Coastguard Worker : TestCaseGroup(context, "atomic_counter", "Atomic counter tests")
1378*35238bceSAndroid Build Coastguard Worker {
1379*35238bceSAndroid Build Coastguard Worker // Runtime use tests
1380*35238bceSAndroid Build Coastguard Worker {
1381*35238bceSAndroid Build Coastguard Worker const int counterCounts[] = {1, 4, 8};
1382*35238bceSAndroid Build Coastguard Worker
1383*35238bceSAndroid Build Coastguard Worker const int callCounts[] = {1, 5, 100};
1384*35238bceSAndroid Build Coastguard Worker
1385*35238bceSAndroid Build Coastguard Worker const int threadCounts[] = {1, 10, 5000};
1386*35238bceSAndroid Build Coastguard Worker
1387*35238bceSAndroid Build Coastguard Worker const AtomicCounterTest::Operation operations[] = {
1388*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::OPERATION_GET,
1389*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::OPERATION_INC,
1390*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::OPERATION_DEC,
1391*35238bceSAndroid Build Coastguard Worker
1392*35238bceSAndroid Build Coastguard Worker (AtomicCounterTest::Operation)(AtomicCounterTest::OPERATION_INC | AtomicCounterTest::OPERATION_GET),
1393*35238bceSAndroid Build Coastguard Worker (AtomicCounterTest::Operation)(AtomicCounterTest::OPERATION_DEC | AtomicCounterTest::OPERATION_GET),
1394*35238bceSAndroid Build Coastguard Worker
1395*35238bceSAndroid Build Coastguard Worker (AtomicCounterTest::Operation)(AtomicCounterTest::OPERATION_INC | AtomicCounterTest::OPERATION_DEC),
1396*35238bceSAndroid Build Coastguard Worker (AtomicCounterTest::Operation)(AtomicCounterTest::OPERATION_INC | AtomicCounterTest::OPERATION_DEC |
1397*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::OPERATION_GET)};
1398*35238bceSAndroid Build Coastguard Worker
1399*35238bceSAndroid Build Coastguard Worker for (int operationNdx = 0; operationNdx < DE_LENGTH_OF_ARRAY(operations); operationNdx++)
1400*35238bceSAndroid Build Coastguard Worker {
1401*35238bceSAndroid Build Coastguard Worker const AtomicCounterTest::Operation operation = operations[operationNdx];
1402*35238bceSAndroid Build Coastguard Worker
1403*35238bceSAndroid Build Coastguard Worker for (int branch = 0; branch < 2; branch++)
1404*35238bceSAndroid Build Coastguard Worker {
1405*35238bceSAndroid Build Coastguard Worker const bool useBranch = (branch == 1);
1406*35238bceSAndroid Build Coastguard Worker
1407*35238bceSAndroid Build Coastguard Worker TestCaseGroup *operationGroup =
1408*35238bceSAndroid Build Coastguard Worker new TestCaseGroup(m_context, operationToName(operation, useBranch).c_str(),
1409*35238bceSAndroid Build Coastguard Worker operationToDescription(operation, useBranch).c_str());
1410*35238bceSAndroid Build Coastguard Worker
1411*35238bceSAndroid Build Coastguard Worker for (int counterCountNdx = 0; counterCountNdx < DE_LENGTH_OF_ARRAY(counterCounts); counterCountNdx++)
1412*35238bceSAndroid Build Coastguard Worker {
1413*35238bceSAndroid Build Coastguard Worker const int counterCount = counterCounts[counterCountNdx];
1414*35238bceSAndroid Build Coastguard Worker
1415*35238bceSAndroid Build Coastguard Worker for (int callCountNdx = 0; callCountNdx < DE_LENGTH_OF_ARRAY(callCounts); callCountNdx++)
1416*35238bceSAndroid Build Coastguard Worker {
1417*35238bceSAndroid Build Coastguard Worker const int callCount = callCounts[callCountNdx];
1418*35238bceSAndroid Build Coastguard Worker
1419*35238bceSAndroid Build Coastguard Worker for (int threadCountNdx = 0; threadCountNdx < DE_LENGTH_OF_ARRAY(threadCounts);
1420*35238bceSAndroid Build Coastguard Worker threadCountNdx++)
1421*35238bceSAndroid Build Coastguard Worker {
1422*35238bceSAndroid Build Coastguard Worker const int threadCount = threadCounts[threadCountNdx];
1423*35238bceSAndroid Build Coastguard Worker
1424*35238bceSAndroid Build Coastguard Worker if (threadCount * callCount * counterCount > 10000)
1425*35238bceSAndroid Build Coastguard Worker continue;
1426*35238bceSAndroid Build Coastguard Worker
1427*35238bceSAndroid Build Coastguard Worker if (useBranch && threadCount * callCount == 1)
1428*35238bceSAndroid Build Coastguard Worker continue;
1429*35238bceSAndroid Build Coastguard Worker
1430*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::TestSpec spec;
1431*35238bceSAndroid Build Coastguard Worker
1432*35238bceSAndroid Build Coastguard Worker spec.atomicCounterCount = counterCount;
1433*35238bceSAndroid Build Coastguard Worker spec.operations = operation;
1434*35238bceSAndroid Build Coastguard Worker spec.callCount = callCount;
1435*35238bceSAndroid Build Coastguard Worker spec.useBranches = useBranch;
1436*35238bceSAndroid Build Coastguard Worker spec.threadCount = threadCount;
1437*35238bceSAndroid Build Coastguard Worker spec.bindingType = AtomicCounterTest::BINDINGTYPE_BASIC;
1438*35238bceSAndroid Build Coastguard Worker spec.offsetType = AtomicCounterTest::OFFSETTYPE_NONE;
1439*35238bceSAndroid Build Coastguard Worker
1440*35238bceSAndroid Build Coastguard Worker operationGroup->addChild(new AtomicCounterTest(m_context, specToTestName(spec).c_str(),
1441*35238bceSAndroid Build Coastguard Worker specToTestDescription(spec).c_str(), spec));
1442*35238bceSAndroid Build Coastguard Worker }
1443*35238bceSAndroid Build Coastguard Worker }
1444*35238bceSAndroid Build Coastguard Worker }
1445*35238bceSAndroid Build Coastguard Worker
1446*35238bceSAndroid Build Coastguard Worker addChild(operationGroup);
1447*35238bceSAndroid Build Coastguard Worker }
1448*35238bceSAndroid Build Coastguard Worker }
1449*35238bceSAndroid Build Coastguard Worker }
1450*35238bceSAndroid Build Coastguard Worker
1451*35238bceSAndroid Build Coastguard Worker {
1452*35238bceSAndroid Build Coastguard Worker TestCaseGroup *layoutGroup = new TestCaseGroup(m_context, "layout", "Layout qualifier tests.");
1453*35238bceSAndroid Build Coastguard Worker
1454*35238bceSAndroid Build Coastguard Worker const int counterCounts[] = {1, 8};
1455*35238bceSAndroid Build Coastguard Worker const int callCounts[] = {1, 5};
1456*35238bceSAndroid Build Coastguard Worker const int threadCounts[] = {1, 1000};
1457*35238bceSAndroid Build Coastguard Worker
1458*35238bceSAndroid Build Coastguard Worker const AtomicCounterTest::Operation operations[] = {
1459*35238bceSAndroid Build Coastguard Worker (AtomicCounterTest::Operation)(AtomicCounterTest::OPERATION_INC | AtomicCounterTest::OPERATION_GET),
1460*35238bceSAndroid Build Coastguard Worker (AtomicCounterTest::Operation)(AtomicCounterTest::OPERATION_DEC | AtomicCounterTest::OPERATION_GET),
1461*35238bceSAndroid Build Coastguard Worker (AtomicCounterTest::Operation)(AtomicCounterTest::OPERATION_INC | AtomicCounterTest::OPERATION_DEC)};
1462*35238bceSAndroid Build Coastguard Worker
1463*35238bceSAndroid Build Coastguard Worker const AtomicCounterTest::OffsetType offsetTypes[] = {
1464*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::OFFSETTYPE_REVERSE, AtomicCounterTest::OFFSETTYPE_FIRST_AUTO,
1465*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::OFFSETTYPE_DEFAULT_AUTO, AtomicCounterTest::OFFSETTYPE_RESET_DEFAULT};
1466*35238bceSAndroid Build Coastguard Worker
1467*35238bceSAndroid Build Coastguard Worker for (int offsetTypeNdx = 0; offsetTypeNdx < DE_LENGTH_OF_ARRAY(offsetTypes); offsetTypeNdx++)
1468*35238bceSAndroid Build Coastguard Worker {
1469*35238bceSAndroid Build Coastguard Worker const AtomicCounterTest::OffsetType offsetType = offsetTypes[offsetTypeNdx];
1470*35238bceSAndroid Build Coastguard Worker
1471*35238bceSAndroid Build Coastguard Worker TestCaseGroup *layoutQualifierGroup = new TestCaseGroup(
1472*35238bceSAndroid Build Coastguard Worker m_context, layoutTypesToName(AtomicCounterTest::BINDINGTYPE_BASIC, offsetType).c_str(),
1473*35238bceSAndroid Build Coastguard Worker layoutTypesToDesc(AtomicCounterTest::BINDINGTYPE_BASIC, offsetType).c_str());
1474*35238bceSAndroid Build Coastguard Worker
1475*35238bceSAndroid Build Coastguard Worker for (int operationNdx = 0; operationNdx < DE_LENGTH_OF_ARRAY(operations); operationNdx++)
1476*35238bceSAndroid Build Coastguard Worker {
1477*35238bceSAndroid Build Coastguard Worker const AtomicCounterTest::Operation operation = operations[operationNdx];
1478*35238bceSAndroid Build Coastguard Worker
1479*35238bceSAndroid Build Coastguard Worker TestCaseGroup *operationGroup = new TestCaseGroup(m_context, operationToName(operation, false).c_str(),
1480*35238bceSAndroid Build Coastguard Worker operationToDescription(operation, false).c_str());
1481*35238bceSAndroid Build Coastguard Worker
1482*35238bceSAndroid Build Coastguard Worker for (int counterCountNdx = 0; counterCountNdx < DE_LENGTH_OF_ARRAY(counterCounts); counterCountNdx++)
1483*35238bceSAndroid Build Coastguard Worker {
1484*35238bceSAndroid Build Coastguard Worker const int counterCount = counterCounts[counterCountNdx];
1485*35238bceSAndroid Build Coastguard Worker
1486*35238bceSAndroid Build Coastguard Worker if (offsetType == AtomicCounterTest::OFFSETTYPE_FIRST_AUTO && counterCount < 3)
1487*35238bceSAndroid Build Coastguard Worker continue;
1488*35238bceSAndroid Build Coastguard Worker
1489*35238bceSAndroid Build Coastguard Worker if (offsetType == AtomicCounterTest::OFFSETTYPE_DEFAULT_AUTO && counterCount < 2)
1490*35238bceSAndroid Build Coastguard Worker continue;
1491*35238bceSAndroid Build Coastguard Worker
1492*35238bceSAndroid Build Coastguard Worker if (offsetType == AtomicCounterTest::OFFSETTYPE_RESET_DEFAULT && counterCount < 2)
1493*35238bceSAndroid Build Coastguard Worker continue;
1494*35238bceSAndroid Build Coastguard Worker
1495*35238bceSAndroid Build Coastguard Worker if (offsetType == AtomicCounterTest::OFFSETTYPE_REVERSE && counterCount < 2)
1496*35238bceSAndroid Build Coastguard Worker continue;
1497*35238bceSAndroid Build Coastguard Worker
1498*35238bceSAndroid Build Coastguard Worker for (int callCountNdx = 0; callCountNdx < DE_LENGTH_OF_ARRAY(callCounts); callCountNdx++)
1499*35238bceSAndroid Build Coastguard Worker {
1500*35238bceSAndroid Build Coastguard Worker const int callCount = callCounts[callCountNdx];
1501*35238bceSAndroid Build Coastguard Worker
1502*35238bceSAndroid Build Coastguard Worker for (int threadCountNdx = 0; threadCountNdx < DE_LENGTH_OF_ARRAY(threadCounts);
1503*35238bceSAndroid Build Coastguard Worker threadCountNdx++)
1504*35238bceSAndroid Build Coastguard Worker {
1505*35238bceSAndroid Build Coastguard Worker const int threadCount = threadCounts[threadCountNdx];
1506*35238bceSAndroid Build Coastguard Worker
1507*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::TestSpec spec;
1508*35238bceSAndroid Build Coastguard Worker
1509*35238bceSAndroid Build Coastguard Worker spec.atomicCounterCount = counterCount;
1510*35238bceSAndroid Build Coastguard Worker spec.operations = operation;
1511*35238bceSAndroid Build Coastguard Worker spec.callCount = callCount;
1512*35238bceSAndroid Build Coastguard Worker spec.useBranches = false;
1513*35238bceSAndroid Build Coastguard Worker spec.threadCount = threadCount;
1514*35238bceSAndroid Build Coastguard Worker spec.bindingType = AtomicCounterTest::BINDINGTYPE_BASIC;
1515*35238bceSAndroid Build Coastguard Worker spec.offsetType = offsetType;
1516*35238bceSAndroid Build Coastguard Worker
1517*35238bceSAndroid Build Coastguard Worker operationGroup->addChild(new AtomicCounterTest(m_context, specToTestName(spec).c_str(),
1518*35238bceSAndroid Build Coastguard Worker specToTestDescription(spec).c_str(), spec));
1519*35238bceSAndroid Build Coastguard Worker }
1520*35238bceSAndroid Build Coastguard Worker }
1521*35238bceSAndroid Build Coastguard Worker }
1522*35238bceSAndroid Build Coastguard Worker layoutQualifierGroup->addChild(operationGroup);
1523*35238bceSAndroid Build Coastguard Worker }
1524*35238bceSAndroid Build Coastguard Worker layoutGroup->addChild(layoutQualifierGroup);
1525*35238bceSAndroid Build Coastguard Worker }
1526*35238bceSAndroid Build Coastguard Worker
1527*35238bceSAndroid Build Coastguard Worker {
1528*35238bceSAndroid Build Coastguard Worker TestCaseGroup *invalidGroup = new TestCaseGroup(m_context, "invalid", "Test invalid layouts");
1529*35238bceSAndroid Build Coastguard Worker
1530*35238bceSAndroid Build Coastguard Worker {
1531*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::TestSpec spec;
1532*35238bceSAndroid Build Coastguard Worker
1533*35238bceSAndroid Build Coastguard Worker spec.atomicCounterCount = 1;
1534*35238bceSAndroid Build Coastguard Worker spec.operations = AtomicCounterTest::OPERATION_INC;
1535*35238bceSAndroid Build Coastguard Worker spec.callCount = 1;
1536*35238bceSAndroid Build Coastguard Worker spec.useBranches = false;
1537*35238bceSAndroid Build Coastguard Worker spec.threadCount = 1;
1538*35238bceSAndroid Build Coastguard Worker spec.bindingType = AtomicCounterTest::BINDINGTYPE_INVALID;
1539*35238bceSAndroid Build Coastguard Worker spec.offsetType = AtomicCounterTest::OFFSETTYPE_NONE;
1540*35238bceSAndroid Build Coastguard Worker
1541*35238bceSAndroid Build Coastguard Worker invalidGroup->addChild(new AtomicCounterTest(m_context, "invalid_binding",
1542*35238bceSAndroid Build Coastguard Worker "Test layout qualifiers with invalid binding.", spec));
1543*35238bceSAndroid Build Coastguard Worker }
1544*35238bceSAndroid Build Coastguard Worker
1545*35238bceSAndroid Build Coastguard Worker {
1546*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::TestSpec spec;
1547*35238bceSAndroid Build Coastguard Worker
1548*35238bceSAndroid Build Coastguard Worker spec.atomicCounterCount = 1;
1549*35238bceSAndroid Build Coastguard Worker spec.operations = AtomicCounterTest::OPERATION_INC;
1550*35238bceSAndroid Build Coastguard Worker spec.callCount = 1;
1551*35238bceSAndroid Build Coastguard Worker spec.useBranches = false;
1552*35238bceSAndroid Build Coastguard Worker spec.threadCount = 1;
1553*35238bceSAndroid Build Coastguard Worker spec.bindingType = AtomicCounterTest::BINDINGTYPE_INVALID_DEFAULT;
1554*35238bceSAndroid Build Coastguard Worker spec.offsetType = AtomicCounterTest::OFFSETTYPE_NONE;
1555*35238bceSAndroid Build Coastguard Worker
1556*35238bceSAndroid Build Coastguard Worker invalidGroup->addChild(new AtomicCounterTest(m_context, "invalid_default_binding",
1557*35238bceSAndroid Build Coastguard Worker "Test layout qualifiers with invalid default binding.",
1558*35238bceSAndroid Build Coastguard Worker spec));
1559*35238bceSAndroid Build Coastguard Worker }
1560*35238bceSAndroid Build Coastguard Worker
1561*35238bceSAndroid Build Coastguard Worker {
1562*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::TestSpec spec;
1563*35238bceSAndroid Build Coastguard Worker
1564*35238bceSAndroid Build Coastguard Worker spec.atomicCounterCount = 1;
1565*35238bceSAndroid Build Coastguard Worker spec.operations = AtomicCounterTest::OPERATION_INC;
1566*35238bceSAndroid Build Coastguard Worker spec.callCount = 1;
1567*35238bceSAndroid Build Coastguard Worker spec.useBranches = false;
1568*35238bceSAndroid Build Coastguard Worker spec.threadCount = 1;
1569*35238bceSAndroid Build Coastguard Worker spec.bindingType = AtomicCounterTest::BINDINGTYPE_BASIC;
1570*35238bceSAndroid Build Coastguard Worker spec.offsetType = AtomicCounterTest::OFFSETTYPE_INVALID;
1571*35238bceSAndroid Build Coastguard Worker
1572*35238bceSAndroid Build Coastguard Worker invalidGroup->addChild(new AtomicCounterTest(
1573*35238bceSAndroid Build Coastguard Worker m_context, "invalid_offset_align", "Test layout qualifiers with invalid alignment offset.", spec));
1574*35238bceSAndroid Build Coastguard Worker }
1575*35238bceSAndroid Build Coastguard Worker
1576*35238bceSAndroid Build Coastguard Worker {
1577*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::TestSpec spec;
1578*35238bceSAndroid Build Coastguard Worker
1579*35238bceSAndroid Build Coastguard Worker spec.atomicCounterCount = 2;
1580*35238bceSAndroid Build Coastguard Worker spec.operations = AtomicCounterTest::OPERATION_INC;
1581*35238bceSAndroid Build Coastguard Worker spec.callCount = 1;
1582*35238bceSAndroid Build Coastguard Worker spec.useBranches = false;
1583*35238bceSAndroid Build Coastguard Worker spec.threadCount = 1;
1584*35238bceSAndroid Build Coastguard Worker spec.bindingType = AtomicCounterTest::BINDINGTYPE_BASIC;
1585*35238bceSAndroid Build Coastguard Worker spec.offsetType = AtomicCounterTest::OFFSETTYPE_INVALID_OVERLAPPING;
1586*35238bceSAndroid Build Coastguard Worker
1587*35238bceSAndroid Build Coastguard Worker invalidGroup->addChild(new AtomicCounterTest(m_context, "invalid_offset_overlap",
1588*35238bceSAndroid Build Coastguard Worker "Test layout qualifiers with invalid overlapping offset.",
1589*35238bceSAndroid Build Coastguard Worker spec));
1590*35238bceSAndroid Build Coastguard Worker }
1591*35238bceSAndroid Build Coastguard Worker
1592*35238bceSAndroid Build Coastguard Worker {
1593*35238bceSAndroid Build Coastguard Worker AtomicCounterTest::TestSpec spec;
1594*35238bceSAndroid Build Coastguard Worker
1595*35238bceSAndroid Build Coastguard Worker spec.atomicCounterCount = 1;
1596*35238bceSAndroid Build Coastguard Worker spec.operations = AtomicCounterTest::OPERATION_INC;
1597*35238bceSAndroid Build Coastguard Worker spec.callCount = 1;
1598*35238bceSAndroid Build Coastguard Worker spec.useBranches = false;
1599*35238bceSAndroid Build Coastguard Worker spec.threadCount = 1;
1600*35238bceSAndroid Build Coastguard Worker spec.bindingType = AtomicCounterTest::BINDINGTYPE_BASIC;
1601*35238bceSAndroid Build Coastguard Worker spec.offsetType = AtomicCounterTest::OFFSETTYPE_INVALID_DEFAULT;
1602*35238bceSAndroid Build Coastguard Worker
1603*35238bceSAndroid Build Coastguard Worker invalidGroup->addChild(new AtomicCounterTest(
1604*35238bceSAndroid Build Coastguard Worker m_context, "invalid_default_offset", "Test layout qualifiers with invalid default offset.", spec));
1605*35238bceSAndroid Build Coastguard Worker }
1606*35238bceSAndroid Build Coastguard Worker
1607*35238bceSAndroid Build Coastguard Worker layoutGroup->addChild(invalidGroup);
1608*35238bceSAndroid Build Coastguard Worker }
1609*35238bceSAndroid Build Coastguard Worker
1610*35238bceSAndroid Build Coastguard Worker addChild(layoutGroup);
1611*35238bceSAndroid Build Coastguard Worker }
1612*35238bceSAndroid Build Coastguard Worker }
1613*35238bceSAndroid Build Coastguard Worker
~AtomicCounterTests(void)1614*35238bceSAndroid Build Coastguard Worker AtomicCounterTests::~AtomicCounterTests(void)
1615*35238bceSAndroid Build Coastguard Worker {
1616*35238bceSAndroid Build Coastguard Worker }
1617*35238bceSAndroid Build Coastguard Worker
init(void)1618*35238bceSAndroid Build Coastguard Worker void AtomicCounterTests::init(void)
1619*35238bceSAndroid Build Coastguard Worker {
1620*35238bceSAndroid Build Coastguard Worker }
1621*35238bceSAndroid Build Coastguard Worker
1622*35238bceSAndroid Build Coastguard Worker } // namespace Functional
1623*35238bceSAndroid Build Coastguard Worker } // namespace gles31
1624*35238bceSAndroid Build Coastguard Worker } // namespace deqp
1625