xref: /aosp_15_r20/external/deqp/modules/gles31/functional/es31fNegativeSSBOBlockTests.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 2016 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 Negative Shader Storage Buffer Object (SSBO) tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker #include "es31fNegativeSSBOBlockTests.hpp"
24*35238bceSAndroid Build Coastguard Worker #include "glwDefs.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
28*35238bceSAndroid Build Coastguard Worker #include <map>
29*35238bceSAndroid Build Coastguard Worker 
30*35238bceSAndroid Build Coastguard Worker namespace deqp
31*35238bceSAndroid Build Coastguard Worker {
32*35238bceSAndroid Build Coastguard Worker namespace gles31
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker namespace Functional
35*35238bceSAndroid Build Coastguard Worker {
36*35238bceSAndroid Build Coastguard Worker namespace NegativeTestShared
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker namespace
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker using glu::CallLogWrapper;
41*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
42*35238bceSAndroid Build Coastguard Worker using namespace glw;
43*35238bceSAndroid Build Coastguard Worker namespace args
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker enum ArgMember
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker     ARGMEMBER_FORMAT = 0,
48*35238bceSAndroid Build Coastguard Worker     ARGMEMBER_BINDING_POINT,
49*35238bceSAndroid Build Coastguard Worker     ARGMEMBER_MATRIX_ORDER,
50*35238bceSAndroid Build Coastguard Worker     ARGMEMBER_MEMBER_TYPE,
51*35238bceSAndroid Build Coastguard Worker     ARGMEMBER_NAME,
52*35238bceSAndroid Build Coastguard Worker     ARGMEMBER_FIXED_ARRAY,
53*35238bceSAndroid Build Coastguard Worker     ARGMEMBER_VARIABLE_ARRAY,
54*35238bceSAndroid Build Coastguard Worker     ARGMEMBER_REORDER
55*35238bceSAndroid Build Coastguard Worker };
56*35238bceSAndroid Build Coastguard Worker 
57*35238bceSAndroid Build Coastguard Worker // key pair ssbo arg data
58*35238bceSAndroid Build Coastguard Worker struct SsboArgData
59*35238bceSAndroid Build Coastguard Worker {
60*35238bceSAndroid Build Coastguard Worker     ArgMember member;
61*35238bceSAndroid Build Coastguard Worker     std::string data;
62*35238bceSAndroid Build Coastguard Worker 
SsboArgDatadeqp::gles31::Functional::NegativeTestShared::__anonf37e7ea30111::args::SsboArgData63*35238bceSAndroid Build Coastguard Worker     SsboArgData(const ArgMember &member_, const std::string &data_)
64*35238bceSAndroid Build Coastguard Worker     {
65*35238bceSAndroid Build Coastguard Worker         member = member_;
66*35238bceSAndroid Build Coastguard Worker         data   = data_;
67*35238bceSAndroid Build Coastguard Worker     }
68*35238bceSAndroid Build Coastguard Worker };
69*35238bceSAndroid Build Coastguard Worker 
70*35238bceSAndroid Build Coastguard Worker // class which manages string based argument used to build varying ssbo interface blocks and members
71*35238bceSAndroid Build Coastguard Worker class SsboArgs
72*35238bceSAndroid Build Coastguard Worker {
73*35238bceSAndroid Build Coastguard Worker public:
74*35238bceSAndroid Build Coastguard Worker     SsboArgs(const std::string version, tcu::TestLog &log);
75*35238bceSAndroid Build Coastguard Worker 
76*35238bceSAndroid Build Coastguard Worker     void setSingleValue(const SsboArgData argData);
77*35238bceSAndroid Build Coastguard Worker     bool setAllValues(const std::vector<SsboArgData> argDataList);
78*35238bceSAndroid Build Coastguard Worker 
79*35238bceSAndroid Build Coastguard Worker     bool getMemberReorder(void) const;
80*35238bceSAndroid Build Coastguard Worker 
81*35238bceSAndroid Build Coastguard Worker     void resetValues(void);
82*35238bceSAndroid Build Coastguard Worker 
83*35238bceSAndroid Build Coastguard Worker     std::map<std::string, std::string> populateArgsMap(void) const;
84*35238bceSAndroid Build Coastguard Worker 
85*35238bceSAndroid Build Coastguard Worker private:
86*35238bceSAndroid Build Coastguard Worker     std::string m_negativeContextVersion;
87*35238bceSAndroid Build Coastguard Worker     std::string m_stdFormat;
88*35238bceSAndroid Build Coastguard Worker     std::string m_bindingPoint;
89*35238bceSAndroid Build Coastguard Worker     std::string m_matrixOrder;
90*35238bceSAndroid Build Coastguard Worker     std::string m_memberType;
91*35238bceSAndroid Build Coastguard Worker     std::string m_memberName;
92*35238bceSAndroid Build Coastguard Worker     std::string m_memberFixedArrayerName;
93*35238bceSAndroid Build Coastguard Worker     std::string m_memberVariableArray;
94*35238bceSAndroid Build Coastguard Worker     bool m_memberReorder;
95*35238bceSAndroid Build Coastguard Worker     int m_numberMembers;
96*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &m_testLog;
97*35238bceSAndroid Build Coastguard Worker 
98*35238bceSAndroid Build Coastguard Worker     void setDefaultValues(void);
99*35238bceSAndroid Build Coastguard Worker };
100*35238bceSAndroid Build Coastguard Worker 
101*35238bceSAndroid Build Coastguard Worker //constructor which ensure a proper context is passed into the struct
SsboArgs(const std::string version,tcu::TestLog & log)102*35238bceSAndroid Build Coastguard Worker SsboArgs::SsboArgs(const std::string version, tcu::TestLog &log)
103*35238bceSAndroid Build Coastguard Worker     : m_negativeContextVersion(version)
104*35238bceSAndroid Build Coastguard Worker     , m_numberMembers(8)
105*35238bceSAndroid Build Coastguard Worker     , m_testLog(log)
106*35238bceSAndroid Build Coastguard Worker {
107*35238bceSAndroid Build Coastguard Worker     setDefaultValues();
108*35238bceSAndroid Build Coastguard Worker }
109*35238bceSAndroid Build Coastguard Worker 
setSingleValue(const SsboArgData argData)110*35238bceSAndroid Build Coastguard Worker void SsboArgs::setSingleValue(const SsboArgData argData)
111*35238bceSAndroid Build Coastguard Worker {
112*35238bceSAndroid Build Coastguard Worker     std::string message;
113*35238bceSAndroid Build Coastguard Worker 
114*35238bceSAndroid Build Coastguard Worker     switch (argData.member)
115*35238bceSAndroid Build Coastguard Worker     {
116*35238bceSAndroid Build Coastguard Worker     case ARGMEMBER_FORMAT:
117*35238bceSAndroid Build Coastguard Worker         m_stdFormat = argData.data;
118*35238bceSAndroid Build Coastguard Worker         return;
119*35238bceSAndroid Build Coastguard Worker     case ARGMEMBER_BINDING_POINT:
120*35238bceSAndroid Build Coastguard Worker         m_bindingPoint = argData.data;
121*35238bceSAndroid Build Coastguard Worker         return;
122*35238bceSAndroid Build Coastguard Worker     case ARGMEMBER_MATRIX_ORDER:
123*35238bceSAndroid Build Coastguard Worker         m_matrixOrder = argData.data;
124*35238bceSAndroid Build Coastguard Worker         return;
125*35238bceSAndroid Build Coastguard Worker     case ARGMEMBER_MEMBER_TYPE:
126*35238bceSAndroid Build Coastguard Worker         m_memberType = argData.data;
127*35238bceSAndroid Build Coastguard Worker         return;
128*35238bceSAndroid Build Coastguard Worker     case ARGMEMBER_NAME:
129*35238bceSAndroid Build Coastguard Worker         m_memberName = argData.data;
130*35238bceSAndroid Build Coastguard Worker         return;
131*35238bceSAndroid Build Coastguard Worker     case ARGMEMBER_FIXED_ARRAY:
132*35238bceSAndroid Build Coastguard Worker         m_memberFixedArrayerName = argData.data;
133*35238bceSAndroid Build Coastguard Worker         return;
134*35238bceSAndroid Build Coastguard Worker     case ARGMEMBER_VARIABLE_ARRAY:
135*35238bceSAndroid Build Coastguard Worker         m_memberVariableArray = argData.data;
136*35238bceSAndroid Build Coastguard Worker         return;
137*35238bceSAndroid Build Coastguard Worker     case ARGMEMBER_REORDER:
138*35238bceSAndroid Build Coastguard Worker         if (argData.data == "true")
139*35238bceSAndroid Build Coastguard Worker         {
140*35238bceSAndroid Build Coastguard Worker             m_memberReorder = true;
141*35238bceSAndroid Build Coastguard Worker         }
142*35238bceSAndroid Build Coastguard Worker         return;
143*35238bceSAndroid Build Coastguard Worker     default:
144*35238bceSAndroid Build Coastguard Worker         message = "auto loop argument data member not recognised.";
145*35238bceSAndroid Build Coastguard Worker         m_testLog << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
146*35238bceSAndroid Build Coastguard Worker     }
147*35238bceSAndroid Build Coastguard Worker }
148*35238bceSAndroid Build Coastguard Worker 
setAllValues(const std::vector<SsboArgData> argDataList)149*35238bceSAndroid Build Coastguard Worker bool SsboArgs::setAllValues(const std::vector<SsboArgData> argDataList)
150*35238bceSAndroid Build Coastguard Worker {
151*35238bceSAndroid Build Coastguard Worker     std::string message;
152*35238bceSAndroid Build Coastguard Worker 
153*35238bceSAndroid Build Coastguard Worker     if ((argDataList.size() == 0) || (argDataList.size() > (size_t)m_numberMembers))
154*35238bceSAndroid Build Coastguard Worker     {
155*35238bceSAndroid Build Coastguard Worker         message = "set of args does not match the number of args struct changeable members.";
156*35238bceSAndroid Build Coastguard Worker         m_testLog << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
157*35238bceSAndroid Build Coastguard Worker 
158*35238bceSAndroid Build Coastguard Worker         return false;
159*35238bceSAndroid Build Coastguard Worker     }
160*35238bceSAndroid Build Coastguard Worker     else
161*35238bceSAndroid Build Coastguard Worker     {
162*35238bceSAndroid Build Coastguard Worker         for (unsigned int idx = 0; idx < argDataList.size(); idx++)
163*35238bceSAndroid Build Coastguard Worker         {
164*35238bceSAndroid Build Coastguard Worker             setSingleValue(argDataList[idx]);
165*35238bceSAndroid Build Coastguard Worker         }
166*35238bceSAndroid Build Coastguard Worker     }
167*35238bceSAndroid Build Coastguard Worker 
168*35238bceSAndroid Build Coastguard Worker     return true;
169*35238bceSAndroid Build Coastguard Worker }
170*35238bceSAndroid Build Coastguard Worker 
getMemberReorder(void) const171*35238bceSAndroid Build Coastguard Worker bool SsboArgs::getMemberReorder(void) const
172*35238bceSAndroid Build Coastguard Worker {
173*35238bceSAndroid Build Coastguard Worker     return m_memberReorder;
174*35238bceSAndroid Build Coastguard Worker }
175*35238bceSAndroid Build Coastguard Worker 
resetValues(void)176*35238bceSAndroid Build Coastguard Worker void SsboArgs::resetValues(void)
177*35238bceSAndroid Build Coastguard Worker {
178*35238bceSAndroid Build Coastguard Worker     setDefaultValues();
179*35238bceSAndroid Build Coastguard Worker }
180*35238bceSAndroid Build Coastguard Worker 
181*35238bceSAndroid Build Coastguard Worker //converts SsboArgs member variable into a map object to be used by tcu::StringTemplate
populateArgsMap(void) const182*35238bceSAndroid Build Coastguard Worker std::map<std::string, std::string> SsboArgs::populateArgsMap(void) const
183*35238bceSAndroid Build Coastguard Worker {
184*35238bceSAndroid Build Coastguard Worker     std::map<std::string, std::string> argsMap;
185*35238bceSAndroid Build Coastguard Worker 
186*35238bceSAndroid Build Coastguard Worker     // key placeholders located at specific points in the ssbo block
187*35238bceSAndroid Build Coastguard Worker     argsMap["NEGATIVE_CONTEXT_VERSION"] = m_negativeContextVersion;
188*35238bceSAndroid Build Coastguard Worker     argsMap["STD_FORMAT"]               = m_stdFormat;
189*35238bceSAndroid Build Coastguard Worker     argsMap["BINDING_POINT"]            = m_bindingPoint;
190*35238bceSAndroid Build Coastguard Worker     argsMap["MATRIX_ORDER"]             = m_matrixOrder;
191*35238bceSAndroid Build Coastguard Worker     argsMap["MEMBER_TYPE"]              = m_memberType;
192*35238bceSAndroid Build Coastguard Worker     argsMap["MEMBER_NAME"]              = m_memberName;
193*35238bceSAndroid Build Coastguard Worker     argsMap["MEMBER_FIXED_ARRAY"]       = m_memberFixedArrayerName;
194*35238bceSAndroid Build Coastguard Worker     argsMap["MEMBER_VARIABLE_ARRAY"]    = m_memberVariableArray;
195*35238bceSAndroid Build Coastguard Worker 
196*35238bceSAndroid Build Coastguard Worker     return argsMap;
197*35238bceSAndroid Build Coastguard Worker }
198*35238bceSAndroid Build Coastguard Worker 
199*35238bceSAndroid Build Coastguard Worker // default values i.e. same shader template
setDefaultValues(void)200*35238bceSAndroid Build Coastguard Worker void SsboArgs::setDefaultValues(void)
201*35238bceSAndroid Build Coastguard Worker {
202*35238bceSAndroid Build Coastguard Worker     m_stdFormat              = "std430";
203*35238bceSAndroid Build Coastguard Worker     m_bindingPoint           = "0";
204*35238bceSAndroid Build Coastguard Worker     m_matrixOrder            = "column_major";
205*35238bceSAndroid Build Coastguard Worker     m_memberType             = "int";
206*35238bceSAndroid Build Coastguard Worker     m_memberName             = "matrix";
207*35238bceSAndroid Build Coastguard Worker     m_memberFixedArrayerName = "10";
208*35238bceSAndroid Build Coastguard Worker     m_memberVariableArray    = "";
209*35238bceSAndroid Build Coastguard Worker     m_memberReorder          = false;
210*35238bceSAndroid Build Coastguard Worker }
211*35238bceSAndroid Build Coastguard Worker } // namespace args
212*35238bceSAndroid Build Coastguard Worker 
generateVaryingSSBOShader(const glw::GLenum shaderType,const args::SsboArgs & args,tcu::TestLog & log)213*35238bceSAndroid Build Coastguard Worker std::string generateVaryingSSBOShader(const glw::GLenum shaderType, const args::SsboArgs &args, tcu::TestLog &log)
214*35238bceSAndroid Build Coastguard Worker {
215*35238bceSAndroid Build Coastguard Worker     std::map<std::string, std::string> argsMap;
216*35238bceSAndroid Build Coastguard Worker     std::ostringstream source;
217*35238bceSAndroid Build Coastguard Worker     std::string sourceString;
218*35238bceSAndroid Build Coastguard Worker     std::stringstream ssboString;
219*35238bceSAndroid Build Coastguard Worker     std::string message;
220*35238bceSAndroid Build Coastguard Worker 
221*35238bceSAndroid Build Coastguard Worker     if (args.getMemberReorder())
222*35238bceSAndroid Build Coastguard Worker     {
223*35238bceSAndroid Build Coastguard Worker         ssboString << "    mediump vec4 array_1[${MEMBER_FIXED_ARRAY}];\n"
224*35238bceSAndroid Build Coastguard Worker                    << "    highp mat4 ${MEMBER_NAME};\n"
225*35238bceSAndroid Build Coastguard Worker                    << "    lowp ${MEMBER_TYPE} data;\n"
226*35238bceSAndroid Build Coastguard Worker                    << "    mediump float array_2[${MEMBER_VARIABLE_ARRAY}];\n";
227*35238bceSAndroid Build Coastguard Worker     }
228*35238bceSAndroid Build Coastguard Worker     else
229*35238bceSAndroid Build Coastguard Worker     {
230*35238bceSAndroid Build Coastguard Worker         ssboString << "    lowp ${MEMBER_TYPE} data;\n"
231*35238bceSAndroid Build Coastguard Worker                    << "    highp mat4 ${MEMBER_NAME};\n"
232*35238bceSAndroid Build Coastguard Worker                    << "    mediump vec4 array_1[${MEMBER_FIXED_ARRAY}];\n"
233*35238bceSAndroid Build Coastguard Worker                    << "    mediump float array_2[${MEMBER_VARIABLE_ARRAY}];\n";
234*35238bceSAndroid Build Coastguard Worker     }
235*35238bceSAndroid Build Coastguard Worker 
236*35238bceSAndroid Build Coastguard Worker     argsMap = args.populateArgsMap();
237*35238bceSAndroid Build Coastguard Worker 
238*35238bceSAndroid Build Coastguard Worker     switch (shaderType)
239*35238bceSAndroid Build Coastguard Worker     {
240*35238bceSAndroid Build Coastguard Worker     case GL_VERTEX_SHADER:
241*35238bceSAndroid Build Coastguard Worker     {
242*35238bceSAndroid Build Coastguard Worker         source << "${NEGATIVE_CONTEXT_VERSION}\n"
243*35238bceSAndroid Build Coastguard Worker                << "layout (location = 0) in highp vec4 position;\n"
244*35238bceSAndroid Build Coastguard Worker                << "layout (location = 1) in mediump vec4 colour;\n"
245*35238bceSAndroid Build Coastguard Worker                << "out mediump vec4 vertex_colour;\n"
246*35238bceSAndroid Build Coastguard Worker                << "layout (${STD_FORMAT}, binding = ${BINDING_POINT}, ${MATRIX_ORDER}) buffer ssbo_block\n"
247*35238bceSAndroid Build Coastguard Worker                << "{\n";
248*35238bceSAndroid Build Coastguard Worker 
249*35238bceSAndroid Build Coastguard Worker         source << ssboString.str();
250*35238bceSAndroid Build Coastguard Worker 
251*35238bceSAndroid Build Coastguard Worker         source << "} ssbo;\n"
252*35238bceSAndroid Build Coastguard Worker                << "void main()\n"
253*35238bceSAndroid Build Coastguard Worker                << "{\n"
254*35238bceSAndroid Build Coastguard Worker                << "    mediump vec4 variable;\n"
255*35238bceSAndroid Build Coastguard Worker                << "    gl_Position = ssbo.${MEMBER_NAME} * position;\n"
256*35238bceSAndroid Build Coastguard Worker                << "    for (int idx = 0; idx < ${MEMBER_FIXED_ARRAY}; idx++)\n"
257*35238bceSAndroid Build Coastguard Worker                << "    {\n"
258*35238bceSAndroid Build Coastguard Worker                << "        variable += ssbo.array_1[idx];\n"
259*35238bceSAndroid Build Coastguard Worker                << "    }\n"
260*35238bceSAndroid Build Coastguard Worker                << "    vertex_colour = colour + variable;\n"
261*35238bceSAndroid Build Coastguard Worker                << "}\n";
262*35238bceSAndroid Build Coastguard Worker 
263*35238bceSAndroid Build Coastguard Worker         sourceString = source.str();
264*35238bceSAndroid Build Coastguard Worker         sourceString = tcu::StringTemplate(sourceString).specialize(argsMap);
265*35238bceSAndroid Build Coastguard Worker 
266*35238bceSAndroid Build Coastguard Worker         return sourceString;
267*35238bceSAndroid Build Coastguard Worker     }
268*35238bceSAndroid Build Coastguard Worker 
269*35238bceSAndroid Build Coastguard Worker     case GL_FRAGMENT_SHADER:
270*35238bceSAndroid Build Coastguard Worker     {
271*35238bceSAndroid Build Coastguard Worker         source << "${NEGATIVE_CONTEXT_VERSION}\n"
272*35238bceSAndroid Build Coastguard Worker                << "in mediump vec4 vertex_colour;\n"
273*35238bceSAndroid Build Coastguard Worker                << "layout (location = 0) out mediump vec4 fragment_colour;\n"
274*35238bceSAndroid Build Coastguard Worker                << "layout (${STD_FORMAT}, binding = ${BINDING_POINT}, ${MATRIX_ORDER}) buffer ssbo_block\n"
275*35238bceSAndroid Build Coastguard Worker                << "{\n";
276*35238bceSAndroid Build Coastguard Worker 
277*35238bceSAndroid Build Coastguard Worker         source << ssboString.str();
278*35238bceSAndroid Build Coastguard Worker 
279*35238bceSAndroid Build Coastguard Worker         source << "} ssbo;\n"
280*35238bceSAndroid Build Coastguard Worker                << "void main()\n"
281*35238bceSAndroid Build Coastguard Worker                << "{\n"
282*35238bceSAndroid Build Coastguard Worker                << "    mediump vec4 variable;\n"
283*35238bceSAndroid Build Coastguard Worker                << "    variable * ssbo.${MEMBER_NAME};\n"
284*35238bceSAndroid Build Coastguard Worker                << "    for (int idx = 0; idx < ${MEMBER_FIXED_ARRAY}; idx++)\n"
285*35238bceSAndroid Build Coastguard Worker                << "    {\n"
286*35238bceSAndroid Build Coastguard Worker                << "        variable += ssbo.array_1[idx];\n"
287*35238bceSAndroid Build Coastguard Worker                << "    }\n"
288*35238bceSAndroid Build Coastguard Worker                << "    fragment_colour = vertex_colour + variable;\n"
289*35238bceSAndroid Build Coastguard Worker                << "}\n";
290*35238bceSAndroid Build Coastguard Worker 
291*35238bceSAndroid Build Coastguard Worker         sourceString = source.str();
292*35238bceSAndroid Build Coastguard Worker         sourceString = tcu::StringTemplate(sourceString).specialize(argsMap);
293*35238bceSAndroid Build Coastguard Worker 
294*35238bceSAndroid Build Coastguard Worker         return sourceString;
295*35238bceSAndroid Build Coastguard Worker     }
296*35238bceSAndroid Build Coastguard Worker 
297*35238bceSAndroid Build Coastguard Worker     case GL_GEOMETRY_SHADER:
298*35238bceSAndroid Build Coastguard Worker     {
299*35238bceSAndroid Build Coastguard Worker         // TODO:
300*35238bceSAndroid Build Coastguard Worker         return sourceString;
301*35238bceSAndroid Build Coastguard Worker     }
302*35238bceSAndroid Build Coastguard Worker 
303*35238bceSAndroid Build Coastguard Worker     case GL_TESS_CONTROL_SHADER:
304*35238bceSAndroid Build Coastguard Worker     {
305*35238bceSAndroid Build Coastguard Worker         // TODO:
306*35238bceSAndroid Build Coastguard Worker         return sourceString;
307*35238bceSAndroid Build Coastguard Worker     }
308*35238bceSAndroid Build Coastguard Worker 
309*35238bceSAndroid Build Coastguard Worker     case GL_TESS_EVALUATION_SHADER:
310*35238bceSAndroid Build Coastguard Worker     {
311*35238bceSAndroid Build Coastguard Worker         // TODO:
312*35238bceSAndroid Build Coastguard Worker         return sourceString;
313*35238bceSAndroid Build Coastguard Worker     }
314*35238bceSAndroid Build Coastguard Worker 
315*35238bceSAndroid Build Coastguard Worker     case GL_COMPUTE_SHADER:
316*35238bceSAndroid Build Coastguard Worker     {
317*35238bceSAndroid Build Coastguard Worker         // TODO:
318*35238bceSAndroid Build Coastguard Worker         return sourceString;
319*35238bceSAndroid Build Coastguard Worker     }
320*35238bceSAndroid Build Coastguard Worker 
321*35238bceSAndroid Build Coastguard Worker     default:
322*35238bceSAndroid Build Coastguard Worker     {
323*35238bceSAndroid Build Coastguard Worker         message = "shader type not recognised.";
324*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
325*35238bceSAndroid Build Coastguard Worker     }
326*35238bceSAndroid Build Coastguard Worker     }
327*35238bceSAndroid Build Coastguard Worker 
328*35238bceSAndroid Build Coastguard Worker     return std::string();
329*35238bceSAndroid Build Coastguard Worker }
330*35238bceSAndroid Build Coastguard Worker 
logProgramInfo(NegativeTestContext & ctx,GLint program)331*35238bceSAndroid Build Coastguard Worker void logProgramInfo(NegativeTestContext &ctx, GLint program)
332*35238bceSAndroid Build Coastguard Worker {
333*35238bceSAndroid Build Coastguard Worker     GLint maxLength = 0;
334*35238bceSAndroid Build Coastguard Worker     std::string message;
335*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log = ctx.getLog();
336*35238bceSAndroid Build Coastguard Worker 
337*35238bceSAndroid Build Coastguard Worker     ctx.glGetProgramiv(program, GL_INFO_LOG_LENGTH, &maxLength);
338*35238bceSAndroid Build Coastguard Worker 
339*35238bceSAndroid Build Coastguard Worker     message = "Program log:";
340*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
341*35238bceSAndroid Build Coastguard Worker 
342*35238bceSAndroid Build Coastguard Worker     if (maxLength == 0)
343*35238bceSAndroid Build Coastguard Worker     {
344*35238bceSAndroid Build Coastguard Worker         message = "No available info log.";
345*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
346*35238bceSAndroid Build Coastguard Worker         return;
347*35238bceSAndroid Build Coastguard Worker     }
348*35238bceSAndroid Build Coastguard Worker 
349*35238bceSAndroid Build Coastguard Worker     std::vector<GLchar> infoLog(maxLength);
350*35238bceSAndroid Build Coastguard Worker     ctx.glGetProgramInfoLog(program, maxLength, &maxLength, &infoLog[0]);
351*35238bceSAndroid Build Coastguard Worker 
352*35238bceSAndroid Build Coastguard Worker     std::string programLogMessage(&infoLog[0], maxLength);
353*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << programLogMessage << tcu::TestLog::EndMessage;
354*35238bceSAndroid Build Coastguard Worker }
355*35238bceSAndroid Build Coastguard Worker 
ssbo_block_matching(NegativeTestContext & ctx)356*35238bceSAndroid Build Coastguard Worker void ssbo_block_matching(NegativeTestContext &ctx)
357*35238bceSAndroid Build Coastguard Worker {
358*35238bceSAndroid Build Coastguard Worker     const bool isES32              = contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
359*35238bceSAndroid Build Coastguard Worker     const glu::GLSLVersion version = isES32 ? glu::GLSL_VERSION_320_ES : glu::GLSL_VERSION_310_ES;
360*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log              = ctx.getLog();
361*35238bceSAndroid Build Coastguard Worker     std::string message;
362*35238bceSAndroid Build Coastguard Worker     std::string versionString(glu::getGLSLVersionDeclaration(version));
363*35238bceSAndroid Build Coastguard Worker     args::SsboArgs ssboArgs(versionString, log);
364*35238bceSAndroid Build Coastguard Worker     GLint shaderVertexGL;
365*35238bceSAndroid Build Coastguard Worker     std::string shaderVertexString;
366*35238bceSAndroid Build Coastguard Worker     const char *shaderVertexCharPtr;
367*35238bceSAndroid Build Coastguard Worker 
368*35238bceSAndroid Build Coastguard Worker     // List of arguments used to create varying ssbo objects in the fragment shader
369*35238bceSAndroid Build Coastguard Worker     const args::SsboArgData argDataArrayFrag[] = {args::SsboArgData(args::ARGMEMBER_FORMAT, "std140"),
370*35238bceSAndroid Build Coastguard Worker                                                   args::SsboArgData(args::ARGMEMBER_BINDING_POINT, "10"),
371*35238bceSAndroid Build Coastguard Worker                                                   args::SsboArgData(args::ARGMEMBER_MATRIX_ORDER, "row_major"),
372*35238bceSAndroid Build Coastguard Worker                                                   args::SsboArgData(args::ARGMEMBER_MEMBER_TYPE, "vec2"),
373*35238bceSAndroid Build Coastguard Worker                                                   args::SsboArgData(args::ARGMEMBER_NAME, "name_changed"),
374*35238bceSAndroid Build Coastguard Worker                                                   args::SsboArgData(args::ARGMEMBER_FIXED_ARRAY, "20"),
375*35238bceSAndroid Build Coastguard Worker                                                   args::SsboArgData(args::ARGMEMBER_VARIABLE_ARRAY, "5"),
376*35238bceSAndroid Build Coastguard Worker                                                   args::SsboArgData(args::ARGMEMBER_REORDER, "true")};
377*35238bceSAndroid Build Coastguard Worker     std::vector<args::SsboArgData> argDataVectorFrag(
378*35238bceSAndroid Build Coastguard Worker         argDataArrayFrag, argDataArrayFrag + sizeof(argDataArrayFrag) / sizeof(argDataArrayFrag[0]));
379*35238bceSAndroid Build Coastguard Worker 
380*35238bceSAndroid Build Coastguard Worker     // create default vertex shader
381*35238bceSAndroid Build Coastguard Worker     shaderVertexString  = generateVaryingSSBOShader(GL_VERTEX_SHADER, ssboArgs, log);
382*35238bceSAndroid Build Coastguard Worker     shaderVertexCharPtr = shaderVertexString.c_str();
383*35238bceSAndroid Build Coastguard Worker     shaderVertexGL      = ctx.glCreateShader(GL_VERTEX_SHADER);
384*35238bceSAndroid Build Coastguard Worker 
385*35238bceSAndroid Build Coastguard Worker     // log
386*35238bceSAndroid Build Coastguard Worker     message = shaderVertexString;
387*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
388*35238bceSAndroid Build Coastguard Worker 
389*35238bceSAndroid Build Coastguard Worker     // compile
390*35238bceSAndroid Build Coastguard Worker     ctx.glShaderSource(shaderVertexGL, 1, &shaderVertexCharPtr, DE_NULL);
391*35238bceSAndroid Build Coastguard Worker     ctx.glCompileShader(shaderVertexGL);
392*35238bceSAndroid Build Coastguard Worker 
393*35238bceSAndroid Build Coastguard Worker     for (std::size_t idx = 0; idx < argDataVectorFrag.size(); ++idx)
394*35238bceSAndroid Build Coastguard Worker     {
395*35238bceSAndroid Build Coastguard Worker         GLint linkStatus = -1;
396*35238bceSAndroid Build Coastguard Worker         GLint program;
397*35238bceSAndroid Build Coastguard Worker         GLint shaderFragmentGL;
398*35238bceSAndroid Build Coastguard Worker         std::string shaderFragmentString;
399*35238bceSAndroid Build Coastguard Worker         const char *shaderFragmentCharPtr;
400*35238bceSAndroid Build Coastguard Worker 
401*35238bceSAndroid Build Coastguard Worker         ctx.beginSection("Multiple shaders created using SSBO's sharing the same name but not matching layouts");
402*35238bceSAndroid Build Coastguard Worker 
403*35238bceSAndroid Build Coastguard Worker         program = ctx.glCreateProgram();
404*35238bceSAndroid Build Coastguard Worker 
405*35238bceSAndroid Build Coastguard Worker         // reset args to default and make a single change
406*35238bceSAndroid Build Coastguard Worker         ssboArgs.resetValues();
407*35238bceSAndroid Build Coastguard Worker         ssboArgs.setSingleValue(argDataVectorFrag[idx]);
408*35238bceSAndroid Build Coastguard Worker 
409*35238bceSAndroid Build Coastguard Worker         // create fragment shader
410*35238bceSAndroid Build Coastguard Worker         shaderFragmentString  = generateVaryingSSBOShader(GL_FRAGMENT_SHADER, ssboArgs, log);
411*35238bceSAndroid Build Coastguard Worker         shaderFragmentCharPtr = shaderFragmentString.c_str();
412*35238bceSAndroid Build Coastguard Worker         shaderFragmentGL      = ctx.glCreateShader(GL_FRAGMENT_SHADER);
413*35238bceSAndroid Build Coastguard Worker 
414*35238bceSAndroid Build Coastguard Worker         // log
415*35238bceSAndroid Build Coastguard Worker         message = shaderFragmentString;
416*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
417*35238bceSAndroid Build Coastguard Worker 
418*35238bceSAndroid Build Coastguard Worker         // compile
419*35238bceSAndroid Build Coastguard Worker         ctx.glShaderSource(shaderFragmentGL, 1, &shaderFragmentCharPtr, DE_NULL);
420*35238bceSAndroid Build Coastguard Worker         ctx.glCompileShader(shaderFragmentGL);
421*35238bceSAndroid Build Coastguard Worker 
422*35238bceSAndroid Build Coastguard Worker         // attach shaders to program and attempt to link
423*35238bceSAndroid Build Coastguard Worker         ctx.glAttachShader(program, shaderVertexGL);
424*35238bceSAndroid Build Coastguard Worker         ctx.glAttachShader(program, shaderFragmentGL);
425*35238bceSAndroid Build Coastguard Worker         ctx.glLinkProgram(program);
426*35238bceSAndroid Build Coastguard Worker         ctx.glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
427*35238bceSAndroid Build Coastguard Worker 
428*35238bceSAndroid Build Coastguard Worker         logProgramInfo(ctx, program);
429*35238bceSAndroid Build Coastguard Worker 
430*35238bceSAndroid Build Coastguard Worker         if (linkStatus == GL_TRUE)
431*35238bceSAndroid Build Coastguard Worker         {
432*35238bceSAndroid Build Coastguard Worker             ctx.fail("Program should not have linked");
433*35238bceSAndroid Build Coastguard Worker         }
434*35238bceSAndroid Build Coastguard Worker 
435*35238bceSAndroid Build Coastguard Worker         // clean up resources
436*35238bceSAndroid Build Coastguard Worker         ctx.glDeleteShader(shaderFragmentGL);
437*35238bceSAndroid Build Coastguard Worker         ctx.glDeleteProgram(program);
438*35238bceSAndroid Build Coastguard Worker 
439*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
440*35238bceSAndroid Build Coastguard Worker     }
441*35238bceSAndroid Build Coastguard Worker 
442*35238bceSAndroid Build Coastguard Worker     // clean up default resources
443*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shaderVertexGL);
444*35238bceSAndroid Build Coastguard Worker }
445*35238bceSAndroid Build Coastguard Worker 
ssbo_block_shared_qualifier(NegativeTestContext & ctx)446*35238bceSAndroid Build Coastguard Worker void ssbo_block_shared_qualifier(NegativeTestContext &ctx)
447*35238bceSAndroid Build Coastguard Worker {
448*35238bceSAndroid Build Coastguard Worker     const bool isES32              = contextSupports(ctx.getRenderContext().getType(), glu::ApiType::es(3, 2));
449*35238bceSAndroid Build Coastguard Worker     const glu::GLSLVersion version = isES32 ? glu::GLSL_VERSION_320_ES : glu::GLSL_VERSION_310_ES;
450*35238bceSAndroid Build Coastguard Worker     tcu::TestLog &log              = ctx.getLog();
451*35238bceSAndroid Build Coastguard Worker     std::string message;
452*35238bceSAndroid Build Coastguard Worker     std::string versionString(glu::getGLSLVersionDeclaration(version));
453*35238bceSAndroid Build Coastguard Worker     args::SsboArgs ssboArgs(versionString, log);
454*35238bceSAndroid Build Coastguard Worker     bool result;
455*35238bceSAndroid Build Coastguard Worker     GLint shaderVertexGL;
456*35238bceSAndroid Build Coastguard Worker     std::string shaderVertexString;
457*35238bceSAndroid Build Coastguard Worker     const char *shaderVertexCharPtr;
458*35238bceSAndroid Build Coastguard Worker 
459*35238bceSAndroid Build Coastguard Worker     // default args used in vertex shader ssbo
460*35238bceSAndroid Build Coastguard Worker     const args::SsboArgData argDataArrayVert[] = {args::SsboArgData(args::ARGMEMBER_FORMAT, "shared"),
461*35238bceSAndroid Build Coastguard Worker                                                   args::SsboArgData(args::ARGMEMBER_BINDING_POINT, "0"),
462*35238bceSAndroid Build Coastguard Worker                                                   args::SsboArgData(args::ARGMEMBER_MATRIX_ORDER, "column_major"),
463*35238bceSAndroid Build Coastguard Worker                                                   args::SsboArgData(args::ARGMEMBER_FIXED_ARRAY, "10"),
464*35238bceSAndroid Build Coastguard Worker                                                   args::SsboArgData(args::ARGMEMBER_VARIABLE_ARRAY, "10"),
465*35238bceSAndroid Build Coastguard Worker                                                   args::SsboArgData(args::ARGMEMBER_REORDER, "false")};
466*35238bceSAndroid Build Coastguard Worker     std::vector<args::SsboArgData> argDataVectorVert(
467*35238bceSAndroid Build Coastguard Worker         argDataArrayVert, argDataArrayVert + sizeof(argDataArrayVert) / sizeof(argDataArrayVert[0]));
468*35238bceSAndroid Build Coastguard Worker 
469*35238bceSAndroid Build Coastguard Worker     // args changed in fragment shader ssbo
470*35238bceSAndroid Build Coastguard Worker     const args::SsboArgData argDataArrayFrag[] = {args::SsboArgData(args::ARGMEMBER_MATRIX_ORDER, "row_major"),
471*35238bceSAndroid Build Coastguard Worker                                                   args::SsboArgData(args::ARGMEMBER_VARIABLE_ARRAY, ""),
472*35238bceSAndroid Build Coastguard Worker                                                   args::SsboArgData(args::ARGMEMBER_FIXED_ARRAY, "20")};
473*35238bceSAndroid Build Coastguard Worker     std::vector<args::SsboArgData> argDataVectorFrag(
474*35238bceSAndroid Build Coastguard Worker         argDataArrayFrag, argDataArrayFrag + sizeof(argDataArrayFrag) / sizeof(argDataArrayFrag[0]));
475*35238bceSAndroid Build Coastguard Worker 
476*35238bceSAndroid Build Coastguard Worker     // set default vertex ssbo args
477*35238bceSAndroid Build Coastguard Worker     result = ssboArgs.setAllValues(argDataVectorVert);
478*35238bceSAndroid Build Coastguard Worker 
479*35238bceSAndroid Build Coastguard Worker     if (result == false)
480*35238bceSAndroid Build Coastguard Worker     {
481*35238bceSAndroid Build Coastguard Worker         message = "Invalid use of args.setAllValues()";
482*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
483*35238bceSAndroid Build Coastguard Worker         return;
484*35238bceSAndroid Build Coastguard Worker     }
485*35238bceSAndroid Build Coastguard Worker 
486*35238bceSAndroid Build Coastguard Worker     // create default vertex shader
487*35238bceSAndroid Build Coastguard Worker     shaderVertexString  = generateVaryingSSBOShader(GL_VERTEX_SHADER, ssboArgs, log);
488*35238bceSAndroid Build Coastguard Worker     shaderVertexCharPtr = shaderVertexString.c_str();
489*35238bceSAndroid Build Coastguard Worker     shaderVertexGL      = ctx.glCreateShader(GL_VERTEX_SHADER);
490*35238bceSAndroid Build Coastguard Worker 
491*35238bceSAndroid Build Coastguard Worker     // log
492*35238bceSAndroid Build Coastguard Worker     message = shaderVertexString;
493*35238bceSAndroid Build Coastguard Worker     log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
494*35238bceSAndroid Build Coastguard Worker 
495*35238bceSAndroid Build Coastguard Worker     // compile
496*35238bceSAndroid Build Coastguard Worker     ctx.glShaderSource(shaderVertexGL, 1, &shaderVertexCharPtr, DE_NULL);
497*35238bceSAndroid Build Coastguard Worker     ctx.glCompileShader(shaderVertexGL);
498*35238bceSAndroid Build Coastguard Worker 
499*35238bceSAndroid Build Coastguard Worker     for (std::size_t idx = 0; idx < argDataVectorFrag.size(); idx++)
500*35238bceSAndroid Build Coastguard Worker     {
501*35238bceSAndroid Build Coastguard Worker         GLint linkStatus = -1;
502*35238bceSAndroid Build Coastguard Worker         GLint program;
503*35238bceSAndroid Build Coastguard Worker         GLint shaderFragmentGL;
504*35238bceSAndroid Build Coastguard Worker         std::string shaderFragmentString;
505*35238bceSAndroid Build Coastguard Worker         const char *shaderFragmentCharPtr;
506*35238bceSAndroid Build Coastguard Worker 
507*35238bceSAndroid Build Coastguard Worker         ctx.beginSection("Multiple shaders created using SSBO's sharing the same name but not matching layouts");
508*35238bceSAndroid Build Coastguard Worker 
509*35238bceSAndroid Build Coastguard Worker         program = ctx.glCreateProgram();
510*35238bceSAndroid Build Coastguard Worker 
511*35238bceSAndroid Build Coastguard Worker         // reset args to default and make a single change
512*35238bceSAndroid Build Coastguard Worker         ssboArgs.setAllValues(argDataVectorVert);
513*35238bceSAndroid Build Coastguard Worker         ssboArgs.setSingleValue(argDataVectorFrag[idx]);
514*35238bceSAndroid Build Coastguard Worker 
515*35238bceSAndroid Build Coastguard Worker         // create fragment shader
516*35238bceSAndroid Build Coastguard Worker         shaderFragmentString  = generateVaryingSSBOShader(GL_FRAGMENT_SHADER, ssboArgs, log);
517*35238bceSAndroid Build Coastguard Worker         shaderFragmentCharPtr = shaderFragmentString.c_str();
518*35238bceSAndroid Build Coastguard Worker         shaderFragmentGL      = ctx.glCreateShader(GL_FRAGMENT_SHADER);
519*35238bceSAndroid Build Coastguard Worker 
520*35238bceSAndroid Build Coastguard Worker         // log
521*35238bceSAndroid Build Coastguard Worker         message = shaderFragmentString;
522*35238bceSAndroid Build Coastguard Worker         log << tcu::TestLog::Message << message << tcu::TestLog::EndMessage;
523*35238bceSAndroid Build Coastguard Worker 
524*35238bceSAndroid Build Coastguard Worker         // compile
525*35238bceSAndroid Build Coastguard Worker         ctx.glShaderSource(shaderFragmentGL, 1, &shaderFragmentCharPtr, DE_NULL);
526*35238bceSAndroid Build Coastguard Worker         ctx.glCompileShader(shaderFragmentGL);
527*35238bceSAndroid Build Coastguard Worker 
528*35238bceSAndroid Build Coastguard Worker         // attach shaders to the program and attempt to link
529*35238bceSAndroid Build Coastguard Worker         ctx.glAttachShader(program, shaderVertexGL);
530*35238bceSAndroid Build Coastguard Worker         ctx.glAttachShader(program, shaderFragmentGL);
531*35238bceSAndroid Build Coastguard Worker         ctx.glLinkProgram(program);
532*35238bceSAndroid Build Coastguard Worker         ctx.glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
533*35238bceSAndroid Build Coastguard Worker 
534*35238bceSAndroid Build Coastguard Worker         logProgramInfo(ctx, program);
535*35238bceSAndroid Build Coastguard Worker 
536*35238bceSAndroid Build Coastguard Worker         if (linkStatus == GL_TRUE)
537*35238bceSAndroid Build Coastguard Worker         {
538*35238bceSAndroid Build Coastguard Worker             ctx.fail("Program should not have linked");
539*35238bceSAndroid Build Coastguard Worker         }
540*35238bceSAndroid Build Coastguard Worker 
541*35238bceSAndroid Build Coastguard Worker         // clean up resources
542*35238bceSAndroid Build Coastguard Worker         ctx.glDeleteShader(shaderFragmentGL);
543*35238bceSAndroid Build Coastguard Worker         ctx.glDeleteProgram(program);
544*35238bceSAndroid Build Coastguard Worker 
545*35238bceSAndroid Build Coastguard Worker         ctx.endSection();
546*35238bceSAndroid Build Coastguard Worker     }
547*35238bceSAndroid Build Coastguard Worker 
548*35238bceSAndroid Build Coastguard Worker     // clean up default resources
549*35238bceSAndroid Build Coastguard Worker     ctx.glDeleteShader(shaderVertexGL);
550*35238bceSAndroid Build Coastguard Worker }
551*35238bceSAndroid Build Coastguard Worker } // namespace
552*35238bceSAndroid Build Coastguard Worker 
getNegativeSSBOBlockTestFunctions(void)553*35238bceSAndroid Build Coastguard Worker std::vector<FunctionContainer> getNegativeSSBOBlockTestFunctions(void)
554*35238bceSAndroid Build Coastguard Worker {
555*35238bceSAndroid Build Coastguard Worker     const FunctionContainer funcs[] = {
556*35238bceSAndroid Build Coastguard Worker         {ssbo_block_matching, "ssbo_block_interface_matching_tests", "Invalid Shader Linkage"},
557*35238bceSAndroid Build Coastguard Worker         {ssbo_block_shared_qualifier, "ssbo_using_shared_qualifier_tests", "Invalid Shader Linkage"},
558*35238bceSAndroid Build Coastguard Worker     };
559*35238bceSAndroid Build Coastguard Worker 
560*35238bceSAndroid Build Coastguard Worker     return std::vector<FunctionContainer>(DE_ARRAY_BEGIN(funcs), DE_ARRAY_END(funcs));
561*35238bceSAndroid Build Coastguard Worker }
562*35238bceSAndroid Build Coastguard Worker } // namespace NegativeTestShared
563*35238bceSAndroid Build Coastguard Worker } // namespace Functional
564*35238bceSAndroid Build Coastguard Worker } // namespace gles31
565*35238bceSAndroid Build Coastguard Worker } // namespace deqp
566