xref: /aosp_15_r20/external/deqp/modules/glshared/glsAttributeLocationTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL (ES) 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 Attribute location tests
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "glsAttributeLocationTests.hpp"
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include "gluDefs.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluShaderUtil.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "gluStrUtil.hpp"
34*35238bceSAndroid Build Coastguard Worker 
35*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
36*35238bceSAndroid Build Coastguard Worker 
37*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
38*35238bceSAndroid Build Coastguard Worker 
39*35238bceSAndroid Build Coastguard Worker #include <map>
40*35238bceSAndroid Build Coastguard Worker #include <set>
41*35238bceSAndroid Build Coastguard Worker #include <sstream>
42*35238bceSAndroid Build Coastguard Worker #include <string>
43*35238bceSAndroid Build Coastguard Worker #include <vector>
44*35238bceSAndroid Build Coastguard Worker 
45*35238bceSAndroid Build Coastguard Worker #include <cstring>
46*35238bceSAndroid Build Coastguard Worker 
47*35238bceSAndroid Build Coastguard Worker #include "glw.h"
48*35238bceSAndroid Build Coastguard Worker 
49*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
50*35238bceSAndroid Build Coastguard Worker 
51*35238bceSAndroid Build Coastguard Worker using std::map;
52*35238bceSAndroid Build Coastguard Worker using std::pair;
53*35238bceSAndroid Build Coastguard Worker using std::set;
54*35238bceSAndroid Build Coastguard Worker using std::string;
55*35238bceSAndroid Build Coastguard Worker using std::vector;
56*35238bceSAndroid Build Coastguard Worker 
57*35238bceSAndroid Build Coastguard Worker using namespace deqp::gls::AttributeLocationTestUtil;
58*35238bceSAndroid Build Coastguard Worker 
59*35238bceSAndroid Build Coastguard Worker namespace deqp
60*35238bceSAndroid Build Coastguard Worker {
61*35238bceSAndroid Build Coastguard Worker namespace gls
62*35238bceSAndroid Build Coastguard Worker {
63*35238bceSAndroid Build Coastguard Worker namespace
64*35238bceSAndroid Build Coastguard Worker {
65*35238bceSAndroid Build Coastguard Worker 
getBoundLocation(const map<string,uint32_t> & bindings,const string & attrib)66*35238bceSAndroid Build Coastguard Worker int32_t getBoundLocation(const map<string, uint32_t> &bindings, const string &attrib)
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker     std::map<string, uint32_t>::const_iterator iter = bindings.find(attrib);
69*35238bceSAndroid Build Coastguard Worker 
70*35238bceSAndroid Build Coastguard Worker     return (iter == bindings.end() ? (int32_t)Attribute::LOC_UNDEF : iter->second);
71*35238bceSAndroid Build Coastguard Worker }
72*35238bceSAndroid Build Coastguard Worker 
hasAttributeAliasing(const vector<Attribute> & attributes,const map<string,uint32_t> & bindings)73*35238bceSAndroid Build Coastguard Worker bool hasAttributeAliasing(const vector<Attribute> &attributes, const map<string, uint32_t> &bindings)
74*35238bceSAndroid Build Coastguard Worker {
75*35238bceSAndroid Build Coastguard Worker     vector<bool> reservedSpaces;
76*35238bceSAndroid Build Coastguard Worker 
77*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < (int)attributes.size(); attribNdx++)
78*35238bceSAndroid Build Coastguard Worker     {
79*35238bceSAndroid Build Coastguard Worker         const int32_t location = getBoundLocation(bindings, attributes[attribNdx].getName());
80*35238bceSAndroid Build Coastguard Worker         const uint32_t size    = attributes[attribNdx].getType().getLocationSize();
81*35238bceSAndroid Build Coastguard Worker 
82*35238bceSAndroid Build Coastguard Worker         if (location != Attribute::LOC_UNDEF)
83*35238bceSAndroid Build Coastguard Worker         {
84*35238bceSAndroid Build Coastguard Worker             if (reservedSpaces.size() < location + size)
85*35238bceSAndroid Build Coastguard Worker                 reservedSpaces.resize(location + size, false);
86*35238bceSAndroid Build Coastguard Worker 
87*35238bceSAndroid Build Coastguard Worker             for (int i = 0; i < (int)size; i++)
88*35238bceSAndroid Build Coastguard Worker             {
89*35238bceSAndroid Build Coastguard Worker                 if (reservedSpaces[location + i])
90*35238bceSAndroid Build Coastguard Worker                     return true;
91*35238bceSAndroid Build Coastguard Worker 
92*35238bceSAndroid Build Coastguard Worker                 reservedSpaces[location + i] = true;
93*35238bceSAndroid Build Coastguard Worker             }
94*35238bceSAndroid Build Coastguard Worker         }
95*35238bceSAndroid Build Coastguard Worker     }
96*35238bceSAndroid Build Coastguard Worker 
97*35238bceSAndroid Build Coastguard Worker     return false;
98*35238bceSAndroid Build Coastguard Worker }
99*35238bceSAndroid Build Coastguard Worker 
getMaxAttributeLocations(glu::RenderContext & renderCtx)100*35238bceSAndroid Build Coastguard Worker int32_t getMaxAttributeLocations(glu::RenderContext &renderCtx)
101*35238bceSAndroid Build Coastguard Worker {
102*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = renderCtx.getFunctions();
103*35238bceSAndroid Build Coastguard Worker     int32_t maxAttribs;
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker     gl.getIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxAttribs);
106*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGetIntegerv()");
107*35238bceSAndroid Build Coastguard Worker 
108*35238bceSAndroid Build Coastguard Worker     return maxAttribs;
109*35238bceSAndroid Build Coastguard Worker }
110*35238bceSAndroid Build Coastguard Worker 
generateAttributeDefinitions(const vector<Attribute> & attributes)111*35238bceSAndroid Build Coastguard Worker string generateAttributeDefinitions(const vector<Attribute> &attributes)
112*35238bceSAndroid Build Coastguard Worker {
113*35238bceSAndroid Build Coastguard Worker     std::ostringstream src;
114*35238bceSAndroid Build Coastguard Worker 
115*35238bceSAndroid Build Coastguard Worker     for (vector<Attribute>::const_iterator iter = attributes.begin(); iter != attributes.end(); ++iter)
116*35238bceSAndroid Build Coastguard Worker     {
117*35238bceSAndroid Build Coastguard Worker         if (iter->getLayoutLocation() != Attribute::LOC_UNDEF)
118*35238bceSAndroid Build Coastguard Worker             src << "layout(location = " << iter->getLayoutLocation() << ") ";
119*35238bceSAndroid Build Coastguard Worker 
120*35238bceSAndroid Build Coastguard Worker         src << "${VTX_INPUT} mediump " << iter->getType().getName() << " " << iter->getName()
121*35238bceSAndroid Build Coastguard Worker             << (iter->getArraySize() != Attribute::NOT_ARRAY ? "[" + de::toString(iter->getArraySize()) + "]" : "")
122*35238bceSAndroid Build Coastguard Worker             << ";\n";
123*35238bceSAndroid Build Coastguard Worker     }
124*35238bceSAndroid Build Coastguard Worker 
125*35238bceSAndroid Build Coastguard Worker     return src.str();
126*35238bceSAndroid Build Coastguard Worker }
127*35238bceSAndroid Build Coastguard Worker 
generateConditionUniformDefinitions(const vector<Attribute> & attributes)128*35238bceSAndroid Build Coastguard Worker string generateConditionUniformDefinitions(const vector<Attribute> &attributes)
129*35238bceSAndroid Build Coastguard Worker {
130*35238bceSAndroid Build Coastguard Worker     std::ostringstream src;
131*35238bceSAndroid Build Coastguard Worker     set<string> conditions;
132*35238bceSAndroid Build Coastguard Worker 
133*35238bceSAndroid Build Coastguard Worker     for (vector<Attribute>::const_iterator iter = attributes.begin(); iter != attributes.end(); ++iter)
134*35238bceSAndroid Build Coastguard Worker     {
135*35238bceSAndroid Build Coastguard Worker         if (iter->getCondition() != Cond::COND_NEVER && iter->getCondition() != Cond::COND_ALWAYS)
136*35238bceSAndroid Build Coastguard Worker             conditions.insert(iter->getCondition().getName());
137*35238bceSAndroid Build Coastguard Worker     }
138*35238bceSAndroid Build Coastguard Worker 
139*35238bceSAndroid Build Coastguard Worker     for (set<string>::const_iterator iter = conditions.begin(); iter != conditions.end(); ++iter)
140*35238bceSAndroid Build Coastguard Worker         src << "uniform mediump float u_" << (*iter) << ";\n";
141*35238bceSAndroid Build Coastguard Worker 
142*35238bceSAndroid Build Coastguard Worker     return src.str();
143*35238bceSAndroid Build Coastguard Worker }
144*35238bceSAndroid Build Coastguard Worker 
generateToVec4Expression(const Attribute & attrib,int id=-1)145*35238bceSAndroid Build Coastguard Worker string generateToVec4Expression(const Attribute &attrib, int id = -1)
146*35238bceSAndroid Build Coastguard Worker {
147*35238bceSAndroid Build Coastguard Worker     const string variableName(attrib.getName() +
148*35238bceSAndroid Build Coastguard Worker                               (attrib.getArraySize() != Attribute::NOT_ARRAY ? "[" + de::toString(id) + "]" : ""));
149*35238bceSAndroid Build Coastguard Worker     std::ostringstream src;
150*35238bceSAndroid Build Coastguard Worker 
151*35238bceSAndroid Build Coastguard Worker     switch (attrib.getType().getGLTypeEnum())
152*35238bceSAndroid Build Coastguard Worker     {
153*35238bceSAndroid Build Coastguard Worker     case GL_INT_VEC2:
154*35238bceSAndroid Build Coastguard Worker     case GL_UNSIGNED_INT_VEC2:
155*35238bceSAndroid Build Coastguard Worker     case GL_FLOAT_VEC2:
156*35238bceSAndroid Build Coastguard Worker         src << "vec4(" << variableName << ".xy, " << variableName << ".yx)";
157*35238bceSAndroid Build Coastguard Worker         break;
158*35238bceSAndroid Build Coastguard Worker 
159*35238bceSAndroid Build Coastguard Worker     case GL_INT_VEC3:
160*35238bceSAndroid Build Coastguard Worker     case GL_UNSIGNED_INT_VEC3:
161*35238bceSAndroid Build Coastguard Worker     case GL_FLOAT_VEC3:
162*35238bceSAndroid Build Coastguard Worker         src << "vec4(" << variableName << ".xyz, " << variableName << ".x)";
163*35238bceSAndroid Build Coastguard Worker         break;
164*35238bceSAndroid Build Coastguard Worker 
165*35238bceSAndroid Build Coastguard Worker     default:
166*35238bceSAndroid Build Coastguard Worker         src << "vec4(" << variableName << ")";
167*35238bceSAndroid Build Coastguard Worker         break;
168*35238bceSAndroid Build Coastguard Worker     }
169*35238bceSAndroid Build Coastguard Worker 
170*35238bceSAndroid Build Coastguard Worker     return src.str();
171*35238bceSAndroid Build Coastguard Worker }
172*35238bceSAndroid Build Coastguard Worker 
generateOutputCode(const vector<Attribute> & attributes)173*35238bceSAndroid Build Coastguard Worker string generateOutputCode(const vector<Attribute> &attributes)
174*35238bceSAndroid Build Coastguard Worker {
175*35238bceSAndroid Build Coastguard Worker     std::ostringstream src;
176*35238bceSAndroid Build Coastguard Worker 
177*35238bceSAndroid Build Coastguard Worker     for (vector<Attribute>::const_iterator iter = attributes.begin(); iter != attributes.end(); ++iter)
178*35238bceSAndroid Build Coastguard Worker     {
179*35238bceSAndroid Build Coastguard Worker         if (iter->getCondition() == Cond::COND_NEVER)
180*35238bceSAndroid Build Coastguard Worker         {
181*35238bceSAndroid Build Coastguard Worker             src << "\tif (0 != 0)\n"
182*35238bceSAndroid Build Coastguard Worker                    "\t{\n";
183*35238bceSAndroid Build Coastguard Worker 
184*35238bceSAndroid Build Coastguard Worker             if (iter->getArraySize() == Attribute::NOT_ARRAY)
185*35238bceSAndroid Build Coastguard Worker                 src << "\t\tcolor += " << generateToVec4Expression(*iter) << ";\n";
186*35238bceSAndroid Build Coastguard Worker             else
187*35238bceSAndroid Build Coastguard Worker             {
188*35238bceSAndroid Build Coastguard Worker                 for (int i = 0; i < iter->getArraySize(); i++)
189*35238bceSAndroid Build Coastguard Worker                     src << "\t\tcolor += " << generateToVec4Expression(*iter, i) << ";\n";
190*35238bceSAndroid Build Coastguard Worker             }
191*35238bceSAndroid Build Coastguard Worker 
192*35238bceSAndroid Build Coastguard Worker             src << "\t}\n";
193*35238bceSAndroid Build Coastguard Worker         }
194*35238bceSAndroid Build Coastguard Worker         else if (iter->getCondition() == Cond::COND_ALWAYS)
195*35238bceSAndroid Build Coastguard Worker         {
196*35238bceSAndroid Build Coastguard Worker             if (iter->getArraySize() == Attribute::NOT_ARRAY)
197*35238bceSAndroid Build Coastguard Worker                 src << "\tcolor += " << generateToVec4Expression(*iter) << ";\n";
198*35238bceSAndroid Build Coastguard Worker             else
199*35238bceSAndroid Build Coastguard Worker             {
200*35238bceSAndroid Build Coastguard Worker                 for (int i = 0; i < iter->getArraySize(); i++)
201*35238bceSAndroid Build Coastguard Worker                     src << "\tcolor += " << generateToVec4Expression(*iter, i) << ";\n";
202*35238bceSAndroid Build Coastguard Worker             }
203*35238bceSAndroid Build Coastguard Worker         }
204*35238bceSAndroid Build Coastguard Worker         else
205*35238bceSAndroid Build Coastguard Worker         {
206*35238bceSAndroid Build Coastguard Worker             src << "\tif (u_" << iter->getCondition().getName() << (iter->getCondition().getNegate() ? " != " : " == ")
207*35238bceSAndroid Build Coastguard Worker                 << "0.0)\n"
208*35238bceSAndroid Build Coastguard Worker                    "\t{\n";
209*35238bceSAndroid Build Coastguard Worker 
210*35238bceSAndroid Build Coastguard Worker             if (iter->getArraySize() == Attribute::NOT_ARRAY)
211*35238bceSAndroid Build Coastguard Worker                 src << "\t\tcolor += " << generateToVec4Expression(*iter) << ";\n";
212*35238bceSAndroid Build Coastguard Worker             else
213*35238bceSAndroid Build Coastguard Worker             {
214*35238bceSAndroid Build Coastguard Worker                 for (int i = 0; i < iter->getArraySize(); i++)
215*35238bceSAndroid Build Coastguard Worker                     src << "\t\tcolor += " << generateToVec4Expression(*iter, i) << ";\n";
216*35238bceSAndroid Build Coastguard Worker             }
217*35238bceSAndroid Build Coastguard Worker 
218*35238bceSAndroid Build Coastguard Worker             src << "\t}\n";
219*35238bceSAndroid Build Coastguard Worker         }
220*35238bceSAndroid Build Coastguard Worker     }
221*35238bceSAndroid Build Coastguard Worker 
222*35238bceSAndroid Build Coastguard Worker     return src.str();
223*35238bceSAndroid Build Coastguard Worker }
224*35238bceSAndroid Build Coastguard Worker 
generateVertexShaderTemplate(const vector<Attribute> & attributes)225*35238bceSAndroid Build Coastguard Worker string generateVertexShaderTemplate(const vector<Attribute> &attributes)
226*35238bceSAndroid Build Coastguard Worker {
227*35238bceSAndroid Build Coastguard Worker     std::ostringstream src;
228*35238bceSAndroid Build Coastguard Worker 
229*35238bceSAndroid Build Coastguard Worker     src << "${VERSION}\n"
230*35238bceSAndroid Build Coastguard Worker            "${VTX_OUTPUT} mediump vec4 v_color;\n";
231*35238bceSAndroid Build Coastguard Worker 
232*35238bceSAndroid Build Coastguard Worker     src << generateAttributeDefinitions(attributes) << "\n" << generateConditionUniformDefinitions(attributes) << "\n";
233*35238bceSAndroid Build Coastguard Worker 
234*35238bceSAndroid Build Coastguard Worker     src << "void main (void)\n"
235*35238bceSAndroid Build Coastguard Worker            "{\n"
236*35238bceSAndroid Build Coastguard Worker            "\tmediump vec4 color = vec4(0.0);\n"
237*35238bceSAndroid Build Coastguard Worker            "\n";
238*35238bceSAndroid Build Coastguard Worker 
239*35238bceSAndroid Build Coastguard Worker     src << generateOutputCode(attributes);
240*35238bceSAndroid Build Coastguard Worker 
241*35238bceSAndroid Build Coastguard Worker     src << "\n"
242*35238bceSAndroid Build Coastguard Worker            "\tv_color = color;\n"
243*35238bceSAndroid Build Coastguard Worker            "\tgl_Position = color;\n"
244*35238bceSAndroid Build Coastguard Worker            "}\n";
245*35238bceSAndroid Build Coastguard Worker 
246*35238bceSAndroid Build Coastguard Worker     return src.str();
247*35238bceSAndroid Build Coastguard Worker }
248*35238bceSAndroid Build Coastguard Worker 
createVertexShaderSource(glu::RenderContext & renderCtx,const vector<Attribute> & attributes,bool attributeAliasing)249*35238bceSAndroid Build Coastguard Worker string createVertexShaderSource(glu::RenderContext &renderCtx, const vector<Attribute> &attributes,
250*35238bceSAndroid Build Coastguard Worker                                 bool attributeAliasing)
251*35238bceSAndroid Build Coastguard Worker {
252*35238bceSAndroid Build Coastguard Worker     // \note On GLES only GLSL #version 100 supports aliasing
253*35238bceSAndroid Build Coastguard Worker     const glu::GLSLVersion contextGLSLVersion = glu::getContextTypeGLSLVersion(renderCtx.getType());
254*35238bceSAndroid Build Coastguard Worker     const glu::GLSLVersion glslVersion =
255*35238bceSAndroid Build Coastguard Worker         (attributeAliasing && glu::glslVersionIsES(contextGLSLVersion) ? glu::GLSL_VERSION_100_ES : contextGLSLVersion);
256*35238bceSAndroid Build Coastguard Worker     const bool usesInOutQualifiers = glu::glslVersionUsesInOutQualifiers(glslVersion);
257*35238bceSAndroid Build Coastguard Worker     const tcu::StringTemplate vertexShaderTemplate(generateVertexShaderTemplate(attributes));
258*35238bceSAndroid Build Coastguard Worker 
259*35238bceSAndroid Build Coastguard Worker     map<string, string> parameters;
260*35238bceSAndroid Build Coastguard Worker 
261*35238bceSAndroid Build Coastguard Worker     parameters["VERSION"]         = glu::getGLSLVersionDeclaration(glslVersion);
262*35238bceSAndroid Build Coastguard Worker     parameters["VTX_OUTPUT"]      = (usesInOutQualifiers ? "out" : "varying");
263*35238bceSAndroid Build Coastguard Worker     parameters["VTX_INPUT"]       = (usesInOutQualifiers ? "in" : "attribute");
264*35238bceSAndroid Build Coastguard Worker     parameters["FRAG_INPUT"]      = (usesInOutQualifiers ? "in" : "varying");
265*35238bceSAndroid Build Coastguard Worker     parameters["FRAG_OUTPUT_VAR"] = (usesInOutQualifiers ? "dEQP_FragColor" : "gl_FragColor");
266*35238bceSAndroid Build Coastguard Worker     parameters["FRAG_OUTPUT_DECLARATION"] =
267*35238bceSAndroid Build Coastguard Worker         (usesInOutQualifiers ? "layout(location=0) out mediump vec4 dEQP_FragColor;" : "");
268*35238bceSAndroid Build Coastguard Worker 
269*35238bceSAndroid Build Coastguard Worker     return vertexShaderTemplate.specialize(parameters);
270*35238bceSAndroid Build Coastguard Worker }
271*35238bceSAndroid Build Coastguard Worker 
createFragmentShaderSource(glu::RenderContext & renderCtx,bool attributeAliasing)272*35238bceSAndroid Build Coastguard Worker string createFragmentShaderSource(glu::RenderContext &renderCtx, bool attributeAliasing)
273*35238bceSAndroid Build Coastguard Worker {
274*35238bceSAndroid Build Coastguard Worker     const char *const fragmentShaderSource = "${VERSION}\n"
275*35238bceSAndroid Build Coastguard Worker                                              "${FRAG_OUTPUT_DECLARATION}\n"
276*35238bceSAndroid Build Coastguard Worker                                              "${FRAG_INPUT} mediump vec4 v_color;\n"
277*35238bceSAndroid Build Coastguard Worker                                              "void main (void)\n"
278*35238bceSAndroid Build Coastguard Worker                                              "{\n"
279*35238bceSAndroid Build Coastguard Worker                                              "\t${FRAG_OUTPUT_VAR} = v_color;\n"
280*35238bceSAndroid Build Coastguard Worker                                              "}\n";
281*35238bceSAndroid Build Coastguard Worker 
282*35238bceSAndroid Build Coastguard Worker     // \note On GLES only GLSL #version 100 supports aliasing
283*35238bceSAndroid Build Coastguard Worker     const glu::GLSLVersion contextGLSLVersion = glu::getContextTypeGLSLVersion(renderCtx.getType());
284*35238bceSAndroid Build Coastguard Worker     const glu::GLSLVersion glslVersion =
285*35238bceSAndroid Build Coastguard Worker         (attributeAliasing && glu::glslVersionIsES(contextGLSLVersion) ? glu::GLSL_VERSION_100_ES : contextGLSLVersion);
286*35238bceSAndroid Build Coastguard Worker     const tcu::StringTemplate fragmentShaderTemplate(fragmentShaderSource);
287*35238bceSAndroid Build Coastguard Worker     const bool usesInOutQualifiers = glu::glslVersionUsesInOutQualifiers(glslVersion);
288*35238bceSAndroid Build Coastguard Worker 
289*35238bceSAndroid Build Coastguard Worker     map<string, string> parameters;
290*35238bceSAndroid Build Coastguard Worker 
291*35238bceSAndroid Build Coastguard Worker     parameters["VERSION"]         = glu::getGLSLVersionDeclaration(glslVersion);
292*35238bceSAndroid Build Coastguard Worker     parameters["VTX_OUTPUT"]      = (usesInOutQualifiers ? "out" : "varying");
293*35238bceSAndroid Build Coastguard Worker     parameters["VTX_INPUT"]       = (usesInOutQualifiers ? "in" : "attribute");
294*35238bceSAndroid Build Coastguard Worker     parameters["FRAG_INPUT"]      = (usesInOutQualifiers ? "in" : "varying");
295*35238bceSAndroid Build Coastguard Worker     parameters["FRAG_OUTPUT_VAR"] = (usesInOutQualifiers ? "dEQP_FragColor" : "gl_FragColor");
296*35238bceSAndroid Build Coastguard Worker     parameters["FRAG_OUTPUT_DECLARATION"] =
297*35238bceSAndroid Build Coastguard Worker         (usesInOutQualifiers ? "layout(location=0) out mediump vec4 dEQP_FragColor;" : "");
298*35238bceSAndroid Build Coastguard Worker 
299*35238bceSAndroid Build Coastguard Worker     return fragmentShaderTemplate.specialize(parameters);
300*35238bceSAndroid Build Coastguard Worker }
301*35238bceSAndroid Build Coastguard Worker 
getShaderInfoLog(const glw::Functions & gl,uint32_t shader)302*35238bceSAndroid Build Coastguard Worker string getShaderInfoLog(const glw::Functions &gl, uint32_t shader)
303*35238bceSAndroid Build Coastguard Worker {
304*35238bceSAndroid Build Coastguard Worker     int32_t length = 0;
305*35238bceSAndroid Build Coastguard Worker     string infoLog;
306*35238bceSAndroid Build Coastguard Worker 
307*35238bceSAndroid Build Coastguard Worker     gl.getShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
308*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv()");
309*35238bceSAndroid Build Coastguard Worker 
310*35238bceSAndroid Build Coastguard Worker     infoLog.resize(length, '\0');
311*35238bceSAndroid Build Coastguard Worker 
312*35238bceSAndroid Build Coastguard Worker     gl.getShaderInfoLog(shader, (glw::GLsizei)infoLog.length(), DE_NULL, &(infoLog[0]));
313*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderInfoLog()");
314*35238bceSAndroid Build Coastguard Worker 
315*35238bceSAndroid Build Coastguard Worker     return infoLog;
316*35238bceSAndroid Build Coastguard Worker }
317*35238bceSAndroid Build Coastguard Worker 
getShaderCompileStatus(const glw::Functions & gl,uint32_t shader)318*35238bceSAndroid Build Coastguard Worker bool getShaderCompileStatus(const glw::Functions &gl, uint32_t shader)
319*35238bceSAndroid Build Coastguard Worker {
320*35238bceSAndroid Build Coastguard Worker     int32_t status;
321*35238bceSAndroid Build Coastguard Worker 
322*35238bceSAndroid Build Coastguard Worker     gl.getShaderiv(shader, GL_COMPILE_STATUS, &status);
323*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGetShaderiv()");
324*35238bceSAndroid Build Coastguard Worker 
325*35238bceSAndroid Build Coastguard Worker     return status == GL_TRUE;
326*35238bceSAndroid Build Coastguard Worker }
327*35238bceSAndroid Build Coastguard Worker 
getProgramInfoLog(const glw::Functions & gl,uint32_t program)328*35238bceSAndroid Build Coastguard Worker string getProgramInfoLog(const glw::Functions &gl, uint32_t program)
329*35238bceSAndroid Build Coastguard Worker {
330*35238bceSAndroid Build Coastguard Worker     int32_t length = 0;
331*35238bceSAndroid Build Coastguard Worker     string infoLog;
332*35238bceSAndroid Build Coastguard Worker 
333*35238bceSAndroid Build Coastguard Worker     gl.getProgramiv(program, GL_INFO_LOG_LENGTH, &length);
334*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv()");
335*35238bceSAndroid Build Coastguard Worker 
336*35238bceSAndroid Build Coastguard Worker     infoLog.resize(length, '\0');
337*35238bceSAndroid Build Coastguard Worker 
338*35238bceSAndroid Build Coastguard Worker     gl.getProgramInfoLog(program, (glw::GLsizei)infoLog.length(), DE_NULL, &(infoLog[0]));
339*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramInfoLog()");
340*35238bceSAndroid Build Coastguard Worker 
341*35238bceSAndroid Build Coastguard Worker     return infoLog;
342*35238bceSAndroid Build Coastguard Worker }
343*35238bceSAndroid Build Coastguard Worker 
getProgramLinkStatus(const glw::Functions & gl,uint32_t program)344*35238bceSAndroid Build Coastguard Worker bool getProgramLinkStatus(const glw::Functions &gl, uint32_t program)
345*35238bceSAndroid Build Coastguard Worker {
346*35238bceSAndroid Build Coastguard Worker     int32_t status;
347*35238bceSAndroid Build Coastguard Worker 
348*35238bceSAndroid Build Coastguard Worker     gl.getProgramiv(program, GL_LINK_STATUS, &status);
349*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv()");
350*35238bceSAndroid Build Coastguard Worker 
351*35238bceSAndroid Build Coastguard Worker     return status == GL_TRUE;
352*35238bceSAndroid Build Coastguard Worker }
353*35238bceSAndroid Build Coastguard Worker 
logProgram(TestLog & log,const glw::Functions & gl,uint32_t program)354*35238bceSAndroid Build Coastguard Worker void logProgram(TestLog &log, const glw::Functions &gl, uint32_t program)
355*35238bceSAndroid Build Coastguard Worker {
356*35238bceSAndroid Build Coastguard Worker     const bool programLinkOk    = getProgramLinkStatus(gl, program);
357*35238bceSAndroid Build Coastguard Worker     const string programInfoLog = getProgramInfoLog(gl, program);
358*35238bceSAndroid Build Coastguard Worker     tcu::ScopedLogSection linkInfo(log, "Program Link Info", "Program Link Info");
359*35238bceSAndroid Build Coastguard Worker 
360*35238bceSAndroid Build Coastguard Worker     {
361*35238bceSAndroid Build Coastguard Worker         tcu::ScopedLogSection infoLogSection(log, "Info Log", "Info Log");
362*35238bceSAndroid Build Coastguard Worker 
363*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << programInfoLog << TestLog::EndMessage;
364*35238bceSAndroid Build Coastguard Worker     }
365*35238bceSAndroid Build Coastguard Worker 
366*35238bceSAndroid Build Coastguard Worker     log << TestLog::Message << "Link result: " << (programLinkOk ? "Ok" : "Fail") << TestLog::EndMessage;
367*35238bceSAndroid Build Coastguard Worker }
368*35238bceSAndroid Build Coastguard Worker 
logShaders(TestLog & log,const string & vertexShaderSource,const string & vertexShaderInfoLog,bool vertexCompileOk,const string & fragmentShaderSource,const string & fragmentShaderInfoLog,bool fragmentCompileOk)369*35238bceSAndroid Build Coastguard Worker void logShaders(TestLog &log, const string &vertexShaderSource, const string &vertexShaderInfoLog, bool vertexCompileOk,
370*35238bceSAndroid Build Coastguard Worker                 const string &fragmentShaderSource, const string &fragmentShaderInfoLog, bool fragmentCompileOk)
371*35238bceSAndroid Build Coastguard Worker {
372*35238bceSAndroid Build Coastguard Worker     // \todo [mika] Log as real shader elements. Currently not supported by TestLog.
373*35238bceSAndroid Build Coastguard Worker     {
374*35238bceSAndroid Build Coastguard Worker         tcu::ScopedLogSection shaderSection(log, "Vertex Shader Info", "Vertex Shader Info");
375*35238bceSAndroid Build Coastguard Worker 
376*35238bceSAndroid Build Coastguard Worker         log << TestLog::KernelSource(vertexShaderSource);
377*35238bceSAndroid Build Coastguard Worker 
378*35238bceSAndroid Build Coastguard Worker         {
379*35238bceSAndroid Build Coastguard Worker             tcu::ScopedLogSection infoLogSection(log, "Info Log", "Info Log");
380*35238bceSAndroid Build Coastguard Worker 
381*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << vertexShaderInfoLog << TestLog::EndMessage;
382*35238bceSAndroid Build Coastguard Worker         }
383*35238bceSAndroid Build Coastguard Worker 
384*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Compilation result: " << (vertexCompileOk ? "Ok" : "Failed") << TestLog::EndMessage;
385*35238bceSAndroid Build Coastguard Worker     }
386*35238bceSAndroid Build Coastguard Worker 
387*35238bceSAndroid Build Coastguard Worker     {
388*35238bceSAndroid Build Coastguard Worker         tcu::ScopedLogSection shaderSection(log, "Fragment Shader Info", "Fragment Shader Info");
389*35238bceSAndroid Build Coastguard Worker 
390*35238bceSAndroid Build Coastguard Worker         log << TestLog::KernelSource(fragmentShaderSource);
391*35238bceSAndroid Build Coastguard Worker 
392*35238bceSAndroid Build Coastguard Worker         {
393*35238bceSAndroid Build Coastguard Worker             tcu::ScopedLogSection infoLogSection(log, "Info Log", "Info Log");
394*35238bceSAndroid Build Coastguard Worker 
395*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << fragmentShaderInfoLog << TestLog::EndMessage;
396*35238bceSAndroid Build Coastguard Worker         }
397*35238bceSAndroid Build Coastguard Worker 
398*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Compilation result: " << (fragmentCompileOk ? "Ok" : "Failed")
399*35238bceSAndroid Build Coastguard Worker             << TestLog::EndMessage;
400*35238bceSAndroid Build Coastguard Worker     }
401*35238bceSAndroid Build Coastguard Worker }
402*35238bceSAndroid Build Coastguard Worker 
createAndAttachShaders(TestLog & log,glu::RenderContext & renderCtx,uint32_t program,const vector<Attribute> & attributes,bool attributeAliasing)403*35238bceSAndroid Build Coastguard Worker pair<uint32_t, uint32_t> createAndAttachShaders(TestLog &log, glu::RenderContext &renderCtx, uint32_t program,
404*35238bceSAndroid Build Coastguard Worker                                                 const vector<Attribute> &attributes, bool attributeAliasing)
405*35238bceSAndroid Build Coastguard Worker {
406*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl          = renderCtx.getFunctions();
407*35238bceSAndroid Build Coastguard Worker     const string vertexShaderSource   = createVertexShaderSource(renderCtx, attributes, attributeAliasing);
408*35238bceSAndroid Build Coastguard Worker     const string fragmentShaderSource = createFragmentShaderSource(renderCtx, attributeAliasing);
409*35238bceSAndroid Build Coastguard Worker 
410*35238bceSAndroid Build Coastguard Worker     const uint32_t vertexShader   = gl.createShader(GL_VERTEX_SHADER);
411*35238bceSAndroid Build Coastguard Worker     const uint32_t fragmentShader = gl.createShader(GL_FRAGMENT_SHADER);
412*35238bceSAndroid Build Coastguard Worker 
413*35238bceSAndroid Build Coastguard Worker     try
414*35238bceSAndroid Build Coastguard Worker     {
415*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateShader()");
416*35238bceSAndroid Build Coastguard Worker 
417*35238bceSAndroid Build Coastguard Worker         {
418*35238bceSAndroid Build Coastguard Worker             const char *const vertexShaderString   = vertexShaderSource.c_str();
419*35238bceSAndroid Build Coastguard Worker             const char *const fragmentShaderString = fragmentShaderSource.c_str();
420*35238bceSAndroid Build Coastguard Worker 
421*35238bceSAndroid Build Coastguard Worker             gl.shaderSource(vertexShader, 1, &vertexShaderString, DE_NULL);
422*35238bceSAndroid Build Coastguard Worker             gl.shaderSource(fragmentShader, 1, &fragmentShaderString, DE_NULL);
423*35238bceSAndroid Build Coastguard Worker 
424*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "glShaderSource()");
425*35238bceSAndroid Build Coastguard Worker         }
426*35238bceSAndroid Build Coastguard Worker 
427*35238bceSAndroid Build Coastguard Worker         gl.compileShader(vertexShader);
428*35238bceSAndroid Build Coastguard Worker         gl.compileShader(fragmentShader);
429*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glCompileShader()");
430*35238bceSAndroid Build Coastguard Worker 
431*35238bceSAndroid Build Coastguard Worker         gl.attachShader(program, vertexShader);
432*35238bceSAndroid Build Coastguard Worker         gl.attachShader(program, fragmentShader);
433*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glAttachShader()");
434*35238bceSAndroid Build Coastguard Worker 
435*35238bceSAndroid Build Coastguard Worker         {
436*35238bceSAndroid Build Coastguard Worker             const bool vertexCompileOk   = getShaderCompileStatus(gl, vertexShader);
437*35238bceSAndroid Build Coastguard Worker             const bool fragmentCompileOk = getShaderCompileStatus(gl, fragmentShader);
438*35238bceSAndroid Build Coastguard Worker 
439*35238bceSAndroid Build Coastguard Worker             const string vertexShaderInfoLog   = getShaderInfoLog(gl, vertexShader);
440*35238bceSAndroid Build Coastguard Worker             const string fragmentShaderInfoLog = getShaderInfoLog(gl, fragmentShader);
441*35238bceSAndroid Build Coastguard Worker 
442*35238bceSAndroid Build Coastguard Worker             logShaders(log, vertexShaderSource, vertexShaderInfoLog, vertexCompileOk, fragmentShaderSource,
443*35238bceSAndroid Build Coastguard Worker                        fragmentShaderInfoLog, fragmentCompileOk);
444*35238bceSAndroid Build Coastguard Worker 
445*35238bceSAndroid Build Coastguard Worker             TCU_CHECK_MSG(vertexCompileOk, "Vertex shader compilation failed");
446*35238bceSAndroid Build Coastguard Worker             TCU_CHECK_MSG(fragmentCompileOk, "Fragment shader compilation failed");
447*35238bceSAndroid Build Coastguard Worker         }
448*35238bceSAndroid Build Coastguard Worker 
449*35238bceSAndroid Build Coastguard Worker         gl.deleteShader(vertexShader);
450*35238bceSAndroid Build Coastguard Worker         gl.deleteShader(fragmentShader);
451*35238bceSAndroid Build Coastguard Worker 
452*35238bceSAndroid Build Coastguard Worker         return pair<uint32_t, uint32_t>(vertexShader, fragmentShader);
453*35238bceSAndroid Build Coastguard Worker     }
454*35238bceSAndroid Build Coastguard Worker     catch (...)
455*35238bceSAndroid Build Coastguard Worker     {
456*35238bceSAndroid Build Coastguard Worker         if (vertexShader != 0)
457*35238bceSAndroid Build Coastguard Worker             gl.deleteShader(vertexShader);
458*35238bceSAndroid Build Coastguard Worker 
459*35238bceSAndroid Build Coastguard Worker         if (fragmentShader != 0)
460*35238bceSAndroid Build Coastguard Worker             gl.deleteShader(fragmentShader);
461*35238bceSAndroid Build Coastguard Worker 
462*35238bceSAndroid Build Coastguard Worker         throw;
463*35238bceSAndroid Build Coastguard Worker     }
464*35238bceSAndroid Build Coastguard Worker }
465*35238bceSAndroid Build Coastguard Worker 
bindAttributes(TestLog & log,const glw::Functions & gl,uint32_t program,const vector<Bind> & binds)466*35238bceSAndroid Build Coastguard Worker void bindAttributes(TestLog &log, const glw::Functions &gl, uint32_t program, const vector<Bind> &binds)
467*35238bceSAndroid Build Coastguard Worker {
468*35238bceSAndroid Build Coastguard Worker     for (vector<Bind>::const_iterator iter = binds.begin(); iter != binds.end(); ++iter)
469*35238bceSAndroid Build Coastguard Worker     {
470*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Bind attribute: '" << iter->getAttributeName() << "' to " << iter->getLocation()
471*35238bceSAndroid Build Coastguard Worker             << TestLog::EndMessage;
472*35238bceSAndroid Build Coastguard Worker         gl.bindAttribLocation(program, iter->getLocation(), iter->getAttributeName().c_str());
473*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glBindAttribLocation()");
474*35238bceSAndroid Build Coastguard Worker     }
475*35238bceSAndroid Build Coastguard Worker }
476*35238bceSAndroid Build Coastguard Worker 
logAttributes(TestLog & log,const vector<Attribute> & attributes)477*35238bceSAndroid Build Coastguard Worker void logAttributes(TestLog &log, const vector<Attribute> &attributes)
478*35238bceSAndroid Build Coastguard Worker {
479*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < (int)attributes.size(); attribNdx++)
480*35238bceSAndroid Build Coastguard Worker     {
481*35238bceSAndroid Build Coastguard Worker         const Attribute &attrib = attributes[attribNdx];
482*35238bceSAndroid Build Coastguard Worker 
483*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Type: " << attrib.getType().getName() << ", Name: " << attrib.getName()
484*35238bceSAndroid Build Coastguard Worker             << (attrib.getLayoutLocation() != Attribute::LOC_UNDEF ?
485*35238bceSAndroid Build Coastguard Worker                     ", Layout location " + de::toString(attrib.getLayoutLocation()) :
486*35238bceSAndroid Build Coastguard Worker                     "")
487*35238bceSAndroid Build Coastguard Worker             << TestLog::EndMessage;
488*35238bceSAndroid Build Coastguard Worker     }
489*35238bceSAndroid Build Coastguard Worker }
490*35238bceSAndroid Build Coastguard Worker 
checkActiveAttribQuery(TestLog & log,const glw::Functions & gl,uint32_t program,const vector<Attribute> & attributes)491*35238bceSAndroid Build Coastguard Worker bool checkActiveAttribQuery(TestLog &log, const glw::Functions &gl, uint32_t program,
492*35238bceSAndroid Build Coastguard Worker                             const vector<Attribute> &attributes)
493*35238bceSAndroid Build Coastguard Worker {
494*35238bceSAndroid Build Coastguard Worker     int32_t activeAttribCount = 0;
495*35238bceSAndroid Build Coastguard Worker     set<string> activeAttributes;
496*35238bceSAndroid Build Coastguard Worker     bool isOk = true;
497*35238bceSAndroid Build Coastguard Worker 
498*35238bceSAndroid Build Coastguard Worker     gl.getProgramiv(program, GL_ACTIVE_ATTRIBUTES, &activeAttribCount);
499*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.getError(), "glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &activeAttribCount)");
500*35238bceSAndroid Build Coastguard Worker 
501*35238bceSAndroid Build Coastguard Worker     for (int activeAttribNdx = 0; activeAttribNdx < activeAttribCount; activeAttribNdx++)
502*35238bceSAndroid Build Coastguard Worker     {
503*35238bceSAndroid Build Coastguard Worker         char name[128];
504*35238bceSAndroid Build Coastguard Worker         const size_t maxNameSize = DE_LENGTH_OF_ARRAY(name) - 1;
505*35238bceSAndroid Build Coastguard Worker         int32_t length           = 0;
506*35238bceSAndroid Build Coastguard Worker         int32_t size             = 0;
507*35238bceSAndroid Build Coastguard Worker         uint32_t type            = 0;
508*35238bceSAndroid Build Coastguard Worker 
509*35238bceSAndroid Build Coastguard Worker         std::memset(name, 0, sizeof(name));
510*35238bceSAndroid Build Coastguard Worker 
511*35238bceSAndroid Build Coastguard Worker         gl.getActiveAttrib(program, activeAttribNdx, maxNameSize, &length, &size, &type, name);
512*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetActiveAttrib()");
513*35238bceSAndroid Build Coastguard Worker 
514*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "glGetActiveAttrib(program"
515*35238bceSAndroid Build Coastguard Worker             << ", index=" << activeAttribNdx << ", bufSize=" << maxNameSize << ", length=" << length
516*35238bceSAndroid Build Coastguard Worker             << ", size=" << size << ", type=" << glu::getShaderVarTypeStr(type) << ", name='" << name << "')"
517*35238bceSAndroid Build Coastguard Worker             << TestLog::EndMessage;
518*35238bceSAndroid Build Coastguard Worker 
519*35238bceSAndroid Build Coastguard Worker         {
520*35238bceSAndroid Build Coastguard Worker             bool found = false;
521*35238bceSAndroid Build Coastguard Worker 
522*35238bceSAndroid Build Coastguard Worker             for (int attribNdx = 0; attribNdx < (int)attributes.size(); attribNdx++)
523*35238bceSAndroid Build Coastguard Worker             {
524*35238bceSAndroid Build Coastguard Worker                 const Attribute &attrib = attributes[attribNdx];
525*35238bceSAndroid Build Coastguard Worker 
526*35238bceSAndroid Build Coastguard Worker                 if (attrib.getName() == name)
527*35238bceSAndroid Build Coastguard Worker                 {
528*35238bceSAndroid Build Coastguard Worker                     if (type != attrib.getType().getGLTypeEnum())
529*35238bceSAndroid Build Coastguard Worker                     {
530*35238bceSAndroid Build Coastguard Worker                         log << TestLog::Message << "Error: Wrong type " << glu::getShaderVarTypeStr(type)
531*35238bceSAndroid Build Coastguard Worker                             << " expected " << glu::getShaderVarTypeStr(attrib.getType().getGLTypeEnum())
532*35238bceSAndroid Build Coastguard Worker                             << TestLog::EndMessage;
533*35238bceSAndroid Build Coastguard Worker 
534*35238bceSAndroid Build Coastguard Worker                         isOk = false;
535*35238bceSAndroid Build Coastguard Worker                     }
536*35238bceSAndroid Build Coastguard Worker 
537*35238bceSAndroid Build Coastguard Worker                     if (attrib.getArraySize() == Attribute::NOT_ARRAY)
538*35238bceSAndroid Build Coastguard Worker                     {
539*35238bceSAndroid Build Coastguard Worker                         if (size != 1)
540*35238bceSAndroid Build Coastguard Worker                         {
541*35238bceSAndroid Build Coastguard Worker                             log << TestLog::Message << "Error: Wrong size " << size << " expected " << 1
542*35238bceSAndroid Build Coastguard Worker                                 << TestLog::EndMessage;
543*35238bceSAndroid Build Coastguard Worker                             isOk = false;
544*35238bceSAndroid Build Coastguard Worker                         }
545*35238bceSAndroid Build Coastguard Worker                     }
546*35238bceSAndroid Build Coastguard Worker                     else
547*35238bceSAndroid Build Coastguard Worker                     {
548*35238bceSAndroid Build Coastguard Worker                         if (size != attrib.getArraySize())
549*35238bceSAndroid Build Coastguard Worker                         {
550*35238bceSAndroid Build Coastguard Worker                             log << TestLog::Message << "Error: Wrong size " << size << " expected "
551*35238bceSAndroid Build Coastguard Worker                                 << attrib.getArraySize() << TestLog::EndMessage;
552*35238bceSAndroid Build Coastguard Worker                             isOk = false;
553*35238bceSAndroid Build Coastguard Worker                         }
554*35238bceSAndroid Build Coastguard Worker                     }
555*35238bceSAndroid Build Coastguard Worker 
556*35238bceSAndroid Build Coastguard Worker                     found = true;
557*35238bceSAndroid Build Coastguard Worker                     break;
558*35238bceSAndroid Build Coastguard Worker                 }
559*35238bceSAndroid Build Coastguard Worker             }
560*35238bceSAndroid Build Coastguard Worker 
561*35238bceSAndroid Build Coastguard Worker             if (!found)
562*35238bceSAndroid Build Coastguard Worker             {
563*35238bceSAndroid Build Coastguard Worker                 log << TestLog::Message << "Error: Unknown attribute '" << name << "' returned by glGetActiveAttrib()."
564*35238bceSAndroid Build Coastguard Worker                     << TestLog::EndMessage;
565*35238bceSAndroid Build Coastguard Worker                 isOk = false;
566*35238bceSAndroid Build Coastguard Worker             }
567*35238bceSAndroid Build Coastguard Worker         }
568*35238bceSAndroid Build Coastguard Worker 
569*35238bceSAndroid Build Coastguard Worker         activeAttributes.insert(name);
570*35238bceSAndroid Build Coastguard Worker     }
571*35238bceSAndroid Build Coastguard Worker 
572*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < (int)attributes.size(); attribNdx++)
573*35238bceSAndroid Build Coastguard Worker     {
574*35238bceSAndroid Build Coastguard Worker         const Attribute &attrib = attributes[attribNdx];
575*35238bceSAndroid Build Coastguard Worker         const bool isActive     = attrib.getCondition() != Cond::COND_NEVER;
576*35238bceSAndroid Build Coastguard Worker 
577*35238bceSAndroid Build Coastguard Worker         if (isActive)
578*35238bceSAndroid Build Coastguard Worker         {
579*35238bceSAndroid Build Coastguard Worker             if (activeAttributes.find(attrib.getName()) == activeAttributes.end())
580*35238bceSAndroid Build Coastguard Worker             {
581*35238bceSAndroid Build Coastguard Worker                 log << TestLog::Message << "Error: Active attribute " << attrib.getName()
582*35238bceSAndroid Build Coastguard Worker                     << " wasn't returned by glGetActiveAttrib()." << TestLog::EndMessage;
583*35238bceSAndroid Build Coastguard Worker                 isOk = false;
584*35238bceSAndroid Build Coastguard Worker             }
585*35238bceSAndroid Build Coastguard Worker         }
586*35238bceSAndroid Build Coastguard Worker         else
587*35238bceSAndroid Build Coastguard Worker         {
588*35238bceSAndroid Build Coastguard Worker             if (activeAttributes.find(attrib.getName()) != activeAttributes.end())
589*35238bceSAndroid Build Coastguard Worker                 log << TestLog::Message << "Note: Inactive attribute " << attrib.getName()
590*35238bceSAndroid Build Coastguard Worker                     << " was returned by glGetActiveAttrib()." << TestLog::EndMessage;
591*35238bceSAndroid Build Coastguard Worker         }
592*35238bceSAndroid Build Coastguard Worker     }
593*35238bceSAndroid Build Coastguard Worker 
594*35238bceSAndroid Build Coastguard Worker     return isOk;
595*35238bceSAndroid Build Coastguard Worker }
596*35238bceSAndroid Build Coastguard Worker 
checkAttribLocationQuery(TestLog & log,const glw::Functions & gl,uint32_t program,const vector<Attribute> & attributes,const map<string,uint32_t> & bindings)597*35238bceSAndroid Build Coastguard Worker bool checkAttribLocationQuery(TestLog &log, const glw::Functions &gl, uint32_t program,
598*35238bceSAndroid Build Coastguard Worker                               const vector<Attribute> &attributes, const map<string, uint32_t> &bindings)
599*35238bceSAndroid Build Coastguard Worker {
600*35238bceSAndroid Build Coastguard Worker     bool isOk = true;
601*35238bceSAndroid Build Coastguard Worker 
602*35238bceSAndroid Build Coastguard Worker     for (int attribNdx = 0; attribNdx < (int)attributes.size(); attribNdx++)
603*35238bceSAndroid Build Coastguard Worker     {
604*35238bceSAndroid Build Coastguard Worker         const Attribute &attrib = attributes[attribNdx];
605*35238bceSAndroid Build Coastguard Worker         const int32_t expectedLocation =
606*35238bceSAndroid Build Coastguard Worker             (attrib.getLayoutLocation() != Attribute::LOC_UNDEF ? attrib.getLayoutLocation() :
607*35238bceSAndroid Build Coastguard Worker                                                                   getBoundLocation(bindings, attrib.getName()));
608*35238bceSAndroid Build Coastguard Worker         const int32_t location = gl.getAttribLocation(program, attrib.getName().c_str());
609*35238bceSAndroid Build Coastguard Worker 
610*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glGetAttribLocation()");
611*35238bceSAndroid Build Coastguard Worker 
612*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << location << " = glGetAttribLocation(program, \"" << attrib.getName() << "\")"
613*35238bceSAndroid Build Coastguard Worker             << (attrib.getCondition() != Cond::COND_NEVER && expectedLocation != Attribute::LOC_UNDEF ?
614*35238bceSAndroid Build Coastguard Worker                     ", expected " + de::toString(expectedLocation) :
615*35238bceSAndroid Build Coastguard Worker                     "")
616*35238bceSAndroid Build Coastguard Worker             << "." << TestLog::EndMessage;
617*35238bceSAndroid Build Coastguard Worker 
618*35238bceSAndroid Build Coastguard Worker         if (attrib.getCondition() == Cond::COND_NEVER && location != -1)
619*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "\tNote: Inactive attribute with location." << TestLog::EndMessage;
620*35238bceSAndroid Build Coastguard Worker 
621*35238bceSAndroid Build Coastguard Worker         if (attrib.getCondition() != Cond::COND_NEVER && expectedLocation != Attribute::LOC_UNDEF &&
622*35238bceSAndroid Build Coastguard Worker             expectedLocation != location)
623*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "\tError: Invalid attribute location." << TestLog::EndMessage;
624*35238bceSAndroid Build Coastguard Worker 
625*35238bceSAndroid Build Coastguard Worker         isOk &= (attrib.getCondition() == Cond::COND_NEVER || expectedLocation == Attribute::LOC_UNDEF ||
626*35238bceSAndroid Build Coastguard Worker                  expectedLocation == location);
627*35238bceSAndroid Build Coastguard Worker     }
628*35238bceSAndroid Build Coastguard Worker 
629*35238bceSAndroid Build Coastguard Worker     return isOk;
630*35238bceSAndroid Build Coastguard Worker }
631*35238bceSAndroid Build Coastguard Worker 
checkQuery(TestLog & log,const glw::Functions & gl,uint32_t program,const vector<Attribute> & attributes,const map<string,uint32_t> & bindings)632*35238bceSAndroid Build Coastguard Worker bool checkQuery(TestLog &log, const glw::Functions &gl, uint32_t program, const vector<Attribute> &attributes,
633*35238bceSAndroid Build Coastguard Worker                 const map<string, uint32_t> &bindings)
634*35238bceSAndroid Build Coastguard Worker {
635*35238bceSAndroid Build Coastguard Worker     bool isOk = checkActiveAttribQuery(log, gl, program, attributes);
636*35238bceSAndroid Build Coastguard Worker 
637*35238bceSAndroid Build Coastguard Worker     if (!checkAttribLocationQuery(log, gl, program, attributes, bindings))
638*35238bceSAndroid Build Coastguard Worker         isOk = false;
639*35238bceSAndroid Build Coastguard Worker 
640*35238bceSAndroid Build Coastguard Worker     return isOk;
641*35238bceSAndroid Build Coastguard Worker }
642*35238bceSAndroid Build Coastguard Worker 
generateTestName(const AttribType & type,int arraySize)643*35238bceSAndroid Build Coastguard Worker string generateTestName(const AttribType &type, int arraySize)
644*35238bceSAndroid Build Coastguard Worker {
645*35238bceSAndroid Build Coastguard Worker     return type.getName() + (arraySize != Attribute::NOT_ARRAY ? "_array_" + de::toString(arraySize) : "");
646*35238bceSAndroid Build Coastguard Worker }
647*35238bceSAndroid Build Coastguard Worker 
648*35238bceSAndroid Build Coastguard Worker } // namespace
649*35238bceSAndroid Build Coastguard Worker 
650*35238bceSAndroid Build Coastguard Worker namespace AttributeLocationTestUtil
651*35238bceSAndroid Build Coastguard Worker {
652*35238bceSAndroid Build Coastguard Worker 
AttribType(const string & name,uint32_t localSize,uint32_t typeEnum)653*35238bceSAndroid Build Coastguard Worker AttribType::AttribType(const string &name, uint32_t localSize, uint32_t typeEnum)
654*35238bceSAndroid Build Coastguard Worker     : m_name(name)
655*35238bceSAndroid Build Coastguard Worker     , m_locationSize(localSize)
656*35238bceSAndroid Build Coastguard Worker     , m_glTypeEnum(typeEnum)
657*35238bceSAndroid Build Coastguard Worker {
658*35238bceSAndroid Build Coastguard Worker }
659*35238bceSAndroid Build Coastguard Worker 
Cond(const string & name,bool negate)660*35238bceSAndroid Build Coastguard Worker Cond::Cond(const string &name, bool negate) : m_negate(negate), m_name(name)
661*35238bceSAndroid Build Coastguard Worker {
662*35238bceSAndroid Build Coastguard Worker }
663*35238bceSAndroid Build Coastguard Worker 
Cond(ConstCond cond)664*35238bceSAndroid Build Coastguard Worker Cond::Cond(ConstCond cond) : m_negate(cond != COND_NEVER), m_name("__always__")
665*35238bceSAndroid Build Coastguard Worker {
666*35238bceSAndroid Build Coastguard Worker     DE_ASSERT(cond == COND_ALWAYS || cond == COND_NEVER);
667*35238bceSAndroid Build Coastguard Worker }
668*35238bceSAndroid Build Coastguard Worker 
Attribute(const AttribType & type,const string & name,int32_t layoutLocation,const Cond & cond,int arraySize)669*35238bceSAndroid Build Coastguard Worker Attribute::Attribute(const AttribType &type, const string &name, int32_t layoutLocation, const Cond &cond,
670*35238bceSAndroid Build Coastguard Worker                      int arraySize)
671*35238bceSAndroid Build Coastguard Worker     : m_type(type)
672*35238bceSAndroid Build Coastguard Worker     , m_name(name)
673*35238bceSAndroid Build Coastguard Worker     , m_layoutLocation(layoutLocation)
674*35238bceSAndroid Build Coastguard Worker     , m_cond(cond)
675*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
676*35238bceSAndroid Build Coastguard Worker {
677*35238bceSAndroid Build Coastguard Worker }
678*35238bceSAndroid Build Coastguard Worker 
Bind(const std::string & attribute,uint32_t location)679*35238bceSAndroid Build Coastguard Worker Bind::Bind(const std::string &attribute, uint32_t location) : m_attribute(attribute), m_location(location)
680*35238bceSAndroid Build Coastguard Worker {
681*35238bceSAndroid Build Coastguard Worker }
682*35238bceSAndroid Build Coastguard Worker 
runTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const vector<Attribute> & attributes,const vector<Bind> & preAttachBind,const vector<Bind> & preLinkBind,const vector<Bind> & postLinkBind,bool relink,bool reattach=false,const vector<Attribute> & reattachAttributes=vector<Attribute> ())683*35238bceSAndroid Build Coastguard Worker void runTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx, const vector<Attribute> &attributes,
684*35238bceSAndroid Build Coastguard Worker              const vector<Bind> &preAttachBind, const vector<Bind> &preLinkBind, const vector<Bind> &postLinkBind,
685*35238bceSAndroid Build Coastguard Worker              bool relink, bool reattach = false, const vector<Attribute> &reattachAttributes = vector<Attribute>())
686*35238bceSAndroid Build Coastguard Worker {
687*35238bceSAndroid Build Coastguard Worker     TestLog &log             = testCtx.getLog();
688*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = renderCtx.getFunctions();
689*35238bceSAndroid Build Coastguard Worker     uint32_t program         = 0;
690*35238bceSAndroid Build Coastguard Worker     pair<uint32_t, uint32_t> shaders;
691*35238bceSAndroid Build Coastguard Worker 
692*35238bceSAndroid Build Coastguard Worker     try
693*35238bceSAndroid Build Coastguard Worker     {
694*35238bceSAndroid Build Coastguard Worker         bool isOk = true;
695*35238bceSAndroid Build Coastguard Worker         map<string, uint32_t> activeBindings;
696*35238bceSAndroid Build Coastguard Worker 
697*35238bceSAndroid Build Coastguard Worker         for (int bindNdx = 0; bindNdx < (int)preAttachBind.size(); bindNdx++)
698*35238bceSAndroid Build Coastguard Worker             activeBindings[preAttachBind[bindNdx].getAttributeName()] = preAttachBind[bindNdx].getLocation();
699*35238bceSAndroid Build Coastguard Worker 
700*35238bceSAndroid Build Coastguard Worker         for (int bindNdx = 0; bindNdx < (int)preLinkBind.size(); bindNdx++)
701*35238bceSAndroid Build Coastguard Worker             activeBindings[preLinkBind[bindNdx].getAttributeName()] = preLinkBind[bindNdx].getLocation();
702*35238bceSAndroid Build Coastguard Worker 
703*35238bceSAndroid Build Coastguard Worker         {
704*35238bceSAndroid Build Coastguard Worker             tcu::ScopedLogSection section(log, "Attributes", "Attribute information");
705*35238bceSAndroid Build Coastguard Worker             logAttributes(testCtx.getLog(), attributes);
706*35238bceSAndroid Build Coastguard Worker         }
707*35238bceSAndroid Build Coastguard Worker 
708*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Create program." << TestLog::EndMessage;
709*35238bceSAndroid Build Coastguard Worker         program = gl.createProgram();
710*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glCreateProgram()");
711*35238bceSAndroid Build Coastguard Worker 
712*35238bceSAndroid Build Coastguard Worker         if (!preAttachBind.empty())
713*35238bceSAndroid Build Coastguard Worker             bindAttributes(log, gl, program, preAttachBind);
714*35238bceSAndroid Build Coastguard Worker 
715*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Create and attach shaders to program." << TestLog::EndMessage;
716*35238bceSAndroid Build Coastguard Worker         shaders = createAndAttachShaders(log, renderCtx, program, attributes,
717*35238bceSAndroid Build Coastguard Worker                                          hasAttributeAliasing(attributes, activeBindings));
718*35238bceSAndroid Build Coastguard Worker 
719*35238bceSAndroid Build Coastguard Worker         if (!preLinkBind.empty())
720*35238bceSAndroid Build Coastguard Worker             bindAttributes(log, gl, program, preLinkBind);
721*35238bceSAndroid Build Coastguard Worker 
722*35238bceSAndroid Build Coastguard Worker         log << TestLog::Message << "Link program." << TestLog::EndMessage;
723*35238bceSAndroid Build Coastguard Worker 
724*35238bceSAndroid Build Coastguard Worker         gl.linkProgram(program);
725*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram()");
726*35238bceSAndroid Build Coastguard Worker 
727*35238bceSAndroid Build Coastguard Worker         logProgram(log, gl, program);
728*35238bceSAndroid Build Coastguard Worker         TCU_CHECK_MSG(getProgramLinkStatus(gl, program), "Program link failed");
729*35238bceSAndroid Build Coastguard Worker 
730*35238bceSAndroid Build Coastguard Worker         if (!checkQuery(log, gl, program, attributes, activeBindings))
731*35238bceSAndroid Build Coastguard Worker             isOk = false;
732*35238bceSAndroid Build Coastguard Worker 
733*35238bceSAndroid Build Coastguard Worker         if (!postLinkBind.empty())
734*35238bceSAndroid Build Coastguard Worker         {
735*35238bceSAndroid Build Coastguard Worker             bindAttributes(log, gl, program, postLinkBind);
736*35238bceSAndroid Build Coastguard Worker 
737*35238bceSAndroid Build Coastguard Worker             if (!checkQuery(log, gl, program, attributes, activeBindings))
738*35238bceSAndroid Build Coastguard Worker                 isOk = false;
739*35238bceSAndroid Build Coastguard Worker         }
740*35238bceSAndroid Build Coastguard Worker 
741*35238bceSAndroid Build Coastguard Worker         if (relink)
742*35238bceSAndroid Build Coastguard Worker         {
743*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Relink program." << TestLog::EndMessage;
744*35238bceSAndroid Build Coastguard Worker             gl.linkProgram(program);
745*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram()");
746*35238bceSAndroid Build Coastguard Worker 
747*35238bceSAndroid Build Coastguard Worker             logProgram(log, gl, program);
748*35238bceSAndroid Build Coastguard Worker             TCU_CHECK_MSG(getProgramLinkStatus(gl, program), "Program link failed");
749*35238bceSAndroid Build Coastguard Worker 
750*35238bceSAndroid Build Coastguard Worker             for (int bindNdx = 0; bindNdx < (int)postLinkBind.size(); bindNdx++)
751*35238bceSAndroid Build Coastguard Worker                 activeBindings[postLinkBind[bindNdx].getAttributeName()] = postLinkBind[bindNdx].getLocation();
752*35238bceSAndroid Build Coastguard Worker 
753*35238bceSAndroid Build Coastguard Worker             if (!checkQuery(log, gl, program, attributes, activeBindings))
754*35238bceSAndroid Build Coastguard Worker                 isOk = false;
755*35238bceSAndroid Build Coastguard Worker         }
756*35238bceSAndroid Build Coastguard Worker 
757*35238bceSAndroid Build Coastguard Worker         if (reattach)
758*35238bceSAndroid Build Coastguard Worker         {
759*35238bceSAndroid Build Coastguard Worker             gl.detachShader(program, shaders.first);
760*35238bceSAndroid Build Coastguard Worker             gl.detachShader(program, shaders.second);
761*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "glDetachShader()");
762*35238bceSAndroid Build Coastguard Worker 
763*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Create and attach shaders to program." << TestLog::EndMessage;
764*35238bceSAndroid Build Coastguard Worker             createAndAttachShaders(log, renderCtx, program, reattachAttributes,
765*35238bceSAndroid Build Coastguard Worker                                    hasAttributeAliasing(reattachAttributes, activeBindings));
766*35238bceSAndroid Build Coastguard Worker 
767*35238bceSAndroid Build Coastguard Worker             log << TestLog::Message << "Relink program." << TestLog::EndMessage;
768*35238bceSAndroid Build Coastguard Worker             gl.linkProgram(program);
769*35238bceSAndroid Build Coastguard Worker             GLU_EXPECT_NO_ERROR(gl.getError(), "glLinkProgram()");
770*35238bceSAndroid Build Coastguard Worker 
771*35238bceSAndroid Build Coastguard Worker             logProgram(log, gl, program);
772*35238bceSAndroid Build Coastguard Worker             TCU_CHECK_MSG(getProgramLinkStatus(gl, program), "Program link failed");
773*35238bceSAndroid Build Coastguard Worker 
774*35238bceSAndroid Build Coastguard Worker             if (!checkQuery(log, gl, program, reattachAttributes, activeBindings))
775*35238bceSAndroid Build Coastguard Worker                 isOk = false;
776*35238bceSAndroid Build Coastguard Worker         }
777*35238bceSAndroid Build Coastguard Worker 
778*35238bceSAndroid Build Coastguard Worker         gl.deleteProgram(program);
779*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "glDeleteProgram()");
780*35238bceSAndroid Build Coastguard Worker 
781*35238bceSAndroid Build Coastguard Worker         if (isOk)
782*35238bceSAndroid Build Coastguard Worker             testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
783*35238bceSAndroid Build Coastguard Worker         else
784*35238bceSAndroid Build Coastguard Worker             testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
785*35238bceSAndroid Build Coastguard Worker     }
786*35238bceSAndroid Build Coastguard Worker     catch (...)
787*35238bceSAndroid Build Coastguard Worker     {
788*35238bceSAndroid Build Coastguard Worker         if (program)
789*35238bceSAndroid Build Coastguard Worker             gl.deleteProgram(program);
790*35238bceSAndroid Build Coastguard Worker 
791*35238bceSAndroid Build Coastguard Worker         throw;
792*35238bceSAndroid Build Coastguard Worker     }
793*35238bceSAndroid Build Coastguard Worker }
794*35238bceSAndroid Build Coastguard Worker 
795*35238bceSAndroid Build Coastguard Worker } // namespace AttributeLocationTestUtil
796*35238bceSAndroid Build Coastguard Worker 
BindAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const AttribType & type,int arraySize)797*35238bceSAndroid Build Coastguard Worker BindAttributeTest::BindAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx, const AttribType &type,
798*35238bceSAndroid Build Coastguard Worker                                      int arraySize)
799*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, generateTestName(type, arraySize).c_str(), generateTestName(type, arraySize).c_str())
800*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
801*35238bceSAndroid Build Coastguard Worker     , m_type(type)
802*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
803*35238bceSAndroid Build Coastguard Worker {
804*35238bceSAndroid Build Coastguard Worker }
805*35238bceSAndroid Build Coastguard Worker 
iterate(void)806*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult BindAttributeTest::iterate(void)
807*35238bceSAndroid Build Coastguard Worker {
808*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
809*35238bceSAndroid Build Coastguard Worker 
810*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
811*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
812*35238bceSAndroid Build Coastguard Worker 
813*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(m_type, "a_0", Attribute::LOC_UNDEF, Cond::COND_ALWAYS, m_arraySize));
814*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_0", 3));
815*35238bceSAndroid Build Coastguard Worker 
816*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, bindings, noBindings, false);
817*35238bceSAndroid Build Coastguard Worker     return STOP;
818*35238bceSAndroid Build Coastguard Worker }
819*35238bceSAndroid Build Coastguard Worker 
BindMaxAttributesTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const AttribType & type,int arraySize)820*35238bceSAndroid Build Coastguard Worker BindMaxAttributesTest::BindMaxAttributesTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx,
821*35238bceSAndroid Build Coastguard Worker                                              const AttribType &type, int arraySize)
822*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, generateTestName(type, arraySize).c_str(), generateTestName(type, arraySize).c_str())
823*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
824*35238bceSAndroid Build Coastguard Worker     , m_type(type)
825*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
826*35238bceSAndroid Build Coastguard Worker {
827*35238bceSAndroid Build Coastguard Worker }
828*35238bceSAndroid Build Coastguard Worker 
iterate(void)829*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult BindMaxAttributesTest::iterate(void)
830*35238bceSAndroid Build Coastguard Worker {
831*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
832*35238bceSAndroid Build Coastguard Worker     const int32_t maxAttributes = getMaxAttributeLocations(m_renderCtx);
833*35238bceSAndroid Build Coastguard Worker     const int arrayElementCount = (m_arraySize != Attribute::NOT_ARRAY ? m_arraySize : 1);
834*35238bceSAndroid Build Coastguard Worker 
835*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
836*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
837*35238bceSAndroid Build Coastguard Worker     int ndx = 0;
838*35238bceSAndroid Build Coastguard Worker 
839*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << TestLog::Message << "GL_MAX_VERTEX_ATTRIBS: " << maxAttributes << TestLog::EndMessage;
840*35238bceSAndroid Build Coastguard Worker 
841*35238bceSAndroid Build Coastguard Worker     for (int loc = maxAttributes - (arrayElementCount * m_type.getLocationSize()); loc >= 0;
842*35238bceSAndroid Build Coastguard Worker          loc -= (arrayElementCount * m_type.getLocationSize()))
843*35238bceSAndroid Build Coastguard Worker     {
844*35238bceSAndroid Build Coastguard Worker         attributes.push_back(
845*35238bceSAndroid Build Coastguard Worker             Attribute(m_type, "a_" + de::toString(ndx), Attribute::LOC_UNDEF, Cond::COND_ALWAYS, m_arraySize));
846*35238bceSAndroid Build Coastguard Worker         bindings.push_back(Bind("a_" + de::toString(ndx), loc));
847*35238bceSAndroid Build Coastguard Worker         ndx++;
848*35238bceSAndroid Build Coastguard Worker     }
849*35238bceSAndroid Build Coastguard Worker 
850*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, bindings, noBindings, false);
851*35238bceSAndroid Build Coastguard Worker     return STOP;
852*35238bceSAndroid Build Coastguard Worker }
853*35238bceSAndroid Build Coastguard Worker 
BindAliasingAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const AttribType & type,int offset,int arraySize)854*35238bceSAndroid Build Coastguard Worker BindAliasingAttributeTest::BindAliasingAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx,
855*35238bceSAndroid Build Coastguard Worker                                                      const AttribType &type, int offset, int arraySize)
856*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx,
857*35238bceSAndroid Build Coastguard Worker                ("cond_" + generateTestName(type, arraySize) + (offset != 0 ? "_offset_" + de::toString(offset) : ""))
858*35238bceSAndroid Build Coastguard Worker                    .c_str(),
859*35238bceSAndroid Build Coastguard Worker                ("cond_" + generateTestName(type, arraySize) + (offset != 0 ? "_offset_" + de::toString(offset) : ""))
860*35238bceSAndroid Build Coastguard Worker                    .c_str())
861*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
862*35238bceSAndroid Build Coastguard Worker     , m_type(type)
863*35238bceSAndroid Build Coastguard Worker     , m_offset(offset)
864*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
865*35238bceSAndroid Build Coastguard Worker {
866*35238bceSAndroid Build Coastguard Worker }
867*35238bceSAndroid Build Coastguard Worker 
iterate(void)868*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult BindAliasingAttributeTest::iterate(void)
869*35238bceSAndroid Build Coastguard Worker {
870*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
871*35238bceSAndroid Build Coastguard Worker 
872*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
873*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
874*35238bceSAndroid Build Coastguard Worker 
875*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(m_type, "a_0", Attribute::LOC_UNDEF, Cond("A", true), m_arraySize));
876*35238bceSAndroid Build Coastguard Worker     attributes.push_back(
877*35238bceSAndroid Build Coastguard Worker         Attribute(AttribType("vec4", 1, GL_FLOAT_VEC4), "a_1", Attribute::LOC_UNDEF, Cond("A", false)));
878*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_0", 1));
879*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_1", 1 + m_offset));
880*35238bceSAndroid Build Coastguard Worker 
881*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, bindings, noBindings, false);
882*35238bceSAndroid Build Coastguard Worker     return STOP;
883*35238bceSAndroid Build Coastguard Worker }
884*35238bceSAndroid Build Coastguard Worker 
BindMaxAliasingAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const AttribType & type,int arraySize)885*35238bceSAndroid Build Coastguard Worker BindMaxAliasingAttributeTest::BindMaxAliasingAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx,
886*35238bceSAndroid Build Coastguard Worker                                                            const AttribType &type, int arraySize)
887*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, ("max_cond_" + generateTestName(type, arraySize)).c_str(),
888*35238bceSAndroid Build Coastguard Worker                ("max_cond_" + generateTestName(type, arraySize)).c_str())
889*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
890*35238bceSAndroid Build Coastguard Worker     , m_type(type)
891*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
892*35238bceSAndroid Build Coastguard Worker {
893*35238bceSAndroid Build Coastguard Worker }
894*35238bceSAndroid Build Coastguard Worker 
iterate(void)895*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult BindMaxAliasingAttributeTest::iterate(void)
896*35238bceSAndroid Build Coastguard Worker {
897*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
898*35238bceSAndroid Build Coastguard Worker     const int32_t maxAttributes = getMaxAttributeLocations(m_renderCtx);
899*35238bceSAndroid Build Coastguard Worker     const int arrayElementCount = (m_arraySize != Attribute::NOT_ARRAY ? m_arraySize : 1);
900*35238bceSAndroid Build Coastguard Worker 
901*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
902*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
903*35238bceSAndroid Build Coastguard Worker     int ndx = 0;
904*35238bceSAndroid Build Coastguard Worker 
905*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << TestLog::Message << "GL_MAX_VERTEX_ATTRIBS: " << maxAttributes << TestLog::EndMessage;
906*35238bceSAndroid Build Coastguard Worker 
907*35238bceSAndroid Build Coastguard Worker     for (int loc = maxAttributes - arrayElementCount * m_type.getLocationSize(); loc >= 0;
908*35238bceSAndroid Build Coastguard Worker          loc -= m_type.getLocationSize() * arrayElementCount)
909*35238bceSAndroid Build Coastguard Worker     {
910*35238bceSAndroid Build Coastguard Worker         attributes.push_back(Attribute(m_type, "a_" + de::toString(ndx), Attribute::LOC_UNDEF, Cond("A", true)));
911*35238bceSAndroid Build Coastguard Worker         bindings.push_back(Bind("a_" + de::toString(ndx), loc));
912*35238bceSAndroid Build Coastguard Worker 
913*35238bceSAndroid Build Coastguard Worker         attributes.push_back(
914*35238bceSAndroid Build Coastguard Worker             Attribute(m_type, "a_" + de::toString(ndx + maxAttributes), Attribute::LOC_UNDEF, Cond("A", false)));
915*35238bceSAndroid Build Coastguard Worker         bindings.push_back(Bind("a_" + de::toString(ndx + maxAttributes), loc));
916*35238bceSAndroid Build Coastguard Worker         ndx++;
917*35238bceSAndroid Build Coastguard Worker     }
918*35238bceSAndroid Build Coastguard Worker 
919*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, bindings, noBindings, false);
920*35238bceSAndroid Build Coastguard Worker     return STOP;
921*35238bceSAndroid Build Coastguard Worker }
922*35238bceSAndroid Build Coastguard Worker 
BindHoleAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const AttribType & type,int arraySize)923*35238bceSAndroid Build Coastguard Worker BindHoleAttributeTest::BindHoleAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx,
924*35238bceSAndroid Build Coastguard Worker                                              const AttribType &type, int arraySize)
925*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, generateTestName(type, arraySize).c_str(), generateTestName(type, arraySize).c_str())
926*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
927*35238bceSAndroid Build Coastguard Worker     , m_type(type)
928*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
929*35238bceSAndroid Build Coastguard Worker {
930*35238bceSAndroid Build Coastguard Worker }
931*35238bceSAndroid Build Coastguard Worker 
iterate(void)932*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult BindHoleAttributeTest::iterate(void)
933*35238bceSAndroid Build Coastguard Worker {
934*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
935*35238bceSAndroid Build Coastguard Worker     const int32_t maxAttributes = getMaxAttributeLocations(m_renderCtx);
936*35238bceSAndroid Build Coastguard Worker     const AttribType vec4("vec4", 1, GL_FLOAT_VEC4);
937*35238bceSAndroid Build Coastguard Worker     const int arrayElementCount = (m_arraySize != Attribute::NOT_ARRAY ? m_arraySize : 1);
938*35238bceSAndroid Build Coastguard Worker 
939*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
940*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
941*35238bceSAndroid Build Coastguard Worker     int ndx;
942*35238bceSAndroid Build Coastguard Worker 
943*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(vec4, "a_0"));
944*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_0", 0));
945*35238bceSAndroid Build Coastguard Worker 
946*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(m_type, "a_1", Attribute::LOC_UNDEF, Cond::COND_ALWAYS, m_arraySize));
947*35238bceSAndroid Build Coastguard Worker 
948*35238bceSAndroid Build Coastguard Worker     ndx = 2;
949*35238bceSAndroid Build Coastguard Worker     for (int loc = 1 + m_type.getLocationSize() * arrayElementCount; loc < maxAttributes; loc++)
950*35238bceSAndroid Build Coastguard Worker     {
951*35238bceSAndroid Build Coastguard Worker         attributes.push_back(Attribute(vec4, "a_" + de::toString(ndx)));
952*35238bceSAndroid Build Coastguard Worker         bindings.push_back(Bind("a_" + de::toString(ndx), loc));
953*35238bceSAndroid Build Coastguard Worker 
954*35238bceSAndroid Build Coastguard Worker         ndx++;
955*35238bceSAndroid Build Coastguard Worker     }
956*35238bceSAndroid Build Coastguard Worker 
957*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, bindings, noBindings, false);
958*35238bceSAndroid Build Coastguard Worker     return STOP;
959*35238bceSAndroid Build Coastguard Worker }
960*35238bceSAndroid Build Coastguard Worker 
BindInactiveAliasingAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const AttribType & type,int arraySize)961*35238bceSAndroid Build Coastguard Worker BindInactiveAliasingAttributeTest::BindInactiveAliasingAttributeTest(tcu::TestContext &testCtx,
962*35238bceSAndroid Build Coastguard Worker                                                                      glu::RenderContext &renderCtx,
963*35238bceSAndroid Build Coastguard Worker                                                                      const AttribType &type, int arraySize)
964*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, ("max_inactive_" + generateTestName(type, arraySize)).c_str(),
965*35238bceSAndroid Build Coastguard Worker                ("max_inactive_" + generateTestName(type, arraySize)).c_str())
966*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
967*35238bceSAndroid Build Coastguard Worker     , m_type(type)
968*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
969*35238bceSAndroid Build Coastguard Worker {
970*35238bceSAndroid Build Coastguard Worker }
971*35238bceSAndroid Build Coastguard Worker 
iterate(void)972*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult BindInactiveAliasingAttributeTest::iterate(void)
973*35238bceSAndroid Build Coastguard Worker {
974*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
975*35238bceSAndroid Build Coastguard Worker     const int32_t maxAttributes = getMaxAttributeLocations(m_renderCtx);
976*35238bceSAndroid Build Coastguard Worker     const int arrayElementCount = (m_arraySize != Attribute::NOT_ARRAY ? m_arraySize : 1);
977*35238bceSAndroid Build Coastguard Worker 
978*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
979*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
980*35238bceSAndroid Build Coastguard Worker     int ndx = 0;
981*35238bceSAndroid Build Coastguard Worker 
982*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << TestLog::Message << "GL_MAX_VERTEX_ATTRIBS: " << maxAttributes << TestLog::EndMessage;
983*35238bceSAndroid Build Coastguard Worker 
984*35238bceSAndroid Build Coastguard Worker     for (int loc = maxAttributes - arrayElementCount * m_type.getLocationSize(); loc >= 0;
985*35238bceSAndroid Build Coastguard Worker          loc -= m_type.getLocationSize() * arrayElementCount)
986*35238bceSAndroid Build Coastguard Worker     {
987*35238bceSAndroid Build Coastguard Worker         attributes.push_back(Attribute(m_type, "a_" + de::toString(ndx), Attribute::LOC_UNDEF, Cond("A")));
988*35238bceSAndroid Build Coastguard Worker         bindings.push_back(Bind("a_" + de::toString(ndx), loc));
989*35238bceSAndroid Build Coastguard Worker 
990*35238bceSAndroid Build Coastguard Worker         attributes.push_back(
991*35238bceSAndroid Build Coastguard Worker             Attribute(m_type, "a_" + de::toString(ndx + maxAttributes), Attribute::LOC_UNDEF, Cond::COND_NEVER));
992*35238bceSAndroid Build Coastguard Worker         bindings.push_back(Bind("a_" + de::toString(ndx + maxAttributes), loc));
993*35238bceSAndroid Build Coastguard Worker         ndx++;
994*35238bceSAndroid Build Coastguard Worker     }
995*35238bceSAndroid Build Coastguard Worker 
996*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, bindings, noBindings, false);
997*35238bceSAndroid Build Coastguard Worker     return STOP;
998*35238bceSAndroid Build Coastguard Worker }
999*35238bceSAndroid Build Coastguard Worker 
PreAttachBindAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx)1000*35238bceSAndroid Build Coastguard Worker PreAttachBindAttributeTest::PreAttachBindAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx)
1001*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, "pre_attach", "pre_attach")
1002*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1003*35238bceSAndroid Build Coastguard Worker {
1004*35238bceSAndroid Build Coastguard Worker }
1005*35238bceSAndroid Build Coastguard Worker 
iterate(void)1006*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult PreAttachBindAttributeTest::iterate(void)
1007*35238bceSAndroid Build Coastguard Worker {
1008*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1009*35238bceSAndroid Build Coastguard Worker 
1010*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1011*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
1012*35238bceSAndroid Build Coastguard Worker 
1013*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(AttribType("vec4", 1, GL_FLOAT_VEC4), "a_0"));
1014*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_0", 3));
1015*35238bceSAndroid Build Coastguard Worker 
1016*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, bindings, noBindings, noBindings, false);
1017*35238bceSAndroid Build Coastguard Worker     return STOP;
1018*35238bceSAndroid Build Coastguard Worker }
1019*35238bceSAndroid Build Coastguard Worker 
PreLinkBindAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx)1020*35238bceSAndroid Build Coastguard Worker PreLinkBindAttributeTest::PreLinkBindAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx)
1021*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, "pre_link", "pre_link")
1022*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1023*35238bceSAndroid Build Coastguard Worker {
1024*35238bceSAndroid Build Coastguard Worker }
1025*35238bceSAndroid Build Coastguard Worker 
iterate(void)1026*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult PreLinkBindAttributeTest::iterate(void)
1027*35238bceSAndroid Build Coastguard Worker {
1028*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1029*35238bceSAndroid Build Coastguard Worker 
1030*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1031*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
1032*35238bceSAndroid Build Coastguard Worker 
1033*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(AttribType("vec4", 1, GL_FLOAT_VEC4), "a_0"));
1034*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_0", 3));
1035*35238bceSAndroid Build Coastguard Worker 
1036*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, bindings, noBindings, false);
1037*35238bceSAndroid Build Coastguard Worker     return STOP;
1038*35238bceSAndroid Build Coastguard Worker }
1039*35238bceSAndroid Build Coastguard Worker 
PostLinkBindAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx)1040*35238bceSAndroid Build Coastguard Worker PostLinkBindAttributeTest::PostLinkBindAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx)
1041*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, "post_link", "post_link")
1042*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1043*35238bceSAndroid Build Coastguard Worker {
1044*35238bceSAndroid Build Coastguard Worker }
1045*35238bceSAndroid Build Coastguard Worker 
iterate(void)1046*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult PostLinkBindAttributeTest::iterate(void)
1047*35238bceSAndroid Build Coastguard Worker {
1048*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1049*35238bceSAndroid Build Coastguard Worker 
1050*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1051*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
1052*35238bceSAndroid Build Coastguard Worker 
1053*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(AttribType("vec4", 1, GL_FLOAT_VEC4), "a_0"));
1054*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_0", 3));
1055*35238bceSAndroid Build Coastguard Worker 
1056*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, noBindings, bindings, false);
1057*35238bceSAndroid Build Coastguard Worker     return STOP;
1058*35238bceSAndroid Build Coastguard Worker }
1059*35238bceSAndroid Build Coastguard Worker 
LocationAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const AttribType & type,int arraySize)1060*35238bceSAndroid Build Coastguard Worker LocationAttributeTest::LocationAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx,
1061*35238bceSAndroid Build Coastguard Worker                                              const AttribType &type, int arraySize)
1062*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, generateTestName(type, arraySize).c_str(), generateTestName(type, arraySize).c_str())
1063*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1064*35238bceSAndroid Build Coastguard Worker     , m_type(type)
1065*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
1066*35238bceSAndroid Build Coastguard Worker {
1067*35238bceSAndroid Build Coastguard Worker }
1068*35238bceSAndroid Build Coastguard Worker 
iterate(void)1069*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult LocationAttributeTest::iterate(void)
1070*35238bceSAndroid Build Coastguard Worker {
1071*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1072*35238bceSAndroid Build Coastguard Worker 
1073*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1074*35238bceSAndroid Build Coastguard Worker 
1075*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(m_type, "a_0", 3, Cond::COND_ALWAYS, m_arraySize));
1076*35238bceSAndroid Build Coastguard Worker 
1077*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, noBindings, noBindings, false);
1078*35238bceSAndroid Build Coastguard Worker     return STOP;
1079*35238bceSAndroid Build Coastguard Worker }
1080*35238bceSAndroid Build Coastguard Worker 
LocationMaxAttributesTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const AttribType & type,int arraySize)1081*35238bceSAndroid Build Coastguard Worker LocationMaxAttributesTest::LocationMaxAttributesTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx,
1082*35238bceSAndroid Build Coastguard Worker                                                      const AttribType &type, int arraySize)
1083*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, generateTestName(type, arraySize).c_str(), generateTestName(type, arraySize).c_str())
1084*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1085*35238bceSAndroid Build Coastguard Worker     , m_type(type)
1086*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
1087*35238bceSAndroid Build Coastguard Worker {
1088*35238bceSAndroid Build Coastguard Worker }
1089*35238bceSAndroid Build Coastguard Worker 
iterate(void)1090*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult LocationMaxAttributesTest::iterate(void)
1091*35238bceSAndroid Build Coastguard Worker {
1092*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1093*35238bceSAndroid Build Coastguard Worker     const int32_t maxAttributes = getMaxAttributeLocations(m_renderCtx);
1094*35238bceSAndroid Build Coastguard Worker     const int arrayElementCount = (m_arraySize != Attribute::NOT_ARRAY ? m_arraySize : 1);
1095*35238bceSAndroid Build Coastguard Worker 
1096*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1097*35238bceSAndroid Build Coastguard Worker     int ndx = 0;
1098*35238bceSAndroid Build Coastguard Worker 
1099*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << TestLog::Message << "GL_MAX_VERTEX_ATTRIBS: " << maxAttributes << TestLog::EndMessage;
1100*35238bceSAndroid Build Coastguard Worker 
1101*35238bceSAndroid Build Coastguard Worker     for (int loc = maxAttributes - (arrayElementCount * m_type.getLocationSize()); loc >= 0;
1102*35238bceSAndroid Build Coastguard Worker          loc -= (arrayElementCount * m_type.getLocationSize()))
1103*35238bceSAndroid Build Coastguard Worker     {
1104*35238bceSAndroid Build Coastguard Worker         attributes.push_back(Attribute(m_type, "a_" + de::toString(ndx), loc, Cond::COND_ALWAYS, m_arraySize));
1105*35238bceSAndroid Build Coastguard Worker         ndx++;
1106*35238bceSAndroid Build Coastguard Worker     }
1107*35238bceSAndroid Build Coastguard Worker 
1108*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, noBindings, noBindings, false);
1109*35238bceSAndroid Build Coastguard Worker     return STOP;
1110*35238bceSAndroid Build Coastguard Worker }
1111*35238bceSAndroid Build Coastguard Worker 
LocationHoleAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const AttribType & type,int arraySize)1112*35238bceSAndroid Build Coastguard Worker LocationHoleAttributeTest::LocationHoleAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx,
1113*35238bceSAndroid Build Coastguard Worker                                                      const AttribType &type, int arraySize)
1114*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, generateTestName(type, arraySize).c_str(), generateTestName(type, arraySize).c_str())
1115*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1116*35238bceSAndroid Build Coastguard Worker     , m_type(type)
1117*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
1118*35238bceSAndroid Build Coastguard Worker {
1119*35238bceSAndroid Build Coastguard Worker }
1120*35238bceSAndroid Build Coastguard Worker 
iterate(void)1121*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult LocationHoleAttributeTest::iterate(void)
1122*35238bceSAndroid Build Coastguard Worker {
1123*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1124*35238bceSAndroid Build Coastguard Worker     const int32_t maxAttributes = getMaxAttributeLocations(m_renderCtx);
1125*35238bceSAndroid Build Coastguard Worker     const AttribType vec4("vec4", 1, GL_FLOAT_VEC4);
1126*35238bceSAndroid Build Coastguard Worker     const int arrayElementCount = (m_arraySize != Attribute::NOT_ARRAY ? m_arraySize : 1);
1127*35238bceSAndroid Build Coastguard Worker 
1128*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1129*35238bceSAndroid Build Coastguard Worker     int ndx;
1130*35238bceSAndroid Build Coastguard Worker 
1131*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(vec4, "a_0", 0));
1132*35238bceSAndroid Build Coastguard Worker 
1133*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(m_type, "a_1", Attribute::LOC_UNDEF, Cond::COND_ALWAYS, m_arraySize));
1134*35238bceSAndroid Build Coastguard Worker 
1135*35238bceSAndroid Build Coastguard Worker     ndx = 2;
1136*35238bceSAndroid Build Coastguard Worker     for (int loc = 1 + m_type.getLocationSize() * arrayElementCount; loc < maxAttributes; loc++)
1137*35238bceSAndroid Build Coastguard Worker     {
1138*35238bceSAndroid Build Coastguard Worker         attributes.push_back(Attribute(vec4, "a_" + de::toString(ndx), loc));
1139*35238bceSAndroid Build Coastguard Worker         ndx++;
1140*35238bceSAndroid Build Coastguard Worker     }
1141*35238bceSAndroid Build Coastguard Worker 
1142*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, noBindings, noBindings, false);
1143*35238bceSAndroid Build Coastguard Worker     return STOP;
1144*35238bceSAndroid Build Coastguard Worker }
1145*35238bceSAndroid Build Coastguard Worker 
MixedAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const AttribType & type,int arraySize)1146*35238bceSAndroid Build Coastguard Worker MixedAttributeTest::MixedAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx, const AttribType &type,
1147*35238bceSAndroid Build Coastguard Worker                                        int arraySize)
1148*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, generateTestName(type, arraySize).c_str(), generateTestName(type, arraySize).c_str())
1149*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1150*35238bceSAndroid Build Coastguard Worker     , m_type(type)
1151*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
1152*35238bceSAndroid Build Coastguard Worker {
1153*35238bceSAndroid Build Coastguard Worker }
1154*35238bceSAndroid Build Coastguard Worker 
iterate(void)1155*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult MixedAttributeTest::iterate(void)
1156*35238bceSAndroid Build Coastguard Worker {
1157*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1158*35238bceSAndroid Build Coastguard Worker 
1159*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
1160*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1161*35238bceSAndroid Build Coastguard Worker 
1162*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(m_type, "a_0", 3, Cond::COND_ALWAYS, m_arraySize));
1163*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_0", 4));
1164*35238bceSAndroid Build Coastguard Worker 
1165*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, bindings, noBindings, false);
1166*35238bceSAndroid Build Coastguard Worker     return STOP;
1167*35238bceSAndroid Build Coastguard Worker }
1168*35238bceSAndroid Build Coastguard Worker 
MixedMaxAttributesTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const AttribType & type,int arraySize)1169*35238bceSAndroid Build Coastguard Worker MixedMaxAttributesTest::MixedMaxAttributesTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx,
1170*35238bceSAndroid Build Coastguard Worker                                                const AttribType &type, int arraySize)
1171*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, generateTestName(type, arraySize).c_str(), generateTestName(type, arraySize).c_str())
1172*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1173*35238bceSAndroid Build Coastguard Worker     , m_type(type)
1174*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
1175*35238bceSAndroid Build Coastguard Worker {
1176*35238bceSAndroid Build Coastguard Worker }
1177*35238bceSAndroid Build Coastguard Worker 
iterate(void)1178*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult MixedMaxAttributesTest::iterate(void)
1179*35238bceSAndroid Build Coastguard Worker {
1180*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1181*35238bceSAndroid Build Coastguard Worker     const int32_t maxAttributes = getMaxAttributeLocations(m_renderCtx);
1182*35238bceSAndroid Build Coastguard Worker     const int arrayElementCount = (m_arraySize != Attribute::NOT_ARRAY ? m_arraySize : 1);
1183*35238bceSAndroid Build Coastguard Worker 
1184*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
1185*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1186*35238bceSAndroid Build Coastguard Worker     int ndx = 0;
1187*35238bceSAndroid Build Coastguard Worker 
1188*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << TestLog::Message << "GL_MAX_VERTEX_ATTRIBS: " << maxAttributes << TestLog::EndMessage;
1189*35238bceSAndroid Build Coastguard Worker 
1190*35238bceSAndroid Build Coastguard Worker     for (int loc = maxAttributes - (arrayElementCount * m_type.getLocationSize()); loc >= 0;
1191*35238bceSAndroid Build Coastguard Worker          loc -= (arrayElementCount * m_type.getLocationSize()))
1192*35238bceSAndroid Build Coastguard Worker     {
1193*35238bceSAndroid Build Coastguard Worker         if ((ndx % 2) != 0)
1194*35238bceSAndroid Build Coastguard Worker             attributes.push_back(Attribute(m_type, "a_" + de::toString(ndx), loc, Cond::COND_ALWAYS, m_arraySize));
1195*35238bceSAndroid Build Coastguard Worker         else
1196*35238bceSAndroid Build Coastguard Worker         {
1197*35238bceSAndroid Build Coastguard Worker             attributes.push_back(
1198*35238bceSAndroid Build Coastguard Worker                 Attribute(m_type, "a_" + de::toString(ndx), Attribute::LOC_UNDEF, Cond::COND_ALWAYS, m_arraySize));
1199*35238bceSAndroid Build Coastguard Worker             bindings.push_back(Bind("a_" + de::toString(ndx), loc));
1200*35238bceSAndroid Build Coastguard Worker         }
1201*35238bceSAndroid Build Coastguard Worker         ndx++;
1202*35238bceSAndroid Build Coastguard Worker     }
1203*35238bceSAndroid Build Coastguard Worker 
1204*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, bindings, noBindings, false);
1205*35238bceSAndroid Build Coastguard Worker     return STOP;
1206*35238bceSAndroid Build Coastguard Worker }
1207*35238bceSAndroid Build Coastguard Worker 
MixedHoleAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const AttribType & type,int arraySize)1208*35238bceSAndroid Build Coastguard Worker MixedHoleAttributeTest::MixedHoleAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx,
1209*35238bceSAndroid Build Coastguard Worker                                                const AttribType &type, int arraySize)
1210*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, generateTestName(type, arraySize).c_str(), generateTestName(type, arraySize).c_str())
1211*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1212*35238bceSAndroid Build Coastguard Worker     , m_type(type)
1213*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
1214*35238bceSAndroid Build Coastguard Worker {
1215*35238bceSAndroid Build Coastguard Worker }
1216*35238bceSAndroid Build Coastguard Worker 
iterate(void)1217*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult MixedHoleAttributeTest::iterate(void)
1218*35238bceSAndroid Build Coastguard Worker {
1219*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1220*35238bceSAndroid Build Coastguard Worker     const int32_t maxAttributes = getMaxAttributeLocations(m_renderCtx);
1221*35238bceSAndroid Build Coastguard Worker     const AttribType vec4("vec4", 1, GL_FLOAT_VEC4);
1222*35238bceSAndroid Build Coastguard Worker     const int arrayElementCount = (m_arraySize != Attribute::NOT_ARRAY ? m_arraySize : 1);
1223*35238bceSAndroid Build Coastguard Worker 
1224*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
1225*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1226*35238bceSAndroid Build Coastguard Worker     int ndx;
1227*35238bceSAndroid Build Coastguard Worker 
1228*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(vec4, "a_0"));
1229*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_0", 0));
1230*35238bceSAndroid Build Coastguard Worker 
1231*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(m_type, "a_1", Attribute::LOC_UNDEF, Cond::COND_ALWAYS, m_arraySize));
1232*35238bceSAndroid Build Coastguard Worker 
1233*35238bceSAndroid Build Coastguard Worker     ndx = 2;
1234*35238bceSAndroid Build Coastguard Worker     for (int loc = 1 + m_type.getLocationSize() * arrayElementCount; loc < maxAttributes; loc++)
1235*35238bceSAndroid Build Coastguard Worker     {
1236*35238bceSAndroid Build Coastguard Worker         if ((ndx % 2) != 0)
1237*35238bceSAndroid Build Coastguard Worker             attributes.push_back(Attribute(vec4, "a_" + de::toString(ndx), loc));
1238*35238bceSAndroid Build Coastguard Worker         else
1239*35238bceSAndroid Build Coastguard Worker         {
1240*35238bceSAndroid Build Coastguard Worker             attributes.push_back(Attribute(vec4, "a_" + de::toString(ndx), loc));
1241*35238bceSAndroid Build Coastguard Worker             bindings.push_back(Bind("a_" + de::toString(ndx), loc));
1242*35238bceSAndroid Build Coastguard Worker         }
1243*35238bceSAndroid Build Coastguard Worker         ndx++;
1244*35238bceSAndroid Build Coastguard Worker     }
1245*35238bceSAndroid Build Coastguard Worker 
1246*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, bindings, noBindings, false);
1247*35238bceSAndroid Build Coastguard Worker     return STOP;
1248*35238bceSAndroid Build Coastguard Worker }
1249*35238bceSAndroid Build Coastguard Worker 
BindRelinkAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx)1250*35238bceSAndroid Build Coastguard Worker BindRelinkAttributeTest::BindRelinkAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx)
1251*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, "relink", "relink")
1252*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1253*35238bceSAndroid Build Coastguard Worker {
1254*35238bceSAndroid Build Coastguard Worker }
1255*35238bceSAndroid Build Coastguard Worker 
iterate(void)1256*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult BindRelinkAttributeTest::iterate(void)
1257*35238bceSAndroid Build Coastguard Worker {
1258*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1259*35238bceSAndroid Build Coastguard Worker     const AttribType vec4("vec4", 1, GL_FLOAT_VEC4);
1260*35238bceSAndroid Build Coastguard Worker 
1261*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1262*35238bceSAndroid Build Coastguard Worker     vector<Bind> preLinkBindings;
1263*35238bceSAndroid Build Coastguard Worker     vector<Bind> postLinkBindings;
1264*35238bceSAndroid Build Coastguard Worker 
1265*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(vec4, "a_0"));
1266*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(vec4, "a_1"));
1267*35238bceSAndroid Build Coastguard Worker 
1268*35238bceSAndroid Build Coastguard Worker     preLinkBindings.push_back(Bind("a_0", 3));
1269*35238bceSAndroid Build Coastguard Worker     preLinkBindings.push_back(Bind("a_0", 5));
1270*35238bceSAndroid Build Coastguard Worker 
1271*35238bceSAndroid Build Coastguard Worker     postLinkBindings.push_back(Bind("a_0", 6));
1272*35238bceSAndroid Build Coastguard Worker 
1273*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, preLinkBindings, postLinkBindings, true);
1274*35238bceSAndroid Build Coastguard Worker     return STOP;
1275*35238bceSAndroid Build Coastguard Worker }
1276*35238bceSAndroid Build Coastguard Worker 
BindRelinkHoleAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const AttribType & type,int arraySize)1277*35238bceSAndroid Build Coastguard Worker BindRelinkHoleAttributeTest::BindRelinkHoleAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx,
1278*35238bceSAndroid Build Coastguard Worker                                                          const AttribType &type, int arraySize)
1279*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, generateTestName(type, arraySize).c_str(), generateTestName(type, arraySize).c_str())
1280*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1281*35238bceSAndroid Build Coastguard Worker     , m_type(type)
1282*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
1283*35238bceSAndroid Build Coastguard Worker {
1284*35238bceSAndroid Build Coastguard Worker }
1285*35238bceSAndroid Build Coastguard Worker 
iterate(void)1286*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult BindRelinkHoleAttributeTest::iterate(void)
1287*35238bceSAndroid Build Coastguard Worker {
1288*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1289*35238bceSAndroid Build Coastguard Worker     const int32_t maxAttributes = getMaxAttributeLocations(m_renderCtx);
1290*35238bceSAndroid Build Coastguard Worker     const AttribType vec4("vec4", 1, GL_FLOAT_VEC4);
1291*35238bceSAndroid Build Coastguard Worker     const int arrayElementCount = (m_arraySize != Attribute::NOT_ARRAY ? m_arraySize : 1);
1292*35238bceSAndroid Build Coastguard Worker 
1293*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1294*35238bceSAndroid Build Coastguard Worker     vector<Bind> preLinkBindings;
1295*35238bceSAndroid Build Coastguard Worker     vector<Bind> postLinkBindings;
1296*35238bceSAndroid Build Coastguard Worker     int ndx;
1297*35238bceSAndroid Build Coastguard Worker 
1298*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(vec4, "a_0"));
1299*35238bceSAndroid Build Coastguard Worker     preLinkBindings.push_back(Bind("a_0", 0));
1300*35238bceSAndroid Build Coastguard Worker 
1301*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(m_type, "a_1", Attribute::LOC_UNDEF, Cond::COND_ALWAYS, m_arraySize));
1302*35238bceSAndroid Build Coastguard Worker 
1303*35238bceSAndroid Build Coastguard Worker     ndx = 2;
1304*35238bceSAndroid Build Coastguard Worker     for (int loc = 1 + m_type.getLocationSize() * arrayElementCount; loc < maxAttributes; loc++)
1305*35238bceSAndroid Build Coastguard Worker     {
1306*35238bceSAndroid Build Coastguard Worker         attributes.push_back(Attribute(vec4, "a_" + de::toString(ndx)));
1307*35238bceSAndroid Build Coastguard Worker         preLinkBindings.push_back(Bind("a_" + de::toString(ndx), loc));
1308*35238bceSAndroid Build Coastguard Worker 
1309*35238bceSAndroid Build Coastguard Worker         ndx++;
1310*35238bceSAndroid Build Coastguard Worker     }
1311*35238bceSAndroid Build Coastguard Worker 
1312*35238bceSAndroid Build Coastguard Worker     postLinkBindings.push_back(Bind("a_2", 1));
1313*35238bceSAndroid Build Coastguard Worker 
1314*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, preLinkBindings, postLinkBindings, true);
1315*35238bceSAndroid Build Coastguard Worker     return STOP;
1316*35238bceSAndroid Build Coastguard Worker }
1317*35238bceSAndroid Build Coastguard Worker 
MixedRelinkHoleAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const AttribType & type,int arraySize)1318*35238bceSAndroid Build Coastguard Worker MixedRelinkHoleAttributeTest::MixedRelinkHoleAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx,
1319*35238bceSAndroid Build Coastguard Worker                                                            const AttribType &type, int arraySize)
1320*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, generateTestName(type, arraySize).c_str(), generateTestName(type, arraySize).c_str())
1321*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1322*35238bceSAndroid Build Coastguard Worker     , m_type(type)
1323*35238bceSAndroid Build Coastguard Worker     , m_arraySize(arraySize)
1324*35238bceSAndroid Build Coastguard Worker {
1325*35238bceSAndroid Build Coastguard Worker }
1326*35238bceSAndroid Build Coastguard Worker 
iterate(void)1327*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult MixedRelinkHoleAttributeTest::iterate(void)
1328*35238bceSAndroid Build Coastguard Worker {
1329*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1330*35238bceSAndroid Build Coastguard Worker     const int32_t maxAttributes = getMaxAttributeLocations(m_renderCtx);
1331*35238bceSAndroid Build Coastguard Worker     const AttribType vec4("vec4", 1, GL_FLOAT_VEC4);
1332*35238bceSAndroid Build Coastguard Worker     const int arrayElementCount = (m_arraySize != Attribute::NOT_ARRAY ? m_arraySize : 1);
1333*35238bceSAndroid Build Coastguard Worker 
1334*35238bceSAndroid Build Coastguard Worker     vector<Bind> preLinkBindings;
1335*35238bceSAndroid Build Coastguard Worker     vector<Bind> postLinkBindings;
1336*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1337*35238bceSAndroid Build Coastguard Worker     int ndx;
1338*35238bceSAndroid Build Coastguard Worker 
1339*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(vec4, "a_0"));
1340*35238bceSAndroid Build Coastguard Worker     preLinkBindings.push_back(Bind("a_0", 0));
1341*35238bceSAndroid Build Coastguard Worker 
1342*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(m_type, "a_1", Attribute::LOC_UNDEF, Cond::COND_ALWAYS, m_arraySize));
1343*35238bceSAndroid Build Coastguard Worker 
1344*35238bceSAndroid Build Coastguard Worker     ndx = 2;
1345*35238bceSAndroid Build Coastguard Worker     for (int loc = 1 + m_type.getLocationSize() * arrayElementCount; loc < maxAttributes; loc++)
1346*35238bceSAndroid Build Coastguard Worker     {
1347*35238bceSAndroid Build Coastguard Worker         if ((ndx % 2) != 0)
1348*35238bceSAndroid Build Coastguard Worker             attributes.push_back(Attribute(vec4, "a_" + de::toString(ndx), loc));
1349*35238bceSAndroid Build Coastguard Worker         else
1350*35238bceSAndroid Build Coastguard Worker         {
1351*35238bceSAndroid Build Coastguard Worker             attributes.push_back(Attribute(vec4, "a_" + de::toString(ndx)));
1352*35238bceSAndroid Build Coastguard Worker             preLinkBindings.push_back(Bind("a_" + de::toString(ndx), loc));
1353*35238bceSAndroid Build Coastguard Worker         }
1354*35238bceSAndroid Build Coastguard Worker         ndx++;
1355*35238bceSAndroid Build Coastguard Worker     }
1356*35238bceSAndroid Build Coastguard Worker 
1357*35238bceSAndroid Build Coastguard Worker     postLinkBindings.push_back(Bind("a_2", 1));
1358*35238bceSAndroid Build Coastguard Worker 
1359*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, preLinkBindings, postLinkBindings, true);
1360*35238bceSAndroid Build Coastguard Worker     return STOP;
1361*35238bceSAndroid Build Coastguard Worker }
1362*35238bceSAndroid Build Coastguard Worker 
BindReattachAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx)1363*35238bceSAndroid Build Coastguard Worker BindReattachAttributeTest::BindReattachAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx)
1364*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, "reattach", "reattach")
1365*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1366*35238bceSAndroid Build Coastguard Worker {
1367*35238bceSAndroid Build Coastguard Worker }
1368*35238bceSAndroid Build Coastguard Worker 
iterate(void)1369*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult BindReattachAttributeTest::iterate(void)
1370*35238bceSAndroid Build Coastguard Worker {
1371*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1372*35238bceSAndroid Build Coastguard Worker     const AttribType vec4("vec4", 1, GL_FLOAT_VEC4);
1373*35238bceSAndroid Build Coastguard Worker     const AttribType vec2("vec2", 1, GL_FLOAT_VEC2);
1374*35238bceSAndroid Build Coastguard Worker 
1375*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
1376*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1377*35238bceSAndroid Build Coastguard Worker     vector<Attribute> reattachAttributes;
1378*35238bceSAndroid Build Coastguard Worker 
1379*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(vec4, "a_0"));
1380*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_0", 1));
1381*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_1", 1));
1382*35238bceSAndroid Build Coastguard Worker 
1383*35238bceSAndroid Build Coastguard Worker     reattachAttributes.push_back(Attribute(vec2, "a_1"));
1384*35238bceSAndroid Build Coastguard Worker 
1385*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, bindings, noBindings, false, true, reattachAttributes);
1386*35238bceSAndroid Build Coastguard Worker     return STOP;
1387*35238bceSAndroid Build Coastguard Worker }
1388*35238bceSAndroid Build Coastguard Worker 
PreAttachMixedAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx)1389*35238bceSAndroid Build Coastguard Worker PreAttachMixedAttributeTest::PreAttachMixedAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx)
1390*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, "pre_attach", "pre_attach")
1391*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1392*35238bceSAndroid Build Coastguard Worker {
1393*35238bceSAndroid Build Coastguard Worker }
1394*35238bceSAndroid Build Coastguard Worker 
iterate(void)1395*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult PreAttachMixedAttributeTest::iterate(void)
1396*35238bceSAndroid Build Coastguard Worker {
1397*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1398*35238bceSAndroid Build Coastguard Worker 
1399*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1400*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
1401*35238bceSAndroid Build Coastguard Worker 
1402*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(AttribType("vec4", 1, GL_FLOAT_VEC4), "a_0", 1));
1403*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_0", 3));
1404*35238bceSAndroid Build Coastguard Worker 
1405*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, bindings, noBindings, noBindings, false);
1406*35238bceSAndroid Build Coastguard Worker     return STOP;
1407*35238bceSAndroid Build Coastguard Worker }
1408*35238bceSAndroid Build Coastguard Worker 
PreLinkMixedAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx)1409*35238bceSAndroid Build Coastguard Worker PreLinkMixedAttributeTest::PreLinkMixedAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx)
1410*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, "pre_link", "pre_link")
1411*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1412*35238bceSAndroid Build Coastguard Worker {
1413*35238bceSAndroid Build Coastguard Worker }
1414*35238bceSAndroid Build Coastguard Worker 
iterate(void)1415*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult PreLinkMixedAttributeTest::iterate(void)
1416*35238bceSAndroid Build Coastguard Worker {
1417*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1418*35238bceSAndroid Build Coastguard Worker 
1419*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1420*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
1421*35238bceSAndroid Build Coastguard Worker 
1422*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(AttribType("vec4", 1, GL_FLOAT_VEC4), "a_0", 1));
1423*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_0", 3));
1424*35238bceSAndroid Build Coastguard Worker 
1425*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, bindings, noBindings, false);
1426*35238bceSAndroid Build Coastguard Worker     return STOP;
1427*35238bceSAndroid Build Coastguard Worker }
1428*35238bceSAndroid Build Coastguard Worker 
PostLinkMixedAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx)1429*35238bceSAndroid Build Coastguard Worker PostLinkMixedAttributeTest::PostLinkMixedAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx)
1430*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, "post_link", "post_link")
1431*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1432*35238bceSAndroid Build Coastguard Worker {
1433*35238bceSAndroid Build Coastguard Worker }
1434*35238bceSAndroid Build Coastguard Worker 
iterate(void)1435*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult PostLinkMixedAttributeTest::iterate(void)
1436*35238bceSAndroid Build Coastguard Worker {
1437*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1438*35238bceSAndroid Build Coastguard Worker 
1439*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1440*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
1441*35238bceSAndroid Build Coastguard Worker 
1442*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(AttribType("vec4", 1, GL_FLOAT_VEC4), "a_0", 1));
1443*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_0", 3));
1444*35238bceSAndroid Build Coastguard Worker 
1445*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, noBindings, bindings, false);
1446*35238bceSAndroid Build Coastguard Worker     return STOP;
1447*35238bceSAndroid Build Coastguard Worker }
1448*35238bceSAndroid Build Coastguard Worker 
MixedReattachAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx)1449*35238bceSAndroid Build Coastguard Worker MixedReattachAttributeTest::MixedReattachAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx)
1450*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, "reattach", "reattach")
1451*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1452*35238bceSAndroid Build Coastguard Worker {
1453*35238bceSAndroid Build Coastguard Worker }
1454*35238bceSAndroid Build Coastguard Worker 
iterate(void)1455*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult MixedReattachAttributeTest::iterate(void)
1456*35238bceSAndroid Build Coastguard Worker {
1457*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1458*35238bceSAndroid Build Coastguard Worker     const AttribType vec4("vec4", 1, GL_FLOAT_VEC4);
1459*35238bceSAndroid Build Coastguard Worker     const AttribType vec2("vec2", 1, GL_FLOAT_VEC2);
1460*35238bceSAndroid Build Coastguard Worker 
1461*35238bceSAndroid Build Coastguard Worker     vector<Bind> bindings;
1462*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1463*35238bceSAndroid Build Coastguard Worker     vector<Attribute> reattachAttributes;
1464*35238bceSAndroid Build Coastguard Worker 
1465*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(vec4, "a_0", 2));
1466*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_0", 1));
1467*35238bceSAndroid Build Coastguard Worker     bindings.push_back(Bind("a_1", 1));
1468*35238bceSAndroid Build Coastguard Worker 
1469*35238bceSAndroid Build Coastguard Worker     reattachAttributes.push_back(Attribute(vec2, "a_1"));
1470*35238bceSAndroid Build Coastguard Worker 
1471*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, bindings, noBindings, false, true, reattachAttributes);
1472*35238bceSAndroid Build Coastguard Worker     return STOP;
1473*35238bceSAndroid Build Coastguard Worker }
1474*35238bceSAndroid Build Coastguard Worker 
MixedRelinkAttributeTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx)1475*35238bceSAndroid Build Coastguard Worker MixedRelinkAttributeTest::MixedRelinkAttributeTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx)
1476*35238bceSAndroid Build Coastguard Worker     : TestCase(testCtx, "relink", "relink")
1477*35238bceSAndroid Build Coastguard Worker     , m_renderCtx(renderCtx)
1478*35238bceSAndroid Build Coastguard Worker {
1479*35238bceSAndroid Build Coastguard Worker }
1480*35238bceSAndroid Build Coastguard Worker 
iterate(void)1481*35238bceSAndroid Build Coastguard Worker tcu::TestCase::IterateResult MixedRelinkAttributeTest::iterate(void)
1482*35238bceSAndroid Build Coastguard Worker {
1483*35238bceSAndroid Build Coastguard Worker     const vector<Bind> noBindings;
1484*35238bceSAndroid Build Coastguard Worker     const AttribType vec4("vec4", 1, GL_FLOAT_VEC4);
1485*35238bceSAndroid Build Coastguard Worker 
1486*35238bceSAndroid Build Coastguard Worker     vector<Attribute> attributes;
1487*35238bceSAndroid Build Coastguard Worker     vector<Bind> preLinkBindings;
1488*35238bceSAndroid Build Coastguard Worker     vector<Bind> postLinkBindings;
1489*35238bceSAndroid Build Coastguard Worker 
1490*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(vec4, "a_0", 1));
1491*35238bceSAndroid Build Coastguard Worker     attributes.push_back(Attribute(vec4, "a_1"));
1492*35238bceSAndroid Build Coastguard Worker 
1493*35238bceSAndroid Build Coastguard Worker     preLinkBindings.push_back(Bind("a_0", 3));
1494*35238bceSAndroid Build Coastguard Worker     preLinkBindings.push_back(Bind("a_0", 5));
1495*35238bceSAndroid Build Coastguard Worker 
1496*35238bceSAndroid Build Coastguard Worker     postLinkBindings.push_back(Bind("a_0", 6));
1497*35238bceSAndroid Build Coastguard Worker 
1498*35238bceSAndroid Build Coastguard Worker     runTest(m_testCtx, m_renderCtx, attributes, noBindings, preLinkBindings, postLinkBindings, true);
1499*35238bceSAndroid Build Coastguard Worker     return STOP;
1500*35238bceSAndroid Build Coastguard Worker }
1501*35238bceSAndroid Build Coastguard Worker 
1502*35238bceSAndroid Build Coastguard Worker } // namespace gls
1503*35238bceSAndroid Build Coastguard Worker } // namespace deqp
1504