xref: /aosp_15_r20/external/deqp/modules/gles31/functional/es31fSSBOArrayLengthTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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 SSBO array length tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es31fSSBOArrayLengthTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker #include <sstream>
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker namespace deqp
35*35238bceSAndroid Build Coastguard Worker {
36*35238bceSAndroid Build Coastguard Worker namespace gles31
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker namespace Functional
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker namespace
41*35238bceSAndroid Build Coastguard Worker {
42*35238bceSAndroid Build Coastguard Worker 
43*35238bceSAndroid Build Coastguard Worker class SSBOArrayLengthCase : public TestCase
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker public:
46*35238bceSAndroid Build Coastguard Worker     enum ArrayAccess
47*35238bceSAndroid Build Coastguard Worker     {
48*35238bceSAndroid Build Coastguard Worker         ACCESS_DEFAULT = 0,
49*35238bceSAndroid Build Coastguard Worker         ACCESS_WRITEONLY,
50*35238bceSAndroid Build Coastguard Worker         ACCESS_READONLY,
51*35238bceSAndroid Build Coastguard Worker 
52*35238bceSAndroid Build Coastguard Worker         ACCESS_LAST
53*35238bceSAndroid Build Coastguard Worker     };
54*35238bceSAndroid Build Coastguard Worker 
55*35238bceSAndroid Build Coastguard Worker     SSBOArrayLengthCase(Context &context, const char *name, const char *desc, ArrayAccess access, bool sized);
56*35238bceSAndroid Build Coastguard Worker     ~SSBOArrayLengthCase(void);
57*35238bceSAndroid Build Coastguard Worker 
58*35238bceSAndroid Build Coastguard Worker     void init(void);
59*35238bceSAndroid Build Coastguard Worker     void deinit(void);
60*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
61*35238bceSAndroid Build Coastguard Worker 
62*35238bceSAndroid Build Coastguard Worker private:
63*35238bceSAndroid Build Coastguard Worker     std::string genComputeSource(void) const;
64*35238bceSAndroid Build Coastguard Worker 
65*35238bceSAndroid Build Coastguard Worker     const ArrayAccess m_access;
66*35238bceSAndroid Build Coastguard Worker     const bool m_sized;
67*35238bceSAndroid Build Coastguard Worker 
68*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *m_shader;
69*35238bceSAndroid Build Coastguard Worker     uint32_t m_targetBufferID;
70*35238bceSAndroid Build Coastguard Worker     uint32_t m_outputBufferID;
71*35238bceSAndroid Build Coastguard Worker 
72*35238bceSAndroid Build Coastguard Worker     static const int s_fixedBufferSize = 16;
73*35238bceSAndroid Build Coastguard Worker };
74*35238bceSAndroid Build Coastguard Worker 
SSBOArrayLengthCase(Context & context,const char * name,const char * desc,ArrayAccess access,bool sized)75*35238bceSAndroid Build Coastguard Worker SSBOArrayLengthCase::SSBOArrayLengthCase(Context &context, const char *name, const char *desc, ArrayAccess access,
76*35238bceSAndroid Build Coastguard Worker                                          bool sized)
77*35238bceSAndroid Build Coastguard Worker     : TestCase(context, name, desc)
78*35238bceSAndroid Build Coastguard Worker     , m_access(access)
79*35238bceSAndroid Build Coastguard Worker     , m_sized(sized)
80*35238bceSAndroid Build Coastguard Worker     , m_shader(DE_NULL)
81*35238bceSAndroid Build Coastguard Worker     , m_targetBufferID(0)
82*35238bceSAndroid Build Coastguard Worker     , m_outputBufferID(0)
83*35238bceSAndroid Build Coastguard Worker {
84*35238bceSAndroid Build Coastguard Worker }
85*35238bceSAndroid Build Coastguard Worker 
~SSBOArrayLengthCase(void)86*35238bceSAndroid Build Coastguard Worker SSBOArrayLengthCase::~SSBOArrayLengthCase(void)
87*35238bceSAndroid Build Coastguard Worker {
88*35238bceSAndroid Build Coastguard Worker     deinit();
89*35238bceSAndroid Build Coastguard Worker }
90*35238bceSAndroid Build Coastguard Worker 
init(void)91*35238bceSAndroid Build Coastguard Worker void SSBOArrayLengthCase::init(void)
92*35238bceSAndroid Build Coastguard Worker {
93*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl       = m_context.getRenderContext().getFunctions();
94*35238bceSAndroid Build Coastguard Worker     const uint32_t invalidValues[] = {0xFFFFFFFFUL, 0xAAAAAAAAUL};
95*35238bceSAndroid Build Coastguard Worker 
96*35238bceSAndroid Build Coastguard Worker     // program
97*35238bceSAndroid Build Coastguard Worker     m_shader = new glu::ShaderProgram(m_context.getRenderContext(), glu::ProgramSources()
98*35238bceSAndroid Build Coastguard Worker                                                                         << glu::ComputeSource(genComputeSource()));
99*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << *m_shader;
100*35238bceSAndroid Build Coastguard Worker 
101*35238bceSAndroid Build Coastguard Worker     if (!m_shader->isOk())
102*35238bceSAndroid Build Coastguard Worker         throw tcu::TestError("Failed to build shader");
103*35238bceSAndroid Build Coastguard Worker 
104*35238bceSAndroid Build Coastguard Worker     // gen and attach buffers
105*35238bceSAndroid Build Coastguard Worker     gl.genBuffers(1, &m_outputBufferID);
106*35238bceSAndroid Build Coastguard Worker     gl.bindBuffer(GL_SHADER_STORAGE_BUFFER, m_outputBufferID);
107*35238bceSAndroid Build Coastguard Worker     gl.bufferData(GL_SHADER_STORAGE_BUFFER, 2 * (int)sizeof(uint32_t), invalidValues, GL_DYNAMIC_COPY);
108*35238bceSAndroid Build Coastguard Worker 
109*35238bceSAndroid Build Coastguard Worker     gl.genBuffers(1, &m_targetBufferID);
110*35238bceSAndroid Build Coastguard Worker     gl.bindBuffer(GL_SHADER_STORAGE_BUFFER, m_targetBufferID);
111*35238bceSAndroid Build Coastguard Worker 
112*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "create buffers");
113*35238bceSAndroid Build Coastguard Worker 
114*35238bceSAndroid Build Coastguard Worker     gl.bindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, m_outputBufferID);
115*35238bceSAndroid Build Coastguard Worker     gl.bindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, m_targetBufferID);
116*35238bceSAndroid Build Coastguard Worker 
117*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "bind buffers");
118*35238bceSAndroid Build Coastguard Worker 
119*35238bceSAndroid Build Coastguard Worker     // check the ssbo has expected layout
120*35238bceSAndroid Build Coastguard Worker     {
121*35238bceSAndroid Build Coastguard Worker         const uint32_t index = gl.getProgramResourceIndex(m_shader->getProgram(), GL_BUFFER_VARIABLE, "Out.outLength");
122*35238bceSAndroid Build Coastguard Worker         const glw::GLenum prop = GL_OFFSET;
123*35238bceSAndroid Build Coastguard Worker         glw::GLint result      = 0;
124*35238bceSAndroid Build Coastguard Worker 
125*35238bceSAndroid Build Coastguard Worker         if (index == GL_INVALID_INDEX)
126*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("Failed to find outLength variable");
127*35238bceSAndroid Build Coastguard Worker 
128*35238bceSAndroid Build Coastguard Worker         gl.getProgramResourceiv(m_shader->getProgram(), GL_BUFFER_VARIABLE, index, 1, &prop, 1, DE_NULL, &result);
129*35238bceSAndroid Build Coastguard Worker 
130*35238bceSAndroid Build Coastguard Worker         if (result != 0)
131*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("Unexpected outLength location");
132*35238bceSAndroid Build Coastguard Worker     }
133*35238bceSAndroid Build Coastguard Worker     {
134*35238bceSAndroid Build Coastguard Worker         const uint32_t index   = gl.getProgramResourceIndex(m_shader->getProgram(), GL_BUFFER_VARIABLE, "Out.unused");
135*35238bceSAndroid Build Coastguard Worker         const glw::GLenum prop = GL_OFFSET;
136*35238bceSAndroid Build Coastguard Worker         glw::GLint result      = 0;
137*35238bceSAndroid Build Coastguard Worker 
138*35238bceSAndroid Build Coastguard Worker         if (index == GL_INVALID_INDEX)
139*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("Failed to find unused variable");
140*35238bceSAndroid Build Coastguard Worker 
141*35238bceSAndroid Build Coastguard Worker         gl.getProgramResourceiv(m_shader->getProgram(), GL_BUFFER_VARIABLE, index, 1, &prop, 1, DE_NULL, &result);
142*35238bceSAndroid Build Coastguard Worker 
143*35238bceSAndroid Build Coastguard Worker         if (result != 4)
144*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("Unexpected unused location");
145*35238bceSAndroid Build Coastguard Worker     }
146*35238bceSAndroid Build Coastguard Worker     {
147*35238bceSAndroid Build Coastguard Worker         const uint32_t index   = gl.getProgramResourceIndex(m_shader->getProgram(), GL_BUFFER_VARIABLE, "Target.array");
148*35238bceSAndroid Build Coastguard Worker         const glw::GLenum prop = GL_ARRAY_STRIDE;
149*35238bceSAndroid Build Coastguard Worker         glw::GLint result      = 0;
150*35238bceSAndroid Build Coastguard Worker 
151*35238bceSAndroid Build Coastguard Worker         if (index == GL_INVALID_INDEX)
152*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("Failed to find array variable");
153*35238bceSAndroid Build Coastguard Worker 
154*35238bceSAndroid Build Coastguard Worker         gl.getProgramResourceiv(m_shader->getProgram(), GL_BUFFER_VARIABLE, index, 1, &prop, 1, DE_NULL, &result);
155*35238bceSAndroid Build Coastguard Worker 
156*35238bceSAndroid Build Coastguard Worker         if (result != 4)
157*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("Unexpected array stride");
158*35238bceSAndroid Build Coastguard Worker     }
159*35238bceSAndroid Build Coastguard Worker }
160*35238bceSAndroid Build Coastguard Worker 
deinit(void)161*35238bceSAndroid Build Coastguard Worker void SSBOArrayLengthCase::deinit(void)
162*35238bceSAndroid Build Coastguard Worker {
163*35238bceSAndroid Build Coastguard Worker     if (m_shader)
164*35238bceSAndroid Build Coastguard Worker     {
165*35238bceSAndroid Build Coastguard Worker         delete m_shader;
166*35238bceSAndroid Build Coastguard Worker         m_shader = DE_NULL;
167*35238bceSAndroid Build Coastguard Worker     }
168*35238bceSAndroid Build Coastguard Worker 
169*35238bceSAndroid Build Coastguard Worker     if (m_targetBufferID)
170*35238bceSAndroid Build Coastguard Worker     {
171*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().deleteBuffers(1, &m_targetBufferID);
172*35238bceSAndroid Build Coastguard Worker         m_targetBufferID = 0;
173*35238bceSAndroid Build Coastguard Worker     }
174*35238bceSAndroid Build Coastguard Worker 
175*35238bceSAndroid Build Coastguard Worker     if (m_outputBufferID)
176*35238bceSAndroid Build Coastguard Worker     {
177*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().deleteBuffers(1, &m_outputBufferID);
178*35238bceSAndroid Build Coastguard Worker         m_outputBufferID = 0;
179*35238bceSAndroid Build Coastguard Worker     }
180*35238bceSAndroid Build Coastguard Worker }
181*35238bceSAndroid Build Coastguard Worker 
iterate(void)182*35238bceSAndroid Build Coastguard Worker SSBOArrayLengthCase::IterateResult SSBOArrayLengthCase::iterate(void)
183*35238bceSAndroid Build Coastguard Worker {
184*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_context.getRenderContext().getFunctions();
185*35238bceSAndroid Build Coastguard Worker     bool error               = false;
186*35238bceSAndroid Build Coastguard Worker 
187*35238bceSAndroid Build Coastguard Worker     // Update buffer size
188*35238bceSAndroid Build Coastguard Worker 
189*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << tcu::TestLog::Message << "Allocating float memory buffer with "
190*35238bceSAndroid Build Coastguard Worker                        << static_cast<int>(s_fixedBufferSize) << " elements." << tcu::TestLog::EndMessage;
191*35238bceSAndroid Build Coastguard Worker 
192*35238bceSAndroid Build Coastguard Worker     gl.bindBuffer(GL_SHADER_STORAGE_BUFFER, m_targetBufferID);
193*35238bceSAndroid Build Coastguard Worker     gl.bufferData(GL_SHADER_STORAGE_BUFFER, s_fixedBufferSize * (int)sizeof(float), DE_NULL, GL_DYNAMIC_COPY);
194*35238bceSAndroid Build Coastguard Worker 
195*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "update buffer");
196*35238bceSAndroid Build Coastguard Worker 
197*35238bceSAndroid Build Coastguard Worker     // Run compute
198*35238bceSAndroid Build Coastguard Worker 
199*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << tcu::TestLog::Message << "Running compute shader." << tcu::TestLog::EndMessage;
200*35238bceSAndroid Build Coastguard Worker 
201*35238bceSAndroid Build Coastguard Worker     gl.useProgram(m_shader->getProgram());
202*35238bceSAndroid Build Coastguard Worker     gl.dispatchCompute(1, 1, 1);
203*35238bceSAndroid Build Coastguard Worker 
204*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "dispatch");
205*35238bceSAndroid Build Coastguard Worker 
206*35238bceSAndroid Build Coastguard Worker     // Verify
207*35238bceSAndroid Build Coastguard Worker     {
208*35238bceSAndroid Build Coastguard Worker         const void *ptr;
209*35238bceSAndroid Build Coastguard Worker 
210*35238bceSAndroid Build Coastguard Worker         gl.bindBuffer(GL_SHADER_STORAGE_BUFFER, m_outputBufferID);
211*35238bceSAndroid Build Coastguard Worker         ptr = gl.mapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, (int)sizeof(uint32_t), GL_MAP_READ_BIT);
212*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "map");
213*35238bceSAndroid Build Coastguard Worker 
214*35238bceSAndroid Build Coastguard Worker         if (!ptr)
215*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("mapBufferRange returned NULL");
216*35238bceSAndroid Build Coastguard Worker 
217*35238bceSAndroid Build Coastguard Worker         if (*(const uint32_t *)ptr != (uint32_t)s_fixedBufferSize)
218*35238bceSAndroid Build Coastguard Worker         {
219*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "ERROR: Length returned was " << *(const uint32_t *)ptr
220*35238bceSAndroid Build Coastguard Worker                                << ", expected " << static_cast<int>(s_fixedBufferSize) << tcu::TestLog::EndMessage;
221*35238bceSAndroid Build Coastguard Worker             error = true;
222*35238bceSAndroid Build Coastguard Worker         }
223*35238bceSAndroid Build Coastguard Worker         else
224*35238bceSAndroid Build Coastguard Worker             m_testCtx.getLog() << tcu::TestLog::Message << "Length returned was correct." << tcu::TestLog::EndMessage;
225*35238bceSAndroid Build Coastguard Worker 
226*35238bceSAndroid Build Coastguard Worker         if (gl.unmapBuffer(GL_SHADER_STORAGE_BUFFER) == GL_FALSE)
227*35238bceSAndroid Build Coastguard Worker             throw tcu::TestError("unmapBuffer returned false");
228*35238bceSAndroid Build Coastguard Worker 
229*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "unmap");
230*35238bceSAndroid Build Coastguard Worker     }
231*35238bceSAndroid Build Coastguard Worker 
232*35238bceSAndroid Build Coastguard Worker     if (!error)
233*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
234*35238bceSAndroid Build Coastguard Worker     else
235*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
236*35238bceSAndroid Build Coastguard Worker     return STOP;
237*35238bceSAndroid Build Coastguard Worker }
238*35238bceSAndroid Build Coastguard Worker 
genComputeSource(void) const239*35238bceSAndroid Build Coastguard Worker std::string SSBOArrayLengthCase::genComputeSource(void) const
240*35238bceSAndroid Build Coastguard Worker {
241*35238bceSAndroid Build Coastguard Worker     const std::string qualifierStr = (m_access == ACCESS_READONLY)  ? ("readonly ") :
242*35238bceSAndroid Build Coastguard Worker                                      (m_access == ACCESS_WRITEONLY) ? ("writeonly ") :
243*35238bceSAndroid Build Coastguard Worker                                                                       ("");
244*35238bceSAndroid Build Coastguard Worker     const std::string sizeStr      = (m_sized) ? (de::toString(static_cast<int>(s_fixedBufferSize))) : ("");
245*35238bceSAndroid Build Coastguard Worker 
246*35238bceSAndroid Build Coastguard Worker     std::ostringstream buf;
247*35238bceSAndroid Build Coastguard Worker     buf << "#version 310 es\n"
248*35238bceSAndroid Build Coastguard Worker         << "layout(local_size_x = 1, local_size_y = 1) in;\n"
249*35238bceSAndroid Build Coastguard Worker         << "layout(std430) buffer;\n"
250*35238bceSAndroid Build Coastguard Worker         << "\n"
251*35238bceSAndroid Build Coastguard Worker         << "layout(binding = 0) buffer Out\n"
252*35238bceSAndroid Build Coastguard Worker         << "{\n"
253*35238bceSAndroid Build Coastguard Worker         << "    int outLength;\n"
254*35238bceSAndroid Build Coastguard Worker         << "    uint unused;\n"
255*35238bceSAndroid Build Coastguard Worker         << "} sb_out;\n"
256*35238bceSAndroid Build Coastguard Worker         << "layout(binding = 1) " << qualifierStr << "buffer Target\n"
257*35238bceSAndroid Build Coastguard Worker         << "{\n"
258*35238bceSAndroid Build Coastguard Worker         << "    float array[" << sizeStr << "];\n"
259*35238bceSAndroid Build Coastguard Worker         << "} sb_target;\n\n"
260*35238bceSAndroid Build Coastguard Worker         << "void main (void)\n"
261*35238bceSAndroid Build Coastguard Worker         << "{\n";
262*35238bceSAndroid Build Coastguard Worker 
263*35238bceSAndroid Build Coastguard Worker     // read
264*35238bceSAndroid Build Coastguard Worker     if (m_access == ACCESS_READONLY || m_access == ACCESS_DEFAULT)
265*35238bceSAndroid Build Coastguard Worker         buf << "    sb_out.unused = uint(sb_target.array[1]);\n";
266*35238bceSAndroid Build Coastguard Worker 
267*35238bceSAndroid Build Coastguard Worker     // write
268*35238bceSAndroid Build Coastguard Worker     if (m_access == ACCESS_WRITEONLY || m_access == ACCESS_DEFAULT)
269*35238bceSAndroid Build Coastguard Worker         buf << "    sb_target.array[2] = float(sb_out.unused);\n";
270*35238bceSAndroid Build Coastguard Worker 
271*35238bceSAndroid Build Coastguard Worker     // actual test
272*35238bceSAndroid Build Coastguard Worker     buf << "\n"
273*35238bceSAndroid Build Coastguard Worker         << "    sb_out.outLength = sb_target.array.length();\n"
274*35238bceSAndroid Build Coastguard Worker         << "}\n";
275*35238bceSAndroid Build Coastguard Worker 
276*35238bceSAndroid Build Coastguard Worker     return buf.str();
277*35238bceSAndroid Build Coastguard Worker }
278*35238bceSAndroid Build Coastguard Worker 
279*35238bceSAndroid Build Coastguard Worker } // namespace
280*35238bceSAndroid Build Coastguard Worker 
SSBOArrayLengthTests(Context & context)281*35238bceSAndroid Build Coastguard Worker SSBOArrayLengthTests::SSBOArrayLengthTests(Context &context)
282*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "array_length", "Test array.length()")
283*35238bceSAndroid Build Coastguard Worker {
284*35238bceSAndroid Build Coastguard Worker }
285*35238bceSAndroid Build Coastguard Worker 
~SSBOArrayLengthTests(void)286*35238bceSAndroid Build Coastguard Worker SSBOArrayLengthTests::~SSBOArrayLengthTests(void)
287*35238bceSAndroid Build Coastguard Worker {
288*35238bceSAndroid Build Coastguard Worker }
289*35238bceSAndroid Build Coastguard Worker 
init(void)290*35238bceSAndroid Build Coastguard Worker void SSBOArrayLengthTests::init(void)
291*35238bceSAndroid Build Coastguard Worker {
292*35238bceSAndroid Build Coastguard Worker     static const struct Qualifier
293*35238bceSAndroid Build Coastguard Worker     {
294*35238bceSAndroid Build Coastguard Worker         SSBOArrayLengthCase::ArrayAccess access;
295*35238bceSAndroid Build Coastguard Worker         const char *name;
296*35238bceSAndroid Build Coastguard Worker         const char *desc;
297*35238bceSAndroid Build Coastguard Worker     } qualifiers[] = {
298*35238bceSAndroid Build Coastguard Worker         {SSBOArrayLengthCase::ACCESS_DEFAULT, "", ""},
299*35238bceSAndroid Build Coastguard Worker         {SSBOArrayLengthCase::ACCESS_WRITEONLY, "writeonly_", "writeonly"},
300*35238bceSAndroid Build Coastguard Worker         {SSBOArrayLengthCase::ACCESS_READONLY, "readonly_", "readonly"},
301*35238bceSAndroid Build Coastguard Worker     };
302*35238bceSAndroid Build Coastguard Worker 
303*35238bceSAndroid Build Coastguard Worker     static const bool arraysSized[] = {true, false};
304*35238bceSAndroid Build Coastguard Worker 
305*35238bceSAndroid Build Coastguard Worker     for (int sizeNdx = 0; sizeNdx < DE_LENGTH_OF_ARRAY(arraysSized); ++sizeNdx)
306*35238bceSAndroid Build Coastguard Worker         for (int qualifierNdx = 0; qualifierNdx < DE_LENGTH_OF_ARRAY(qualifiers); ++qualifierNdx)
307*35238bceSAndroid Build Coastguard Worker         {
308*35238bceSAndroid Build Coastguard Worker             const std::string name = std::string() + ((arraysSized[sizeNdx]) ? ("sized_") : ("unsized_")) +
309*35238bceSAndroid Build Coastguard Worker                                      qualifiers[qualifierNdx].name + "array";
310*35238bceSAndroid Build Coastguard Worker             const std::string desc = std::string("Test length() of ") +
311*35238bceSAndroid Build Coastguard Worker                                      ((arraysSized[sizeNdx]) ? ("sized ") : ("unsized ")) +
312*35238bceSAndroid Build Coastguard Worker                                      qualifiers[qualifierNdx].name + " array";
313*35238bceSAndroid Build Coastguard Worker 
314*35238bceSAndroid Build Coastguard Worker             this->addChild(new SSBOArrayLengthCase(m_context, name.c_str(), desc.c_str(),
315*35238bceSAndroid Build Coastguard Worker                                                    qualifiers[qualifierNdx].access, arraysSized[sizeNdx]));
316*35238bceSAndroid Build Coastguard Worker         }
317*35238bceSAndroid Build Coastguard Worker }
318*35238bceSAndroid Build Coastguard Worker 
319*35238bceSAndroid Build Coastguard Worker } // namespace Functional
320*35238bceSAndroid Build Coastguard Worker } // namespace gles31
321*35238bceSAndroid Build Coastguard Worker } // namespace deqp
322