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 Vertex array and buffer tests
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "glsVertexArrayTests.hpp"
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker #include "deRandom.h"
27*35238bceSAndroid Build Coastguard Worker
28*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "tcuPixelFormat.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "tcuRGBA.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
35*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
36*35238bceSAndroid Build Coastguard Worker #include "tcuImageCompare.hpp"
37*35238bceSAndroid Build Coastguard Worker
38*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
39*35238bceSAndroid Build Coastguard Worker #include "gluCallLogWrapper.hpp"
40*35238bceSAndroid Build Coastguard Worker
41*35238bceSAndroid Build Coastguard Worker #include "sglrContext.hpp"
42*35238bceSAndroid Build Coastguard Worker #include "sglrReferenceContext.hpp"
43*35238bceSAndroid Build Coastguard Worker #include "sglrGLContext.hpp"
44*35238bceSAndroid Build Coastguard Worker
45*35238bceSAndroid Build Coastguard Worker #include "deMath.h"
46*35238bceSAndroid Build Coastguard Worker #include "deStringUtil.hpp"
47*35238bceSAndroid Build Coastguard Worker #include "deArrayUtil.hpp"
48*35238bceSAndroid Build Coastguard Worker
49*35238bceSAndroid Build Coastguard Worker #include <cstring>
50*35238bceSAndroid Build Coastguard Worker #include <cmath>
51*35238bceSAndroid Build Coastguard Worker #include <vector>
52*35238bceSAndroid Build Coastguard Worker #include <sstream>
53*35238bceSAndroid Build Coastguard Worker #include <limits>
54*35238bceSAndroid Build Coastguard Worker #include <algorithm>
55*35238bceSAndroid Build Coastguard Worker
56*35238bceSAndroid Build Coastguard Worker #include "glwDefs.hpp"
57*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
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
64*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
65*35238bceSAndroid Build Coastguard Worker using namespace glw; // GL types
66*35238bceSAndroid Build Coastguard Worker
targetToString(Target target)67*35238bceSAndroid Build Coastguard Worker std::string Array::targetToString(Target target)
68*35238bceSAndroid Build Coastguard Worker {
69*35238bceSAndroid Build Coastguard Worker static const char *targets[] = {
70*35238bceSAndroid Build Coastguard Worker "element_array", // TARGET_ELEMENT_ARRAY = 0,
71*35238bceSAndroid Build Coastguard Worker "array" // TARGET_ARRAY,
72*35238bceSAndroid Build Coastguard Worker };
73*35238bceSAndroid Build Coastguard Worker
74*35238bceSAndroid Build Coastguard Worker return de::getSizedArrayElement<Array::TARGET_LAST>(targets, (int)target);
75*35238bceSAndroid Build Coastguard Worker }
76*35238bceSAndroid Build Coastguard Worker
inputTypeToString(InputType type)77*35238bceSAndroid Build Coastguard Worker std::string Array::inputTypeToString(InputType type)
78*35238bceSAndroid Build Coastguard Worker {
79*35238bceSAndroid Build Coastguard Worker static const char *types[] = {
80*35238bceSAndroid Build Coastguard Worker "float", // INPUTTYPE_FLOAT = 0,
81*35238bceSAndroid Build Coastguard Worker "fixed", // INPUTTYPE_FIXED,
82*35238bceSAndroid Build Coastguard Worker "double", // INPUTTYPE_DOUBLE
83*35238bceSAndroid Build Coastguard Worker
84*35238bceSAndroid Build Coastguard Worker "byte", // INPUTTYPE_BYTE,
85*35238bceSAndroid Build Coastguard Worker "short", // INPUTTYPE_SHORT,
86*35238bceSAndroid Build Coastguard Worker
87*35238bceSAndroid Build Coastguard Worker "unsigned_byte", // INPUTTYPE_UNSIGNED_BYTE,
88*35238bceSAndroid Build Coastguard Worker "unsigned_short", // INPUTTYPE_UNSIGNED_SHORT,
89*35238bceSAndroid Build Coastguard Worker
90*35238bceSAndroid Build Coastguard Worker "int", // INPUTTYPE_INT,
91*35238bceSAndroid Build Coastguard Worker "unsigned_int", // INPUTTYPE_UNSIGNED_INT,
92*35238bceSAndroid Build Coastguard Worker "half", // INPUTTYPE_HALF,
93*35238bceSAndroid Build Coastguard Worker "usigned_int2_10_10_10", // INPUTTYPE_UNSIGNED_INT_2_10_10_10,
94*35238bceSAndroid Build Coastguard Worker "int2_10_10_10" // INPUTTYPE_INT_2_10_10_10,
95*35238bceSAndroid Build Coastguard Worker };
96*35238bceSAndroid Build Coastguard Worker
97*35238bceSAndroid Build Coastguard Worker return de::getSizedArrayElement<Array::INPUTTYPE_LAST>(types, (int)type);
98*35238bceSAndroid Build Coastguard Worker }
99*35238bceSAndroid Build Coastguard Worker
outputTypeToString(OutputType type)100*35238bceSAndroid Build Coastguard Worker std::string Array::outputTypeToString(OutputType type)
101*35238bceSAndroid Build Coastguard Worker {
102*35238bceSAndroid Build Coastguard Worker static const char *types[] = {
103*35238bceSAndroid Build Coastguard Worker "float", // OUTPUTTYPE_FLOAT = 0,
104*35238bceSAndroid Build Coastguard Worker "vec2", // OUTPUTTYPE_VEC2,
105*35238bceSAndroid Build Coastguard Worker "vec3", // OUTPUTTYPE_VEC3,
106*35238bceSAndroid Build Coastguard Worker "vec4", // OUTPUTTYPE_VEC4,
107*35238bceSAndroid Build Coastguard Worker
108*35238bceSAndroid Build Coastguard Worker "int", // OUTPUTTYPE_INT,
109*35238bceSAndroid Build Coastguard Worker "uint", // OUTPUTTYPE_UINT,
110*35238bceSAndroid Build Coastguard Worker
111*35238bceSAndroid Build Coastguard Worker "ivec2", // OUTPUTTYPE_IVEC2,
112*35238bceSAndroid Build Coastguard Worker "ivec3", // OUTPUTTYPE_IVEC3,
113*35238bceSAndroid Build Coastguard Worker "ivec4", // OUTPUTTYPE_IVEC4,
114*35238bceSAndroid Build Coastguard Worker
115*35238bceSAndroid Build Coastguard Worker "uvec2", // OUTPUTTYPE_UVEC2,
116*35238bceSAndroid Build Coastguard Worker "uvec3", // OUTPUTTYPE_UVEC3,
117*35238bceSAndroid Build Coastguard Worker "uvec4", // OUTPUTTYPE_UVEC4,
118*35238bceSAndroid Build Coastguard Worker };
119*35238bceSAndroid Build Coastguard Worker
120*35238bceSAndroid Build Coastguard Worker return de::getSizedArrayElement<Array::OUTPUTTYPE_LAST>(types, (int)type);
121*35238bceSAndroid Build Coastguard Worker }
122*35238bceSAndroid Build Coastguard Worker
usageTypeToString(Usage usage)123*35238bceSAndroid Build Coastguard Worker std::string Array::usageTypeToString(Usage usage)
124*35238bceSAndroid Build Coastguard Worker {
125*35238bceSAndroid Build Coastguard Worker static const char *usages[] = {
126*35238bceSAndroid Build Coastguard Worker "dynamic_draw", // USAGE_DYNAMIC_DRAW = 0,
127*35238bceSAndroid Build Coastguard Worker "static_draw", // USAGE_STATIC_DRAW,
128*35238bceSAndroid Build Coastguard Worker "stream_draw", // USAGE_STREAM_DRAW,
129*35238bceSAndroid Build Coastguard Worker
130*35238bceSAndroid Build Coastguard Worker "stream_read", // USAGE_STREAM_READ,
131*35238bceSAndroid Build Coastguard Worker "stream_copy", // USAGE_STREAM_COPY,
132*35238bceSAndroid Build Coastguard Worker
133*35238bceSAndroid Build Coastguard Worker "static_read", // USAGE_STATIC_READ,
134*35238bceSAndroid Build Coastguard Worker "static_copy", // USAGE_STATIC_COPY,
135*35238bceSAndroid Build Coastguard Worker
136*35238bceSAndroid Build Coastguard Worker "dynamic_read", // USAGE_DYNAMIC_READ,
137*35238bceSAndroid Build Coastguard Worker "dynamic_copy", // USAGE_DYNAMIC_COPY,
138*35238bceSAndroid Build Coastguard Worker };
139*35238bceSAndroid Build Coastguard Worker
140*35238bceSAndroid Build Coastguard Worker return de::getSizedArrayElement<Array::USAGE_LAST>(usages, (int)usage);
141*35238bceSAndroid Build Coastguard Worker }
142*35238bceSAndroid Build Coastguard Worker
storageToString(Storage storage)143*35238bceSAndroid Build Coastguard Worker std::string Array::storageToString(Storage storage)
144*35238bceSAndroid Build Coastguard Worker {
145*35238bceSAndroid Build Coastguard Worker static const char *storages[] = {
146*35238bceSAndroid Build Coastguard Worker "user_ptr", // STORAGE_USER = 0,
147*35238bceSAndroid Build Coastguard Worker "buffer" // STORAGE_BUFFER,
148*35238bceSAndroid Build Coastguard Worker };
149*35238bceSAndroid Build Coastguard Worker
150*35238bceSAndroid Build Coastguard Worker return de::getSizedArrayElement<Array::STORAGE_LAST>(storages, (int)storage);
151*35238bceSAndroid Build Coastguard Worker }
152*35238bceSAndroid Build Coastguard Worker
primitiveToString(Primitive primitive)153*35238bceSAndroid Build Coastguard Worker std::string Array::primitiveToString(Primitive primitive)
154*35238bceSAndroid Build Coastguard Worker {
155*35238bceSAndroid Build Coastguard Worker static const char *primitives[] = {
156*35238bceSAndroid Build Coastguard Worker "points", // PRIMITIVE_POINTS ,
157*35238bceSAndroid Build Coastguard Worker "triangles", // PRIMITIVE_TRIANGLES,
158*35238bceSAndroid Build Coastguard Worker "triangle_fan", // PRIMITIVE_TRIANGLE_FAN,
159*35238bceSAndroid Build Coastguard Worker "triangle_strip" // PRIMITIVE_TRIANGLE_STRIP,
160*35238bceSAndroid Build Coastguard Worker };
161*35238bceSAndroid Build Coastguard Worker
162*35238bceSAndroid Build Coastguard Worker return de::getSizedArrayElement<Array::PRIMITIVE_LAST>(primitives, (int)primitive);
163*35238bceSAndroid Build Coastguard Worker }
164*35238bceSAndroid Build Coastguard Worker
inputTypeSize(InputType type)165*35238bceSAndroid Build Coastguard Worker int Array::inputTypeSize(InputType type)
166*35238bceSAndroid Build Coastguard Worker {
167*35238bceSAndroid Build Coastguard Worker static const int size[] = {
168*35238bceSAndroid Build Coastguard Worker (int)sizeof(float), // INPUTTYPE_FLOAT = 0,
169*35238bceSAndroid Build Coastguard Worker (int)sizeof(int32_t), // INPUTTYPE_FIXED,
170*35238bceSAndroid Build Coastguard Worker (int)sizeof(double), // INPUTTYPE_DOUBLE
171*35238bceSAndroid Build Coastguard Worker
172*35238bceSAndroid Build Coastguard Worker (int)sizeof(int8_t), // INPUTTYPE_BYTE,
173*35238bceSAndroid Build Coastguard Worker (int)sizeof(int16_t), // INPUTTYPE_SHORT,
174*35238bceSAndroid Build Coastguard Worker
175*35238bceSAndroid Build Coastguard Worker (int)sizeof(uint8_t), // INPUTTYPE_UNSIGNED_BYTE,
176*35238bceSAndroid Build Coastguard Worker (int)sizeof(uint16_t), // INPUTTYPE_UNSIGNED_SHORT,
177*35238bceSAndroid Build Coastguard Worker
178*35238bceSAndroid Build Coastguard Worker (int)sizeof(int32_t), // INPUTTYPE_INT,
179*35238bceSAndroid Build Coastguard Worker (int)sizeof(uint32_t), // INPUTTYPE_UNSIGNED_INT,
180*35238bceSAndroid Build Coastguard Worker (int)sizeof(deFloat16), // INPUTTYPE_HALF,
181*35238bceSAndroid Build Coastguard Worker (int)sizeof(uint32_t) / 4, // INPUTTYPE_UNSIGNED_INT_2_10_10_10,
182*35238bceSAndroid Build Coastguard Worker (int)sizeof(uint32_t) / 4 // INPUTTYPE_INT_2_10_10_10,
183*35238bceSAndroid Build Coastguard Worker };
184*35238bceSAndroid Build Coastguard Worker
185*35238bceSAndroid Build Coastguard Worker return de::getSizedArrayElement<Array::INPUTTYPE_LAST>(size, (int)type);
186*35238bceSAndroid Build Coastguard Worker }
187*35238bceSAndroid Build Coastguard Worker
inputTypeIsFloatType(Array::InputType type)188*35238bceSAndroid Build Coastguard Worker static bool inputTypeIsFloatType(Array::InputType type)
189*35238bceSAndroid Build Coastguard Worker {
190*35238bceSAndroid Build Coastguard Worker if (type == Array::INPUTTYPE_FLOAT)
191*35238bceSAndroid Build Coastguard Worker return true;
192*35238bceSAndroid Build Coastguard Worker if (type == Array::INPUTTYPE_FIXED)
193*35238bceSAndroid Build Coastguard Worker return true;
194*35238bceSAndroid Build Coastguard Worker if (type == Array::INPUTTYPE_DOUBLE)
195*35238bceSAndroid Build Coastguard Worker return true;
196*35238bceSAndroid Build Coastguard Worker if (type == Array::INPUTTYPE_HALF)
197*35238bceSAndroid Build Coastguard Worker return true;
198*35238bceSAndroid Build Coastguard Worker return false;
199*35238bceSAndroid Build Coastguard Worker }
200*35238bceSAndroid Build Coastguard Worker
outputTypeIsFloatType(Array::OutputType type)201*35238bceSAndroid Build Coastguard Worker static bool outputTypeIsFloatType(Array::OutputType type)
202*35238bceSAndroid Build Coastguard Worker {
203*35238bceSAndroid Build Coastguard Worker if (type == Array::OUTPUTTYPE_FLOAT || type == Array::OUTPUTTYPE_VEC2 || type == Array::OUTPUTTYPE_VEC3 ||
204*35238bceSAndroid Build Coastguard Worker type == Array::OUTPUTTYPE_VEC4)
205*35238bceSAndroid Build Coastguard Worker return true;
206*35238bceSAndroid Build Coastguard Worker
207*35238bceSAndroid Build Coastguard Worker return false;
208*35238bceSAndroid Build Coastguard Worker }
209*35238bceSAndroid Build Coastguard Worker
210*35238bceSAndroid Build Coastguard Worker template <class T>
211*35238bceSAndroid Build Coastguard Worker inline T getRandom(deRandom &rnd, T min, T max);
212*35238bceSAndroid Build Coastguard Worker
213*35238bceSAndroid Build Coastguard Worker template <>
getRandom(deRandom & rnd,GLValue::Float min,GLValue::Float max)214*35238bceSAndroid Build Coastguard Worker inline GLValue::Float getRandom(deRandom &rnd, GLValue::Float min, GLValue::Float max)
215*35238bceSAndroid Build Coastguard Worker {
216*35238bceSAndroid Build Coastguard Worker if (max < min)
217*35238bceSAndroid Build Coastguard Worker return min;
218*35238bceSAndroid Build Coastguard Worker
219*35238bceSAndroid Build Coastguard Worker return GLValue::Float::create(min + deRandom_getFloat(&rnd) * (max.to<float>() - min.to<float>()));
220*35238bceSAndroid Build Coastguard Worker }
221*35238bceSAndroid Build Coastguard Worker
222*35238bceSAndroid Build Coastguard Worker template <>
getRandom(deRandom & rnd,GLValue::Short min,GLValue::Short max)223*35238bceSAndroid Build Coastguard Worker inline GLValue::Short getRandom(deRandom &rnd, GLValue::Short min, GLValue::Short max)
224*35238bceSAndroid Build Coastguard Worker {
225*35238bceSAndroid Build Coastguard Worker if (max < min)
226*35238bceSAndroid Build Coastguard Worker return min;
227*35238bceSAndroid Build Coastguard Worker
228*35238bceSAndroid Build Coastguard Worker return GLValue::Short::create(
229*35238bceSAndroid Build Coastguard Worker (min == max ? min : (int16_t)(min + (deRandom_getUint32(&rnd) % (max.to<int>() - min.to<int>())))));
230*35238bceSAndroid Build Coastguard Worker }
231*35238bceSAndroid Build Coastguard Worker
232*35238bceSAndroid Build Coastguard Worker template <>
getRandom(deRandom & rnd,GLValue::Ushort min,GLValue::Ushort max)233*35238bceSAndroid Build Coastguard Worker inline GLValue::Ushort getRandom(deRandom &rnd, GLValue::Ushort min, GLValue::Ushort max)
234*35238bceSAndroid Build Coastguard Worker {
235*35238bceSAndroid Build Coastguard Worker if (max < min)
236*35238bceSAndroid Build Coastguard Worker return min;
237*35238bceSAndroid Build Coastguard Worker
238*35238bceSAndroid Build Coastguard Worker return GLValue::Ushort::create(
239*35238bceSAndroid Build Coastguard Worker (min == max ? min : (uint16_t)(min + (deRandom_getUint32(&rnd) % (max.to<int>() - min.to<int>())))));
240*35238bceSAndroid Build Coastguard Worker }
241*35238bceSAndroid Build Coastguard Worker
242*35238bceSAndroid Build Coastguard Worker template <>
getRandom(deRandom & rnd,GLValue::Byte min,GLValue::Byte max)243*35238bceSAndroid Build Coastguard Worker inline GLValue::Byte getRandom(deRandom &rnd, GLValue::Byte min, GLValue::Byte max)
244*35238bceSAndroid Build Coastguard Worker {
245*35238bceSAndroid Build Coastguard Worker if (max < min)
246*35238bceSAndroid Build Coastguard Worker return min;
247*35238bceSAndroid Build Coastguard Worker
248*35238bceSAndroid Build Coastguard Worker return GLValue::Byte::create(
249*35238bceSAndroid Build Coastguard Worker (min == max ? min : (int8_t)(min + (deRandom_getUint32(&rnd) % (max.to<int>() - min.to<int>())))));
250*35238bceSAndroid Build Coastguard Worker }
251*35238bceSAndroid Build Coastguard Worker
252*35238bceSAndroid Build Coastguard Worker template <>
getRandom(deRandom & rnd,GLValue::Ubyte min,GLValue::Ubyte max)253*35238bceSAndroid Build Coastguard Worker inline GLValue::Ubyte getRandom(deRandom &rnd, GLValue::Ubyte min, GLValue::Ubyte max)
254*35238bceSAndroid Build Coastguard Worker {
255*35238bceSAndroid Build Coastguard Worker if (max < min)
256*35238bceSAndroid Build Coastguard Worker return min;
257*35238bceSAndroid Build Coastguard Worker
258*35238bceSAndroid Build Coastguard Worker return GLValue::Ubyte::create(
259*35238bceSAndroid Build Coastguard Worker (min == max ? min : (uint8_t)(min + (deRandom_getUint32(&rnd) % (max.to<int>() - min.to<int>())))));
260*35238bceSAndroid Build Coastguard Worker }
261*35238bceSAndroid Build Coastguard Worker
262*35238bceSAndroid Build Coastguard Worker template <>
getRandom(deRandom & rnd,GLValue::Fixed min,GLValue::Fixed max)263*35238bceSAndroid Build Coastguard Worker inline GLValue::Fixed getRandom(deRandom &rnd, GLValue::Fixed min, GLValue::Fixed max)
264*35238bceSAndroid Build Coastguard Worker {
265*35238bceSAndroid Build Coastguard Worker if (max < min)
266*35238bceSAndroid Build Coastguard Worker return min;
267*35238bceSAndroid Build Coastguard Worker
268*35238bceSAndroid Build Coastguard Worker return GLValue::Fixed::create(
269*35238bceSAndroid Build Coastguard Worker (min == max ? min : min + (deRandom_getUint32(&rnd) % (max.to<uint32_t>() - min.to<uint32_t>()))));
270*35238bceSAndroid Build Coastguard Worker }
271*35238bceSAndroid Build Coastguard Worker
272*35238bceSAndroid Build Coastguard Worker template <>
getRandom(deRandom & rnd,GLValue::Half min,GLValue::Half max)273*35238bceSAndroid Build Coastguard Worker inline GLValue::Half getRandom(deRandom &rnd, GLValue::Half min, GLValue::Half max)
274*35238bceSAndroid Build Coastguard Worker {
275*35238bceSAndroid Build Coastguard Worker if (max < min)
276*35238bceSAndroid Build Coastguard Worker return min;
277*35238bceSAndroid Build Coastguard Worker
278*35238bceSAndroid Build Coastguard Worker float fMax = max.to<float>();
279*35238bceSAndroid Build Coastguard Worker float fMin = min.to<float>();
280*35238bceSAndroid Build Coastguard Worker GLValue::Half h = GLValue::Half::create(fMin + deRandom_getFloat(&rnd) * (fMax - fMin));
281*35238bceSAndroid Build Coastguard Worker return h;
282*35238bceSAndroid Build Coastguard Worker }
283*35238bceSAndroid Build Coastguard Worker
284*35238bceSAndroid Build Coastguard Worker template <>
getRandom(deRandom & rnd,GLValue::Int min,GLValue::Int max)285*35238bceSAndroid Build Coastguard Worker inline GLValue::Int getRandom(deRandom &rnd, GLValue::Int min, GLValue::Int max)
286*35238bceSAndroid Build Coastguard Worker {
287*35238bceSAndroid Build Coastguard Worker if (max < min)
288*35238bceSAndroid Build Coastguard Worker return min;
289*35238bceSAndroid Build Coastguard Worker
290*35238bceSAndroid Build Coastguard Worker return GLValue::Int::create(
291*35238bceSAndroid Build Coastguard Worker (min == max ? min : min + (deRandom_getUint32(&rnd) % (max.to<uint32_t>() - min.to<uint32_t>()))));
292*35238bceSAndroid Build Coastguard Worker }
293*35238bceSAndroid Build Coastguard Worker
294*35238bceSAndroid Build Coastguard Worker template <>
getRandom(deRandom & rnd,GLValue::Uint min,GLValue::Uint max)295*35238bceSAndroid Build Coastguard Worker inline GLValue::Uint getRandom(deRandom &rnd, GLValue::Uint min, GLValue::Uint max)
296*35238bceSAndroid Build Coastguard Worker {
297*35238bceSAndroid Build Coastguard Worker if (max < min)
298*35238bceSAndroid Build Coastguard Worker return min;
299*35238bceSAndroid Build Coastguard Worker
300*35238bceSAndroid Build Coastguard Worker return GLValue::Uint::create(
301*35238bceSAndroid Build Coastguard Worker (min == max ? min : min + (deRandom_getUint32(&rnd) % (max.to<uint32_t>() - min.to<uint32_t>()))));
302*35238bceSAndroid Build Coastguard Worker }
303*35238bceSAndroid Build Coastguard Worker
304*35238bceSAndroid Build Coastguard Worker template <>
getRandom(deRandom & rnd,GLValue::Double min,GLValue::Double max)305*35238bceSAndroid Build Coastguard Worker inline GLValue::Double getRandom(deRandom &rnd, GLValue::Double min, GLValue::Double max)
306*35238bceSAndroid Build Coastguard Worker {
307*35238bceSAndroid Build Coastguard Worker if (max < min)
308*35238bceSAndroid Build Coastguard Worker return min;
309*35238bceSAndroid Build Coastguard Worker
310*35238bceSAndroid Build Coastguard Worker return GLValue::Double::create(min + deRandom_getFloat(&rnd) * (max.to<float>() - min.to<float>()));
311*35238bceSAndroid Build Coastguard Worker }
312*35238bceSAndroid Build Coastguard Worker
313*35238bceSAndroid Build Coastguard Worker // Minimum difference required between coordinates
314*35238bceSAndroid Build Coastguard Worker template <class T>
315*35238bceSAndroid Build Coastguard Worker inline T minValue(void);
316*35238bceSAndroid Build Coastguard Worker
317*35238bceSAndroid Build Coastguard Worker template <>
minValue(void)318*35238bceSAndroid Build Coastguard Worker inline GLValue::Float minValue(void)
319*35238bceSAndroid Build Coastguard Worker {
320*35238bceSAndroid Build Coastguard Worker return GLValue::Float::create(4 * 1.0f);
321*35238bceSAndroid Build Coastguard Worker }
322*35238bceSAndroid Build Coastguard Worker
323*35238bceSAndroid Build Coastguard Worker template <>
minValue(void)324*35238bceSAndroid Build Coastguard Worker inline GLValue::Short minValue(void)
325*35238bceSAndroid Build Coastguard Worker {
326*35238bceSAndroid Build Coastguard Worker return GLValue::Short::create(4 * 256);
327*35238bceSAndroid Build Coastguard Worker }
328*35238bceSAndroid Build Coastguard Worker
329*35238bceSAndroid Build Coastguard Worker template <>
minValue(void)330*35238bceSAndroid Build Coastguard Worker inline GLValue::Ushort minValue(void)
331*35238bceSAndroid Build Coastguard Worker {
332*35238bceSAndroid Build Coastguard Worker return GLValue::Ushort::create(4 * 256);
333*35238bceSAndroid Build Coastguard Worker }
334*35238bceSAndroid Build Coastguard Worker
335*35238bceSAndroid Build Coastguard Worker template <>
minValue(void)336*35238bceSAndroid Build Coastguard Worker inline GLValue::Byte minValue(void)
337*35238bceSAndroid Build Coastguard Worker {
338*35238bceSAndroid Build Coastguard Worker return GLValue::Byte::create(4 * 1);
339*35238bceSAndroid Build Coastguard Worker }
340*35238bceSAndroid Build Coastguard Worker
341*35238bceSAndroid Build Coastguard Worker template <>
minValue(void)342*35238bceSAndroid Build Coastguard Worker inline GLValue::Ubyte minValue(void)
343*35238bceSAndroid Build Coastguard Worker {
344*35238bceSAndroid Build Coastguard Worker return GLValue::Ubyte::create(4 * 2);
345*35238bceSAndroid Build Coastguard Worker }
346*35238bceSAndroid Build Coastguard Worker
347*35238bceSAndroid Build Coastguard Worker template <>
minValue(void)348*35238bceSAndroid Build Coastguard Worker inline GLValue::Fixed minValue(void)
349*35238bceSAndroid Build Coastguard Worker {
350*35238bceSAndroid Build Coastguard Worker return GLValue::Fixed::create(4 * 512);
351*35238bceSAndroid Build Coastguard Worker }
352*35238bceSAndroid Build Coastguard Worker
353*35238bceSAndroid Build Coastguard Worker template <>
minValue(void)354*35238bceSAndroid Build Coastguard Worker inline GLValue::Int minValue(void)
355*35238bceSAndroid Build Coastguard Worker {
356*35238bceSAndroid Build Coastguard Worker return GLValue::Int::create(4 * 16777216);
357*35238bceSAndroid Build Coastguard Worker }
358*35238bceSAndroid Build Coastguard Worker
359*35238bceSAndroid Build Coastguard Worker template <>
minValue(void)360*35238bceSAndroid Build Coastguard Worker inline GLValue::Uint minValue(void)
361*35238bceSAndroid Build Coastguard Worker {
362*35238bceSAndroid Build Coastguard Worker return GLValue::Uint::create(4 * 16777216);
363*35238bceSAndroid Build Coastguard Worker }
364*35238bceSAndroid Build Coastguard Worker
365*35238bceSAndroid Build Coastguard Worker template <>
minValue(void)366*35238bceSAndroid Build Coastguard Worker inline GLValue::Half minValue(void)
367*35238bceSAndroid Build Coastguard Worker {
368*35238bceSAndroid Build Coastguard Worker return GLValue::Half::create(4 * 1.0f);
369*35238bceSAndroid Build Coastguard Worker }
370*35238bceSAndroid Build Coastguard Worker
371*35238bceSAndroid Build Coastguard Worker template <>
minValue(void)372*35238bceSAndroid Build Coastguard Worker inline GLValue::Double minValue(void)
373*35238bceSAndroid Build Coastguard Worker {
374*35238bceSAndroid Build Coastguard Worker return GLValue::Double::create(4 * 1.0f);
375*35238bceSAndroid Build Coastguard Worker }
376*35238bceSAndroid Build Coastguard Worker
377*35238bceSAndroid Build Coastguard Worker template <class T>
alignmentSafeAssignment(char * dst,T val)378*35238bceSAndroid Build Coastguard Worker static inline void alignmentSafeAssignment(char *dst, T val)
379*35238bceSAndroid Build Coastguard Worker {
380*35238bceSAndroid Build Coastguard Worker std::memcpy(dst, &val, sizeof(T));
381*35238bceSAndroid Build Coastguard Worker }
382*35238bceSAndroid Build Coastguard Worker
ContextArray(Storage storage,sglr::Context & context)383*35238bceSAndroid Build Coastguard Worker ContextArray::ContextArray(Storage storage, sglr::Context &context)
384*35238bceSAndroid Build Coastguard Worker : m_storage(storage)
385*35238bceSAndroid Build Coastguard Worker , m_ctx(context)
386*35238bceSAndroid Build Coastguard Worker , m_glBuffer(0)
387*35238bceSAndroid Build Coastguard Worker , m_bound(false)
388*35238bceSAndroid Build Coastguard Worker , m_attribNdx(0)
389*35238bceSAndroid Build Coastguard Worker , m_size(0)
390*35238bceSAndroid Build Coastguard Worker , m_data(DE_NULL)
391*35238bceSAndroid Build Coastguard Worker , m_componentCount(1)
392*35238bceSAndroid Build Coastguard Worker , m_target(Array::TARGET_ARRAY)
393*35238bceSAndroid Build Coastguard Worker , m_inputType(Array::INPUTTYPE_FLOAT)
394*35238bceSAndroid Build Coastguard Worker , m_outputType(Array::OUTPUTTYPE_VEC4)
395*35238bceSAndroid Build Coastguard Worker , m_normalize(false)
396*35238bceSAndroid Build Coastguard Worker , m_stride(0)
397*35238bceSAndroid Build Coastguard Worker , m_offset(0)
398*35238bceSAndroid Build Coastguard Worker {
399*35238bceSAndroid Build Coastguard Worker if (m_storage == STORAGE_BUFFER)
400*35238bceSAndroid Build Coastguard Worker {
401*35238bceSAndroid Build Coastguard Worker m_ctx.genBuffers(1, &m_glBuffer);
402*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glGenBuffers()");
403*35238bceSAndroid Build Coastguard Worker }
404*35238bceSAndroid Build Coastguard Worker }
405*35238bceSAndroid Build Coastguard Worker
~ContextArray(void)406*35238bceSAndroid Build Coastguard Worker ContextArray::~ContextArray(void)
407*35238bceSAndroid Build Coastguard Worker {
408*35238bceSAndroid Build Coastguard Worker if (m_storage == STORAGE_BUFFER)
409*35238bceSAndroid Build Coastguard Worker {
410*35238bceSAndroid Build Coastguard Worker m_ctx.deleteBuffers(1, &m_glBuffer);
411*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glDeleteBuffers()");
412*35238bceSAndroid Build Coastguard Worker }
413*35238bceSAndroid Build Coastguard Worker else if (m_storage == STORAGE_USER)
414*35238bceSAndroid Build Coastguard Worker delete[] m_data;
415*35238bceSAndroid Build Coastguard Worker else
416*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
417*35238bceSAndroid Build Coastguard Worker }
418*35238bceSAndroid Build Coastguard Worker
getArray(int i)419*35238bceSAndroid Build Coastguard Worker Array *ContextArrayPack::getArray(int i)
420*35238bceSAndroid Build Coastguard Worker {
421*35238bceSAndroid Build Coastguard Worker return m_arrays.at(i);
422*35238bceSAndroid Build Coastguard Worker }
423*35238bceSAndroid Build Coastguard Worker
data(Target target,int size,const char * ptr,Usage usage)424*35238bceSAndroid Build Coastguard Worker void ContextArray::data(Target target, int size, const char *ptr, Usage usage)
425*35238bceSAndroid Build Coastguard Worker {
426*35238bceSAndroid Build Coastguard Worker m_size = size;
427*35238bceSAndroid Build Coastguard Worker m_target = target;
428*35238bceSAndroid Build Coastguard Worker
429*35238bceSAndroid Build Coastguard Worker if (m_storage == STORAGE_BUFFER)
430*35238bceSAndroid Build Coastguard Worker {
431*35238bceSAndroid Build Coastguard Worker m_ctx.bindBuffer(targetToGL(target), m_glBuffer);
432*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glBindBuffer()");
433*35238bceSAndroid Build Coastguard Worker
434*35238bceSAndroid Build Coastguard Worker m_ctx.bufferData(targetToGL(target), size, ptr, usageToGL(usage));
435*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glBufferData()");
436*35238bceSAndroid Build Coastguard Worker }
437*35238bceSAndroid Build Coastguard Worker else if (m_storage == STORAGE_USER)
438*35238bceSAndroid Build Coastguard Worker {
439*35238bceSAndroid Build Coastguard Worker if (m_data)
440*35238bceSAndroid Build Coastguard Worker delete[] m_data;
441*35238bceSAndroid Build Coastguard Worker
442*35238bceSAndroid Build Coastguard Worker m_data = new char[size];
443*35238bceSAndroid Build Coastguard Worker std::memcpy(m_data, ptr, size);
444*35238bceSAndroid Build Coastguard Worker }
445*35238bceSAndroid Build Coastguard Worker else
446*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
447*35238bceSAndroid Build Coastguard Worker }
448*35238bceSAndroid Build Coastguard Worker
subdata(Target target,int offset,int size,const char * ptr)449*35238bceSAndroid Build Coastguard Worker void ContextArray::subdata(Target target, int offset, int size, const char *ptr)
450*35238bceSAndroid Build Coastguard Worker {
451*35238bceSAndroid Build Coastguard Worker m_target = target;
452*35238bceSAndroid Build Coastguard Worker
453*35238bceSAndroid Build Coastguard Worker if (m_storage == STORAGE_BUFFER)
454*35238bceSAndroid Build Coastguard Worker {
455*35238bceSAndroid Build Coastguard Worker m_ctx.bindBuffer(targetToGL(target), m_glBuffer);
456*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glBindBuffer()");
457*35238bceSAndroid Build Coastguard Worker
458*35238bceSAndroid Build Coastguard Worker m_ctx.bufferSubData(targetToGL(target), offset, size, ptr);
459*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glBufferSubData()");
460*35238bceSAndroid Build Coastguard Worker }
461*35238bceSAndroid Build Coastguard Worker else if (m_storage == STORAGE_USER)
462*35238bceSAndroid Build Coastguard Worker std::memcpy(m_data + offset, ptr, size);
463*35238bceSAndroid Build Coastguard Worker else
464*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
465*35238bceSAndroid Build Coastguard Worker }
466*35238bceSAndroid Build Coastguard Worker
bind(int attribNdx,int offset,int size,InputType inputType,OutputType outType,bool normalized,int stride)467*35238bceSAndroid Build Coastguard Worker void ContextArray::bind(int attribNdx, int offset, int size, InputType inputType, OutputType outType, bool normalized,
468*35238bceSAndroid Build Coastguard Worker int stride)
469*35238bceSAndroid Build Coastguard Worker {
470*35238bceSAndroid Build Coastguard Worker m_attribNdx = attribNdx;
471*35238bceSAndroid Build Coastguard Worker m_bound = true;
472*35238bceSAndroid Build Coastguard Worker m_componentCount = size;
473*35238bceSAndroid Build Coastguard Worker m_inputType = inputType;
474*35238bceSAndroid Build Coastguard Worker m_outputType = outType;
475*35238bceSAndroid Build Coastguard Worker m_normalize = normalized;
476*35238bceSAndroid Build Coastguard Worker m_stride = stride;
477*35238bceSAndroid Build Coastguard Worker m_offset = offset;
478*35238bceSAndroid Build Coastguard Worker }
479*35238bceSAndroid Build Coastguard Worker
bindIndexArray(Array::Target target)480*35238bceSAndroid Build Coastguard Worker void ContextArray::bindIndexArray(Array::Target target)
481*35238bceSAndroid Build Coastguard Worker {
482*35238bceSAndroid Build Coastguard Worker if (m_storage == STORAGE_USER)
483*35238bceSAndroid Build Coastguard Worker {
484*35238bceSAndroid Build Coastguard Worker }
485*35238bceSAndroid Build Coastguard Worker else if (m_storage == STORAGE_BUFFER)
486*35238bceSAndroid Build Coastguard Worker {
487*35238bceSAndroid Build Coastguard Worker m_ctx.bindBuffer(targetToGL(target), m_glBuffer);
488*35238bceSAndroid Build Coastguard Worker }
489*35238bceSAndroid Build Coastguard Worker }
490*35238bceSAndroid Build Coastguard Worker
glBind(uint32_t loc)491*35238bceSAndroid Build Coastguard Worker void ContextArray::glBind(uint32_t loc)
492*35238bceSAndroid Build Coastguard Worker {
493*35238bceSAndroid Build Coastguard Worker if (m_storage == STORAGE_BUFFER)
494*35238bceSAndroid Build Coastguard Worker {
495*35238bceSAndroid Build Coastguard Worker m_ctx.bindBuffer(targetToGL(m_target), m_glBuffer);
496*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glBindBuffer()");
497*35238bceSAndroid Build Coastguard Worker
498*35238bceSAndroid Build Coastguard Worker if (!inputTypeIsFloatType(m_inputType))
499*35238bceSAndroid Build Coastguard Worker {
500*35238bceSAndroid Build Coastguard Worker // Input is not float type
501*35238bceSAndroid Build Coastguard Worker
502*35238bceSAndroid Build Coastguard Worker if (outputTypeIsFloatType(m_outputType))
503*35238bceSAndroid Build Coastguard Worker {
504*35238bceSAndroid Build Coastguard Worker // Output type is float type
505*35238bceSAndroid Build Coastguard Worker m_ctx.vertexAttribPointer(loc, m_componentCount, inputTypeToGL(m_inputType), m_normalize, m_stride,
506*35238bceSAndroid Build Coastguard Worker (GLvoid *)((GLintptr)m_offset));
507*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glVertexAttribPointer()");
508*35238bceSAndroid Build Coastguard Worker }
509*35238bceSAndroid Build Coastguard Worker else
510*35238bceSAndroid Build Coastguard Worker {
511*35238bceSAndroid Build Coastguard Worker // Output type is int type
512*35238bceSAndroid Build Coastguard Worker m_ctx.vertexAttribIPointer(loc, m_componentCount, inputTypeToGL(m_inputType), m_stride,
513*35238bceSAndroid Build Coastguard Worker (GLvoid *)((GLintptr)m_offset));
514*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glVertexAttribIPointer()");
515*35238bceSAndroid Build Coastguard Worker }
516*35238bceSAndroid Build Coastguard Worker }
517*35238bceSAndroid Build Coastguard Worker else
518*35238bceSAndroid Build Coastguard Worker {
519*35238bceSAndroid Build Coastguard Worker // Input type is float type
520*35238bceSAndroid Build Coastguard Worker
521*35238bceSAndroid Build Coastguard Worker // Output type must be float type
522*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_outputType == OUTPUTTYPE_FLOAT || m_outputType == OUTPUTTYPE_VEC2 ||
523*35238bceSAndroid Build Coastguard Worker m_outputType == OUTPUTTYPE_VEC3 || m_outputType == OUTPUTTYPE_VEC4);
524*35238bceSAndroid Build Coastguard Worker
525*35238bceSAndroid Build Coastguard Worker m_ctx.vertexAttribPointer(loc, m_componentCount, inputTypeToGL(m_inputType), m_normalize, m_stride,
526*35238bceSAndroid Build Coastguard Worker (GLvoid *)((GLintptr)m_offset));
527*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glVertexAttribPointer()");
528*35238bceSAndroid Build Coastguard Worker }
529*35238bceSAndroid Build Coastguard Worker
530*35238bceSAndroid Build Coastguard Worker m_ctx.bindBuffer(targetToGL(m_target), 0);
531*35238bceSAndroid Build Coastguard Worker }
532*35238bceSAndroid Build Coastguard Worker else if (m_storage == STORAGE_USER)
533*35238bceSAndroid Build Coastguard Worker {
534*35238bceSAndroid Build Coastguard Worker m_ctx.bindBuffer(targetToGL(m_target), 0);
535*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glBindBuffer()");
536*35238bceSAndroid Build Coastguard Worker
537*35238bceSAndroid Build Coastguard Worker if (!inputTypeIsFloatType(m_inputType))
538*35238bceSAndroid Build Coastguard Worker {
539*35238bceSAndroid Build Coastguard Worker // Input is not float type
540*35238bceSAndroid Build Coastguard Worker
541*35238bceSAndroid Build Coastguard Worker if (outputTypeIsFloatType(m_outputType))
542*35238bceSAndroid Build Coastguard Worker {
543*35238bceSAndroid Build Coastguard Worker // Output type is float type
544*35238bceSAndroid Build Coastguard Worker m_ctx.vertexAttribPointer(loc, m_componentCount, inputTypeToGL(m_inputType), m_normalize, m_stride,
545*35238bceSAndroid Build Coastguard Worker m_data + m_offset);
546*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glVertexAttribPointer()");
547*35238bceSAndroid Build Coastguard Worker }
548*35238bceSAndroid Build Coastguard Worker else
549*35238bceSAndroid Build Coastguard Worker {
550*35238bceSAndroid Build Coastguard Worker // Output type is int type
551*35238bceSAndroid Build Coastguard Worker m_ctx.vertexAttribIPointer(loc, m_componentCount, inputTypeToGL(m_inputType), m_stride,
552*35238bceSAndroid Build Coastguard Worker m_data + m_offset);
553*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glVertexAttribIPointer()");
554*35238bceSAndroid Build Coastguard Worker }
555*35238bceSAndroid Build Coastguard Worker }
556*35238bceSAndroid Build Coastguard Worker else
557*35238bceSAndroid Build Coastguard Worker {
558*35238bceSAndroid Build Coastguard Worker // Input type is float type
559*35238bceSAndroid Build Coastguard Worker
560*35238bceSAndroid Build Coastguard Worker // Output type must be float type
561*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_outputType == OUTPUTTYPE_FLOAT || m_outputType == OUTPUTTYPE_VEC2 ||
562*35238bceSAndroid Build Coastguard Worker m_outputType == OUTPUTTYPE_VEC3 || m_outputType == OUTPUTTYPE_VEC4);
563*35238bceSAndroid Build Coastguard Worker
564*35238bceSAndroid Build Coastguard Worker m_ctx.vertexAttribPointer(loc, m_componentCount, inputTypeToGL(m_inputType), m_normalize, m_stride,
565*35238bceSAndroid Build Coastguard Worker m_data + m_offset);
566*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glVertexAttribPointer()");
567*35238bceSAndroid Build Coastguard Worker }
568*35238bceSAndroid Build Coastguard Worker }
569*35238bceSAndroid Build Coastguard Worker else
570*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
571*35238bceSAndroid Build Coastguard Worker }
572*35238bceSAndroid Build Coastguard Worker
targetToGL(Array::Target target)573*35238bceSAndroid Build Coastguard Worker GLenum ContextArray::targetToGL(Array::Target target)
574*35238bceSAndroid Build Coastguard Worker {
575*35238bceSAndroid Build Coastguard Worker static const GLenum targets[] = {
576*35238bceSAndroid Build Coastguard Worker GL_ELEMENT_ARRAY_BUFFER, // TARGET_ELEMENT_ARRAY = 0,
577*35238bceSAndroid Build Coastguard Worker GL_ARRAY_BUFFER // TARGET_ARRAY,
578*35238bceSAndroid Build Coastguard Worker };
579*35238bceSAndroid Build Coastguard Worker
580*35238bceSAndroid Build Coastguard Worker return de::getSizedArrayElement<Array::TARGET_LAST>(targets, (int)target);
581*35238bceSAndroid Build Coastguard Worker }
582*35238bceSAndroid Build Coastguard Worker
usageToGL(Array::Usage usage)583*35238bceSAndroid Build Coastguard Worker GLenum ContextArray::usageToGL(Array::Usage usage)
584*35238bceSAndroid Build Coastguard Worker {
585*35238bceSAndroid Build Coastguard Worker static const GLenum usages[] = {
586*35238bceSAndroid Build Coastguard Worker GL_DYNAMIC_DRAW, // USAGE_DYNAMIC_DRAW = 0,
587*35238bceSAndroid Build Coastguard Worker GL_STATIC_DRAW, // USAGE_STATIC_DRAW,
588*35238bceSAndroid Build Coastguard Worker GL_STREAM_DRAW, // USAGE_STREAM_DRAW,
589*35238bceSAndroid Build Coastguard Worker
590*35238bceSAndroid Build Coastguard Worker GL_STREAM_READ, // USAGE_STREAM_READ,
591*35238bceSAndroid Build Coastguard Worker GL_STREAM_COPY, // USAGE_STREAM_COPY,
592*35238bceSAndroid Build Coastguard Worker
593*35238bceSAndroid Build Coastguard Worker GL_STATIC_READ, // USAGE_STATIC_READ,
594*35238bceSAndroid Build Coastguard Worker GL_STATIC_COPY, // USAGE_STATIC_COPY,
595*35238bceSAndroid Build Coastguard Worker
596*35238bceSAndroid Build Coastguard Worker GL_DYNAMIC_READ, // USAGE_DYNAMIC_READ,
597*35238bceSAndroid Build Coastguard Worker GL_DYNAMIC_COPY // USAGE_DYNAMIC_COPY,
598*35238bceSAndroid Build Coastguard Worker };
599*35238bceSAndroid Build Coastguard Worker
600*35238bceSAndroid Build Coastguard Worker return de::getSizedArrayElement<Array::USAGE_LAST>(usages, (int)usage);
601*35238bceSAndroid Build Coastguard Worker }
602*35238bceSAndroid Build Coastguard Worker
inputTypeToGL(Array::InputType type)603*35238bceSAndroid Build Coastguard Worker GLenum ContextArray::inputTypeToGL(Array::InputType type)
604*35238bceSAndroid Build Coastguard Worker {
605*35238bceSAndroid Build Coastguard Worker static const GLenum types[] = {
606*35238bceSAndroid Build Coastguard Worker GL_FLOAT, // INPUTTYPE_FLOAT = 0,
607*35238bceSAndroid Build Coastguard Worker GL_FIXED, // INPUTTYPE_FIXED,
608*35238bceSAndroid Build Coastguard Worker GL_DOUBLE, // INPUTTYPE_DOUBLE
609*35238bceSAndroid Build Coastguard Worker GL_BYTE, // INPUTTYPE_BYTE,
610*35238bceSAndroid Build Coastguard Worker GL_SHORT, // INPUTTYPE_SHORT,
611*35238bceSAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, // INPUTTYPE_UNSIGNED_BYTE,
612*35238bceSAndroid Build Coastguard Worker GL_UNSIGNED_SHORT, // INPUTTYPE_UNSIGNED_SHORT,
613*35238bceSAndroid Build Coastguard Worker
614*35238bceSAndroid Build Coastguard Worker GL_INT, // INPUTTYPE_INT,
615*35238bceSAndroid Build Coastguard Worker GL_UNSIGNED_INT, // INPUTTYPE_UNSIGNED_INT,
616*35238bceSAndroid Build Coastguard Worker GL_HALF_FLOAT, // INPUTTYPE_HALF,
617*35238bceSAndroid Build Coastguard Worker GL_UNSIGNED_INT_2_10_10_10_REV, // INPUTTYPE_UNSIGNED_INT_2_10_10_10,
618*35238bceSAndroid Build Coastguard Worker GL_INT_2_10_10_10_REV // INPUTTYPE_INT_2_10_10_10,
619*35238bceSAndroid Build Coastguard Worker };
620*35238bceSAndroid Build Coastguard Worker
621*35238bceSAndroid Build Coastguard Worker return de::getSizedArrayElement<Array::INPUTTYPE_LAST>(types, (int)type);
622*35238bceSAndroid Build Coastguard Worker }
623*35238bceSAndroid Build Coastguard Worker
outputTypeToGLType(Array::OutputType type)624*35238bceSAndroid Build Coastguard Worker std::string ContextArray::outputTypeToGLType(Array::OutputType type)
625*35238bceSAndroid Build Coastguard Worker {
626*35238bceSAndroid Build Coastguard Worker static const char *types[] = {
627*35238bceSAndroid Build Coastguard Worker "float", // OUTPUTTYPE_FLOAT = 0,
628*35238bceSAndroid Build Coastguard Worker "vec2", // OUTPUTTYPE_VEC2,
629*35238bceSAndroid Build Coastguard Worker "vec3", // OUTPUTTYPE_VEC3,
630*35238bceSAndroid Build Coastguard Worker "vec4", // OUTPUTTYPE_VEC4,
631*35238bceSAndroid Build Coastguard Worker
632*35238bceSAndroid Build Coastguard Worker "int", // OUTPUTTYPE_INT,
633*35238bceSAndroid Build Coastguard Worker "uint", // OUTPUTTYPE_UINT,
634*35238bceSAndroid Build Coastguard Worker
635*35238bceSAndroid Build Coastguard Worker "ivec2", // OUTPUTTYPE_IVEC2,
636*35238bceSAndroid Build Coastguard Worker "ivec3", // OUTPUTTYPE_IVEC3,
637*35238bceSAndroid Build Coastguard Worker "ivec4", // OUTPUTTYPE_IVEC4,
638*35238bceSAndroid Build Coastguard Worker
639*35238bceSAndroid Build Coastguard Worker "uvec2", // OUTPUTTYPE_UVEC2,
640*35238bceSAndroid Build Coastguard Worker "uvec3", // OUTPUTTYPE_UVEC3,
641*35238bceSAndroid Build Coastguard Worker "uvec4", // OUTPUTTYPE_UVEC4,
642*35238bceSAndroid Build Coastguard Worker };
643*35238bceSAndroid Build Coastguard Worker
644*35238bceSAndroid Build Coastguard Worker return de::getSizedArrayElement<Array::OUTPUTTYPE_LAST>(types, (int)type);
645*35238bceSAndroid Build Coastguard Worker }
646*35238bceSAndroid Build Coastguard Worker
primitiveToGL(Array::Primitive primitive)647*35238bceSAndroid Build Coastguard Worker GLenum ContextArray::primitiveToGL(Array::Primitive primitive)
648*35238bceSAndroid Build Coastguard Worker {
649*35238bceSAndroid Build Coastguard Worker static const GLenum primitives[] = {
650*35238bceSAndroid Build Coastguard Worker GL_POINTS, // PRIMITIVE_POINTS = 0,
651*35238bceSAndroid Build Coastguard Worker GL_TRIANGLES, // PRIMITIVE_TRIANGLES,
652*35238bceSAndroid Build Coastguard Worker GL_TRIANGLE_FAN, // PRIMITIVE_TRIANGLE_FAN,
653*35238bceSAndroid Build Coastguard Worker GL_TRIANGLE_STRIP // PRIMITIVE_TRIANGLE_STRIP,
654*35238bceSAndroid Build Coastguard Worker };
655*35238bceSAndroid Build Coastguard Worker
656*35238bceSAndroid Build Coastguard Worker return de::getSizedArrayElement<Array::PRIMITIVE_LAST>(primitives, (int)primitive);
657*35238bceSAndroid Build Coastguard Worker }
658*35238bceSAndroid Build Coastguard Worker
ContextArrayPack(glu::RenderContext & renderCtx,sglr::Context & drawContext)659*35238bceSAndroid Build Coastguard Worker ContextArrayPack::ContextArrayPack(glu::RenderContext &renderCtx, sglr::Context &drawContext)
660*35238bceSAndroid Build Coastguard Worker : m_renderCtx(renderCtx)
661*35238bceSAndroid Build Coastguard Worker , m_ctx(drawContext)
662*35238bceSAndroid Build Coastguard Worker , m_program(DE_NULL)
663*35238bceSAndroid Build Coastguard Worker , m_screen(std::min(512, renderCtx.getRenderTarget().getWidth()),
664*35238bceSAndroid Build Coastguard Worker std::min(512, renderCtx.getRenderTarget().getHeight()))
665*35238bceSAndroid Build Coastguard Worker {
666*35238bceSAndroid Build Coastguard Worker }
667*35238bceSAndroid Build Coastguard Worker
~ContextArrayPack(void)668*35238bceSAndroid Build Coastguard Worker ContextArrayPack::~ContextArrayPack(void)
669*35238bceSAndroid Build Coastguard Worker {
670*35238bceSAndroid Build Coastguard Worker for (std::vector<ContextArray *>::iterator itr = m_arrays.begin(); itr != m_arrays.end(); itr++)
671*35238bceSAndroid Build Coastguard Worker delete *itr;
672*35238bceSAndroid Build Coastguard Worker
673*35238bceSAndroid Build Coastguard Worker delete m_program;
674*35238bceSAndroid Build Coastguard Worker }
675*35238bceSAndroid Build Coastguard Worker
getArrayCount(void)676*35238bceSAndroid Build Coastguard Worker int ContextArrayPack::getArrayCount(void)
677*35238bceSAndroid Build Coastguard Worker {
678*35238bceSAndroid Build Coastguard Worker return (int)m_arrays.size();
679*35238bceSAndroid Build Coastguard Worker }
680*35238bceSAndroid Build Coastguard Worker
newArray(Array::Storage storage)681*35238bceSAndroid Build Coastguard Worker void ContextArrayPack::newArray(Array::Storage storage)
682*35238bceSAndroid Build Coastguard Worker {
683*35238bceSAndroid Build Coastguard Worker m_arrays.push_back(new ContextArray(storage, m_ctx));
684*35238bceSAndroid Build Coastguard Worker }
685*35238bceSAndroid Build Coastguard Worker
686*35238bceSAndroid Build Coastguard Worker class ContextShaderProgram : public sglr::ShaderProgram
687*35238bceSAndroid Build Coastguard Worker {
688*35238bceSAndroid Build Coastguard Worker public:
689*35238bceSAndroid Build Coastguard Worker ContextShaderProgram(const glu::RenderContext &ctx, const std::vector<ContextArray *> &arrays);
690*35238bceSAndroid Build Coastguard Worker
691*35238bceSAndroid Build Coastguard Worker void shadeVertices(const rr::VertexAttrib *inputs, rr::VertexPacket *const *packets, const int numPackets) const;
692*35238bceSAndroid Build Coastguard Worker void shadeFragments(rr::FragmentPacket *packets, const int numPackets,
693*35238bceSAndroid Build Coastguard Worker const rr::FragmentShadingContext &context) const;
694*35238bceSAndroid Build Coastguard Worker
695*35238bceSAndroid Build Coastguard Worker private:
696*35238bceSAndroid Build Coastguard Worker static std::string genVertexSource(const glu::RenderContext &ctx, const std::vector<ContextArray *> &arrays);
697*35238bceSAndroid Build Coastguard Worker static std::string genFragmentSource(const glu::RenderContext &ctx);
698*35238bceSAndroid Build Coastguard Worker static rr::GenericVecType mapOutputType(const Array::OutputType &type);
699*35238bceSAndroid Build Coastguard Worker static int getComponentCount(const Array::OutputType &type);
700*35238bceSAndroid Build Coastguard Worker
701*35238bceSAndroid Build Coastguard Worker static sglr::pdec::ShaderProgramDeclaration createProgramDeclaration(const glu::RenderContext &ctx,
702*35238bceSAndroid Build Coastguard Worker const std::vector<ContextArray *> &arrays);
703*35238bceSAndroid Build Coastguard Worker
704*35238bceSAndroid Build Coastguard Worker std::vector<int> m_componentCount;
705*35238bceSAndroid Build Coastguard Worker std::vector<rr::GenericVecType> m_attrType;
706*35238bceSAndroid Build Coastguard Worker };
707*35238bceSAndroid Build Coastguard Worker
ContextShaderProgram(const glu::RenderContext & ctx,const std::vector<ContextArray * > & arrays)708*35238bceSAndroid Build Coastguard Worker ContextShaderProgram::ContextShaderProgram(const glu::RenderContext &ctx, const std::vector<ContextArray *> &arrays)
709*35238bceSAndroid Build Coastguard Worker : sglr::ShaderProgram(createProgramDeclaration(ctx, arrays))
710*35238bceSAndroid Build Coastguard Worker , m_componentCount(arrays.size())
711*35238bceSAndroid Build Coastguard Worker , m_attrType(arrays.size())
712*35238bceSAndroid Build Coastguard Worker {
713*35238bceSAndroid Build Coastguard Worker for (int arrayNdx = 0; arrayNdx < (int)arrays.size(); arrayNdx++)
714*35238bceSAndroid Build Coastguard Worker {
715*35238bceSAndroid Build Coastguard Worker m_componentCount[arrayNdx] = getComponentCount(arrays[arrayNdx]->getOutputType());
716*35238bceSAndroid Build Coastguard Worker m_attrType[arrayNdx] = mapOutputType(arrays[arrayNdx]->getOutputType());
717*35238bceSAndroid Build Coastguard Worker }
718*35238bceSAndroid Build Coastguard Worker }
719*35238bceSAndroid Build Coastguard Worker
720*35238bceSAndroid Build Coastguard Worker template <typename T>
calcShaderColorCoord(tcu::Vec2 & coord,tcu::Vec3 & color,const tcu::Vector<T,4> & attribValue,bool isCoordinate,int numComponents)721*35238bceSAndroid Build Coastguard Worker void calcShaderColorCoord(tcu::Vec2 &coord, tcu::Vec3 &color, const tcu::Vector<T, 4> &attribValue, bool isCoordinate,
722*35238bceSAndroid Build Coastguard Worker int numComponents)
723*35238bceSAndroid Build Coastguard Worker {
724*35238bceSAndroid Build Coastguard Worker if (isCoordinate)
725*35238bceSAndroid Build Coastguard Worker switch (numComponents)
726*35238bceSAndroid Build Coastguard Worker {
727*35238bceSAndroid Build Coastguard Worker case 1:
728*35238bceSAndroid Build Coastguard Worker coord = tcu::Vec2((float)attribValue.x(), (float)attribValue.x());
729*35238bceSAndroid Build Coastguard Worker break;
730*35238bceSAndroid Build Coastguard Worker case 2:
731*35238bceSAndroid Build Coastguard Worker coord = tcu::Vec2((float)attribValue.x(), (float)attribValue.y());
732*35238bceSAndroid Build Coastguard Worker break;
733*35238bceSAndroid Build Coastguard Worker case 3:
734*35238bceSAndroid Build Coastguard Worker coord = tcu::Vec2((float)attribValue.x() + (float)attribValue.z(), (float)attribValue.y());
735*35238bceSAndroid Build Coastguard Worker break;
736*35238bceSAndroid Build Coastguard Worker case 4:
737*35238bceSAndroid Build Coastguard Worker coord = tcu::Vec2((float)attribValue.x() + (float)attribValue.z(),
738*35238bceSAndroid Build Coastguard Worker (float)attribValue.y() + (float)attribValue.w());
739*35238bceSAndroid Build Coastguard Worker break;
740*35238bceSAndroid Build Coastguard Worker
741*35238bceSAndroid Build Coastguard Worker default:
742*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
743*35238bceSAndroid Build Coastguard Worker }
744*35238bceSAndroid Build Coastguard Worker else
745*35238bceSAndroid Build Coastguard Worker {
746*35238bceSAndroid Build Coastguard Worker switch (numComponents)
747*35238bceSAndroid Build Coastguard Worker {
748*35238bceSAndroid Build Coastguard Worker case 1:
749*35238bceSAndroid Build Coastguard Worker color = color * (float)attribValue.x();
750*35238bceSAndroid Build Coastguard Worker break;
751*35238bceSAndroid Build Coastguard Worker
752*35238bceSAndroid Build Coastguard Worker case 2:
753*35238bceSAndroid Build Coastguard Worker color.x() = color.x() * (float)attribValue.x();
754*35238bceSAndroid Build Coastguard Worker color.y() = color.y() * (float)attribValue.y();
755*35238bceSAndroid Build Coastguard Worker break;
756*35238bceSAndroid Build Coastguard Worker
757*35238bceSAndroid Build Coastguard Worker case 3:
758*35238bceSAndroid Build Coastguard Worker color.x() = color.x() * (float)attribValue.x();
759*35238bceSAndroid Build Coastguard Worker color.y() = color.y() * (float)attribValue.y();
760*35238bceSAndroid Build Coastguard Worker color.z() = color.z() * (float)attribValue.z();
761*35238bceSAndroid Build Coastguard Worker break;
762*35238bceSAndroid Build Coastguard Worker
763*35238bceSAndroid Build Coastguard Worker case 4:
764*35238bceSAndroid Build Coastguard Worker color.x() = color.x() * (float)attribValue.x() * (float)attribValue.w();
765*35238bceSAndroid Build Coastguard Worker color.y() = color.y() * (float)attribValue.y() * (float)attribValue.w();
766*35238bceSAndroid Build Coastguard Worker color.z() = color.z() * (float)attribValue.z() * (float)attribValue.w();
767*35238bceSAndroid Build Coastguard Worker break;
768*35238bceSAndroid Build Coastguard Worker
769*35238bceSAndroid Build Coastguard Worker default:
770*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
771*35238bceSAndroid Build Coastguard Worker }
772*35238bceSAndroid Build Coastguard Worker }
773*35238bceSAndroid Build Coastguard Worker }
774*35238bceSAndroid Build Coastguard Worker
shadeVertices(const rr::VertexAttrib * inputs,rr::VertexPacket * const * packets,const int numPackets) const775*35238bceSAndroid Build Coastguard Worker void ContextShaderProgram::shadeVertices(const rr::VertexAttrib *inputs, rr::VertexPacket *const *packets,
776*35238bceSAndroid Build Coastguard Worker const int numPackets) const
777*35238bceSAndroid Build Coastguard Worker {
778*35238bceSAndroid Build Coastguard Worker const float u_coordScale = getUniformByName("u_coordScale").value.f;
779*35238bceSAndroid Build Coastguard Worker const float u_colorScale = getUniformByName("u_colorScale").value.f;
780*35238bceSAndroid Build Coastguard Worker
781*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
782*35238bceSAndroid Build Coastguard Worker {
783*35238bceSAndroid Build Coastguard Worker const size_t varyingLocColor = 0;
784*35238bceSAndroid Build Coastguard Worker
785*35238bceSAndroid Build Coastguard Worker rr::VertexPacket &packet = *packets[packetNdx];
786*35238bceSAndroid Build Coastguard Worker
787*35238bceSAndroid Build Coastguard Worker // Calc output color
788*35238bceSAndroid Build Coastguard Worker tcu::Vec2 coord = tcu::Vec2(1.0, 1.0);
789*35238bceSAndroid Build Coastguard Worker tcu::Vec3 color = tcu::Vec3(1.0, 1.0, 1.0);
790*35238bceSAndroid Build Coastguard Worker
791*35238bceSAndroid Build Coastguard Worker for (int attribNdx = 0; attribNdx < (int)m_attrType.size(); attribNdx++)
792*35238bceSAndroid Build Coastguard Worker {
793*35238bceSAndroid Build Coastguard Worker const int numComponents = m_componentCount[attribNdx];
794*35238bceSAndroid Build Coastguard Worker
795*35238bceSAndroid Build Coastguard Worker switch (m_attrType[attribNdx])
796*35238bceSAndroid Build Coastguard Worker {
797*35238bceSAndroid Build Coastguard Worker case rr::GENERICVECTYPE_FLOAT:
798*35238bceSAndroid Build Coastguard Worker calcShaderColorCoord(coord, color,
799*35238bceSAndroid Build Coastguard Worker rr::readVertexAttribFloat(inputs[attribNdx], packet.instanceNdx, packet.vertexNdx),
800*35238bceSAndroid Build Coastguard Worker attribNdx == 0, numComponents);
801*35238bceSAndroid Build Coastguard Worker break;
802*35238bceSAndroid Build Coastguard Worker case rr::GENERICVECTYPE_INT32:
803*35238bceSAndroid Build Coastguard Worker calcShaderColorCoord(coord, color,
804*35238bceSAndroid Build Coastguard Worker rr::readVertexAttribInt(inputs[attribNdx], packet.instanceNdx, packet.vertexNdx),
805*35238bceSAndroid Build Coastguard Worker attribNdx == 0, numComponents);
806*35238bceSAndroid Build Coastguard Worker break;
807*35238bceSAndroid Build Coastguard Worker case rr::GENERICVECTYPE_UINT32:
808*35238bceSAndroid Build Coastguard Worker calcShaderColorCoord(coord, color,
809*35238bceSAndroid Build Coastguard Worker rr::readVertexAttribUint(inputs[attribNdx], packet.instanceNdx, packet.vertexNdx),
810*35238bceSAndroid Build Coastguard Worker attribNdx == 0, numComponents);
811*35238bceSAndroid Build Coastguard Worker break;
812*35238bceSAndroid Build Coastguard Worker default:
813*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
814*35238bceSAndroid Build Coastguard Worker }
815*35238bceSAndroid Build Coastguard Worker }
816*35238bceSAndroid Build Coastguard Worker
817*35238bceSAndroid Build Coastguard Worker // Transform position
818*35238bceSAndroid Build Coastguard Worker {
819*35238bceSAndroid Build Coastguard Worker packet.position = tcu::Vec4(u_coordScale * coord.x(), u_coordScale * coord.y(), 1.0f, 1.0f);
820*35238bceSAndroid Build Coastguard Worker }
821*35238bceSAndroid Build Coastguard Worker
822*35238bceSAndroid Build Coastguard Worker // Pass color to FS
823*35238bceSAndroid Build Coastguard Worker {
824*35238bceSAndroid Build Coastguard Worker packet.outputs[varyingLocColor] =
825*35238bceSAndroid Build Coastguard Worker tcu::Vec4(u_colorScale * color.x(), u_colorScale * color.y(), u_colorScale * color.z(), 1.0f);
826*35238bceSAndroid Build Coastguard Worker }
827*35238bceSAndroid Build Coastguard Worker }
828*35238bceSAndroid Build Coastguard Worker }
829*35238bceSAndroid Build Coastguard Worker
shadeFragments(rr::FragmentPacket * packets,const int numPackets,const rr::FragmentShadingContext & context) const830*35238bceSAndroid Build Coastguard Worker void ContextShaderProgram::shadeFragments(rr::FragmentPacket *packets, const int numPackets,
831*35238bceSAndroid Build Coastguard Worker const rr::FragmentShadingContext &context) const
832*35238bceSAndroid Build Coastguard Worker {
833*35238bceSAndroid Build Coastguard Worker const size_t varyingLocColor = 0;
834*35238bceSAndroid Build Coastguard Worker
835*35238bceSAndroid Build Coastguard Worker // Triangles are flashaded
836*35238bceSAndroid Build Coastguard Worker tcu::Vec4 color = rr::readTriangleVarying<float>(packets[0], context, varyingLocColor, 0);
837*35238bceSAndroid Build Coastguard Worker
838*35238bceSAndroid Build Coastguard Worker for (int packetNdx = 0; packetNdx < numPackets; ++packetNdx)
839*35238bceSAndroid Build Coastguard Worker for (int fragNdx = 0; fragNdx < 4; ++fragNdx)
840*35238bceSAndroid Build Coastguard Worker rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, color);
841*35238bceSAndroid Build Coastguard Worker }
842*35238bceSAndroid Build Coastguard Worker
genVertexSource(const glu::RenderContext & ctx,const std::vector<ContextArray * > & arrays)843*35238bceSAndroid Build Coastguard Worker std::string ContextShaderProgram::genVertexSource(const glu::RenderContext &ctx,
844*35238bceSAndroid Build Coastguard Worker const std::vector<ContextArray *> &arrays)
845*35238bceSAndroid Build Coastguard Worker {
846*35238bceSAndroid Build Coastguard Worker std::stringstream vertexShaderTmpl;
847*35238bceSAndroid Build Coastguard Worker std::map<std::string, std::string> params;
848*35238bceSAndroid Build Coastguard Worker
849*35238bceSAndroid Build Coastguard Worker if (glu::isGLSLVersionSupported(ctx.getType(), glu::GLSL_VERSION_300_ES))
850*35238bceSAndroid Build Coastguard Worker {
851*35238bceSAndroid Build Coastguard Worker params["VTX_IN"] = "in";
852*35238bceSAndroid Build Coastguard Worker params["VTX_OUT"] = "out";
853*35238bceSAndroid Build Coastguard Worker params["FRAG_IN"] = "in";
854*35238bceSAndroid Build Coastguard Worker params["FRAG_COLOR"] = "dEQP_FragColor";
855*35238bceSAndroid Build Coastguard Worker params["VTX_HDR"] = "#version 300 es\n";
856*35238bceSAndroid Build Coastguard Worker params["FRAG_HDR"] = "#version 300 es\nlayout(location = 0) out mediump vec4 dEQP_FragColor;\n";
857*35238bceSAndroid Build Coastguard Worker }
858*35238bceSAndroid Build Coastguard Worker else if (glu::isGLSLVersionSupported(ctx.getType(), glu::GLSL_VERSION_100_ES))
859*35238bceSAndroid Build Coastguard Worker {
860*35238bceSAndroid Build Coastguard Worker params["VTX_IN"] = "attribute";
861*35238bceSAndroid Build Coastguard Worker params["VTX_OUT"] = "varying";
862*35238bceSAndroid Build Coastguard Worker params["FRAG_IN"] = "varying";
863*35238bceSAndroid Build Coastguard Worker params["FRAG_COLOR"] = "gl_FragColor";
864*35238bceSAndroid Build Coastguard Worker params["VTX_HDR"] = "";
865*35238bceSAndroid Build Coastguard Worker params["FRAG_HDR"] = "";
866*35238bceSAndroid Build Coastguard Worker }
867*35238bceSAndroid Build Coastguard Worker else if (glu::isGLSLVersionSupported(ctx.getType(), glu::GLSL_VERSION_330))
868*35238bceSAndroid Build Coastguard Worker {
869*35238bceSAndroid Build Coastguard Worker params["VTX_IN"] = "in";
870*35238bceSAndroid Build Coastguard Worker params["VTX_OUT"] = "out";
871*35238bceSAndroid Build Coastguard Worker params["FRAG_IN"] = "in";
872*35238bceSAndroid Build Coastguard Worker params["FRAG_COLOR"] = "dEQP_FragColor";
873*35238bceSAndroid Build Coastguard Worker params["VTX_HDR"] = "#version 330\n";
874*35238bceSAndroid Build Coastguard Worker params["FRAG_HDR"] = "#version 330\nlayout(location = 0) out mediump vec4 dEQP_FragColor;\n";
875*35238bceSAndroid Build Coastguard Worker }
876*35238bceSAndroid Build Coastguard Worker else
877*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
878*35238bceSAndroid Build Coastguard Worker
879*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "${VTX_HDR}";
880*35238bceSAndroid Build Coastguard Worker
881*35238bceSAndroid Build Coastguard Worker for (int arrayNdx = 0; arrayNdx < (int)arrays.size(); arrayNdx++)
882*35238bceSAndroid Build Coastguard Worker {
883*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "${VTX_IN} highp " << ContextArray::outputTypeToGLType(arrays[arrayNdx]->getOutputType())
884*35238bceSAndroid Build Coastguard Worker << " a_" << arrays[arrayNdx]->getAttribNdx() << ";\n";
885*35238bceSAndroid Build Coastguard Worker }
886*35238bceSAndroid Build Coastguard Worker
887*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "uniform highp float u_coordScale;\n"
888*35238bceSAndroid Build Coastguard Worker "uniform highp float u_colorScale;\n"
889*35238bceSAndroid Build Coastguard Worker "${VTX_OUT} mediump vec4 v_color;\n"
890*35238bceSAndroid Build Coastguard Worker "void main(void)\n"
891*35238bceSAndroid Build Coastguard Worker "{\n"
892*35238bceSAndroid Build Coastguard Worker "\tgl_PointSize = 1.0;\n"
893*35238bceSAndroid Build Coastguard Worker "\thighp vec2 coord = vec2(1.0, 1.0);\n"
894*35238bceSAndroid Build Coastguard Worker "\thighp vec3 color = vec3(1.0, 1.0, 1.0);\n";
895*35238bceSAndroid Build Coastguard Worker
896*35238bceSAndroid Build Coastguard Worker for (int arrayNdx = 0; arrayNdx < (int)arrays.size(); arrayNdx++)
897*35238bceSAndroid Build Coastguard Worker {
898*35238bceSAndroid Build Coastguard Worker if (arrays[arrayNdx]->getAttribNdx() == 0)
899*35238bceSAndroid Build Coastguard Worker {
900*35238bceSAndroid Build Coastguard Worker switch (arrays[arrayNdx]->getOutputType())
901*35238bceSAndroid Build Coastguard Worker {
902*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_FLOAT):
903*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "\tcoord = vec2(a_0);\n";
904*35238bceSAndroid Build Coastguard Worker break;
905*35238bceSAndroid Build Coastguard Worker
906*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_VEC2):
907*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "\tcoord = a_0.xy;\n";
908*35238bceSAndroid Build Coastguard Worker break;
909*35238bceSAndroid Build Coastguard Worker
910*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_VEC3):
911*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "\tcoord = a_0.xy;\n"
912*35238bceSAndroid Build Coastguard Worker "\tcoord.x = coord.x + a_0.z;\n";
913*35238bceSAndroid Build Coastguard Worker break;
914*35238bceSAndroid Build Coastguard Worker
915*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_VEC4):
916*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "\tcoord = a_0.xy;\n"
917*35238bceSAndroid Build Coastguard Worker "\tcoord += a_0.zw;\n";
918*35238bceSAndroid Build Coastguard Worker break;
919*35238bceSAndroid Build Coastguard Worker
920*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_IVEC2):
921*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_UVEC2):
922*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "\tcoord = vec2(a_0.xy);\n";
923*35238bceSAndroid Build Coastguard Worker break;
924*35238bceSAndroid Build Coastguard Worker
925*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_IVEC3):
926*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_UVEC3):
927*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "\tcoord = vec2(a_0.xy);\n"
928*35238bceSAndroid Build Coastguard Worker "\tcoord.x = coord.x + float(a_0.z);\n";
929*35238bceSAndroid Build Coastguard Worker break;
930*35238bceSAndroid Build Coastguard Worker
931*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_IVEC4):
932*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_UVEC4):
933*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "\tcoord = vec2(a_0.xy);\n"
934*35238bceSAndroid Build Coastguard Worker "\tcoord += vec2(a_0.zw);\n";
935*35238bceSAndroid Build Coastguard Worker break;
936*35238bceSAndroid Build Coastguard Worker
937*35238bceSAndroid Build Coastguard Worker default:
938*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
939*35238bceSAndroid Build Coastguard Worker break;
940*35238bceSAndroid Build Coastguard Worker }
941*35238bceSAndroid Build Coastguard Worker continue;
942*35238bceSAndroid Build Coastguard Worker }
943*35238bceSAndroid Build Coastguard Worker
944*35238bceSAndroid Build Coastguard Worker switch (arrays[arrayNdx]->getOutputType())
945*35238bceSAndroid Build Coastguard Worker {
946*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_FLOAT):
947*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "\tcolor = color * a_" << arrays[arrayNdx]->getAttribNdx() << ";\n";
948*35238bceSAndroid Build Coastguard Worker break;
949*35238bceSAndroid Build Coastguard Worker
950*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_VEC2):
951*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "\tcolor.rg = color.rg * a_" << arrays[arrayNdx]->getAttribNdx() << ".xy;\n";
952*35238bceSAndroid Build Coastguard Worker break;
953*35238bceSAndroid Build Coastguard Worker
954*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_VEC3):
955*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "\tcolor = color.rgb * a_" << arrays[arrayNdx]->getAttribNdx() << ".xyz;\n";
956*35238bceSAndroid Build Coastguard Worker break;
957*35238bceSAndroid Build Coastguard Worker
958*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_VEC4):
959*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "\tcolor = color.rgb * a_" << arrays[arrayNdx]->getAttribNdx() << ".xyz * a_"
960*35238bceSAndroid Build Coastguard Worker << arrays[arrayNdx]->getAttribNdx() << ".w;\n";
961*35238bceSAndroid Build Coastguard Worker break;
962*35238bceSAndroid Build Coastguard Worker
963*35238bceSAndroid Build Coastguard Worker default:
964*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
965*35238bceSAndroid Build Coastguard Worker break;
966*35238bceSAndroid Build Coastguard Worker }
967*35238bceSAndroid Build Coastguard Worker }
968*35238bceSAndroid Build Coastguard Worker
969*35238bceSAndroid Build Coastguard Worker vertexShaderTmpl << "\tv_color = vec4(u_colorScale * color, 1.0);\n"
970*35238bceSAndroid Build Coastguard Worker "\tgl_Position = vec4(u_coordScale * coord, 1.0, 1.0);\n"
971*35238bceSAndroid Build Coastguard Worker "}\n";
972*35238bceSAndroid Build Coastguard Worker
973*35238bceSAndroid Build Coastguard Worker return tcu::StringTemplate(vertexShaderTmpl.str().c_str()).specialize(params);
974*35238bceSAndroid Build Coastguard Worker }
975*35238bceSAndroid Build Coastguard Worker
genFragmentSource(const glu::RenderContext & ctx)976*35238bceSAndroid Build Coastguard Worker std::string ContextShaderProgram::genFragmentSource(const glu::RenderContext &ctx)
977*35238bceSAndroid Build Coastguard Worker {
978*35238bceSAndroid Build Coastguard Worker std::map<std::string, std::string> params;
979*35238bceSAndroid Build Coastguard Worker
980*35238bceSAndroid Build Coastguard Worker if (glu::isGLSLVersionSupported(ctx.getType(), glu::GLSL_VERSION_300_ES))
981*35238bceSAndroid Build Coastguard Worker {
982*35238bceSAndroid Build Coastguard Worker params["VTX_IN"] = "in";
983*35238bceSAndroid Build Coastguard Worker params["VTX_OUT"] = "out";
984*35238bceSAndroid Build Coastguard Worker params["FRAG_IN"] = "in";
985*35238bceSAndroid Build Coastguard Worker params["FRAG_COLOR"] = "dEQP_FragColor";
986*35238bceSAndroid Build Coastguard Worker params["VTX_HDR"] = "#version 300 es\n";
987*35238bceSAndroid Build Coastguard Worker params["FRAG_HDR"] = "#version 300 es\nlayout(location = 0) out mediump vec4 dEQP_FragColor;\n";
988*35238bceSAndroid Build Coastguard Worker }
989*35238bceSAndroid Build Coastguard Worker else if (glu::isGLSLVersionSupported(ctx.getType(), glu::GLSL_VERSION_100_ES))
990*35238bceSAndroid Build Coastguard Worker {
991*35238bceSAndroid Build Coastguard Worker params["VTX_IN"] = "attribute";
992*35238bceSAndroid Build Coastguard Worker params["VTX_OUT"] = "varying";
993*35238bceSAndroid Build Coastguard Worker params["FRAG_IN"] = "varying";
994*35238bceSAndroid Build Coastguard Worker params["FRAG_COLOR"] = "gl_FragColor";
995*35238bceSAndroid Build Coastguard Worker params["VTX_HDR"] = "";
996*35238bceSAndroid Build Coastguard Worker params["FRAG_HDR"] = "";
997*35238bceSAndroid Build Coastguard Worker }
998*35238bceSAndroid Build Coastguard Worker else if (glu::isGLSLVersionSupported(ctx.getType(), glu::GLSL_VERSION_330))
999*35238bceSAndroid Build Coastguard Worker {
1000*35238bceSAndroid Build Coastguard Worker params["VTX_IN"] = "in";
1001*35238bceSAndroid Build Coastguard Worker params["VTX_OUT"] = "out";
1002*35238bceSAndroid Build Coastguard Worker params["FRAG_IN"] = "in";
1003*35238bceSAndroid Build Coastguard Worker params["FRAG_COLOR"] = "dEQP_FragColor";
1004*35238bceSAndroid Build Coastguard Worker params["VTX_HDR"] = "#version 330\n";
1005*35238bceSAndroid Build Coastguard Worker params["FRAG_HDR"] = "#version 330\nlayout(location = 0) out mediump vec4 dEQP_FragColor;\n";
1006*35238bceSAndroid Build Coastguard Worker }
1007*35238bceSAndroid Build Coastguard Worker else
1008*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1009*35238bceSAndroid Build Coastguard Worker
1010*35238bceSAndroid Build Coastguard Worker static const char *fragmentShaderTmpl = "${FRAG_HDR}"
1011*35238bceSAndroid Build Coastguard Worker "${FRAG_IN} mediump vec4 v_color;\n"
1012*35238bceSAndroid Build Coastguard Worker "void main(void)\n"
1013*35238bceSAndroid Build Coastguard Worker "{\n"
1014*35238bceSAndroid Build Coastguard Worker "\t${FRAG_COLOR} = v_color;\n"
1015*35238bceSAndroid Build Coastguard Worker "}\n";
1016*35238bceSAndroid Build Coastguard Worker
1017*35238bceSAndroid Build Coastguard Worker return tcu::StringTemplate(fragmentShaderTmpl).specialize(params);
1018*35238bceSAndroid Build Coastguard Worker }
1019*35238bceSAndroid Build Coastguard Worker
mapOutputType(const Array::OutputType & type)1020*35238bceSAndroid Build Coastguard Worker rr::GenericVecType ContextShaderProgram::mapOutputType(const Array::OutputType &type)
1021*35238bceSAndroid Build Coastguard Worker {
1022*35238bceSAndroid Build Coastguard Worker switch (type)
1023*35238bceSAndroid Build Coastguard Worker {
1024*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_FLOAT):
1025*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_VEC2):
1026*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_VEC3):
1027*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_VEC4):
1028*35238bceSAndroid Build Coastguard Worker return rr::GENERICVECTYPE_FLOAT;
1029*35238bceSAndroid Build Coastguard Worker
1030*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_INT):
1031*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_IVEC2):
1032*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_IVEC3):
1033*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_IVEC4):
1034*35238bceSAndroid Build Coastguard Worker return rr::GENERICVECTYPE_INT32;
1035*35238bceSAndroid Build Coastguard Worker
1036*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_UINT):
1037*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_UVEC2):
1038*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_UVEC3):
1039*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_UVEC4):
1040*35238bceSAndroid Build Coastguard Worker return rr::GENERICVECTYPE_UINT32;
1041*35238bceSAndroid Build Coastguard Worker
1042*35238bceSAndroid Build Coastguard Worker default:
1043*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1044*35238bceSAndroid Build Coastguard Worker return rr::GENERICVECTYPE_LAST;
1045*35238bceSAndroid Build Coastguard Worker }
1046*35238bceSAndroid Build Coastguard Worker }
1047*35238bceSAndroid Build Coastguard Worker
getComponentCount(const Array::OutputType & type)1048*35238bceSAndroid Build Coastguard Worker int ContextShaderProgram::getComponentCount(const Array::OutputType &type)
1049*35238bceSAndroid Build Coastguard Worker {
1050*35238bceSAndroid Build Coastguard Worker switch (type)
1051*35238bceSAndroid Build Coastguard Worker {
1052*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_FLOAT):
1053*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_INT):
1054*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_UINT):
1055*35238bceSAndroid Build Coastguard Worker return 1;
1056*35238bceSAndroid Build Coastguard Worker
1057*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_VEC2):
1058*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_IVEC2):
1059*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_UVEC2):
1060*35238bceSAndroid Build Coastguard Worker return 2;
1061*35238bceSAndroid Build Coastguard Worker
1062*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_VEC3):
1063*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_IVEC3):
1064*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_UVEC3):
1065*35238bceSAndroid Build Coastguard Worker return 3;
1066*35238bceSAndroid Build Coastguard Worker
1067*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_VEC4):
1068*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_IVEC4):
1069*35238bceSAndroid Build Coastguard Worker case (Array::OUTPUTTYPE_UVEC4):
1070*35238bceSAndroid Build Coastguard Worker return 4;
1071*35238bceSAndroid Build Coastguard Worker
1072*35238bceSAndroid Build Coastguard Worker default:
1073*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1074*35238bceSAndroid Build Coastguard Worker return 0;
1075*35238bceSAndroid Build Coastguard Worker }
1076*35238bceSAndroid Build Coastguard Worker }
1077*35238bceSAndroid Build Coastguard Worker
createProgramDeclaration(const glu::RenderContext & ctx,const std::vector<ContextArray * > & arrays)1078*35238bceSAndroid Build Coastguard Worker sglr::pdec::ShaderProgramDeclaration ContextShaderProgram::createProgramDeclaration(
1079*35238bceSAndroid Build Coastguard Worker const glu::RenderContext &ctx, const std::vector<ContextArray *> &arrays)
1080*35238bceSAndroid Build Coastguard Worker {
1081*35238bceSAndroid Build Coastguard Worker sglr::pdec::ShaderProgramDeclaration decl;
1082*35238bceSAndroid Build Coastguard Worker
1083*35238bceSAndroid Build Coastguard Worker for (int arrayNdx = 0; arrayNdx < (int)arrays.size(); arrayNdx++)
1084*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::VertexAttribute(std::string("a_") + de::toString(arrayNdx),
1085*35238bceSAndroid Build Coastguard Worker mapOutputType(arrays[arrayNdx]->getOutputType()));
1086*35238bceSAndroid Build Coastguard Worker
1087*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::VertexToFragmentVarying(rr::GENERICVECTYPE_FLOAT);
1088*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::FragmentOutput(rr::GENERICVECTYPE_FLOAT);
1089*35238bceSAndroid Build Coastguard Worker
1090*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::VertexSource(genVertexSource(ctx, arrays));
1091*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::FragmentSource(genFragmentSource(ctx));
1092*35238bceSAndroid Build Coastguard Worker
1093*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::Uniform("u_coordScale", glu::TYPE_FLOAT);
1094*35238bceSAndroid Build Coastguard Worker decl << sglr::pdec::Uniform("u_colorScale", glu::TYPE_FLOAT);
1095*35238bceSAndroid Build Coastguard Worker
1096*35238bceSAndroid Build Coastguard Worker return decl;
1097*35238bceSAndroid Build Coastguard Worker }
1098*35238bceSAndroid Build Coastguard Worker
updateProgram(void)1099*35238bceSAndroid Build Coastguard Worker void ContextArrayPack::updateProgram(void)
1100*35238bceSAndroid Build Coastguard Worker {
1101*35238bceSAndroid Build Coastguard Worker delete m_program;
1102*35238bceSAndroid Build Coastguard Worker m_program = new ContextShaderProgram(m_renderCtx, m_arrays);
1103*35238bceSAndroid Build Coastguard Worker }
1104*35238bceSAndroid Build Coastguard Worker
render(Array::Primitive primitive,int firstVertex,int vertexCount,bool useVao,float coordScale,float colorScale)1105*35238bceSAndroid Build Coastguard Worker void ContextArrayPack::render(Array::Primitive primitive, int firstVertex, int vertexCount, bool useVao,
1106*35238bceSAndroid Build Coastguard Worker float coordScale, float colorScale)
1107*35238bceSAndroid Build Coastguard Worker {
1108*35238bceSAndroid Build Coastguard Worker uint32_t program = 0;
1109*35238bceSAndroid Build Coastguard Worker uint32_t vaoId = 0;
1110*35238bceSAndroid Build Coastguard Worker
1111*35238bceSAndroid Build Coastguard Worker updateProgram();
1112*35238bceSAndroid Build Coastguard Worker
1113*35238bceSAndroid Build Coastguard Worker m_ctx.viewport(0, 0, m_screen.getWidth(), m_screen.getHeight());
1114*35238bceSAndroid Build Coastguard Worker m_ctx.clearColor(0.0, 0.0, 0.0, 1.0);
1115*35238bceSAndroid Build Coastguard Worker m_ctx.clear(GL_COLOR_BUFFER_BIT);
1116*35238bceSAndroid Build Coastguard Worker
1117*35238bceSAndroid Build Coastguard Worker program = m_ctx.createProgram(m_program);
1118*35238bceSAndroid Build Coastguard Worker
1119*35238bceSAndroid Build Coastguard Worker m_ctx.useProgram(program);
1120*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glUseProgram()");
1121*35238bceSAndroid Build Coastguard Worker
1122*35238bceSAndroid Build Coastguard Worker m_ctx.uniform1f(m_ctx.getUniformLocation(program, "u_coordScale"), coordScale);
1123*35238bceSAndroid Build Coastguard Worker m_ctx.uniform1f(m_ctx.getUniformLocation(program, "u_colorScale"), colorScale);
1124*35238bceSAndroid Build Coastguard Worker
1125*35238bceSAndroid Build Coastguard Worker if (useVao)
1126*35238bceSAndroid Build Coastguard Worker {
1127*35238bceSAndroid Build Coastguard Worker m_ctx.genVertexArrays(1, &vaoId);
1128*35238bceSAndroid Build Coastguard Worker m_ctx.bindVertexArray(vaoId);
1129*35238bceSAndroid Build Coastguard Worker }
1130*35238bceSAndroid Build Coastguard Worker
1131*35238bceSAndroid Build Coastguard Worker for (int arrayNdx = 0; arrayNdx < (int)m_arrays.size(); arrayNdx++)
1132*35238bceSAndroid Build Coastguard Worker {
1133*35238bceSAndroid Build Coastguard Worker if (m_arrays[arrayNdx]->isBound())
1134*35238bceSAndroid Build Coastguard Worker {
1135*35238bceSAndroid Build Coastguard Worker std::stringstream attribName;
1136*35238bceSAndroid Build Coastguard Worker attribName << "a_" << m_arrays[arrayNdx]->getAttribNdx();
1137*35238bceSAndroid Build Coastguard Worker
1138*35238bceSAndroid Build Coastguard Worker uint32_t loc = m_ctx.getAttribLocation(program, attribName.str().c_str());
1139*35238bceSAndroid Build Coastguard Worker m_ctx.enableVertexAttribArray(loc);
1140*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glEnableVertexAttribArray()");
1141*35238bceSAndroid Build Coastguard Worker
1142*35238bceSAndroid Build Coastguard Worker m_arrays[arrayNdx]->glBind(loc);
1143*35238bceSAndroid Build Coastguard Worker }
1144*35238bceSAndroid Build Coastguard Worker }
1145*35238bceSAndroid Build Coastguard Worker
1146*35238bceSAndroid Build Coastguard Worker DE_ASSERT((firstVertex % 6) == 0);
1147*35238bceSAndroid Build Coastguard Worker m_ctx.drawArrays(ContextArray::primitiveToGL(primitive), firstVertex, vertexCount - firstVertex);
1148*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glDrawArrays()");
1149*35238bceSAndroid Build Coastguard Worker
1150*35238bceSAndroid Build Coastguard Worker for (int arrayNdx = 0; arrayNdx < (int)m_arrays.size(); arrayNdx++)
1151*35238bceSAndroid Build Coastguard Worker {
1152*35238bceSAndroid Build Coastguard Worker if (m_arrays[arrayNdx]->isBound())
1153*35238bceSAndroid Build Coastguard Worker {
1154*35238bceSAndroid Build Coastguard Worker std::stringstream attribName;
1155*35238bceSAndroid Build Coastguard Worker attribName << "a_" << m_arrays[arrayNdx]->getAttribNdx();
1156*35238bceSAndroid Build Coastguard Worker
1157*35238bceSAndroid Build Coastguard Worker uint32_t loc = m_ctx.getAttribLocation(program, attribName.str().c_str());
1158*35238bceSAndroid Build Coastguard Worker
1159*35238bceSAndroid Build Coastguard Worker m_ctx.disableVertexAttribArray(loc);
1160*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(m_ctx.getError(), "glDisableVertexAttribArray()");
1161*35238bceSAndroid Build Coastguard Worker }
1162*35238bceSAndroid Build Coastguard Worker }
1163*35238bceSAndroid Build Coastguard Worker
1164*35238bceSAndroid Build Coastguard Worker if (useVao)
1165*35238bceSAndroid Build Coastguard Worker m_ctx.deleteVertexArrays(1, &vaoId);
1166*35238bceSAndroid Build Coastguard Worker
1167*35238bceSAndroid Build Coastguard Worker m_ctx.deleteProgram(program);
1168*35238bceSAndroid Build Coastguard Worker m_ctx.useProgram(0);
1169*35238bceSAndroid Build Coastguard Worker m_ctx.readPixels(m_screen, 0, 0, m_screen.getWidth(), m_screen.getHeight());
1170*35238bceSAndroid Build Coastguard Worker }
1171*35238bceSAndroid Build Coastguard Worker
1172*35238bceSAndroid Build Coastguard Worker // GLValue
1173*35238bceSAndroid Build Coastguard Worker
getMaxValue(Array::InputType type)1174*35238bceSAndroid Build Coastguard Worker GLValue GLValue::getMaxValue(Array::InputType type)
1175*35238bceSAndroid Build Coastguard Worker {
1176*35238bceSAndroid Build Coastguard Worker GLValue rangesHi[(int)Array::INPUTTYPE_LAST];
1177*35238bceSAndroid Build Coastguard Worker
1178*35238bceSAndroid Build Coastguard Worker rangesHi[(int)Array::INPUTTYPE_FLOAT] = GLValue(Float::create(127.0f));
1179*35238bceSAndroid Build Coastguard Worker rangesHi[(int)Array::INPUTTYPE_DOUBLE] = GLValue(Double::create(127.0f));
1180*35238bceSAndroid Build Coastguard Worker rangesHi[(int)Array::INPUTTYPE_BYTE] = GLValue(Byte::create(127));
1181*35238bceSAndroid Build Coastguard Worker rangesHi[(int)Array::INPUTTYPE_UNSIGNED_BYTE] = GLValue(Ubyte::create(255));
1182*35238bceSAndroid Build Coastguard Worker rangesHi[(int)Array::INPUTTYPE_UNSIGNED_SHORT] = GLValue(Ushort::create(65530));
1183*35238bceSAndroid Build Coastguard Worker rangesHi[(int)Array::INPUTTYPE_SHORT] = GLValue(Short::create(32760));
1184*35238bceSAndroid Build Coastguard Worker rangesHi[(int)Array::INPUTTYPE_FIXED] = GLValue(Fixed::create(32760));
1185*35238bceSAndroid Build Coastguard Worker rangesHi[(int)Array::INPUTTYPE_INT] = GLValue(Int::create(2147483647));
1186*35238bceSAndroid Build Coastguard Worker rangesHi[(int)Array::INPUTTYPE_UNSIGNED_INT] = GLValue(Uint::create(4294967295u));
1187*35238bceSAndroid Build Coastguard Worker rangesHi[(int)Array::INPUTTYPE_HALF] = GLValue(Half::create(256.0f));
1188*35238bceSAndroid Build Coastguard Worker
1189*35238bceSAndroid Build Coastguard Worker return rangesHi[(int)type];
1190*35238bceSAndroid Build Coastguard Worker }
1191*35238bceSAndroid Build Coastguard Worker
getMinValue(Array::InputType type)1192*35238bceSAndroid Build Coastguard Worker GLValue GLValue::getMinValue(Array::InputType type)
1193*35238bceSAndroid Build Coastguard Worker {
1194*35238bceSAndroid Build Coastguard Worker GLValue rangesLo[(int)Array::INPUTTYPE_LAST];
1195*35238bceSAndroid Build Coastguard Worker
1196*35238bceSAndroid Build Coastguard Worker rangesLo[(int)Array::INPUTTYPE_FLOAT] = GLValue(Float::create(-127.0f));
1197*35238bceSAndroid Build Coastguard Worker rangesLo[(int)Array::INPUTTYPE_DOUBLE] = GLValue(Double::create(-127.0f));
1198*35238bceSAndroid Build Coastguard Worker rangesLo[(int)Array::INPUTTYPE_BYTE] = GLValue(Byte::create(-127));
1199*35238bceSAndroid Build Coastguard Worker rangesLo[(int)Array::INPUTTYPE_UNSIGNED_BYTE] = GLValue(Ubyte::create(0));
1200*35238bceSAndroid Build Coastguard Worker rangesLo[(int)Array::INPUTTYPE_UNSIGNED_SHORT] = GLValue(Ushort::create(0));
1201*35238bceSAndroid Build Coastguard Worker rangesLo[(int)Array::INPUTTYPE_SHORT] = GLValue(Short::create(-32760));
1202*35238bceSAndroid Build Coastguard Worker rangesLo[(int)Array::INPUTTYPE_FIXED] = GLValue(Fixed::create(-32760));
1203*35238bceSAndroid Build Coastguard Worker rangesLo[(int)Array::INPUTTYPE_INT] = GLValue(Int::create(-2147483647));
1204*35238bceSAndroid Build Coastguard Worker rangesLo[(int)Array::INPUTTYPE_UNSIGNED_INT] = GLValue(Uint::create(0));
1205*35238bceSAndroid Build Coastguard Worker rangesLo[(int)Array::INPUTTYPE_HALF] = GLValue(Half::create(-256.0f));
1206*35238bceSAndroid Build Coastguard Worker
1207*35238bceSAndroid Build Coastguard Worker return rangesLo[(int)type];
1208*35238bceSAndroid Build Coastguard Worker }
1209*35238bceSAndroid Build Coastguard Worker
toFloat(void) const1210*35238bceSAndroid Build Coastguard Worker float GLValue::toFloat(void) const
1211*35238bceSAndroid Build Coastguard Worker {
1212*35238bceSAndroid Build Coastguard Worker switch (type)
1213*35238bceSAndroid Build Coastguard Worker {
1214*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_FLOAT:
1215*35238bceSAndroid Build Coastguard Worker return fl.getValue();
1216*35238bceSAndroid Build Coastguard Worker
1217*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_BYTE:
1218*35238bceSAndroid Build Coastguard Worker return b.getValue();
1219*35238bceSAndroid Build Coastguard Worker
1220*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_UNSIGNED_BYTE:
1221*35238bceSAndroid Build Coastguard Worker return ub.getValue();
1222*35238bceSAndroid Build Coastguard Worker
1223*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_SHORT:
1224*35238bceSAndroid Build Coastguard Worker return s.getValue();
1225*35238bceSAndroid Build Coastguard Worker
1226*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_UNSIGNED_SHORT:
1227*35238bceSAndroid Build Coastguard Worker return us.getValue();
1228*35238bceSAndroid Build Coastguard Worker
1229*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_FIXED:
1230*35238bceSAndroid Build Coastguard Worker {
1231*35238bceSAndroid Build Coastguard Worker int maxValue = 65536;
1232*35238bceSAndroid Build Coastguard Worker return (float)(double(2 * fi.getValue() + 1) / (maxValue - 1));
1233*35238bceSAndroid Build Coastguard Worker }
1234*35238bceSAndroid Build Coastguard Worker
1235*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_UNSIGNED_INT:
1236*35238bceSAndroid Build Coastguard Worker return (float)ui.getValue();
1237*35238bceSAndroid Build Coastguard Worker
1238*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_INT:
1239*35238bceSAndroid Build Coastguard Worker return (float)i.getValue();
1240*35238bceSAndroid Build Coastguard Worker
1241*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_HALF:
1242*35238bceSAndroid Build Coastguard Worker return h.to<float>();
1243*35238bceSAndroid Build Coastguard Worker
1244*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_DOUBLE:
1245*35238bceSAndroid Build Coastguard Worker return (float)d.getValue();
1246*35238bceSAndroid Build Coastguard Worker
1247*35238bceSAndroid Build Coastguard Worker default:
1248*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1249*35238bceSAndroid Build Coastguard Worker return 0.0f;
1250*35238bceSAndroid Build Coastguard Worker }
1251*35238bceSAndroid Build Coastguard Worker }
1252*35238bceSAndroid Build Coastguard Worker
1253*35238bceSAndroid Build Coastguard Worker class RandomArrayGenerator
1254*35238bceSAndroid Build Coastguard Worker {
1255*35238bceSAndroid Build Coastguard Worker public:
1256*35238bceSAndroid Build Coastguard Worker static char *generateArray(int seed, GLValue min, GLValue max, int count, int componentCount, int stride,
1257*35238bceSAndroid Build Coastguard Worker Array::InputType type);
1258*35238bceSAndroid Build Coastguard Worker static char *generateQuads(int seed, int count, int componentCount, int offset, int stride,
1259*35238bceSAndroid Build Coastguard Worker Array::Primitive primitive, Array::InputType type, GLValue min, GLValue max,
1260*35238bceSAndroid Build Coastguard Worker float gridSize);
1261*35238bceSAndroid Build Coastguard Worker static char *generatePerQuad(int seed, int count, int componentCount, int stride, Array::Primitive primitive,
1262*35238bceSAndroid Build Coastguard Worker Array::InputType type, GLValue min, GLValue max);
1263*35238bceSAndroid Build Coastguard Worker
1264*35238bceSAndroid Build Coastguard Worker private:
1265*35238bceSAndroid Build Coastguard Worker template <typename T>
1266*35238bceSAndroid Build Coastguard Worker static char *createQuads(int seed, int count, int componentCount, int offset, int stride,
1267*35238bceSAndroid Build Coastguard Worker Array::Primitive primitive, T min, T max, float gridSize);
1268*35238bceSAndroid Build Coastguard Worker template <typename T>
1269*35238bceSAndroid Build Coastguard Worker static char *createPerQuads(int seed, int count, int componentCount, int stride, Array::Primitive primitive, T min,
1270*35238bceSAndroid Build Coastguard Worker T max);
1271*35238bceSAndroid Build Coastguard Worker static char *createQuadsPacked(int seed, int count, int componentCount, int offset, int stride,
1272*35238bceSAndroid Build Coastguard Worker Array::Primitive primitive);
1273*35238bceSAndroid Build Coastguard Worker static void setData(char *data, Array::InputType type, deRandom &rnd, GLValue min, GLValue max);
1274*35238bceSAndroid Build Coastguard Worker };
1275*35238bceSAndroid Build Coastguard Worker
setData(char * data,Array::InputType type,deRandom & rnd,GLValue min,GLValue max)1276*35238bceSAndroid Build Coastguard Worker void RandomArrayGenerator::setData(char *data, Array::InputType type, deRandom &rnd, GLValue min, GLValue max)
1277*35238bceSAndroid Build Coastguard Worker {
1278*35238bceSAndroid Build Coastguard Worker switch (type)
1279*35238bceSAndroid Build Coastguard Worker {
1280*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_FLOAT:
1281*35238bceSAndroid Build Coastguard Worker {
1282*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<float>(data, getRandom<GLValue::Float>(rnd, min.fl, max.fl));
1283*35238bceSAndroid Build Coastguard Worker break;
1284*35238bceSAndroid Build Coastguard Worker }
1285*35238bceSAndroid Build Coastguard Worker
1286*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_DOUBLE:
1287*35238bceSAndroid Build Coastguard Worker {
1288*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<double>(data, getRandom<GLValue::Float>(rnd, min.fl, max.fl));
1289*35238bceSAndroid Build Coastguard Worker break;
1290*35238bceSAndroid Build Coastguard Worker }
1291*35238bceSAndroid Build Coastguard Worker
1292*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_SHORT:
1293*35238bceSAndroid Build Coastguard Worker {
1294*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<int16_t>(data, getRandom<GLValue::Short>(rnd, min.s, max.s));
1295*35238bceSAndroid Build Coastguard Worker break;
1296*35238bceSAndroid Build Coastguard Worker }
1297*35238bceSAndroid Build Coastguard Worker
1298*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_UNSIGNED_SHORT:
1299*35238bceSAndroid Build Coastguard Worker {
1300*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<uint16_t>(data, getRandom<GLValue::Ushort>(rnd, min.us, max.us));
1301*35238bceSAndroid Build Coastguard Worker break;
1302*35238bceSAndroid Build Coastguard Worker }
1303*35238bceSAndroid Build Coastguard Worker
1304*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_BYTE:
1305*35238bceSAndroid Build Coastguard Worker {
1306*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<int8_t>(data, getRandom<GLValue::Byte>(rnd, min.b, max.b));
1307*35238bceSAndroid Build Coastguard Worker break;
1308*35238bceSAndroid Build Coastguard Worker }
1309*35238bceSAndroid Build Coastguard Worker
1310*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_UNSIGNED_BYTE:
1311*35238bceSAndroid Build Coastguard Worker {
1312*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<uint8_t>(data, getRandom<GLValue::Ubyte>(rnd, min.ub, max.ub));
1313*35238bceSAndroid Build Coastguard Worker break;
1314*35238bceSAndroid Build Coastguard Worker }
1315*35238bceSAndroid Build Coastguard Worker
1316*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_FIXED:
1317*35238bceSAndroid Build Coastguard Worker {
1318*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<int32_t>(data, getRandom<GLValue::Fixed>(rnd, min.fi, max.fi));
1319*35238bceSAndroid Build Coastguard Worker break;
1320*35238bceSAndroid Build Coastguard Worker }
1321*35238bceSAndroid Build Coastguard Worker
1322*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_INT:
1323*35238bceSAndroid Build Coastguard Worker {
1324*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<int32_t>(data, getRandom<GLValue::Int>(rnd, min.i, max.i));
1325*35238bceSAndroid Build Coastguard Worker break;
1326*35238bceSAndroid Build Coastguard Worker }
1327*35238bceSAndroid Build Coastguard Worker
1328*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_UNSIGNED_INT:
1329*35238bceSAndroid Build Coastguard Worker {
1330*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<uint32_t>(data, getRandom<GLValue::Uint>(rnd, min.ui, max.ui));
1331*35238bceSAndroid Build Coastguard Worker break;
1332*35238bceSAndroid Build Coastguard Worker }
1333*35238bceSAndroid Build Coastguard Worker
1334*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_HALF:
1335*35238bceSAndroid Build Coastguard Worker {
1336*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<deFloat16>(data, getRandom<GLValue::Half>(rnd, min.h, max.h).getValue());
1337*35238bceSAndroid Build Coastguard Worker break;
1338*35238bceSAndroid Build Coastguard Worker }
1339*35238bceSAndroid Build Coastguard Worker
1340*35238bceSAndroid Build Coastguard Worker default:
1341*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1342*35238bceSAndroid Build Coastguard Worker break;
1343*35238bceSAndroid Build Coastguard Worker }
1344*35238bceSAndroid Build Coastguard Worker }
1345*35238bceSAndroid Build Coastguard Worker
generateArray(int seed,GLValue min,GLValue max,int count,int componentCount,int stride,Array::InputType type)1346*35238bceSAndroid Build Coastguard Worker char *RandomArrayGenerator::generateArray(int seed, GLValue min, GLValue max, int count, int componentCount, int stride,
1347*35238bceSAndroid Build Coastguard Worker Array::InputType type)
1348*35238bceSAndroid Build Coastguard Worker {
1349*35238bceSAndroid Build Coastguard Worker char *data = NULL;
1350*35238bceSAndroid Build Coastguard Worker
1351*35238bceSAndroid Build Coastguard Worker deRandom rnd;
1352*35238bceSAndroid Build Coastguard Worker deRandom_init(&rnd, seed);
1353*35238bceSAndroid Build Coastguard Worker
1354*35238bceSAndroid Build Coastguard Worker if (stride == 0)
1355*35238bceSAndroid Build Coastguard Worker stride = componentCount * Array::inputTypeSize(type);
1356*35238bceSAndroid Build Coastguard Worker
1357*35238bceSAndroid Build Coastguard Worker data = new char[stride * count];
1358*35238bceSAndroid Build Coastguard Worker
1359*35238bceSAndroid Build Coastguard Worker for (int vertexNdx = 0; vertexNdx < count; vertexNdx++)
1360*35238bceSAndroid Build Coastguard Worker {
1361*35238bceSAndroid Build Coastguard Worker for (int componentNdx = 0; componentNdx < componentCount; componentNdx++)
1362*35238bceSAndroid Build Coastguard Worker {
1363*35238bceSAndroid Build Coastguard Worker setData(&(data[vertexNdx * stride + Array::inputTypeSize(type) * componentNdx]), type, rnd, min, max);
1364*35238bceSAndroid Build Coastguard Worker }
1365*35238bceSAndroid Build Coastguard Worker }
1366*35238bceSAndroid Build Coastguard Worker
1367*35238bceSAndroid Build Coastguard Worker return data;
1368*35238bceSAndroid Build Coastguard Worker }
1369*35238bceSAndroid Build Coastguard Worker
generateQuads(int seed,int count,int componentCount,int offset,int stride,Array::Primitive primitive,Array::InputType type,GLValue min,GLValue max,float gridSize)1370*35238bceSAndroid Build Coastguard Worker char *RandomArrayGenerator::generateQuads(int seed, int count, int componentCount, int offset, int stride,
1371*35238bceSAndroid Build Coastguard Worker Array::Primitive primitive, Array::InputType type, GLValue min, GLValue max,
1372*35238bceSAndroid Build Coastguard Worker float gridSize)
1373*35238bceSAndroid Build Coastguard Worker {
1374*35238bceSAndroid Build Coastguard Worker char *data = DE_NULL;
1375*35238bceSAndroid Build Coastguard Worker
1376*35238bceSAndroid Build Coastguard Worker switch (type)
1377*35238bceSAndroid Build Coastguard Worker {
1378*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_FLOAT:
1379*35238bceSAndroid Build Coastguard Worker data = createQuads<GLValue::Float>(seed, count, componentCount, offset, stride, primitive, min.fl, max.fl,
1380*35238bceSAndroid Build Coastguard Worker gridSize);
1381*35238bceSAndroid Build Coastguard Worker break;
1382*35238bceSAndroid Build Coastguard Worker
1383*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_FIXED:
1384*35238bceSAndroid Build Coastguard Worker data = createQuads<GLValue::Fixed>(seed, count, componentCount, offset, stride, primitive, min.fi, max.fi,
1385*35238bceSAndroid Build Coastguard Worker gridSize);
1386*35238bceSAndroid Build Coastguard Worker break;
1387*35238bceSAndroid Build Coastguard Worker
1388*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_DOUBLE:
1389*35238bceSAndroid Build Coastguard Worker data = createQuads<GLValue::Double>(seed, count, componentCount, offset, stride, primitive, min.d, max.d,
1390*35238bceSAndroid Build Coastguard Worker gridSize);
1391*35238bceSAndroid Build Coastguard Worker break;
1392*35238bceSAndroid Build Coastguard Worker
1393*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_BYTE:
1394*35238bceSAndroid Build Coastguard Worker data =
1395*35238bceSAndroid Build Coastguard Worker createQuads<GLValue::Byte>(seed, count, componentCount, offset, stride, primitive, min.b, max.b, gridSize);
1396*35238bceSAndroid Build Coastguard Worker break;
1397*35238bceSAndroid Build Coastguard Worker
1398*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_SHORT:
1399*35238bceSAndroid Build Coastguard Worker data =
1400*35238bceSAndroid Build Coastguard Worker createQuads<GLValue::Short>(seed, count, componentCount, offset, stride, primitive, min.s, max.s, gridSize);
1401*35238bceSAndroid Build Coastguard Worker break;
1402*35238bceSAndroid Build Coastguard Worker
1403*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_UNSIGNED_BYTE:
1404*35238bceSAndroid Build Coastguard Worker data = createQuads<GLValue::Ubyte>(seed, count, componentCount, offset, stride, primitive, min.ub, max.ub,
1405*35238bceSAndroid Build Coastguard Worker gridSize);
1406*35238bceSAndroid Build Coastguard Worker break;
1407*35238bceSAndroid Build Coastguard Worker
1408*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_UNSIGNED_SHORT:
1409*35238bceSAndroid Build Coastguard Worker data = createQuads<GLValue::Ushort>(seed, count, componentCount, offset, stride, primitive, min.us, max.us,
1410*35238bceSAndroid Build Coastguard Worker gridSize);
1411*35238bceSAndroid Build Coastguard Worker break;
1412*35238bceSAndroid Build Coastguard Worker
1413*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_UNSIGNED_INT:
1414*35238bceSAndroid Build Coastguard Worker data = createQuads<GLValue::Uint>(seed, count, componentCount, offset, stride, primitive, min.ui, max.ui,
1415*35238bceSAndroid Build Coastguard Worker gridSize);
1416*35238bceSAndroid Build Coastguard Worker break;
1417*35238bceSAndroid Build Coastguard Worker
1418*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_INT:
1419*35238bceSAndroid Build Coastguard Worker data =
1420*35238bceSAndroid Build Coastguard Worker createQuads<GLValue::Int>(seed, count, componentCount, offset, stride, primitive, min.i, max.i, gridSize);
1421*35238bceSAndroid Build Coastguard Worker break;
1422*35238bceSAndroid Build Coastguard Worker
1423*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_HALF:
1424*35238bceSAndroid Build Coastguard Worker data =
1425*35238bceSAndroid Build Coastguard Worker createQuads<GLValue::Half>(seed, count, componentCount, offset, stride, primitive, min.h, max.h, gridSize);
1426*35238bceSAndroid Build Coastguard Worker break;
1427*35238bceSAndroid Build Coastguard Worker
1428*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_INT_2_10_10_10:
1429*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_UNSIGNED_INT_2_10_10_10:
1430*35238bceSAndroid Build Coastguard Worker data = createQuadsPacked(seed, count, componentCount, offset, stride, primitive);
1431*35238bceSAndroid Build Coastguard Worker break;
1432*35238bceSAndroid Build Coastguard Worker
1433*35238bceSAndroid Build Coastguard Worker default:
1434*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1435*35238bceSAndroid Build Coastguard Worker break;
1436*35238bceSAndroid Build Coastguard Worker }
1437*35238bceSAndroid Build Coastguard Worker
1438*35238bceSAndroid Build Coastguard Worker return data;
1439*35238bceSAndroid Build Coastguard Worker }
1440*35238bceSAndroid Build Coastguard Worker
createQuadsPacked(int seed,int count,int componentCount,int offset,int stride,Array::Primitive primitive)1441*35238bceSAndroid Build Coastguard Worker char *RandomArrayGenerator::createQuadsPacked(int seed, int count, int componentCount, int offset, int stride,
1442*35238bceSAndroid Build Coastguard Worker Array::Primitive primitive)
1443*35238bceSAndroid Build Coastguard Worker {
1444*35238bceSAndroid Build Coastguard Worker DE_ASSERT(componentCount == 4);
1445*35238bceSAndroid Build Coastguard Worker DE_UNREF(componentCount);
1446*35238bceSAndroid Build Coastguard Worker int quadStride = 0;
1447*35238bceSAndroid Build Coastguard Worker
1448*35238bceSAndroid Build Coastguard Worker if (stride == 0)
1449*35238bceSAndroid Build Coastguard Worker stride = sizeof(uint32_t);
1450*35238bceSAndroid Build Coastguard Worker
1451*35238bceSAndroid Build Coastguard Worker switch (primitive)
1452*35238bceSAndroid Build Coastguard Worker {
1453*35238bceSAndroid Build Coastguard Worker case Array::PRIMITIVE_TRIANGLES:
1454*35238bceSAndroid Build Coastguard Worker quadStride = stride * 6;
1455*35238bceSAndroid Build Coastguard Worker break;
1456*35238bceSAndroid Build Coastguard Worker
1457*35238bceSAndroid Build Coastguard Worker default:
1458*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1459*35238bceSAndroid Build Coastguard Worker break;
1460*35238bceSAndroid Build Coastguard Worker }
1461*35238bceSAndroid Build Coastguard Worker
1462*35238bceSAndroid Build Coastguard Worker char *const _data =
1463*35238bceSAndroid Build Coastguard Worker new char[offset + quadStride * (count - 1) + stride * 5 +
1464*35238bceSAndroid Build Coastguard Worker componentCount *
1465*35238bceSAndroid Build Coastguard Worker Array::inputTypeSize(Array::INPUTTYPE_INT_2_10_10_10)]; // last element must be fully in the array
1466*35238bceSAndroid Build Coastguard Worker char *const resultData = _data + offset;
1467*35238bceSAndroid Build Coastguard Worker
1468*35238bceSAndroid Build Coastguard Worker const uint32_t max = 1024;
1469*35238bceSAndroid Build Coastguard Worker const uint32_t min = 10;
1470*35238bceSAndroid Build Coastguard Worker const uint32_t max2 = 4;
1471*35238bceSAndroid Build Coastguard Worker
1472*35238bceSAndroid Build Coastguard Worker deRandom rnd;
1473*35238bceSAndroid Build Coastguard Worker deRandom_init(&rnd, seed);
1474*35238bceSAndroid Build Coastguard Worker
1475*35238bceSAndroid Build Coastguard Worker switch (primitive)
1476*35238bceSAndroid Build Coastguard Worker {
1477*35238bceSAndroid Build Coastguard Worker case Array::PRIMITIVE_TRIANGLES:
1478*35238bceSAndroid Build Coastguard Worker {
1479*35238bceSAndroid Build Coastguard Worker for (int quadNdx = 0; quadNdx < count; quadNdx++)
1480*35238bceSAndroid Build Coastguard Worker {
1481*35238bceSAndroid Build Coastguard Worker uint32_t x1 = min + deRandom_getUint32(&rnd) % (max - min);
1482*35238bceSAndroid Build Coastguard Worker uint32_t x2 = min + deRandom_getUint32(&rnd) % (max - x1);
1483*35238bceSAndroid Build Coastguard Worker
1484*35238bceSAndroid Build Coastguard Worker uint32_t y1 = min + deRandom_getUint32(&rnd) % (max - min);
1485*35238bceSAndroid Build Coastguard Worker uint32_t y2 = min + deRandom_getUint32(&rnd) % (max - y1);
1486*35238bceSAndroid Build Coastguard Worker
1487*35238bceSAndroid Build Coastguard Worker uint32_t z = min + deRandom_getUint32(&rnd) % (max - min);
1488*35238bceSAndroid Build Coastguard Worker uint32_t w = deRandom_getUint32(&rnd) % max2;
1489*35238bceSAndroid Build Coastguard Worker
1490*35238bceSAndroid Build Coastguard Worker uint32_t val1 = (w << 30) | (z << 20) | (y1 << 10) | x1;
1491*35238bceSAndroid Build Coastguard Worker uint32_t val2 = (w << 30) | (z << 20) | (y1 << 10) | x2;
1492*35238bceSAndroid Build Coastguard Worker uint32_t val3 = (w << 30) | (z << 20) | (y2 << 10) | x1;
1493*35238bceSAndroid Build Coastguard Worker
1494*35238bceSAndroid Build Coastguard Worker uint32_t val4 = (w << 30) | (z << 20) | (y2 << 10) | x1;
1495*35238bceSAndroid Build Coastguard Worker uint32_t val5 = (w << 30) | (z << 20) | (y1 << 10) | x2;
1496*35238bceSAndroid Build Coastguard Worker uint32_t val6 = (w << 30) | (z << 20) | (y2 << 10) | x2;
1497*35238bceSAndroid Build Coastguard Worker
1498*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<uint32_t>(&(resultData[quadNdx * quadStride + stride * 0]), val1);
1499*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<uint32_t>(&(resultData[quadNdx * quadStride + stride * 1]), val2);
1500*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<uint32_t>(&(resultData[quadNdx * quadStride + stride * 2]), val3);
1501*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<uint32_t>(&(resultData[quadNdx * quadStride + stride * 3]), val4);
1502*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<uint32_t>(&(resultData[quadNdx * quadStride + stride * 4]), val5);
1503*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<uint32_t>(&(resultData[quadNdx * quadStride + stride * 5]), val6);
1504*35238bceSAndroid Build Coastguard Worker }
1505*35238bceSAndroid Build Coastguard Worker
1506*35238bceSAndroid Build Coastguard Worker break;
1507*35238bceSAndroid Build Coastguard Worker }
1508*35238bceSAndroid Build Coastguard Worker
1509*35238bceSAndroid Build Coastguard Worker default:
1510*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1511*35238bceSAndroid Build Coastguard Worker break;
1512*35238bceSAndroid Build Coastguard Worker }
1513*35238bceSAndroid Build Coastguard Worker
1514*35238bceSAndroid Build Coastguard Worker return _data;
1515*35238bceSAndroid Build Coastguard Worker }
1516*35238bceSAndroid Build Coastguard Worker
1517*35238bceSAndroid Build Coastguard Worker template <typename T>
roundTo(const T & step,const T & value)1518*35238bceSAndroid Build Coastguard Worker T roundTo(const T &step, const T &value)
1519*35238bceSAndroid Build Coastguard Worker {
1520*35238bceSAndroid Build Coastguard Worker return value - (value % step);
1521*35238bceSAndroid Build Coastguard Worker }
1522*35238bceSAndroid Build Coastguard Worker
1523*35238bceSAndroid Build Coastguard Worker template <typename T>
createQuads(int seed,int count,int componentCount,int offset,int stride,Array::Primitive primitive,T min,T max,float gridSize)1524*35238bceSAndroid Build Coastguard Worker char *RandomArrayGenerator::createQuads(int seed, int count, int componentCount, int offset, int stride,
1525*35238bceSAndroid Build Coastguard Worker Array::Primitive primitive, T min, T max, float gridSize)
1526*35238bceSAndroid Build Coastguard Worker {
1527*35238bceSAndroid Build Coastguard Worker int componentStride = sizeof(T);
1528*35238bceSAndroid Build Coastguard Worker int quadStride = 0;
1529*35238bceSAndroid Build Coastguard Worker
1530*35238bceSAndroid Build Coastguard Worker if (stride == 0)
1531*35238bceSAndroid Build Coastguard Worker stride = componentCount * componentStride;
1532*35238bceSAndroid Build Coastguard Worker
1533*35238bceSAndroid Build Coastguard Worker DE_ASSERT(stride >= componentCount * componentStride);
1534*35238bceSAndroid Build Coastguard Worker
1535*35238bceSAndroid Build Coastguard Worker switch (primitive)
1536*35238bceSAndroid Build Coastguard Worker {
1537*35238bceSAndroid Build Coastguard Worker case Array::PRIMITIVE_TRIANGLES:
1538*35238bceSAndroid Build Coastguard Worker quadStride = stride * 6;
1539*35238bceSAndroid Build Coastguard Worker break;
1540*35238bceSAndroid Build Coastguard Worker
1541*35238bceSAndroid Build Coastguard Worker default:
1542*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1543*35238bceSAndroid Build Coastguard Worker break;
1544*35238bceSAndroid Build Coastguard Worker }
1545*35238bceSAndroid Build Coastguard Worker
1546*35238bceSAndroid Build Coastguard Worker char *resultData = new char[offset + quadStride * count];
1547*35238bceSAndroid Build Coastguard Worker char *_data = resultData;
1548*35238bceSAndroid Build Coastguard Worker resultData = resultData + offset;
1549*35238bceSAndroid Build Coastguard Worker
1550*35238bceSAndroid Build Coastguard Worker deRandom rnd;
1551*35238bceSAndroid Build Coastguard Worker deRandom_init(&rnd, seed);
1552*35238bceSAndroid Build Coastguard Worker
1553*35238bceSAndroid Build Coastguard Worker switch (primitive)
1554*35238bceSAndroid Build Coastguard Worker {
1555*35238bceSAndroid Build Coastguard Worker case Array::PRIMITIVE_TRIANGLES:
1556*35238bceSAndroid Build Coastguard Worker {
1557*35238bceSAndroid Build Coastguard Worker const T minQuadSize = T::fromFloat(deFloatAbs(max.template to<float>() - min.template to<float>()) * gridSize);
1558*35238bceSAndroid Build Coastguard Worker const T minDiff = minValue<T>() > minQuadSize ? minValue<T>() : minQuadSize;
1559*35238bceSAndroid Build Coastguard Worker const T maxRounded = roundTo(minDiff, max);
1560*35238bceSAndroid Build Coastguard Worker
1561*35238bceSAndroid Build Coastguard Worker for (int quadNdx = 0; quadNdx < count; ++quadNdx)
1562*35238bceSAndroid Build Coastguard Worker {
1563*35238bceSAndroid Build Coastguard Worker T x1, x2;
1564*35238bceSAndroid Build Coastguard Worker T y1, y2;
1565*35238bceSAndroid Build Coastguard Worker T z, w;
1566*35238bceSAndroid Build Coastguard Worker
1567*35238bceSAndroid Build Coastguard Worker x1 = roundTo(minDiff, getRandom<T>(rnd, min, maxRounded - minDiff));
1568*35238bceSAndroid Build Coastguard Worker x2 = roundTo(minDiff, getRandom<T>(rnd, x1 + minDiff, maxRounded));
1569*35238bceSAndroid Build Coastguard Worker
1570*35238bceSAndroid Build Coastguard Worker y1 = roundTo(minDiff, getRandom<T>(rnd, min, maxRounded - minDiff));
1571*35238bceSAndroid Build Coastguard Worker y2 = roundTo(minDiff, getRandom<T>(rnd, y1 + minDiff, maxRounded));
1572*35238bceSAndroid Build Coastguard Worker
1573*35238bceSAndroid Build Coastguard Worker // Make sure the rounding doesn't drop the result below the original range of the random function.
1574*35238bceSAndroid Build Coastguard Worker if (x2 < x1 + minDiff)
1575*35238bceSAndroid Build Coastguard Worker x2 = x1 + minDiff;
1576*35238bceSAndroid Build Coastguard Worker if (y2 < y1 + minDiff)
1577*35238bceSAndroid Build Coastguard Worker y2 = y1 + minDiff;
1578*35238bceSAndroid Build Coastguard Worker
1579*35238bceSAndroid Build Coastguard Worker z = (componentCount > 2) ? roundTo(minDiff, (getRandom<T>(rnd, min, max))) : (T::create(0));
1580*35238bceSAndroid Build Coastguard Worker w = (componentCount > 3) ? roundTo(minDiff, (getRandom<T>(rnd, min, max))) : (T::create(1));
1581*35238bceSAndroid Build Coastguard Worker
1582*35238bceSAndroid Build Coastguard Worker // Make sure the quad is not too thin.
1583*35238bceSAndroid Build Coastguard Worker DE_ASSERT(
1584*35238bceSAndroid Build Coastguard Worker (deFloatAbs(x2.template to<float>() - x1.template to<float>()) >=
1585*35238bceSAndroid Build Coastguard Worker minDiff.template to<float>() * 0.8f) &&
1586*35238bceSAndroid Build Coastguard Worker (deFloatAbs(y2.template to<float>() - y1.template to<float>()) >= minDiff.template to<float>() * 0.8f));
1587*35238bceSAndroid Build Coastguard Worker
1588*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(&(resultData[quadNdx * quadStride]), x1);
1589*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(&(resultData[quadNdx * quadStride + componentStride]), y1);
1590*35238bceSAndroid Build Coastguard Worker
1591*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(&(resultData[quadNdx * quadStride + stride]), x2);
1592*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(&(resultData[quadNdx * quadStride + stride + componentStride]), y1);
1593*35238bceSAndroid Build Coastguard Worker
1594*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(&(resultData[quadNdx * quadStride + stride * 2]), x1);
1595*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(&(resultData[quadNdx * quadStride + stride * 2 + componentStride]), y2);
1596*35238bceSAndroid Build Coastguard Worker
1597*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(&(resultData[quadNdx * quadStride + stride * 3]), x1);
1598*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(&(resultData[quadNdx * quadStride + stride * 3 + componentStride]), y2);
1599*35238bceSAndroid Build Coastguard Worker
1600*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(&(resultData[quadNdx * quadStride + stride * 4]), x2);
1601*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(&(resultData[quadNdx * quadStride + stride * 4 + componentStride]), y1);
1602*35238bceSAndroid Build Coastguard Worker
1603*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(&(resultData[quadNdx * quadStride + stride * 5]), x2);
1604*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(&(resultData[quadNdx * quadStride + stride * 5 + componentStride]), y2);
1605*35238bceSAndroid Build Coastguard Worker
1606*35238bceSAndroid Build Coastguard Worker if (componentCount > 2)
1607*35238bceSAndroid Build Coastguard Worker {
1608*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 6; i++)
1609*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(&(resultData[quadNdx * quadStride + stride * i + componentStride * 2]),
1610*35238bceSAndroid Build Coastguard Worker z);
1611*35238bceSAndroid Build Coastguard Worker }
1612*35238bceSAndroid Build Coastguard Worker
1613*35238bceSAndroid Build Coastguard Worker if (componentCount > 3)
1614*35238bceSAndroid Build Coastguard Worker {
1615*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < 6; i++)
1616*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(&(resultData[quadNdx * quadStride + stride * i + componentStride * 3]),
1617*35238bceSAndroid Build Coastguard Worker w);
1618*35238bceSAndroid Build Coastguard Worker }
1619*35238bceSAndroid Build Coastguard Worker }
1620*35238bceSAndroid Build Coastguard Worker
1621*35238bceSAndroid Build Coastguard Worker break;
1622*35238bceSAndroid Build Coastguard Worker }
1623*35238bceSAndroid Build Coastguard Worker
1624*35238bceSAndroid Build Coastguard Worker default:
1625*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1626*35238bceSAndroid Build Coastguard Worker break;
1627*35238bceSAndroid Build Coastguard Worker }
1628*35238bceSAndroid Build Coastguard Worker
1629*35238bceSAndroid Build Coastguard Worker return _data;
1630*35238bceSAndroid Build Coastguard Worker }
1631*35238bceSAndroid Build Coastguard Worker
generatePerQuad(int seed,int count,int componentCount,int stride,Array::Primitive primitive,Array::InputType type,GLValue min,GLValue max)1632*35238bceSAndroid Build Coastguard Worker char *RandomArrayGenerator::generatePerQuad(int seed, int count, int componentCount, int stride,
1633*35238bceSAndroid Build Coastguard Worker Array::Primitive primitive, Array::InputType type, GLValue min, GLValue max)
1634*35238bceSAndroid Build Coastguard Worker {
1635*35238bceSAndroid Build Coastguard Worker char *data = DE_NULL;
1636*35238bceSAndroid Build Coastguard Worker
1637*35238bceSAndroid Build Coastguard Worker switch (type)
1638*35238bceSAndroid Build Coastguard Worker {
1639*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_FLOAT:
1640*35238bceSAndroid Build Coastguard Worker data = createPerQuads<GLValue::Float>(seed, count, componentCount, stride, primitive, min.fl, max.fl);
1641*35238bceSAndroid Build Coastguard Worker break;
1642*35238bceSAndroid Build Coastguard Worker
1643*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_FIXED:
1644*35238bceSAndroid Build Coastguard Worker data = createPerQuads<GLValue::Fixed>(seed, count, componentCount, stride, primitive, min.fi, max.fi);
1645*35238bceSAndroid Build Coastguard Worker break;
1646*35238bceSAndroid Build Coastguard Worker
1647*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_DOUBLE:
1648*35238bceSAndroid Build Coastguard Worker data = createPerQuads<GLValue::Double>(seed, count, componentCount, stride, primitive, min.d, max.d);
1649*35238bceSAndroid Build Coastguard Worker break;
1650*35238bceSAndroid Build Coastguard Worker
1651*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_BYTE:
1652*35238bceSAndroid Build Coastguard Worker data = createPerQuads<GLValue::Byte>(seed, count, componentCount, stride, primitive, min.b, max.b);
1653*35238bceSAndroid Build Coastguard Worker break;
1654*35238bceSAndroid Build Coastguard Worker
1655*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_SHORT:
1656*35238bceSAndroid Build Coastguard Worker data = createPerQuads<GLValue::Short>(seed, count, componentCount, stride, primitive, min.s, max.s);
1657*35238bceSAndroid Build Coastguard Worker break;
1658*35238bceSAndroid Build Coastguard Worker
1659*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_UNSIGNED_BYTE:
1660*35238bceSAndroid Build Coastguard Worker data = createPerQuads<GLValue::Ubyte>(seed, count, componentCount, stride, primitive, min.ub, max.ub);
1661*35238bceSAndroid Build Coastguard Worker break;
1662*35238bceSAndroid Build Coastguard Worker
1663*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_UNSIGNED_SHORT:
1664*35238bceSAndroid Build Coastguard Worker data = createPerQuads<GLValue::Ushort>(seed, count, componentCount, stride, primitive, min.us, max.us);
1665*35238bceSAndroid Build Coastguard Worker break;
1666*35238bceSAndroid Build Coastguard Worker
1667*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_UNSIGNED_INT:
1668*35238bceSAndroid Build Coastguard Worker data = createPerQuads<GLValue::Uint>(seed, count, componentCount, stride, primitive, min.ui, max.ui);
1669*35238bceSAndroid Build Coastguard Worker break;
1670*35238bceSAndroid Build Coastguard Worker
1671*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_INT:
1672*35238bceSAndroid Build Coastguard Worker data = createPerQuads<GLValue::Int>(seed, count, componentCount, stride, primitive, min.i, max.i);
1673*35238bceSAndroid Build Coastguard Worker break;
1674*35238bceSAndroid Build Coastguard Worker
1675*35238bceSAndroid Build Coastguard Worker case Array::INPUTTYPE_HALF:
1676*35238bceSAndroid Build Coastguard Worker data = createPerQuads<GLValue::Half>(seed, count, componentCount, stride, primitive, min.h, max.h);
1677*35238bceSAndroid Build Coastguard Worker break;
1678*35238bceSAndroid Build Coastguard Worker
1679*35238bceSAndroid Build Coastguard Worker default:
1680*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1681*35238bceSAndroid Build Coastguard Worker break;
1682*35238bceSAndroid Build Coastguard Worker }
1683*35238bceSAndroid Build Coastguard Worker
1684*35238bceSAndroid Build Coastguard Worker return data;
1685*35238bceSAndroid Build Coastguard Worker }
1686*35238bceSAndroid Build Coastguard Worker
1687*35238bceSAndroid Build Coastguard Worker template <typename T>
createPerQuads(int seed,int count,int componentCount,int stride,Array::Primitive primitive,T min,T max)1688*35238bceSAndroid Build Coastguard Worker char *RandomArrayGenerator::createPerQuads(int seed, int count, int componentCount, int stride,
1689*35238bceSAndroid Build Coastguard Worker Array::Primitive primitive, T min, T max)
1690*35238bceSAndroid Build Coastguard Worker {
1691*35238bceSAndroid Build Coastguard Worker deRandom rnd;
1692*35238bceSAndroid Build Coastguard Worker deRandom_init(&rnd, seed);
1693*35238bceSAndroid Build Coastguard Worker
1694*35238bceSAndroid Build Coastguard Worker int componentStride = sizeof(T);
1695*35238bceSAndroid Build Coastguard Worker
1696*35238bceSAndroid Build Coastguard Worker if (stride == 0)
1697*35238bceSAndroid Build Coastguard Worker stride = componentStride * componentCount;
1698*35238bceSAndroid Build Coastguard Worker
1699*35238bceSAndroid Build Coastguard Worker int quadStride = 0;
1700*35238bceSAndroid Build Coastguard Worker
1701*35238bceSAndroid Build Coastguard Worker switch (primitive)
1702*35238bceSAndroid Build Coastguard Worker {
1703*35238bceSAndroid Build Coastguard Worker case Array::PRIMITIVE_TRIANGLES:
1704*35238bceSAndroid Build Coastguard Worker quadStride = stride * 6;
1705*35238bceSAndroid Build Coastguard Worker break;
1706*35238bceSAndroid Build Coastguard Worker
1707*35238bceSAndroid Build Coastguard Worker default:
1708*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1709*35238bceSAndroid Build Coastguard Worker break;
1710*35238bceSAndroid Build Coastguard Worker }
1711*35238bceSAndroid Build Coastguard Worker
1712*35238bceSAndroid Build Coastguard Worker char *data = new char[count * quadStride];
1713*35238bceSAndroid Build Coastguard Worker
1714*35238bceSAndroid Build Coastguard Worker for (int quadNdx = 0; quadNdx < count; quadNdx++)
1715*35238bceSAndroid Build Coastguard Worker {
1716*35238bceSAndroid Build Coastguard Worker for (int componentNdx = 0; componentNdx < componentCount; componentNdx++)
1717*35238bceSAndroid Build Coastguard Worker {
1718*35238bceSAndroid Build Coastguard Worker T val = getRandom<T>(rnd, min, max);
1719*35238bceSAndroid Build Coastguard Worker
1720*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(data + quadNdx * quadStride + stride * 0 + componentStride * componentNdx, val);
1721*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(data + quadNdx * quadStride + stride * 1 + componentStride * componentNdx, val);
1722*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(data + quadNdx * quadStride + stride * 2 + componentStride * componentNdx, val);
1723*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(data + quadNdx * quadStride + stride * 3 + componentStride * componentNdx, val);
1724*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(data + quadNdx * quadStride + stride * 4 + componentStride * componentNdx, val);
1725*35238bceSAndroid Build Coastguard Worker alignmentSafeAssignment<T>(data + quadNdx * quadStride + stride * 5 + componentStride * componentNdx, val);
1726*35238bceSAndroid Build Coastguard Worker }
1727*35238bceSAndroid Build Coastguard Worker }
1728*35238bceSAndroid Build Coastguard Worker
1729*35238bceSAndroid Build Coastguard Worker return data;
1730*35238bceSAndroid Build Coastguard Worker }
1731*35238bceSAndroid Build Coastguard Worker
1732*35238bceSAndroid Build Coastguard Worker // VertexArrayTest
1733*35238bceSAndroid Build Coastguard Worker
VertexArrayTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const char * name,const char * desc)1734*35238bceSAndroid Build Coastguard Worker VertexArrayTest::VertexArrayTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx, const char *name,
1735*35238bceSAndroid Build Coastguard Worker const char *desc)
1736*35238bceSAndroid Build Coastguard Worker : TestCase(testCtx, name, desc)
1737*35238bceSAndroid Build Coastguard Worker , m_renderCtx(renderCtx)
1738*35238bceSAndroid Build Coastguard Worker , m_refBuffers(DE_NULL)
1739*35238bceSAndroid Build Coastguard Worker , m_refContext(DE_NULL)
1740*35238bceSAndroid Build Coastguard Worker , m_glesContext(DE_NULL)
1741*35238bceSAndroid Build Coastguard Worker , m_glArrayPack(DE_NULL)
1742*35238bceSAndroid Build Coastguard Worker , m_rrArrayPack(DE_NULL)
1743*35238bceSAndroid Build Coastguard Worker , m_isOk(false)
1744*35238bceSAndroid Build Coastguard Worker , m_maxDiffRed(
1745*35238bceSAndroid Build Coastguard Worker deCeilFloatToInt32(256.0f * (2.0f / (float)(1 << m_renderCtx.getRenderTarget().getPixelFormat().redBits))))
1746*35238bceSAndroid Build Coastguard Worker , m_maxDiffGreen(
1747*35238bceSAndroid Build Coastguard Worker deCeilFloatToInt32(256.0f * (2.0f / (float)(1 << m_renderCtx.getRenderTarget().getPixelFormat().greenBits))))
1748*35238bceSAndroid Build Coastguard Worker , m_maxDiffBlue(
1749*35238bceSAndroid Build Coastguard Worker deCeilFloatToInt32(256.0f * (2.0f / (float)(1 << m_renderCtx.getRenderTarget().getPixelFormat().blueBits))))
1750*35238bceSAndroid Build Coastguard Worker {
1751*35238bceSAndroid Build Coastguard Worker }
1752*35238bceSAndroid Build Coastguard Worker
~VertexArrayTest(void)1753*35238bceSAndroid Build Coastguard Worker VertexArrayTest::~VertexArrayTest(void)
1754*35238bceSAndroid Build Coastguard Worker {
1755*35238bceSAndroid Build Coastguard Worker deinit();
1756*35238bceSAndroid Build Coastguard Worker }
1757*35238bceSAndroid Build Coastguard Worker
init(void)1758*35238bceSAndroid Build Coastguard Worker void VertexArrayTest::init(void)
1759*35238bceSAndroid Build Coastguard Worker {
1760*35238bceSAndroid Build Coastguard Worker const int renderTargetWidth = de::min(512, m_renderCtx.getRenderTarget().getWidth());
1761*35238bceSAndroid Build Coastguard Worker const int renderTargetHeight = de::min(512, m_renderCtx.getRenderTarget().getHeight());
1762*35238bceSAndroid Build Coastguard Worker sglr::ReferenceContextLimits limits(m_renderCtx);
1763*35238bceSAndroid Build Coastguard Worker
1764*35238bceSAndroid Build Coastguard Worker m_glesContext =
1765*35238bceSAndroid Build Coastguard Worker new sglr::GLContext(m_renderCtx, m_testCtx.getLog(), sglr::GLCONTEXT_LOG_CALLS | sglr::GLCONTEXT_LOG_PROGRAMS,
1766*35238bceSAndroid Build Coastguard Worker tcu::IVec4(0, 0, renderTargetWidth, renderTargetHeight));
1767*35238bceSAndroid Build Coastguard Worker
1768*35238bceSAndroid Build Coastguard Worker m_refBuffers = new sglr::ReferenceContextBuffers(m_renderCtx.getRenderTarget().getPixelFormat(), 0, 0,
1769*35238bceSAndroid Build Coastguard Worker renderTargetWidth, renderTargetHeight);
1770*35238bceSAndroid Build Coastguard Worker m_refContext = new sglr::ReferenceContext(limits, m_refBuffers->getColorbuffer(), m_refBuffers->getDepthbuffer(),
1771*35238bceSAndroid Build Coastguard Worker m_refBuffers->getStencilbuffer());
1772*35238bceSAndroid Build Coastguard Worker
1773*35238bceSAndroid Build Coastguard Worker m_glArrayPack = new ContextArrayPack(m_renderCtx, *m_glesContext);
1774*35238bceSAndroid Build Coastguard Worker m_rrArrayPack = new ContextArrayPack(m_renderCtx, *m_refContext);
1775*35238bceSAndroid Build Coastguard Worker }
1776*35238bceSAndroid Build Coastguard Worker
deinit(void)1777*35238bceSAndroid Build Coastguard Worker void VertexArrayTest::deinit(void)
1778*35238bceSAndroid Build Coastguard Worker {
1779*35238bceSAndroid Build Coastguard Worker delete m_glArrayPack;
1780*35238bceSAndroid Build Coastguard Worker delete m_rrArrayPack;
1781*35238bceSAndroid Build Coastguard Worker delete m_refBuffers;
1782*35238bceSAndroid Build Coastguard Worker delete m_refContext;
1783*35238bceSAndroid Build Coastguard Worker delete m_glesContext;
1784*35238bceSAndroid Build Coastguard Worker
1785*35238bceSAndroid Build Coastguard Worker m_glArrayPack = DE_NULL;
1786*35238bceSAndroid Build Coastguard Worker m_rrArrayPack = DE_NULL;
1787*35238bceSAndroid Build Coastguard Worker m_refBuffers = DE_NULL;
1788*35238bceSAndroid Build Coastguard Worker m_refContext = DE_NULL;
1789*35238bceSAndroid Build Coastguard Worker m_glesContext = DE_NULL;
1790*35238bceSAndroid Build Coastguard Worker }
1791*35238bceSAndroid Build Coastguard Worker
compare(void)1792*35238bceSAndroid Build Coastguard Worker void VertexArrayTest::compare(void)
1793*35238bceSAndroid Build Coastguard Worker {
1794*35238bceSAndroid Build Coastguard Worker const tcu::Surface &ref = m_rrArrayPack->getSurface();
1795*35238bceSAndroid Build Coastguard Worker const tcu::Surface &screen = m_glArrayPack->getSurface();
1796*35238bceSAndroid Build Coastguard Worker
1797*35238bceSAndroid Build Coastguard Worker if (m_renderCtx.getRenderTarget().getNumSamples() > 1)
1798*35238bceSAndroid Build Coastguard Worker {
1799*35238bceSAndroid Build Coastguard Worker // \todo [mika] Improve compare when using multisampling
1800*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << tcu::TestLog::Message
1801*35238bceSAndroid Build Coastguard Worker << "Warning: Comparision of result from multisample render targets are not as stricts as "
1802*35238bceSAndroid Build Coastguard Worker "without multisampling. Might produce false positives!"
1803*35238bceSAndroid Build Coastguard Worker << tcu::TestLog::EndMessage;
1804*35238bceSAndroid Build Coastguard Worker m_isOk = tcu::fuzzyCompare(m_testCtx.getLog(), "Compare Results", "Compare Results", ref.getAccess(),
1805*35238bceSAndroid Build Coastguard Worker screen.getAccess(), 1.5f, tcu::COMPARE_LOG_RESULT);
1806*35238bceSAndroid Build Coastguard Worker }
1807*35238bceSAndroid Build Coastguard Worker else
1808*35238bceSAndroid Build Coastguard Worker {
1809*35238bceSAndroid Build Coastguard Worker tcu::RGBA threshold(m_maxDiffRed, m_maxDiffGreen, m_maxDiffBlue, 255);
1810*35238bceSAndroid Build Coastguard Worker tcu::Surface error(ref.getWidth(), ref.getHeight());
1811*35238bceSAndroid Build Coastguard Worker
1812*35238bceSAndroid Build Coastguard Worker m_isOk = true;
1813*35238bceSAndroid Build Coastguard Worker
1814*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < ref.getHeight(); y++)
1815*35238bceSAndroid Build Coastguard Worker {
1816*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < ref.getWidth(); x++)
1817*35238bceSAndroid Build Coastguard Worker {
1818*35238bceSAndroid Build Coastguard Worker tcu::RGBA refPixel = ref.getPixel(x, y);
1819*35238bceSAndroid Build Coastguard Worker tcu::RGBA screenPixel = screen.getPixel(x, y);
1820*35238bceSAndroid Build Coastguard Worker bool isOkPixel = false;
1821*35238bceSAndroid Build Coastguard Worker
1822*35238bceSAndroid Build Coastguard Worker if (y == 0 || y + 1 == ref.getHeight() || x == 0 || x + 1 == ref.getWidth())
1823*35238bceSAndroid Build Coastguard Worker {
1824*35238bceSAndroid Build Coastguard Worker // Don't check borders since the pixel neighborhood is undefined
1825*35238bceSAndroid Build Coastguard Worker error.setPixel(x, y,
1826*35238bceSAndroid Build Coastguard Worker tcu::RGBA(screenPixel.getRed(), (screenPixel.getGreen() + 255) / 2,
1827*35238bceSAndroid Build Coastguard Worker screenPixel.getBlue(), 255));
1828*35238bceSAndroid Build Coastguard Worker continue;
1829*35238bceSAndroid Build Coastguard Worker }
1830*35238bceSAndroid Build Coastguard Worker
1831*35238bceSAndroid Build Coastguard Worker // Don't do comparisons for this pixel if it belongs to a one-pixel-thin part (i.e. it doesn't have similar-color neighbors in both x and y directions) in both result and reference.
1832*35238bceSAndroid Build Coastguard Worker // This fixes some false negatives.
1833*35238bceSAndroid Build Coastguard Worker bool refThin = (!tcu::compareThreshold(refPixel, ref.getPixel(x - 1, y), threshold) &&
1834*35238bceSAndroid Build Coastguard Worker !tcu::compareThreshold(refPixel, ref.getPixel(x + 1, y), threshold)) ||
1835*35238bceSAndroid Build Coastguard Worker (!tcu::compareThreshold(refPixel, ref.getPixel(x, y - 1), threshold) &&
1836*35238bceSAndroid Build Coastguard Worker !tcu::compareThreshold(refPixel, ref.getPixel(x, y + 1), threshold));
1837*35238bceSAndroid Build Coastguard Worker bool screenThin = (!tcu::compareThreshold(screenPixel, screen.getPixel(x - 1, y), threshold) &&
1838*35238bceSAndroid Build Coastguard Worker !tcu::compareThreshold(screenPixel, screen.getPixel(x + 1, y), threshold)) ||
1839*35238bceSAndroid Build Coastguard Worker (!tcu::compareThreshold(screenPixel, screen.getPixel(x, y - 1), threshold) &&
1840*35238bceSAndroid Build Coastguard Worker !tcu::compareThreshold(screenPixel, screen.getPixel(x, y + 1), threshold));
1841*35238bceSAndroid Build Coastguard Worker
1842*35238bceSAndroid Build Coastguard Worker if (refThin && screenThin)
1843*35238bceSAndroid Build Coastguard Worker isOkPixel = true;
1844*35238bceSAndroid Build Coastguard Worker else
1845*35238bceSAndroid Build Coastguard Worker {
1846*35238bceSAndroid Build Coastguard Worker for (int dy = -1; dy < 2 && !isOkPixel; dy++)
1847*35238bceSAndroid Build Coastguard Worker {
1848*35238bceSAndroid Build Coastguard Worker for (int dx = -1; dx < 2 && !isOkPixel; dx++)
1849*35238bceSAndroid Build Coastguard Worker {
1850*35238bceSAndroid Build Coastguard Worker // Check reference pixel against screen pixel
1851*35238bceSAndroid Build Coastguard Worker {
1852*35238bceSAndroid Build Coastguard Worker tcu::RGBA screenCmpPixel = screen.getPixel(x + dx, y + dy);
1853*35238bceSAndroid Build Coastguard Worker uint8_t r = (uint8_t)deAbs32(refPixel.getRed() - screenCmpPixel.getRed());
1854*35238bceSAndroid Build Coastguard Worker uint8_t g = (uint8_t)deAbs32(refPixel.getGreen() - screenCmpPixel.getGreen());
1855*35238bceSAndroid Build Coastguard Worker uint8_t b = (uint8_t)deAbs32(refPixel.getBlue() - screenCmpPixel.getBlue());
1856*35238bceSAndroid Build Coastguard Worker
1857*35238bceSAndroid Build Coastguard Worker if (r <= m_maxDiffRed && g <= m_maxDiffGreen && b <= m_maxDiffBlue)
1858*35238bceSAndroid Build Coastguard Worker isOkPixel = true;
1859*35238bceSAndroid Build Coastguard Worker }
1860*35238bceSAndroid Build Coastguard Worker
1861*35238bceSAndroid Build Coastguard Worker // Check screen pixels against reference pixel
1862*35238bceSAndroid Build Coastguard Worker {
1863*35238bceSAndroid Build Coastguard Worker tcu::RGBA refCmpPixel = ref.getPixel(x + dx, y + dy);
1864*35238bceSAndroid Build Coastguard Worker uint8_t r = (uint8_t)deAbs32(refCmpPixel.getRed() - screenPixel.getRed());
1865*35238bceSAndroid Build Coastguard Worker uint8_t g = (uint8_t)deAbs32(refCmpPixel.getGreen() - screenPixel.getGreen());
1866*35238bceSAndroid Build Coastguard Worker uint8_t b = (uint8_t)deAbs32(refCmpPixel.getBlue() - screenPixel.getBlue());
1867*35238bceSAndroid Build Coastguard Worker
1868*35238bceSAndroid Build Coastguard Worker if (r <= m_maxDiffRed && g <= m_maxDiffGreen && b <= m_maxDiffBlue)
1869*35238bceSAndroid Build Coastguard Worker isOkPixel = true;
1870*35238bceSAndroid Build Coastguard Worker }
1871*35238bceSAndroid Build Coastguard Worker }
1872*35238bceSAndroid Build Coastguard Worker }
1873*35238bceSAndroid Build Coastguard Worker }
1874*35238bceSAndroid Build Coastguard Worker
1875*35238bceSAndroid Build Coastguard Worker if (isOkPixel)
1876*35238bceSAndroid Build Coastguard Worker error.setPixel(x, y,
1877*35238bceSAndroid Build Coastguard Worker tcu::RGBA(screen.getPixel(x, y).getRed(),
1878*35238bceSAndroid Build Coastguard Worker (screen.getPixel(x, y).getGreen() + 255) / 2,
1879*35238bceSAndroid Build Coastguard Worker screen.getPixel(x, y).getBlue(), 255));
1880*35238bceSAndroid Build Coastguard Worker else
1881*35238bceSAndroid Build Coastguard Worker {
1882*35238bceSAndroid Build Coastguard Worker error.setPixel(x, y, tcu::RGBA(255, 0, 0, 255));
1883*35238bceSAndroid Build Coastguard Worker m_isOk = false;
1884*35238bceSAndroid Build Coastguard Worker }
1885*35238bceSAndroid Build Coastguard Worker }
1886*35238bceSAndroid Build Coastguard Worker }
1887*35238bceSAndroid Build Coastguard Worker
1888*35238bceSAndroid Build Coastguard Worker tcu::TestLog &log = m_testCtx.getLog();
1889*35238bceSAndroid Build Coastguard Worker if (!m_isOk)
1890*35238bceSAndroid Build Coastguard Worker {
1891*35238bceSAndroid Build Coastguard Worker log << TestLog::Message << "Image comparison failed, threshold = (" << m_maxDiffRed << ", "
1892*35238bceSAndroid Build Coastguard Worker << m_maxDiffGreen << ", " << m_maxDiffBlue << ")" << TestLog::EndMessage;
1893*35238bceSAndroid Build Coastguard Worker log << TestLog::ImageSet("Compare result", "Result of rendering")
1894*35238bceSAndroid Build Coastguard Worker << TestLog::Image("Result", "Result", screen) << TestLog::Image("Reference", "Reference", ref)
1895*35238bceSAndroid Build Coastguard Worker << TestLog::Image("ErrorMask", "Error mask", error) << TestLog::EndImageSet;
1896*35238bceSAndroid Build Coastguard Worker }
1897*35238bceSAndroid Build Coastguard Worker else
1898*35238bceSAndroid Build Coastguard Worker {
1899*35238bceSAndroid Build Coastguard Worker log << TestLog::ImageSet("Compare result", "Result of rendering")
1900*35238bceSAndroid Build Coastguard Worker << TestLog::Image("Result", "Result", screen) << TestLog::EndImageSet;
1901*35238bceSAndroid Build Coastguard Worker }
1902*35238bceSAndroid Build Coastguard Worker }
1903*35238bceSAndroid Build Coastguard Worker }
1904*35238bceSAndroid Build Coastguard Worker
1905*35238bceSAndroid Build Coastguard Worker // MultiVertexArrayTest
1906*35238bceSAndroid Build Coastguard Worker
ArraySpec(Array::InputType inputType_,Array::OutputType outputType_,Array::Storage storage_,Array::Usage usage_,int componentCount_,int offset_,int stride_,bool normalize_,GLValue min_,GLValue max_)1907*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::Spec::ArraySpec::ArraySpec(Array::InputType inputType_, Array::OutputType outputType_,
1908*35238bceSAndroid Build Coastguard Worker Array::Storage storage_, Array::Usage usage_, int componentCount_,
1909*35238bceSAndroid Build Coastguard Worker int offset_, int stride_, bool normalize_, GLValue min_, GLValue max_)
1910*35238bceSAndroid Build Coastguard Worker : inputType(inputType_)
1911*35238bceSAndroid Build Coastguard Worker , outputType(outputType_)
1912*35238bceSAndroid Build Coastguard Worker , storage(storage_)
1913*35238bceSAndroid Build Coastguard Worker , usage(usage_)
1914*35238bceSAndroid Build Coastguard Worker , componentCount(componentCount_)
1915*35238bceSAndroid Build Coastguard Worker , offset(offset_)
1916*35238bceSAndroid Build Coastguard Worker , stride(stride_)
1917*35238bceSAndroid Build Coastguard Worker , normalize(normalize_)
1918*35238bceSAndroid Build Coastguard Worker , min(min_)
1919*35238bceSAndroid Build Coastguard Worker , max(max_)
1920*35238bceSAndroid Build Coastguard Worker {
1921*35238bceSAndroid Build Coastguard Worker }
1922*35238bceSAndroid Build Coastguard Worker
getName(void) const1923*35238bceSAndroid Build Coastguard Worker std::string MultiVertexArrayTest::Spec::getName(void) const
1924*35238bceSAndroid Build Coastguard Worker {
1925*35238bceSAndroid Build Coastguard Worker std::stringstream name;
1926*35238bceSAndroid Build Coastguard Worker
1927*35238bceSAndroid Build Coastguard Worker for (size_t ndx = 0; ndx < arrays.size(); ++ndx)
1928*35238bceSAndroid Build Coastguard Worker {
1929*35238bceSAndroid Build Coastguard Worker const ArraySpec &array = arrays[ndx];
1930*35238bceSAndroid Build Coastguard Worker
1931*35238bceSAndroid Build Coastguard Worker if (arrays.size() > 1)
1932*35238bceSAndroid Build Coastguard Worker name << "array" << ndx << "_";
1933*35238bceSAndroid Build Coastguard Worker
1934*35238bceSAndroid Build Coastguard Worker name << Array::storageToString(array.storage) << "_" << array.offset << "_" << array.stride << "_"
1935*35238bceSAndroid Build Coastguard Worker << Array::inputTypeToString((Array::InputType)array.inputType);
1936*35238bceSAndroid Build Coastguard Worker if (array.inputType != Array::INPUTTYPE_UNSIGNED_INT_2_10_10_10 &&
1937*35238bceSAndroid Build Coastguard Worker array.inputType != Array::INPUTTYPE_INT_2_10_10_10)
1938*35238bceSAndroid Build Coastguard Worker name << array.componentCount;
1939*35238bceSAndroid Build Coastguard Worker name << "_" << (array.normalize ? "normalized_" : "") << Array::outputTypeToString(array.outputType) << "_"
1940*35238bceSAndroid Build Coastguard Worker << Array::usageTypeToString(array.usage) << "_";
1941*35238bceSAndroid Build Coastguard Worker }
1942*35238bceSAndroid Build Coastguard Worker
1943*35238bceSAndroid Build Coastguard Worker if (first)
1944*35238bceSAndroid Build Coastguard Worker name << "first" << first << "_";
1945*35238bceSAndroid Build Coastguard Worker
1946*35238bceSAndroid Build Coastguard Worker switch (primitive)
1947*35238bceSAndroid Build Coastguard Worker {
1948*35238bceSAndroid Build Coastguard Worker case Array::PRIMITIVE_TRIANGLES:
1949*35238bceSAndroid Build Coastguard Worker name << "quads_";
1950*35238bceSAndroid Build Coastguard Worker break;
1951*35238bceSAndroid Build Coastguard Worker case Array::PRIMITIVE_POINTS:
1952*35238bceSAndroid Build Coastguard Worker name << "points_";
1953*35238bceSAndroid Build Coastguard Worker break;
1954*35238bceSAndroid Build Coastguard Worker
1955*35238bceSAndroid Build Coastguard Worker default:
1956*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1957*35238bceSAndroid Build Coastguard Worker break;
1958*35238bceSAndroid Build Coastguard Worker }
1959*35238bceSAndroid Build Coastguard Worker
1960*35238bceSAndroid Build Coastguard Worker name << drawCount;
1961*35238bceSAndroid Build Coastguard Worker
1962*35238bceSAndroid Build Coastguard Worker return name.str();
1963*35238bceSAndroid Build Coastguard Worker }
1964*35238bceSAndroid Build Coastguard Worker
getDesc(void) const1965*35238bceSAndroid Build Coastguard Worker std::string MultiVertexArrayTest::Spec::getDesc(void) const
1966*35238bceSAndroid Build Coastguard Worker {
1967*35238bceSAndroid Build Coastguard Worker std::stringstream desc;
1968*35238bceSAndroid Build Coastguard Worker
1969*35238bceSAndroid Build Coastguard Worker for (size_t ndx = 0; ndx < arrays.size(); ++ndx)
1970*35238bceSAndroid Build Coastguard Worker {
1971*35238bceSAndroid Build Coastguard Worker const ArraySpec &array = arrays[ndx];
1972*35238bceSAndroid Build Coastguard Worker
1973*35238bceSAndroid Build Coastguard Worker desc << "Array " << ndx << ": "
1974*35238bceSAndroid Build Coastguard Worker << "Storage in " << Array::storageToString(array.storage) << ", "
1975*35238bceSAndroid Build Coastguard Worker << "stride " << array.stride << ", "
1976*35238bceSAndroid Build Coastguard Worker << "input datatype " << Array::inputTypeToString((Array::InputType)array.inputType) << ", "
1977*35238bceSAndroid Build Coastguard Worker << "input component count " << array.componentCount << ", " << (array.normalize ? "normalized, " : "")
1978*35238bceSAndroid Build Coastguard Worker << "used as " << Array::outputTypeToString(array.outputType) << ", ";
1979*35238bceSAndroid Build Coastguard Worker }
1980*35238bceSAndroid Build Coastguard Worker
1981*35238bceSAndroid Build Coastguard Worker desc << "drawArrays(), "
1982*35238bceSAndroid Build Coastguard Worker << "first " << first << ", " << drawCount;
1983*35238bceSAndroid Build Coastguard Worker
1984*35238bceSAndroid Build Coastguard Worker switch (primitive)
1985*35238bceSAndroid Build Coastguard Worker {
1986*35238bceSAndroid Build Coastguard Worker case Array::PRIMITIVE_TRIANGLES:
1987*35238bceSAndroid Build Coastguard Worker desc << "quads ";
1988*35238bceSAndroid Build Coastguard Worker break;
1989*35238bceSAndroid Build Coastguard Worker case Array::PRIMITIVE_POINTS:
1990*35238bceSAndroid Build Coastguard Worker desc << "points";
1991*35238bceSAndroid Build Coastguard Worker break;
1992*35238bceSAndroid Build Coastguard Worker
1993*35238bceSAndroid Build Coastguard Worker default:
1994*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
1995*35238bceSAndroid Build Coastguard Worker break;
1996*35238bceSAndroid Build Coastguard Worker }
1997*35238bceSAndroid Build Coastguard Worker
1998*35238bceSAndroid Build Coastguard Worker return desc.str();
1999*35238bceSAndroid Build Coastguard Worker }
2000*35238bceSAndroid Build Coastguard Worker
MultiVertexArrayTest(tcu::TestContext & testCtx,glu::RenderContext & renderCtx,const Spec & spec,const char * name,const char * desc)2001*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::MultiVertexArrayTest(tcu::TestContext &testCtx, glu::RenderContext &renderCtx, const Spec &spec,
2002*35238bceSAndroid Build Coastguard Worker const char *name, const char *desc)
2003*35238bceSAndroid Build Coastguard Worker : VertexArrayTest(testCtx, renderCtx, name, desc)
2004*35238bceSAndroid Build Coastguard Worker , m_spec(spec)
2005*35238bceSAndroid Build Coastguard Worker , m_iteration(0)
2006*35238bceSAndroid Build Coastguard Worker {
2007*35238bceSAndroid Build Coastguard Worker }
2008*35238bceSAndroid Build Coastguard Worker
~MultiVertexArrayTest(void)2009*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::~MultiVertexArrayTest(void)
2010*35238bceSAndroid Build Coastguard Worker {
2011*35238bceSAndroid Build Coastguard Worker }
2012*35238bceSAndroid Build Coastguard Worker
iterate(void)2013*35238bceSAndroid Build Coastguard Worker MultiVertexArrayTest::IterateResult MultiVertexArrayTest::iterate(void)
2014*35238bceSAndroid Build Coastguard Worker {
2015*35238bceSAndroid Build Coastguard Worker if (m_iteration == 0)
2016*35238bceSAndroid Build Coastguard Worker {
2017*35238bceSAndroid Build Coastguard Worker const size_t primitiveSize = (m_spec.primitive == Array::PRIMITIVE_TRIANGLES) ?
2018*35238bceSAndroid Build Coastguard Worker (6) :
2019*35238bceSAndroid Build Coastguard Worker (1); // in non-indexed draw Triangles means rectangles
2020*35238bceSAndroid Build Coastguard Worker float coordScale = 1.0f;
2021*35238bceSAndroid Build Coastguard Worker float colorScale = 1.0f;
2022*35238bceSAndroid Build Coastguard Worker const bool useVao = m_renderCtx.getType().getProfile() == glu::PROFILE_CORE;
2023*35238bceSAndroid Build Coastguard Worker
2024*35238bceSAndroid Build Coastguard Worker // Log info
2025*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << m_spec.getDesc() << TestLog::EndMessage;
2026*35238bceSAndroid Build Coastguard Worker
2027*35238bceSAndroid Build Coastguard Worker // Color and Coord scale
2028*35238bceSAndroid Build Coastguard Worker {
2029*35238bceSAndroid Build Coastguard Worker // First array is always position
2030*35238bceSAndroid Build Coastguard Worker {
2031*35238bceSAndroid Build Coastguard Worker Spec::ArraySpec arraySpec = m_spec.arrays[0];
2032*35238bceSAndroid Build Coastguard Worker if (arraySpec.inputType == Array::INPUTTYPE_UNSIGNED_INT_2_10_10_10)
2033*35238bceSAndroid Build Coastguard Worker {
2034*35238bceSAndroid Build Coastguard Worker if (arraySpec.normalize)
2035*35238bceSAndroid Build Coastguard Worker coordScale = 1.0f;
2036*35238bceSAndroid Build Coastguard Worker else
2037*35238bceSAndroid Build Coastguard Worker coordScale = 1.0 / 1024.0;
2038*35238bceSAndroid Build Coastguard Worker }
2039*35238bceSAndroid Build Coastguard Worker else if (arraySpec.inputType == Array::INPUTTYPE_INT_2_10_10_10)
2040*35238bceSAndroid Build Coastguard Worker {
2041*35238bceSAndroid Build Coastguard Worker if (arraySpec.normalize)
2042*35238bceSAndroid Build Coastguard Worker coordScale = 1.0f;
2043*35238bceSAndroid Build Coastguard Worker else
2044*35238bceSAndroid Build Coastguard Worker coordScale = 1.0 / 512.0;
2045*35238bceSAndroid Build Coastguard Worker }
2046*35238bceSAndroid Build Coastguard Worker else
2047*35238bceSAndroid Build Coastguard Worker coordScale = (arraySpec.normalize && !inputTypeIsFloatType(arraySpec.inputType) ?
2048*35238bceSAndroid Build Coastguard Worker 1.0f :
2049*35238bceSAndroid Build Coastguard Worker float(0.9 / double(arraySpec.max.toFloat())));
2050*35238bceSAndroid Build Coastguard Worker
2051*35238bceSAndroid Build Coastguard Worker if (arraySpec.outputType == Array::OUTPUTTYPE_VEC3 || arraySpec.outputType == Array::OUTPUTTYPE_VEC4 ||
2052*35238bceSAndroid Build Coastguard Worker arraySpec.outputType == Array::OUTPUTTYPE_IVEC3 ||
2053*35238bceSAndroid Build Coastguard Worker arraySpec.outputType == Array::OUTPUTTYPE_IVEC4 ||
2054*35238bceSAndroid Build Coastguard Worker arraySpec.outputType == Array::OUTPUTTYPE_UVEC3 || arraySpec.outputType == Array::OUTPUTTYPE_UVEC4)
2055*35238bceSAndroid Build Coastguard Worker coordScale = coordScale * 0.5f;
2056*35238bceSAndroid Build Coastguard Worker }
2057*35238bceSAndroid Build Coastguard Worker
2058*35238bceSAndroid Build Coastguard Worker // And other arrays are color-like
2059*35238bceSAndroid Build Coastguard Worker for (int arrayNdx = 1; arrayNdx < (int)m_spec.arrays.size(); arrayNdx++)
2060*35238bceSAndroid Build Coastguard Worker {
2061*35238bceSAndroid Build Coastguard Worker Spec::ArraySpec arraySpec = m_spec.arrays[arrayNdx];
2062*35238bceSAndroid Build Coastguard Worker
2063*35238bceSAndroid Build Coastguard Worker colorScale *= (arraySpec.normalize && !inputTypeIsFloatType(arraySpec.inputType) ?
2064*35238bceSAndroid Build Coastguard Worker 1.0f :
2065*35238bceSAndroid Build Coastguard Worker float(1.0 / double(arraySpec.max.toFloat())));
2066*35238bceSAndroid Build Coastguard Worker if (arraySpec.outputType == Array::OUTPUTTYPE_VEC4)
2067*35238bceSAndroid Build Coastguard Worker colorScale *= (arraySpec.normalize && !inputTypeIsFloatType(arraySpec.inputType) ?
2068*35238bceSAndroid Build Coastguard Worker 1.0f :
2069*35238bceSAndroid Build Coastguard Worker float(1.0 / double(arraySpec.max.toFloat())));
2070*35238bceSAndroid Build Coastguard Worker }
2071*35238bceSAndroid Build Coastguard Worker }
2072*35238bceSAndroid Build Coastguard Worker
2073*35238bceSAndroid Build Coastguard Worker // Data
2074*35238bceSAndroid Build Coastguard Worker for (int arrayNdx = 0; arrayNdx < (int)m_spec.arrays.size(); arrayNdx++)
2075*35238bceSAndroid Build Coastguard Worker {
2076*35238bceSAndroid Build Coastguard Worker Spec::ArraySpec arraySpec = m_spec.arrays[arrayNdx];
2077*35238bceSAndroid Build Coastguard Worker const int seed = int(arraySpec.inputType) + 10 * int(arraySpec.outputType) + 100 * int(arraySpec.storage) +
2078*35238bceSAndroid Build Coastguard Worker 1000 * int(m_spec.primitive) + 10000 * int(arraySpec.usage) + int(m_spec.drawCount) +
2079*35238bceSAndroid Build Coastguard Worker 12 * int(arraySpec.componentCount) + int(arraySpec.stride) + int(arraySpec.normalize);
2080*35238bceSAndroid Build Coastguard Worker const char *data = DE_NULL;
2081*35238bceSAndroid Build Coastguard Worker const size_t stride = (arraySpec.stride == 0) ?
2082*35238bceSAndroid Build Coastguard Worker (arraySpec.componentCount * Array::inputTypeSize(arraySpec.inputType)) :
2083*35238bceSAndroid Build Coastguard Worker (arraySpec.stride);
2084*35238bceSAndroid Build Coastguard Worker const size_t bufferSize = arraySpec.offset + stride * (m_spec.drawCount * primitiveSize - 1) +
2085*35238bceSAndroid Build Coastguard Worker arraySpec.componentCount * Array::inputTypeSize(arraySpec.inputType);
2086*35238bceSAndroid Build Coastguard Worker // Snap values to at least 3x3 grid
2087*35238bceSAndroid Build Coastguard Worker const float gridSize = 3.0f / (float)(de::min(m_renderCtx.getRenderTarget().getWidth(),
2088*35238bceSAndroid Build Coastguard Worker m_renderCtx.getRenderTarget().getHeight()) -
2089*35238bceSAndroid Build Coastguard Worker 1);
2090*35238bceSAndroid Build Coastguard Worker
2091*35238bceSAndroid Build Coastguard Worker switch (m_spec.primitive)
2092*35238bceSAndroid Build Coastguard Worker {
2093*35238bceSAndroid Build Coastguard Worker // case Array::PRIMITIVE_POINTS:
2094*35238bceSAndroid Build Coastguard Worker // data = RandomArrayGenerator::generateArray(seed, arraySpec.min, arraySpec.max, arraySpec.count, arraySpec.componentCount, arraySpec.stride, arraySpec.inputType);
2095*35238bceSAndroid Build Coastguard Worker // break;
2096*35238bceSAndroid Build Coastguard Worker case Array::PRIMITIVE_TRIANGLES:
2097*35238bceSAndroid Build Coastguard Worker if (arrayNdx == 0)
2098*35238bceSAndroid Build Coastguard Worker {
2099*35238bceSAndroid Build Coastguard Worker data = RandomArrayGenerator::generateQuads(
2100*35238bceSAndroid Build Coastguard Worker seed, m_spec.drawCount, arraySpec.componentCount, arraySpec.offset, arraySpec.stride,
2101*35238bceSAndroid Build Coastguard Worker m_spec.primitive, arraySpec.inputType, arraySpec.min, arraySpec.max, gridSize);
2102*35238bceSAndroid Build Coastguard Worker }
2103*35238bceSAndroid Build Coastguard Worker else
2104*35238bceSAndroid Build Coastguard Worker {
2105*35238bceSAndroid Build Coastguard Worker DE_ASSERT(arraySpec.offset == 0); // \note [jarkko] it just hasn't been implemented
2106*35238bceSAndroid Build Coastguard Worker data = RandomArrayGenerator::generatePerQuad(seed, m_spec.drawCount, arraySpec.componentCount,
2107*35238bceSAndroid Build Coastguard Worker arraySpec.stride, m_spec.primitive,
2108*35238bceSAndroid Build Coastguard Worker arraySpec.inputType, arraySpec.min, arraySpec.max);
2109*35238bceSAndroid Build Coastguard Worker }
2110*35238bceSAndroid Build Coastguard Worker break;
2111*35238bceSAndroid Build Coastguard Worker
2112*35238bceSAndroid Build Coastguard Worker default:
2113*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
2114*35238bceSAndroid Build Coastguard Worker break;
2115*35238bceSAndroid Build Coastguard Worker }
2116*35238bceSAndroid Build Coastguard Worker
2117*35238bceSAndroid Build Coastguard Worker m_glArrayPack->newArray(arraySpec.storage);
2118*35238bceSAndroid Build Coastguard Worker m_rrArrayPack->newArray(arraySpec.storage);
2119*35238bceSAndroid Build Coastguard Worker
2120*35238bceSAndroid Build Coastguard Worker m_glArrayPack->getArray(arrayNdx)->data(Array::TARGET_ARRAY, (int)bufferSize, data, arraySpec.usage);
2121*35238bceSAndroid Build Coastguard Worker m_rrArrayPack->getArray(arrayNdx)->data(Array::TARGET_ARRAY, (int)bufferSize, data, arraySpec.usage);
2122*35238bceSAndroid Build Coastguard Worker
2123*35238bceSAndroid Build Coastguard Worker m_glArrayPack->getArray(arrayNdx)->bind(arrayNdx, arraySpec.offset, arraySpec.componentCount,
2124*35238bceSAndroid Build Coastguard Worker arraySpec.inputType, arraySpec.outputType, arraySpec.normalize,
2125*35238bceSAndroid Build Coastguard Worker arraySpec.stride);
2126*35238bceSAndroid Build Coastguard Worker m_rrArrayPack->getArray(arrayNdx)->bind(arrayNdx, arraySpec.offset, arraySpec.componentCount,
2127*35238bceSAndroid Build Coastguard Worker arraySpec.inputType, arraySpec.outputType, arraySpec.normalize,
2128*35238bceSAndroid Build Coastguard Worker arraySpec.stride);
2129*35238bceSAndroid Build Coastguard Worker
2130*35238bceSAndroid Build Coastguard Worker delete[] data;
2131*35238bceSAndroid Build Coastguard Worker }
2132*35238bceSAndroid Build Coastguard Worker
2133*35238bceSAndroid Build Coastguard Worker try
2134*35238bceSAndroid Build Coastguard Worker {
2135*35238bceSAndroid Build Coastguard Worker m_glArrayPack->render(m_spec.primitive, m_spec.first, m_spec.drawCount * (int)primitiveSize, useVao,
2136*35238bceSAndroid Build Coastguard Worker coordScale, colorScale);
2137*35238bceSAndroid Build Coastguard Worker m_testCtx.touchWatchdog();
2138*35238bceSAndroid Build Coastguard Worker m_rrArrayPack->render(m_spec.primitive, m_spec.first, m_spec.drawCount * (int)primitiveSize, useVao,
2139*35238bceSAndroid Build Coastguard Worker coordScale, colorScale);
2140*35238bceSAndroid Build Coastguard Worker }
2141*35238bceSAndroid Build Coastguard Worker catch (glu::Error &err)
2142*35238bceSAndroid Build Coastguard Worker {
2143*35238bceSAndroid Build Coastguard Worker // GL Errors are ok if the mode is not properly aligned
2144*35238bceSAndroid Build Coastguard Worker
2145*35238bceSAndroid Build Coastguard Worker m_testCtx.getLog() << TestLog::Message << "Got error: " << err.what() << TestLog::EndMessage;
2146*35238bceSAndroid Build Coastguard Worker
2147*35238bceSAndroid Build Coastguard Worker if (isUnalignedBufferOffsetTest())
2148*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_COMPATIBILITY_WARNING, "Failed to draw with unaligned buffers.");
2149*35238bceSAndroid Build Coastguard Worker else if (isUnalignedBufferStrideTest())
2150*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_COMPATIBILITY_WARNING, "Failed to draw with unaligned stride.");
2151*35238bceSAndroid Build Coastguard Worker else
2152*35238bceSAndroid Build Coastguard Worker throw;
2153*35238bceSAndroid Build Coastguard Worker
2154*35238bceSAndroid Build Coastguard Worker return STOP;
2155*35238bceSAndroid Build Coastguard Worker }
2156*35238bceSAndroid Build Coastguard Worker
2157*35238bceSAndroid Build Coastguard Worker m_iteration++;
2158*35238bceSAndroid Build Coastguard Worker return CONTINUE;
2159*35238bceSAndroid Build Coastguard Worker }
2160*35238bceSAndroid Build Coastguard Worker else if (m_iteration == 1)
2161*35238bceSAndroid Build Coastguard Worker {
2162*35238bceSAndroid Build Coastguard Worker compare();
2163*35238bceSAndroid Build Coastguard Worker
2164*35238bceSAndroid Build Coastguard Worker if (m_isOk)
2165*35238bceSAndroid Build Coastguard Worker {
2166*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
2167*35238bceSAndroid Build Coastguard Worker }
2168*35238bceSAndroid Build Coastguard Worker else
2169*35238bceSAndroid Build Coastguard Worker {
2170*35238bceSAndroid Build Coastguard Worker if (isUnalignedBufferOffsetTest())
2171*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_COMPATIBILITY_WARNING, "Failed to draw with unaligned buffers.");
2172*35238bceSAndroid Build Coastguard Worker else if (isUnalignedBufferStrideTest())
2173*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_COMPATIBILITY_WARNING, "Failed to draw with unaligned stride.");
2174*35238bceSAndroid Build Coastguard Worker else
2175*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image comparison failed.");
2176*35238bceSAndroid Build Coastguard Worker }
2177*35238bceSAndroid Build Coastguard Worker
2178*35238bceSAndroid Build Coastguard Worker m_iteration++;
2179*35238bceSAndroid Build Coastguard Worker return STOP;
2180*35238bceSAndroid Build Coastguard Worker }
2181*35238bceSAndroid Build Coastguard Worker else
2182*35238bceSAndroid Build Coastguard Worker {
2183*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
2184*35238bceSAndroid Build Coastguard Worker return STOP;
2185*35238bceSAndroid Build Coastguard Worker }
2186*35238bceSAndroid Build Coastguard Worker }
2187*35238bceSAndroid Build Coastguard Worker
isUnalignedBufferOffsetTest(void) const2188*35238bceSAndroid Build Coastguard Worker bool MultiVertexArrayTest::isUnalignedBufferOffsetTest(void) const
2189*35238bceSAndroid Build Coastguard Worker {
2190*35238bceSAndroid Build Coastguard Worker // Buffer offsets should be data type size aligned
2191*35238bceSAndroid Build Coastguard Worker for (size_t i = 0; i < m_spec.arrays.size(); ++i)
2192*35238bceSAndroid Build Coastguard Worker {
2193*35238bceSAndroid Build Coastguard Worker if (m_spec.arrays[i].storage == Array::STORAGE_BUFFER)
2194*35238bceSAndroid Build Coastguard Worker {
2195*35238bceSAndroid Build Coastguard Worker const bool inputTypePacked = m_spec.arrays[i].inputType == Array::INPUTTYPE_UNSIGNED_INT_2_10_10_10 ||
2196*35238bceSAndroid Build Coastguard Worker m_spec.arrays[i].inputType == Array::INPUTTYPE_INT_2_10_10_10;
2197*35238bceSAndroid Build Coastguard Worker
2198*35238bceSAndroid Build Coastguard Worker int dataTypeSize = Array::inputTypeSize(m_spec.arrays[i].inputType);
2199*35238bceSAndroid Build Coastguard Worker if (inputTypePacked)
2200*35238bceSAndroid Build Coastguard Worker dataTypeSize = 4;
2201*35238bceSAndroid Build Coastguard Worker
2202*35238bceSAndroid Build Coastguard Worker if (m_spec.arrays[i].offset % dataTypeSize != 0)
2203*35238bceSAndroid Build Coastguard Worker return true;
2204*35238bceSAndroid Build Coastguard Worker }
2205*35238bceSAndroid Build Coastguard Worker }
2206*35238bceSAndroid Build Coastguard Worker
2207*35238bceSAndroid Build Coastguard Worker return false;
2208*35238bceSAndroid Build Coastguard Worker }
2209*35238bceSAndroid Build Coastguard Worker
isUnalignedBufferStrideTest(void) const2210*35238bceSAndroid Build Coastguard Worker bool MultiVertexArrayTest::isUnalignedBufferStrideTest(void) const
2211*35238bceSAndroid Build Coastguard Worker {
2212*35238bceSAndroid Build Coastguard Worker // Buffer strides should be data type size aligned
2213*35238bceSAndroid Build Coastguard Worker for (size_t i = 0; i < m_spec.arrays.size(); ++i)
2214*35238bceSAndroid Build Coastguard Worker {
2215*35238bceSAndroid Build Coastguard Worker if (m_spec.arrays[i].storage == Array::STORAGE_BUFFER)
2216*35238bceSAndroid Build Coastguard Worker {
2217*35238bceSAndroid Build Coastguard Worker const bool inputTypePacked = m_spec.arrays[i].inputType == Array::INPUTTYPE_UNSIGNED_INT_2_10_10_10 ||
2218*35238bceSAndroid Build Coastguard Worker m_spec.arrays[i].inputType == Array::INPUTTYPE_INT_2_10_10_10;
2219*35238bceSAndroid Build Coastguard Worker
2220*35238bceSAndroid Build Coastguard Worker int dataTypeSize = Array::inputTypeSize(m_spec.arrays[i].inputType);
2221*35238bceSAndroid Build Coastguard Worker if (inputTypePacked)
2222*35238bceSAndroid Build Coastguard Worker dataTypeSize = 4;
2223*35238bceSAndroid Build Coastguard Worker
2224*35238bceSAndroid Build Coastguard Worker if (m_spec.arrays[i].stride % dataTypeSize != 0)
2225*35238bceSAndroid Build Coastguard Worker return true;
2226*35238bceSAndroid Build Coastguard Worker }
2227*35238bceSAndroid Build Coastguard Worker }
2228*35238bceSAndroid Build Coastguard Worker
2229*35238bceSAndroid Build Coastguard Worker return false;
2230*35238bceSAndroid Build Coastguard Worker }
2231*35238bceSAndroid Build Coastguard Worker
2232*35238bceSAndroid Build Coastguard Worker } // namespace gls
2233*35238bceSAndroid Build Coastguard Worker } // namespace deqp
2234