xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fDefaultVertexAttributeTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program OpenGL ES 3.0 Module
3*35238bceSAndroid Build Coastguard Worker  * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Default vertex attribute test
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es3fDefaultVertexAttributeTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "gluRenderContext.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "gluCallLogWrapper.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluObjectWrapper.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "deMath.h"
37*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
38*35238bceSAndroid Build Coastguard Worker #include "deString.h"
39*35238bceSAndroid Build Coastguard Worker 
40*35238bceSAndroid Build Coastguard Worker #include <limits>
41*35238bceSAndroid Build Coastguard Worker 
42*35238bceSAndroid Build Coastguard Worker namespace deqp
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker namespace gles3
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker namespace Functional
47*35238bceSAndroid Build Coastguard Worker {
48*35238bceSAndroid Build Coastguard Worker namespace
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker 
51*35238bceSAndroid Build Coastguard Worker static const int s_valueRange = 10;
52*35238bceSAndroid Build Coastguard Worker 
53*35238bceSAndroid Build Coastguard Worker static const char *const s_passThroughFragmentShaderSource = "#version 300 es\n"
54*35238bceSAndroid Build Coastguard Worker                                                              "layout(location = 0) out mediump vec4 fragColor;\n"
55*35238bceSAndroid Build Coastguard Worker                                                              "in mediump vec4 v_color;\n"
56*35238bceSAndroid Build Coastguard Worker                                                              "void main (void)\n"
57*35238bceSAndroid Build Coastguard Worker                                                              "{\n"
58*35238bceSAndroid Build Coastguard Worker                                                              "    fragColor = v_color;\n"
59*35238bceSAndroid Build Coastguard Worker                                                              "}\n";
60*35238bceSAndroid Build Coastguard Worker 
61*35238bceSAndroid Build Coastguard Worker template <typename T1, int S1, typename T2, int S2>
convertToTypeVec(const tcu::Vector<T2,S2> & v)62*35238bceSAndroid Build Coastguard Worker tcu::Vector<T1, S1> convertToTypeVec(const tcu::Vector<T2, S2> &v)
63*35238bceSAndroid Build Coastguard Worker {
64*35238bceSAndroid Build Coastguard Worker     tcu::Vector<T1, S1> retVal;
65*35238bceSAndroid Build Coastguard Worker 
66*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < S1; ++ndx)
67*35238bceSAndroid Build Coastguard Worker         retVal[ndx] = T1(0);
68*35238bceSAndroid Build Coastguard Worker 
69*35238bceSAndroid Build Coastguard Worker     if (S1 == 4)
70*35238bceSAndroid Build Coastguard Worker         retVal[3] = T1(1);
71*35238bceSAndroid Build Coastguard Worker 
72*35238bceSAndroid Build Coastguard Worker     for (int ndx = 0; ndx < de::min(S1, S2); ++ndx)
73*35238bceSAndroid Build Coastguard Worker         retVal[ndx] = T1(v[ndx]);
74*35238bceSAndroid Build Coastguard Worker 
75*35238bceSAndroid Build Coastguard Worker     return retVal;
76*35238bceSAndroid Build Coastguard Worker }
77*35238bceSAndroid Build Coastguard Worker 
78*35238bceSAndroid Build Coastguard Worker class FloatLoader
79*35238bceSAndroid Build Coastguard Worker {
80*35238bceSAndroid Build Coastguard Worker public:
~FloatLoader(void)81*35238bceSAndroid Build Coastguard Worker     virtual ~FloatLoader(void)
82*35238bceSAndroid Build Coastguard Worker     {
83*35238bceSAndroid Build Coastguard Worker     }
84*35238bceSAndroid Build Coastguard Worker 
85*35238bceSAndroid Build Coastguard Worker     // returns the value loaded
86*35238bceSAndroid Build Coastguard Worker     virtual tcu::Vec4 load(glu::CallLogWrapper &gl, int index, const tcu::Vec4 &v) const = 0;
87*35238bceSAndroid Build Coastguard Worker };
88*35238bceSAndroid Build Coastguard Worker 
89*35238bceSAndroid Build Coastguard Worker #define GEN_DIRECT_FLOAT_LOADER(TYPE, COMPS, TYPECODE, CASENAME, VALUES)             \
90*35238bceSAndroid Build Coastguard Worker     class LoaderVertexAttrib##COMPS##TYPECODE : public FloatLoader                   \
91*35238bceSAndroid Build Coastguard Worker     {                                                                                \
92*35238bceSAndroid Build Coastguard Worker     public:                                                                          \
93*35238bceSAndroid Build Coastguard Worker         enum                                                                         \
94*35238bceSAndroid Build Coastguard Worker         {                                                                            \
95*35238bceSAndroid Build Coastguard Worker             NORMALIZING = 0,                                                         \
96*35238bceSAndroid Build Coastguard Worker         };                                                                           \
97*35238bceSAndroid Build Coastguard Worker         enum                                                                         \
98*35238bceSAndroid Build Coastguard Worker         {                                                                            \
99*35238bceSAndroid Build Coastguard Worker             COMPONENTS = (COMPS)                                                     \
100*35238bceSAndroid Build Coastguard Worker         };                                                                           \
101*35238bceSAndroid Build Coastguard Worker         typedef TYPE Type;                                                           \
102*35238bceSAndroid Build Coastguard Worker                                                                                      \
103*35238bceSAndroid Build Coastguard Worker         tcu::Vec4 load(glu::CallLogWrapper &gl, int index, const tcu::Vec4 &v) const \
104*35238bceSAndroid Build Coastguard Worker         {                                                                            \
105*35238bceSAndroid Build Coastguard Worker             tcu::Vector<TYPE, COMPONENTS> value;                                     \
106*35238bceSAndroid Build Coastguard Worker             value = convertToTypeVec<Type, COMPONENTS>(v);                           \
107*35238bceSAndroid Build Coastguard Worker                                                                                      \
108*35238bceSAndroid Build Coastguard Worker             gl.glVertexAttrib##COMPS##TYPECODE VALUES;                               \
109*35238bceSAndroid Build Coastguard Worker             return convertToTypeVec<float, 4>(value);                                \
110*35238bceSAndroid Build Coastguard Worker         }                                                                            \
111*35238bceSAndroid Build Coastguard Worker                                                                                      \
112*35238bceSAndroid Build Coastguard Worker         static const char *getCaseName(void)                                         \
113*35238bceSAndroid Build Coastguard Worker         {                                                                            \
114*35238bceSAndroid Build Coastguard Worker             return CASENAME;                                                         \
115*35238bceSAndroid Build Coastguard Worker         }                                                                            \
116*35238bceSAndroid Build Coastguard Worker                                                                                      \
117*35238bceSAndroid Build Coastguard Worker         static const char *getName(void)                                             \
118*35238bceSAndroid Build Coastguard Worker         {                                                                            \
119*35238bceSAndroid Build Coastguard Worker             return "VertexAttrib" #COMPS #TYPECODE;                                  \
120*35238bceSAndroid Build Coastguard Worker         }                                                                            \
121*35238bceSAndroid Build Coastguard Worker     }
122*35238bceSAndroid Build Coastguard Worker 
123*35238bceSAndroid Build Coastguard Worker #define GEN_INDIRECT_FLOAT_LOADER(TYPE, COMPS, TYPECODE, CASENAME)                   \
124*35238bceSAndroid Build Coastguard Worker     class LoaderVertexAttrib##COMPS##TYPECODE : public FloatLoader                   \
125*35238bceSAndroid Build Coastguard Worker     {                                                                                \
126*35238bceSAndroid Build Coastguard Worker     public:                                                                          \
127*35238bceSAndroid Build Coastguard Worker         enum                                                                         \
128*35238bceSAndroid Build Coastguard Worker         {                                                                            \
129*35238bceSAndroid Build Coastguard Worker             NORMALIZING = 0,                                                         \
130*35238bceSAndroid Build Coastguard Worker         };                                                                           \
131*35238bceSAndroid Build Coastguard Worker         enum                                                                         \
132*35238bceSAndroid Build Coastguard Worker         {                                                                            \
133*35238bceSAndroid Build Coastguard Worker             COMPONENTS = (COMPS)                                                     \
134*35238bceSAndroid Build Coastguard Worker         };                                                                           \
135*35238bceSAndroid Build Coastguard Worker         typedef TYPE Type;                                                           \
136*35238bceSAndroid Build Coastguard Worker                                                                                      \
137*35238bceSAndroid Build Coastguard Worker         tcu::Vec4 load(glu::CallLogWrapper &gl, int index, const tcu::Vec4 &v) const \
138*35238bceSAndroid Build Coastguard Worker         {                                                                            \
139*35238bceSAndroid Build Coastguard Worker             tcu::Vector<TYPE, COMPONENTS> value;                                     \
140*35238bceSAndroid Build Coastguard Worker             value = convertToTypeVec<Type, COMPONENTS>(v);                           \
141*35238bceSAndroid Build Coastguard Worker                                                                                      \
142*35238bceSAndroid Build Coastguard Worker             gl.glVertexAttrib##COMPS##TYPECODE(index, value.getPtr());               \
143*35238bceSAndroid Build Coastguard Worker             return convertToTypeVec<float, 4>(value);                                \
144*35238bceSAndroid Build Coastguard Worker         }                                                                            \
145*35238bceSAndroid Build Coastguard Worker                                                                                      \
146*35238bceSAndroid Build Coastguard Worker         static const char *getCaseName(void)                                         \
147*35238bceSAndroid Build Coastguard Worker         {                                                                            \
148*35238bceSAndroid Build Coastguard Worker             return CASENAME;                                                         \
149*35238bceSAndroid Build Coastguard Worker         }                                                                            \
150*35238bceSAndroid Build Coastguard Worker                                                                                      \
151*35238bceSAndroid Build Coastguard Worker         static const char *getName(void)                                             \
152*35238bceSAndroid Build Coastguard Worker         {                                                                            \
153*35238bceSAndroid Build Coastguard Worker             return "VertexAttrib" #COMPS #TYPECODE;                                  \
154*35238bceSAndroid Build Coastguard Worker         }                                                                            \
155*35238bceSAndroid Build Coastguard Worker     }
156*35238bceSAndroid Build Coastguard Worker 
157*35238bceSAndroid Build Coastguard Worker #define GEN_DIRECT_INTEGER_LOADER(TYPE, COMPS, TYPECODE, CASENAME, VALUES)           \
158*35238bceSAndroid Build Coastguard Worker     class LoaderVertexAttribI##COMPS##TYPECODE : public FloatLoader                  \
159*35238bceSAndroid Build Coastguard Worker     {                                                                                \
160*35238bceSAndroid Build Coastguard Worker     public:                                                                          \
161*35238bceSAndroid Build Coastguard Worker         enum                                                                         \
162*35238bceSAndroid Build Coastguard Worker         {                                                                            \
163*35238bceSAndroid Build Coastguard Worker             NORMALIZING = 0,                                                         \
164*35238bceSAndroid Build Coastguard Worker         };                                                                           \
165*35238bceSAndroid Build Coastguard Worker         enum                                                                         \
166*35238bceSAndroid Build Coastguard Worker         {                                                                            \
167*35238bceSAndroid Build Coastguard Worker             COMPONENTS = (COMPS)                                                     \
168*35238bceSAndroid Build Coastguard Worker         };                                                                           \
169*35238bceSAndroid Build Coastguard Worker         typedef TYPE Type;                                                           \
170*35238bceSAndroid Build Coastguard Worker                                                                                      \
171*35238bceSAndroid Build Coastguard Worker         tcu::Vec4 load(glu::CallLogWrapper &gl, int index, const tcu::Vec4 &v) const \
172*35238bceSAndroid Build Coastguard Worker         {                                                                            \
173*35238bceSAndroid Build Coastguard Worker             tcu::Vector<TYPE, COMPONENTS> value;                                     \
174*35238bceSAndroid Build Coastguard Worker             value = convertToTypeVec<Type, COMPONENTS>(v);                           \
175*35238bceSAndroid Build Coastguard Worker                                                                                      \
176*35238bceSAndroid Build Coastguard Worker             gl.glVertexAttribI##COMPS##TYPECODE VALUES;                              \
177*35238bceSAndroid Build Coastguard Worker             return convertToTypeVec<float, 4>(value);                                \
178*35238bceSAndroid Build Coastguard Worker         }                                                                            \
179*35238bceSAndroid Build Coastguard Worker                                                                                      \
180*35238bceSAndroid Build Coastguard Worker         static const char *getCaseName(void)                                         \
181*35238bceSAndroid Build Coastguard Worker         {                                                                            \
182*35238bceSAndroid Build Coastguard Worker             return CASENAME;                                                         \
183*35238bceSAndroid Build Coastguard Worker         }                                                                            \
184*35238bceSAndroid Build Coastguard Worker                                                                                      \
185*35238bceSAndroid Build Coastguard Worker         static const char *getName(void)                                             \
186*35238bceSAndroid Build Coastguard Worker         {                                                                            \
187*35238bceSAndroid Build Coastguard Worker             return "VertexAttrib" #COMPS #TYPECODE;                                  \
188*35238bceSAndroid Build Coastguard Worker         }                                                                            \
189*35238bceSAndroid Build Coastguard Worker     }
190*35238bceSAndroid Build Coastguard Worker 
191*35238bceSAndroid Build Coastguard Worker #define GEN_INDIRECT_INTEGER_LOADER(TYPE, COMPS, TYPECODE, CASENAME)                 \
192*35238bceSAndroid Build Coastguard Worker     class LoaderVertexAttribI##COMPS##TYPECODE : public FloatLoader                  \
193*35238bceSAndroid Build Coastguard Worker     {                                                                                \
194*35238bceSAndroid Build Coastguard Worker     public:                                                                          \
195*35238bceSAndroid Build Coastguard Worker         enum                                                                         \
196*35238bceSAndroid Build Coastguard Worker         {                                                                            \
197*35238bceSAndroid Build Coastguard Worker             NORMALIZING = 0,                                                         \
198*35238bceSAndroid Build Coastguard Worker         };                                                                           \
199*35238bceSAndroid Build Coastguard Worker         enum                                                                         \
200*35238bceSAndroid Build Coastguard Worker         {                                                                            \
201*35238bceSAndroid Build Coastguard Worker             COMPONENTS = (COMPS)                                                     \
202*35238bceSAndroid Build Coastguard Worker         };                                                                           \
203*35238bceSAndroid Build Coastguard Worker         typedef TYPE Type;                                                           \
204*35238bceSAndroid Build Coastguard Worker                                                                                      \
205*35238bceSAndroid Build Coastguard Worker         tcu::Vec4 load(glu::CallLogWrapper &gl, int index, const tcu::Vec4 &v) const \
206*35238bceSAndroid Build Coastguard Worker         {                                                                            \
207*35238bceSAndroid Build Coastguard Worker             tcu::Vector<TYPE, COMPONENTS> value;                                     \
208*35238bceSAndroid Build Coastguard Worker             value = convertToTypeVec<Type, COMPONENTS>(v);                           \
209*35238bceSAndroid Build Coastguard Worker                                                                                      \
210*35238bceSAndroid Build Coastguard Worker             gl.glVertexAttribI##COMPS##TYPECODE(index, value.getPtr());              \
211*35238bceSAndroid Build Coastguard Worker             return convertToTypeVec<float, 4>(value);                                \
212*35238bceSAndroid Build Coastguard Worker         }                                                                            \
213*35238bceSAndroid Build Coastguard Worker                                                                                      \
214*35238bceSAndroid Build Coastguard Worker         static const char *getCaseName(void)                                         \
215*35238bceSAndroid Build Coastguard Worker         {                                                                            \
216*35238bceSAndroid Build Coastguard Worker             return CASENAME;                                                         \
217*35238bceSAndroid Build Coastguard Worker         }                                                                            \
218*35238bceSAndroid Build Coastguard Worker                                                                                      \
219*35238bceSAndroid Build Coastguard Worker         static const char *getName(void)                                             \
220*35238bceSAndroid Build Coastguard Worker         {                                                                            \
221*35238bceSAndroid Build Coastguard Worker             return "VertexAttrib" #COMPS #TYPECODE;                                  \
222*35238bceSAndroid Build Coastguard Worker         }                                                                            \
223*35238bceSAndroid Build Coastguard Worker     }
224*35238bceSAndroid Build Coastguard Worker 
225*35238bceSAndroid Build Coastguard Worker GEN_DIRECT_FLOAT_LOADER(float, 1, f, "vertex_attrib_1f", (index, value.x()));
226*35238bceSAndroid Build Coastguard Worker GEN_DIRECT_FLOAT_LOADER(float, 2, f, "vertex_attrib_2f", (index, value.x(), value.y()));
227*35238bceSAndroid Build Coastguard Worker GEN_DIRECT_FLOAT_LOADER(float, 3, f, "vertex_attrib_3f", (index, value.x(), value.y(), value.z()));
228*35238bceSAndroid Build Coastguard Worker GEN_DIRECT_FLOAT_LOADER(float, 4, f, "vertex_attrib_4f", (index, value.x(), value.y(), value.z(), value.w()));
229*35238bceSAndroid Build Coastguard Worker 
230*35238bceSAndroid Build Coastguard Worker GEN_INDIRECT_FLOAT_LOADER(float, 1, fv, "vertex_attrib_1fv");
231*35238bceSAndroid Build Coastguard Worker GEN_INDIRECT_FLOAT_LOADER(float, 2, fv, "vertex_attrib_2fv");
232*35238bceSAndroid Build Coastguard Worker GEN_INDIRECT_FLOAT_LOADER(float, 3, fv, "vertex_attrib_3fv");
233*35238bceSAndroid Build Coastguard Worker GEN_INDIRECT_FLOAT_LOADER(float, 4, fv, "vertex_attrib_4fv");
234*35238bceSAndroid Build Coastguard Worker 
235*35238bceSAndroid Build Coastguard Worker GEN_DIRECT_INTEGER_LOADER(int32_t, 4, i, "vertex_attribi_4i", (index, value.x(), value.y(), value.z(), value.w()));
236*35238bceSAndroid Build Coastguard Worker GEN_INDIRECT_INTEGER_LOADER(int32_t, 4, iv, "vertex_attribi_4iv");
237*35238bceSAndroid Build Coastguard Worker 
238*35238bceSAndroid Build Coastguard Worker GEN_DIRECT_INTEGER_LOADER(uint32_t, 4, ui, "vertex_attribi_4ui", (index, value.x(), value.y(), value.z(), value.w()));
239*35238bceSAndroid Build Coastguard Worker GEN_INDIRECT_INTEGER_LOADER(uint32_t, 4, uiv, "vertex_attribi_4uiv");
240*35238bceSAndroid Build Coastguard Worker 
241*35238bceSAndroid Build Coastguard Worker class AttributeCase : public TestCase
242*35238bceSAndroid Build Coastguard Worker {
243*35238bceSAndroid Build Coastguard Worker     AttributeCase(Context &ctx, const char *name, const char *desc, const char *funcName, bool normalizing,
244*35238bceSAndroid Build Coastguard Worker                   bool useNegative, glu::DataType dataType);
245*35238bceSAndroid Build Coastguard Worker 
246*35238bceSAndroid Build Coastguard Worker public:
247*35238bceSAndroid Build Coastguard Worker     template <typename LoaderType>
248*35238bceSAndroid Build Coastguard Worker     static AttributeCase *create(Context &ctx, glu::DataType dataType);
249*35238bceSAndroid Build Coastguard Worker     ~AttributeCase(void);
250*35238bceSAndroid Build Coastguard Worker 
251*35238bceSAndroid Build Coastguard Worker private:
252*35238bceSAndroid Build Coastguard Worker     void init(void);
253*35238bceSAndroid Build Coastguard Worker     void deinit(void);
254*35238bceSAndroid Build Coastguard Worker     IterateResult iterate(void);
255*35238bceSAndroid Build Coastguard Worker 
256*35238bceSAndroid Build Coastguard Worker     glu::DataType getTargetType(void) const;
257*35238bceSAndroid Build Coastguard Worker     std::string genVertexSource(void) const;
258*35238bceSAndroid Build Coastguard Worker     bool renderWithValue(const tcu::Vec4 &v);
259*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 computeColor(const tcu::Vec4 &value);
260*35238bceSAndroid Build Coastguard Worker     bool verifyUnicoloredBuffer(const tcu::Surface &scene, const tcu::Vec4 &refValue);
261*35238bceSAndroid Build Coastguard Worker 
262*35238bceSAndroid Build Coastguard Worker     const bool m_normalizing;
263*35238bceSAndroid Build Coastguard Worker     const bool m_useNegativeValues;
264*35238bceSAndroid Build Coastguard Worker     const char *const m_funcName;
265*35238bceSAndroid Build Coastguard Worker     const glu::DataType m_dataType;
266*35238bceSAndroid Build Coastguard Worker     const FloatLoader *m_loader;
267*35238bceSAndroid Build Coastguard Worker     glu::ShaderProgram *m_program;
268*35238bceSAndroid Build Coastguard Worker     uint32_t m_bufID;
269*35238bceSAndroid Build Coastguard Worker     bool m_allIterationsPassed;
270*35238bceSAndroid Build Coastguard Worker     int m_iteration;
271*35238bceSAndroid Build Coastguard Worker 
272*35238bceSAndroid Build Coastguard Worker     enum
273*35238bceSAndroid Build Coastguard Worker     {
274*35238bceSAndroid Build Coastguard Worker         RENDER_SIZE = 32
275*35238bceSAndroid Build Coastguard Worker     };
276*35238bceSAndroid Build Coastguard Worker };
277*35238bceSAndroid Build Coastguard Worker 
AttributeCase(Context & ctx,const char * name,const char * desc,const char * funcName,bool normalizing,bool useNegative,glu::DataType dataType)278*35238bceSAndroid Build Coastguard Worker AttributeCase::AttributeCase(Context &ctx, const char *name, const char *desc, const char *funcName, bool normalizing,
279*35238bceSAndroid Build Coastguard Worker                              bool useNegative, glu::DataType dataType)
280*35238bceSAndroid Build Coastguard Worker     : TestCase(ctx, name, desc)
281*35238bceSAndroid Build Coastguard Worker     , m_normalizing(normalizing)
282*35238bceSAndroid Build Coastguard Worker     , m_useNegativeValues(useNegative)
283*35238bceSAndroid Build Coastguard Worker     , m_funcName(funcName)
284*35238bceSAndroid Build Coastguard Worker     , m_dataType(dataType)
285*35238bceSAndroid Build Coastguard Worker     , m_loader(DE_NULL)
286*35238bceSAndroid Build Coastguard Worker     , m_program(DE_NULL)
287*35238bceSAndroid Build Coastguard Worker     , m_bufID(0)
288*35238bceSAndroid Build Coastguard Worker     , m_allIterationsPassed(true)
289*35238bceSAndroid Build Coastguard Worker     , m_iteration(0)
290*35238bceSAndroid Build Coastguard Worker {
291*35238bceSAndroid Build Coastguard Worker }
292*35238bceSAndroid Build Coastguard Worker 
293*35238bceSAndroid Build Coastguard Worker template <typename LoaderType>
create(Context & ctx,glu::DataType dataType)294*35238bceSAndroid Build Coastguard Worker AttributeCase *AttributeCase::create(Context &ctx, glu::DataType dataType)
295*35238bceSAndroid Build Coastguard Worker {
296*35238bceSAndroid Build Coastguard Worker     AttributeCase *retVal = new AttributeCase(
297*35238bceSAndroid Build Coastguard Worker         ctx, LoaderType::getCaseName(), (std::string("Test ") + LoaderType::getName()).c_str(), LoaderType::getName(),
298*35238bceSAndroid Build Coastguard Worker         LoaderType::NORMALIZING != 0, std::numeric_limits<typename LoaderType::Type>::is_signed, dataType);
299*35238bceSAndroid Build Coastguard Worker     retVal->m_loader = new LoaderType();
300*35238bceSAndroid Build Coastguard Worker     return retVal;
301*35238bceSAndroid Build Coastguard Worker }
302*35238bceSAndroid Build Coastguard Worker 
~AttributeCase(void)303*35238bceSAndroid Build Coastguard Worker AttributeCase::~AttributeCase(void)
304*35238bceSAndroid Build Coastguard Worker {
305*35238bceSAndroid Build Coastguard Worker     deinit();
306*35238bceSAndroid Build Coastguard Worker }
307*35238bceSAndroid Build Coastguard Worker 
init(void)308*35238bceSAndroid Build Coastguard Worker void AttributeCase::init(void)
309*35238bceSAndroid Build Coastguard Worker {
310*35238bceSAndroid Build Coastguard Worker     if (m_context.getRenderTarget().getWidth() < RENDER_SIZE || m_context.getRenderTarget().getHeight() < RENDER_SIZE)
311*35238bceSAndroid Build Coastguard Worker         throw tcu::NotSupportedError("Render target must be at least " + de::toString<int>(RENDER_SIZE) + "x" +
312*35238bceSAndroid Build Coastguard Worker                                      de::toString<int>(RENDER_SIZE));
313*35238bceSAndroid Build Coastguard Worker 
314*35238bceSAndroid Build Coastguard Worker     // log test info
315*35238bceSAndroid Build Coastguard Worker 
316*35238bceSAndroid Build Coastguard Worker     {
317*35238bceSAndroid Build Coastguard Worker         const float maxRange = (m_normalizing) ? (1.0f) : (s_valueRange);
318*35238bceSAndroid Build Coastguard Worker         const float minRange = (m_useNegativeValues) ? (-maxRange) : (0.0f);
319*35238bceSAndroid Build Coastguard Worker 
320*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Loading attribute values using " << m_funcName << "\n"
321*35238bceSAndroid Build Coastguard Worker                            << "Attribute type: " << glu::getDataTypeName(m_dataType) << "\n"
322*35238bceSAndroid Build Coastguard Worker                            << "Attribute value range: [" << minRange << ", " << maxRange << "]"
323*35238bceSAndroid Build Coastguard Worker                            << tcu::TestLog::EndMessage;
324*35238bceSAndroid Build Coastguard Worker     }
325*35238bceSAndroid Build Coastguard Worker 
326*35238bceSAndroid Build Coastguard Worker     // gen shader and base quad
327*35238bceSAndroid Build Coastguard Worker 
328*35238bceSAndroid Build Coastguard Worker     m_program = new glu::ShaderProgram(m_context.getRenderContext(),
329*35238bceSAndroid Build Coastguard Worker                                        glu::ProgramSources() << glu::VertexSource(genVertexSource())
330*35238bceSAndroid Build Coastguard Worker                                                              << glu::FragmentSource(s_passThroughFragmentShaderSource));
331*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << *m_program;
332*35238bceSAndroid Build Coastguard Worker     if (!m_program->isOk())
333*35238bceSAndroid Build Coastguard Worker         throw tcu::TestError("could not build program");
334*35238bceSAndroid Build Coastguard Worker 
335*35238bceSAndroid Build Coastguard Worker     {
336*35238bceSAndroid Build Coastguard Worker         const tcu::Vec4 fullscreenQuad[] = {
337*35238bceSAndroid Build Coastguard Worker             tcu::Vec4(1.0f, 1.0f, 0.0f, 1.0f),
338*35238bceSAndroid Build Coastguard Worker             tcu::Vec4(1.0f, -1.0f, 0.0f, 1.0f),
339*35238bceSAndroid Build Coastguard Worker             tcu::Vec4(-1.0f, 1.0f, 0.0f, 1.0f),
340*35238bceSAndroid Build Coastguard Worker             tcu::Vec4(-1.0f, -1.0f, 0.0f, 1.0f),
341*35238bceSAndroid Build Coastguard Worker         };
342*35238bceSAndroid Build Coastguard Worker 
343*35238bceSAndroid Build Coastguard Worker         const glw::Functions &gl = m_context.getRenderContext().getFunctions();
344*35238bceSAndroid Build Coastguard Worker 
345*35238bceSAndroid Build Coastguard Worker         gl.genBuffers(1, &m_bufID);
346*35238bceSAndroid Build Coastguard Worker         gl.bindBuffer(GL_ARRAY_BUFFER, m_bufID);
347*35238bceSAndroid Build Coastguard Worker         gl.bufferData(GL_ARRAY_BUFFER, sizeof(fullscreenQuad), fullscreenQuad, GL_STATIC_DRAW);
348*35238bceSAndroid Build Coastguard Worker         GLU_EXPECT_NO_ERROR(gl.getError(), "fill buffer");
349*35238bceSAndroid Build Coastguard Worker     }
350*35238bceSAndroid Build Coastguard Worker }
351*35238bceSAndroid Build Coastguard Worker 
deinit(void)352*35238bceSAndroid Build Coastguard Worker void AttributeCase::deinit(void)
353*35238bceSAndroid Build Coastguard Worker {
354*35238bceSAndroid Build Coastguard Worker     delete m_loader;
355*35238bceSAndroid Build Coastguard Worker     m_loader = DE_NULL;
356*35238bceSAndroid Build Coastguard Worker 
357*35238bceSAndroid Build Coastguard Worker     delete m_program;
358*35238bceSAndroid Build Coastguard Worker     m_program = DE_NULL;
359*35238bceSAndroid Build Coastguard Worker 
360*35238bceSAndroid Build Coastguard Worker     if (m_bufID)
361*35238bceSAndroid Build Coastguard Worker     {
362*35238bceSAndroid Build Coastguard Worker         m_context.getRenderContext().getFunctions().deleteBuffers(1, &m_bufID);
363*35238bceSAndroid Build Coastguard Worker         m_bufID = 0;
364*35238bceSAndroid Build Coastguard Worker     }
365*35238bceSAndroid Build Coastguard Worker }
366*35238bceSAndroid Build Coastguard Worker 
iterate(void)367*35238bceSAndroid Build Coastguard Worker AttributeCase::IterateResult AttributeCase::iterate(void)
368*35238bceSAndroid Build Coastguard Worker {
369*35238bceSAndroid Build Coastguard Worker     static const tcu::Vec4 testValues[] = {
370*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(0.0f, 0.5f, 0.2f, 1.0f), tcu::Vec4(0.1f, 0.7f, 1.0f, 0.6f), tcu::Vec4(0.4f, 0.2f, 0.0f, 0.5f),
371*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(0.5f, 0.0f, 0.9f, 0.1f), tcu::Vec4(0.6f, 0.2f, 0.2f, 0.9f), tcu::Vec4(0.9f, 1.0f, 0.0f, 0.0f),
372*35238bceSAndroid Build Coastguard Worker         tcu::Vec4(1.0f, 0.5f, 0.3f, 0.8f),
373*35238bceSAndroid Build Coastguard Worker     };
374*35238bceSAndroid Build Coastguard Worker 
375*35238bceSAndroid Build Coastguard Worker     const tcu::ScopedLogSection section(m_testCtx.getLog(), "Iteration",
376*35238bceSAndroid Build Coastguard Worker                                         "Iteration " + de::toString(m_iteration + 1) + "/" +
377*35238bceSAndroid Build Coastguard Worker                                             de::toString(DE_LENGTH_OF_ARRAY(testValues)));
378*35238bceSAndroid Build Coastguard Worker 
379*35238bceSAndroid Build Coastguard Worker     // Test normalizing transfers with whole range, non-normalizing with up to s_valueRange
380*35238bceSAndroid Build Coastguard Worker     const tcu::Vec4 testValue =
381*35238bceSAndroid Build Coastguard Worker         ((m_useNegativeValues) ? (testValues[m_iteration] * 2.0f - tcu::Vec4(1.0f)) : (testValues[m_iteration])) *
382*35238bceSAndroid Build Coastguard Worker         ((m_normalizing) ? (1.0f) : ((float)s_valueRange));
383*35238bceSAndroid Build Coastguard Worker 
384*35238bceSAndroid Build Coastguard Worker     if (!renderWithValue(testValue))
385*35238bceSAndroid Build Coastguard Worker         m_allIterationsPassed = false;
386*35238bceSAndroid Build Coastguard Worker 
387*35238bceSAndroid Build Coastguard Worker     // continue
388*35238bceSAndroid Build Coastguard Worker 
389*35238bceSAndroid Build Coastguard Worker     if (++m_iteration < DE_LENGTH_OF_ARRAY(testValues))
390*35238bceSAndroid Build Coastguard Worker         return CONTINUE;
391*35238bceSAndroid Build Coastguard Worker 
392*35238bceSAndroid Build Coastguard Worker     if (m_allIterationsPassed)
393*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
394*35238bceSAndroid Build Coastguard Worker     else
395*35238bceSAndroid Build Coastguard Worker         m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Got unexpected values");
396*35238bceSAndroid Build Coastguard Worker 
397*35238bceSAndroid Build Coastguard Worker     return STOP;
398*35238bceSAndroid Build Coastguard Worker }
399*35238bceSAndroid Build Coastguard Worker 
genVertexSource(void) const400*35238bceSAndroid Build Coastguard Worker std::string AttributeCase::genVertexSource(void) const
401*35238bceSAndroid Build Coastguard Worker {
402*35238bceSAndroid Build Coastguard Worker     const int vectorSize         = (glu::isDataTypeMatrix(m_dataType)) ? (glu::getDataTypeMatrixNumRows(m_dataType)) :
403*35238bceSAndroid Build Coastguard Worker                                    (glu::isDataTypeVector(m_dataType)) ? (glu::getDataTypeScalarSize(m_dataType)) :
404*35238bceSAndroid Build Coastguard Worker                                                                          (-1);
405*35238bceSAndroid Build Coastguard Worker     const char *const vectorType = glu::getDataTypeName(
406*35238bceSAndroid Build Coastguard Worker         (glu::isDataTypeMatrix(m_dataType)) ? (glu::getDataTypeVector(glu::TYPE_FLOAT, vectorSize)) :
407*35238bceSAndroid Build Coastguard Worker         (glu::isDataTypeVector(m_dataType)) ? (glu::getDataTypeVector(glu::TYPE_FLOAT, vectorSize)) :
408*35238bceSAndroid Build Coastguard Worker                                               (glu::TYPE_FLOAT));
409*35238bceSAndroid Build Coastguard Worker     const int components = (glu::isDataTypeMatrix(m_dataType)) ? (glu::getDataTypeMatrixNumRows(m_dataType)) :
410*35238bceSAndroid Build Coastguard Worker                                                                  (glu::getDataTypeScalarSize(m_dataType));
411*35238bceSAndroid Build Coastguard Worker     std::ostringstream buf;
412*35238bceSAndroid Build Coastguard Worker 
413*35238bceSAndroid Build Coastguard Worker     buf << "#version 300 es\n"
414*35238bceSAndroid Build Coastguard Worker            "in highp vec4 a_position;\n"
415*35238bceSAndroid Build Coastguard Worker            "in highp "
416*35238bceSAndroid Build Coastguard Worker         << glu::getDataTypeName(m_dataType)
417*35238bceSAndroid Build Coastguard Worker         << " a_value;\n"
418*35238bceSAndroid Build Coastguard Worker            "out highp vec4 v_color;\n"
419*35238bceSAndroid Build Coastguard Worker            "void main (void)\n"
420*35238bceSAndroid Build Coastguard Worker            "{\n"
421*35238bceSAndroid Build Coastguard Worker            "    gl_Position = a_position;\n"
422*35238bceSAndroid Build Coastguard Worker            "\n";
423*35238bceSAndroid Build Coastguard Worker 
424*35238bceSAndroid Build Coastguard Worker     if (m_normalizing)
425*35238bceSAndroid Build Coastguard Worker         buf << "    highp " << vectorType << " normalizedValue = "
426*35238bceSAndroid Build Coastguard Worker             << ((glu::getDataTypeScalarType(m_dataType) == glu::TYPE_FLOAT) ? ("") : (vectorType)) << "(a_value"
427*35238bceSAndroid Build Coastguard Worker             << ((glu::isDataTypeMatrix(m_dataType)) ? ("[1]") : ("")) << ");\n";
428*35238bceSAndroid Build Coastguard Worker     else
429*35238bceSAndroid Build Coastguard Worker         buf << "    highp " << vectorType << " normalizedValue = "
430*35238bceSAndroid Build Coastguard Worker             << ((glu::getDataTypeScalarType(m_dataType) == glu::TYPE_FLOAT) ? ("") : (vectorType)) << "(a_value"
431*35238bceSAndroid Build Coastguard Worker             << ((glu::isDataTypeMatrix(m_dataType)) ? ("[1]") : ("")) << ") / float(" << s_valueRange << ");\n";
432*35238bceSAndroid Build Coastguard Worker 
433*35238bceSAndroid Build Coastguard Worker     if (m_useNegativeValues)
434*35238bceSAndroid Build Coastguard Worker         buf << "    highp " << vectorType << " positiveNormalizedValue = (normalizedValue + " << vectorType
435*35238bceSAndroid Build Coastguard Worker             << "(1.0)) / 2.0;\n";
436*35238bceSAndroid Build Coastguard Worker     else
437*35238bceSAndroid Build Coastguard Worker         buf << "    highp " << vectorType << " positiveNormalizedValue = normalizedValue;\n";
438*35238bceSAndroid Build Coastguard Worker 
439*35238bceSAndroid Build Coastguard Worker     if (components == 1)
440*35238bceSAndroid Build Coastguard Worker         buf << "    v_color = vec4(positiveNormalizedValue, 0.0, 0.0, 1.0);\n";
441*35238bceSAndroid Build Coastguard Worker     else if (components == 2)
442*35238bceSAndroid Build Coastguard Worker         buf << "    v_color = vec4(positiveNormalizedValue.xy, 0.0, 1.0);\n";
443*35238bceSAndroid Build Coastguard Worker     else if (components == 3)
444*35238bceSAndroid Build Coastguard Worker         buf << "    v_color = vec4(positiveNormalizedValue.xyz, 1.0);\n";
445*35238bceSAndroid Build Coastguard Worker     else if (components == 4)
446*35238bceSAndroid Build Coastguard Worker         buf << "    v_color = vec4((positiveNormalizedValue.xy + positiveNormalizedValue.zz) / 2.0, "
447*35238bceSAndroid Build Coastguard Worker                "positiveNormalizedValue.w, 1.0);\n";
448*35238bceSAndroid Build Coastguard Worker     else
449*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
450*35238bceSAndroid Build Coastguard Worker 
451*35238bceSAndroid Build Coastguard Worker     buf << "}\n";
452*35238bceSAndroid Build Coastguard Worker 
453*35238bceSAndroid Build Coastguard Worker     return buf.str();
454*35238bceSAndroid Build Coastguard Worker }
455*35238bceSAndroid Build Coastguard Worker 
renderWithValue(const tcu::Vec4 & v)456*35238bceSAndroid Build Coastguard Worker bool AttributeCase::renderWithValue(const tcu::Vec4 &v)
457*35238bceSAndroid Build Coastguard Worker {
458*35238bceSAndroid Build Coastguard Worker     glu::CallLogWrapper gl(m_context.getRenderContext().getFunctions(), m_testCtx.getLog());
459*35238bceSAndroid Build Coastguard Worker 
460*35238bceSAndroid Build Coastguard Worker     gl.enableLogging(true);
461*35238bceSAndroid Build Coastguard Worker 
462*35238bceSAndroid Build Coastguard Worker     const int positionIndex = gl.glGetAttribLocation(m_program->getProgram(), "a_position");
463*35238bceSAndroid Build Coastguard Worker     const int valueIndex    = gl.glGetAttribLocation(m_program->getProgram(), "a_value");
464*35238bceSAndroid Build Coastguard Worker     tcu::Surface dest(RENDER_SIZE, RENDER_SIZE);
465*35238bceSAndroid Build Coastguard Worker     tcu::Vec4 loadedValue;
466*35238bceSAndroid Build Coastguard Worker 
467*35238bceSAndroid Build Coastguard Worker     gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
468*35238bceSAndroid Build Coastguard Worker     gl.glClear(GL_COLOR_BUFFER_BIT);
469*35238bceSAndroid Build Coastguard Worker     gl.glViewport(0, 0, RENDER_SIZE, RENDER_SIZE);
470*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.glGetError(), "setup");
471*35238bceSAndroid Build Coastguard Worker 
472*35238bceSAndroid Build Coastguard Worker     gl.glBindBuffer(GL_ARRAY_BUFFER, m_bufID);
473*35238bceSAndroid Build Coastguard Worker     gl.glVertexAttribPointer(positionIndex, 4, GL_FLOAT, GL_FALSE, 0, DE_NULL);
474*35238bceSAndroid Build Coastguard Worker     gl.glEnableVertexAttribArray(positionIndex);
475*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.glGetError(), "position va");
476*35238bceSAndroid Build Coastguard Worker 
477*35238bceSAndroid Build Coastguard Worker     // transfer test value. Load to the second column in the matrix case
478*35238bceSAndroid Build Coastguard Worker     loadedValue = m_loader->load(gl, (glu::isDataTypeMatrix(m_dataType)) ? (valueIndex + 1) : (valueIndex), v);
479*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.glGetError(), "default va");
480*35238bceSAndroid Build Coastguard Worker 
481*35238bceSAndroid Build Coastguard Worker     gl.glUseProgram(m_program->getProgram());
482*35238bceSAndroid Build Coastguard Worker     gl.glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
483*35238bceSAndroid Build Coastguard Worker     gl.glUseProgram(0);
484*35238bceSAndroid Build Coastguard Worker     GLU_EXPECT_NO_ERROR(gl.glGetError(), "draw");
485*35238bceSAndroid Build Coastguard Worker 
486*35238bceSAndroid Build Coastguard Worker     glu::readPixels(m_context.getRenderContext(), 0, 0, dest.getAccess());
487*35238bceSAndroid Build Coastguard Worker 
488*35238bceSAndroid Build Coastguard Worker     // check whole result is colored correctly
489*35238bceSAndroid Build Coastguard Worker     return verifyUnicoloredBuffer(dest, computeColor(loadedValue));
490*35238bceSAndroid Build Coastguard Worker }
491*35238bceSAndroid Build Coastguard Worker 
computeColor(const tcu::Vec4 & value)492*35238bceSAndroid Build Coastguard Worker tcu::Vec4 AttributeCase::computeColor(const tcu::Vec4 &value)
493*35238bceSAndroid Build Coastguard Worker {
494*35238bceSAndroid Build Coastguard Worker     const tcu::Vec4 normalizedValue = value / ((m_normalizing) ? (1.0f) : ((float)s_valueRange));
495*35238bceSAndroid Build Coastguard Worker     const tcu::Vec4 positiveNormalizedValue =
496*35238bceSAndroid Build Coastguard Worker         ((m_useNegativeValues) ? ((normalizedValue + tcu::Vec4(1.0f)) / 2.0f) : (normalizedValue));
497*35238bceSAndroid Build Coastguard Worker     const int components = (glu::isDataTypeMatrix(m_dataType)) ? (glu::getDataTypeMatrixNumRows(m_dataType)) :
498*35238bceSAndroid Build Coastguard Worker                                                                  (glu::getDataTypeScalarSize(m_dataType));
499*35238bceSAndroid Build Coastguard Worker 
500*35238bceSAndroid Build Coastguard Worker     if (components == 1)
501*35238bceSAndroid Build Coastguard Worker         return tcu::Vec4(positiveNormalizedValue.x(), 0.0f, 0.0f, 1.0f);
502*35238bceSAndroid Build Coastguard Worker     else if (components == 2)
503*35238bceSAndroid Build Coastguard Worker         return tcu::Vec4(positiveNormalizedValue.x(), positiveNormalizedValue.y(), 0.0f, 1.0f);
504*35238bceSAndroid Build Coastguard Worker     else if (components == 3)
505*35238bceSAndroid Build Coastguard Worker         return tcu::Vec4(positiveNormalizedValue.x(), positiveNormalizedValue.y(), positiveNormalizedValue.z(), 1.0f);
506*35238bceSAndroid Build Coastguard Worker     else if (components == 4)
507*35238bceSAndroid Build Coastguard Worker         return tcu::Vec4((positiveNormalizedValue.x() + positiveNormalizedValue.z()) / 2.0f,
508*35238bceSAndroid Build Coastguard Worker                          (positiveNormalizedValue.y() + positiveNormalizedValue.z()) / 2.0f,
509*35238bceSAndroid Build Coastguard Worker                          positiveNormalizedValue.w(), 1.0f);
510*35238bceSAndroid Build Coastguard Worker     else
511*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
512*35238bceSAndroid Build Coastguard Worker 
513*35238bceSAndroid Build Coastguard Worker     return tcu::Vec4(0.0f, 0.0f, 0.0f, 0.0f);
514*35238bceSAndroid Build Coastguard Worker }
515*35238bceSAndroid Build Coastguard Worker 
verifyUnicoloredBuffer(const tcu::Surface & scene,const tcu::Vec4 & refValue)516*35238bceSAndroid Build Coastguard Worker bool AttributeCase::verifyUnicoloredBuffer(const tcu::Surface &scene, const tcu::Vec4 &refValue)
517*35238bceSAndroid Build Coastguard Worker {
518*35238bceSAndroid Build Coastguard Worker     tcu::Surface errorMask(RENDER_SIZE, RENDER_SIZE);
519*35238bceSAndroid Build Coastguard Worker     const tcu::RGBA refColor(refValue);
520*35238bceSAndroid Build Coastguard Worker     const int resultThreshold      = 2;
521*35238bceSAndroid Build Coastguard Worker     const tcu::RGBA colorThreshold = m_context.getRenderTarget().getPixelFormat().getColorThreshold() * resultThreshold;
522*35238bceSAndroid Build Coastguard Worker     bool error                     = false;
523*35238bceSAndroid Build Coastguard Worker 
524*35238bceSAndroid Build Coastguard Worker     tcu::RGBA exampleColor;
525*35238bceSAndroid Build Coastguard Worker     tcu::IVec2 examplePos;
526*35238bceSAndroid Build Coastguard Worker 
527*35238bceSAndroid Build Coastguard Worker     tcu::clear(errorMask.getAccess(), tcu::RGBA::green().toIVec());
528*35238bceSAndroid Build Coastguard Worker 
529*35238bceSAndroid Build Coastguard Worker     m_testCtx.getLog() << tcu::TestLog::Message << "Verifying rendered image. Expecting color " << refColor
530*35238bceSAndroid Build Coastguard Worker                        << ", threshold " << colorThreshold << tcu::TestLog::EndMessage;
531*35238bceSAndroid Build Coastguard Worker 
532*35238bceSAndroid Build Coastguard Worker     for (int y = 0; y < RENDER_SIZE; ++y)
533*35238bceSAndroid Build Coastguard Worker         for (int x = 0; x < RENDER_SIZE; ++x)
534*35238bceSAndroid Build Coastguard Worker         {
535*35238bceSAndroid Build Coastguard Worker             const tcu::RGBA color = scene.getPixel(x, y);
536*35238bceSAndroid Build Coastguard Worker 
537*35238bceSAndroid Build Coastguard Worker             if (de::abs(color.getRed() - refColor.getRed()) > colorThreshold.getRed() ||
538*35238bceSAndroid Build Coastguard Worker                 de::abs(color.getGreen() - refColor.getGreen()) > colorThreshold.getGreen() ||
539*35238bceSAndroid Build Coastguard Worker                 de::abs(color.getBlue() - refColor.getBlue()) > colorThreshold.getBlue())
540*35238bceSAndroid Build Coastguard Worker             {
541*35238bceSAndroid Build Coastguard Worker                 // first error
542*35238bceSAndroid Build Coastguard Worker                 if (!error)
543*35238bceSAndroid Build Coastguard Worker                 {
544*35238bceSAndroid Build Coastguard Worker                     exampleColor = color;
545*35238bceSAndroid Build Coastguard Worker                     examplePos   = tcu::IVec2(x, y);
546*35238bceSAndroid Build Coastguard Worker                 }
547*35238bceSAndroid Build Coastguard Worker 
548*35238bceSAndroid Build Coastguard Worker                 error = true;
549*35238bceSAndroid Build Coastguard Worker                 errorMask.setPixel(x, y, tcu::RGBA::red());
550*35238bceSAndroid Build Coastguard Worker             }
551*35238bceSAndroid Build Coastguard Worker         }
552*35238bceSAndroid Build Coastguard Worker 
553*35238bceSAndroid Build Coastguard Worker     if (!error)
554*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Rendered image is valid." << tcu::TestLog::EndMessage;
555*35238bceSAndroid Build Coastguard Worker     else
556*35238bceSAndroid Build Coastguard Worker     {
557*35238bceSAndroid Build Coastguard Worker         m_testCtx.getLog() << tcu::TestLog::Message << "Found invalid pixel(s).\n"
558*35238bceSAndroid Build Coastguard Worker                            << "Pixel at (" << examplePos.x() << ", " << examplePos.y() << ") color: " << exampleColor
559*35238bceSAndroid Build Coastguard Worker                            << tcu::TestLog::EndMessage << tcu::TestLog::ImageSet("Result", "Render result")
560*35238bceSAndroid Build Coastguard Worker                            << tcu::TestLog::Image("Result", "Result", scene)
561*35238bceSAndroid Build Coastguard Worker                            << tcu::TestLog::Image("ErrorMask", "Error Mask", errorMask) << tcu::TestLog::EndImageSet;
562*35238bceSAndroid Build Coastguard Worker     }
563*35238bceSAndroid Build Coastguard Worker 
564*35238bceSAndroid Build Coastguard Worker     return !error;
565*35238bceSAndroid Build Coastguard Worker }
566*35238bceSAndroid Build Coastguard Worker 
567*35238bceSAndroid Build Coastguard Worker } // namespace
568*35238bceSAndroid Build Coastguard Worker 
DefaultVertexAttributeTests(Context & context)569*35238bceSAndroid Build Coastguard Worker DefaultVertexAttributeTests::DefaultVertexAttributeTests(Context &context)
570*35238bceSAndroid Build Coastguard Worker     : TestCaseGroup(context, "default_vertex_attrib", "Test default vertex attributes")
571*35238bceSAndroid Build Coastguard Worker {
572*35238bceSAndroid Build Coastguard Worker }
573*35238bceSAndroid Build Coastguard Worker 
~DefaultVertexAttributeTests(void)574*35238bceSAndroid Build Coastguard Worker DefaultVertexAttributeTests::~DefaultVertexAttributeTests(void)
575*35238bceSAndroid Build Coastguard Worker {
576*35238bceSAndroid Build Coastguard Worker }
577*35238bceSAndroid Build Coastguard Worker 
init(void)578*35238bceSAndroid Build Coastguard Worker void DefaultVertexAttributeTests::init(void)
579*35238bceSAndroid Build Coastguard Worker {
580*35238bceSAndroid Build Coastguard Worker     struct Target
581*35238bceSAndroid Build Coastguard Worker     {
582*35238bceSAndroid Build Coastguard Worker         const char *name;
583*35238bceSAndroid Build Coastguard Worker         glu::DataType dataType;
584*35238bceSAndroid Build Coastguard Worker         bool reducedTestSets; // !< use reduced coverage
585*35238bceSAndroid Build Coastguard Worker     };
586*35238bceSAndroid Build Coastguard Worker 
587*35238bceSAndroid Build Coastguard Worker     static const Target floatTargets[] = {
588*35238bceSAndroid Build Coastguard Worker         {"float", glu::TYPE_FLOAT, false},        {"vec2", glu::TYPE_FLOAT_VEC2, true},
589*35238bceSAndroid Build Coastguard Worker         {"vec3", glu::TYPE_FLOAT_VEC3, true},     {"vec4", glu::TYPE_FLOAT_VEC4, false},
590*35238bceSAndroid Build Coastguard Worker         {"mat2", glu::TYPE_FLOAT_MAT2, true},     {"mat2x3", glu::TYPE_FLOAT_MAT2X3, true},
591*35238bceSAndroid Build Coastguard Worker         {"mat2x4", glu::TYPE_FLOAT_MAT2X4, true}, {"mat3", glu::TYPE_FLOAT_MAT3, true},
592*35238bceSAndroid Build Coastguard Worker         {"mat3x2", glu::TYPE_FLOAT_MAT3X2, true}, {"mat3x4", glu::TYPE_FLOAT_MAT3X4, true},
593*35238bceSAndroid Build Coastguard Worker         {"mat4", glu::TYPE_FLOAT_MAT4, false},    {"mat4x2", glu::TYPE_FLOAT_MAT4X2, true},
594*35238bceSAndroid Build Coastguard Worker         {"mat4x3", glu::TYPE_FLOAT_MAT4X3, true},
595*35238bceSAndroid Build Coastguard Worker     };
596*35238bceSAndroid Build Coastguard Worker 
597*35238bceSAndroid Build Coastguard Worker     static const Target intTargets[] = {
598*35238bceSAndroid Build Coastguard Worker         {"int", glu::TYPE_INT, false},
599*35238bceSAndroid Build Coastguard Worker         {"ivec2", glu::TYPE_INT_VEC2, true},
600*35238bceSAndroid Build Coastguard Worker         {"ivec3", glu::TYPE_INT_VEC3, true},
601*35238bceSAndroid Build Coastguard Worker         {"ivec4", glu::TYPE_INT_VEC4, false},
602*35238bceSAndroid Build Coastguard Worker     };
603*35238bceSAndroid Build Coastguard Worker 
604*35238bceSAndroid Build Coastguard Worker     static const Target uintTargets[] = {
605*35238bceSAndroid Build Coastguard Worker         {"uint", glu::TYPE_UINT, false},
606*35238bceSAndroid Build Coastguard Worker         {"uvec2", glu::TYPE_UINT_VEC2, true},
607*35238bceSAndroid Build Coastguard Worker         {"uvec3", glu::TYPE_UINT_VEC3, true},
608*35238bceSAndroid Build Coastguard Worker         {"uvec4", glu::TYPE_UINT_VEC4, false},
609*35238bceSAndroid Build Coastguard Worker     };
610*35238bceSAndroid Build Coastguard Worker 
611*35238bceSAndroid Build Coastguard Worker     // float targets
612*35238bceSAndroid Build Coastguard Worker 
613*35238bceSAndroid Build Coastguard Worker     for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(floatTargets); ++targetNdx)
614*35238bceSAndroid Build Coastguard Worker     {
615*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const group =
616*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, floatTargets[targetNdx].name,
617*35238bceSAndroid Build Coastguard Worker                                    (std::string("test with ") + floatTargets[targetNdx].name).c_str());
618*35238bceSAndroid Build Coastguard Worker         const bool fullSet = !floatTargets[targetNdx].reducedTestSets;
619*35238bceSAndroid Build Coastguard Worker 
620*35238bceSAndroid Build Coastguard Worker #define ADD_CASE(X) group->addChild(AttributeCase::create<X>(m_context, floatTargets[targetNdx].dataType))
621*35238bceSAndroid Build Coastguard Worker #define ADD_REDUCED_CASE(X) \
622*35238bceSAndroid Build Coastguard Worker     if (fullSet)            \
623*35238bceSAndroid Build Coastguard Worker     ADD_CASE(X)
624*35238bceSAndroid Build Coastguard Worker 
625*35238bceSAndroid Build Coastguard Worker         ADD_CASE(LoaderVertexAttrib1f);
626*35238bceSAndroid Build Coastguard Worker         ADD_REDUCED_CASE(LoaderVertexAttrib2f);
627*35238bceSAndroid Build Coastguard Worker         ADD_REDUCED_CASE(LoaderVertexAttrib3f);
628*35238bceSAndroid Build Coastguard Worker         ADD_CASE(LoaderVertexAttrib4f);
629*35238bceSAndroid Build Coastguard Worker 
630*35238bceSAndroid Build Coastguard Worker         ADD_CASE(LoaderVertexAttrib1fv);
631*35238bceSAndroid Build Coastguard Worker         ADD_REDUCED_CASE(LoaderVertexAttrib2fv);
632*35238bceSAndroid Build Coastguard Worker         ADD_REDUCED_CASE(LoaderVertexAttrib3fv);
633*35238bceSAndroid Build Coastguard Worker         ADD_CASE(LoaderVertexAttrib4fv);
634*35238bceSAndroid Build Coastguard Worker 
635*35238bceSAndroid Build Coastguard Worker #undef ADD_CASE
636*35238bceSAndroid Build Coastguard Worker #undef ADD_REDUCED_CASE
637*35238bceSAndroid Build Coastguard Worker 
638*35238bceSAndroid Build Coastguard Worker         addChild(group);
639*35238bceSAndroid Build Coastguard Worker     }
640*35238bceSAndroid Build Coastguard Worker 
641*35238bceSAndroid Build Coastguard Worker     // int targets
642*35238bceSAndroid Build Coastguard Worker 
643*35238bceSAndroid Build Coastguard Worker     for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(intTargets); ++targetNdx)
644*35238bceSAndroid Build Coastguard Worker     {
645*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const group = new tcu::TestCaseGroup(
646*35238bceSAndroid Build Coastguard Worker             m_testCtx, intTargets[targetNdx].name, (std::string("test with ") + intTargets[targetNdx].name).c_str());
647*35238bceSAndroid Build Coastguard Worker 
648*35238bceSAndroid Build Coastguard Worker #define ADD_CASE(X) group->addChild(AttributeCase::create<X>(m_context, intTargets[targetNdx].dataType))
649*35238bceSAndroid Build Coastguard Worker 
650*35238bceSAndroid Build Coastguard Worker         ADD_CASE(LoaderVertexAttribI4i);
651*35238bceSAndroid Build Coastguard Worker         ADD_CASE(LoaderVertexAttribI4iv);
652*35238bceSAndroid Build Coastguard Worker 
653*35238bceSAndroid Build Coastguard Worker #undef ADD_CASE
654*35238bceSAndroid Build Coastguard Worker 
655*35238bceSAndroid Build Coastguard Worker         addChild(group);
656*35238bceSAndroid Build Coastguard Worker     }
657*35238bceSAndroid Build Coastguard Worker 
658*35238bceSAndroid Build Coastguard Worker     // uint targets
659*35238bceSAndroid Build Coastguard Worker 
660*35238bceSAndroid Build Coastguard Worker     for (int targetNdx = 0; targetNdx < DE_LENGTH_OF_ARRAY(uintTargets); ++targetNdx)
661*35238bceSAndroid Build Coastguard Worker     {
662*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *const group = new tcu::TestCaseGroup(
663*35238bceSAndroid Build Coastguard Worker             m_testCtx, uintTargets[targetNdx].name, (std::string("test with ") + uintTargets[targetNdx].name).c_str());
664*35238bceSAndroid Build Coastguard Worker 
665*35238bceSAndroid Build Coastguard Worker #define ADD_CASE(X) group->addChild(AttributeCase::create<X>(m_context, uintTargets[targetNdx].dataType))
666*35238bceSAndroid Build Coastguard Worker 
667*35238bceSAndroid Build Coastguard Worker         ADD_CASE(LoaderVertexAttribI4ui);
668*35238bceSAndroid Build Coastguard Worker         ADD_CASE(LoaderVertexAttribI4uiv);
669*35238bceSAndroid Build Coastguard Worker 
670*35238bceSAndroid Build Coastguard Worker #undef ADD_CASE
671*35238bceSAndroid Build Coastguard Worker 
672*35238bceSAndroid Build Coastguard Worker         addChild(group);
673*35238bceSAndroid Build Coastguard Worker     }
674*35238bceSAndroid Build Coastguard Worker }
675*35238bceSAndroid Build Coastguard Worker 
676*35238bceSAndroid Build Coastguard Worker } // namespace Functional
677*35238bceSAndroid Build Coastguard Worker } // namespace gles3
678*35238bceSAndroid Build Coastguard Worker } // namespace deqp
679