1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Reference Renderer
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 attribute fetch.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "rrVertexAttrib.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "tcuFloat.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "deInt32.h"
27*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
28*35238bceSAndroid Build Coastguard Worker
29*35238bceSAndroid Build Coastguard Worker namespace rr
30*35238bceSAndroid Build Coastguard Worker {
31*35238bceSAndroid Build Coastguard Worker
32*35238bceSAndroid Build Coastguard Worker namespace
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker
35*35238bceSAndroid Build Coastguard Worker struct NormalOrder
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker enum
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker T0 = 0,
40*35238bceSAndroid Build Coastguard Worker T1 = 1,
41*35238bceSAndroid Build Coastguard Worker T2 = 2,
42*35238bceSAndroid Build Coastguard Worker T3 = 3,
43*35238bceSAndroid Build Coastguard Worker };
44*35238bceSAndroid Build Coastguard Worker };
45*35238bceSAndroid Build Coastguard Worker
46*35238bceSAndroid Build Coastguard Worker struct BGRAOrder
47*35238bceSAndroid Build Coastguard Worker {
48*35238bceSAndroid Build Coastguard Worker enum
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker T0 = 2,
51*35238bceSAndroid Build Coastguard Worker T1 = 1,
52*35238bceSAndroid Build Coastguard Worker T2 = 0,
53*35238bceSAndroid Build Coastguard Worker T3 = 3,
54*35238bceSAndroid Build Coastguard Worker };
55*35238bceSAndroid Build Coastguard Worker };
56*35238bceSAndroid Build Coastguard Worker
57*35238bceSAndroid Build Coastguard Worker // readers
58*35238bceSAndroid Build Coastguard Worker
59*35238bceSAndroid Build Coastguard Worker template <typename SrcScalarType, typename DstScalarType, typename Order>
readOrder(typename tcu::Vector<DstScalarType,4> & dst,const int size,const void * ptr)60*35238bceSAndroid Build Coastguard Worker inline void readOrder(typename tcu::Vector<DstScalarType, 4> &dst, const int size, const void *ptr)
61*35238bceSAndroid Build Coastguard Worker {
62*35238bceSAndroid Build Coastguard Worker SrcScalarType aligned[4];
63*35238bceSAndroid Build Coastguard Worker deMemcpy(aligned, ptr, size * sizeof(SrcScalarType));
64*35238bceSAndroid Build Coastguard Worker
65*35238bceSAndroid Build Coastguard Worker dst[Order::T0] = DstScalarType(aligned[0]);
66*35238bceSAndroid Build Coastguard Worker if (size >= 2)
67*35238bceSAndroid Build Coastguard Worker dst[Order::T1] = DstScalarType(aligned[1]);
68*35238bceSAndroid Build Coastguard Worker if (size >= 3)
69*35238bceSAndroid Build Coastguard Worker dst[Order::T2] = DstScalarType(aligned[2]);
70*35238bceSAndroid Build Coastguard Worker if (size >= 4)
71*35238bceSAndroid Build Coastguard Worker dst[Order::T3] = DstScalarType(aligned[3]);
72*35238bceSAndroid Build Coastguard Worker }
73*35238bceSAndroid Build Coastguard Worker
74*35238bceSAndroid Build Coastguard Worker template <typename SrcScalarType, typename Order>
readUnormOrder(tcu::Vec4 & dst,const int size,const void * ptr)75*35238bceSAndroid Build Coastguard Worker inline void readUnormOrder(tcu::Vec4 &dst, const int size, const void *ptr)
76*35238bceSAndroid Build Coastguard Worker {
77*35238bceSAndroid Build Coastguard Worker const uint32_t range = (uint32_t)((1ull << (sizeof(SrcScalarType) * 8)) - 1);
78*35238bceSAndroid Build Coastguard Worker
79*35238bceSAndroid Build Coastguard Worker SrcScalarType aligned[4];
80*35238bceSAndroid Build Coastguard Worker deMemcpy(aligned, ptr, size * sizeof(SrcScalarType));
81*35238bceSAndroid Build Coastguard Worker
82*35238bceSAndroid Build Coastguard Worker dst[Order::T0] = float(aligned[0]) / float(range);
83*35238bceSAndroid Build Coastguard Worker if (size >= 2)
84*35238bceSAndroid Build Coastguard Worker dst[Order::T1] = float(aligned[1]) / float(range);
85*35238bceSAndroid Build Coastguard Worker if (size >= 3)
86*35238bceSAndroid Build Coastguard Worker dst[Order::T2] = float(aligned[2]) / float(range);
87*35238bceSAndroid Build Coastguard Worker if (size >= 4)
88*35238bceSAndroid Build Coastguard Worker dst[Order::T3] = float(aligned[3]) / float(range);
89*35238bceSAndroid Build Coastguard Worker }
90*35238bceSAndroid Build Coastguard Worker
91*35238bceSAndroid Build Coastguard Worker template <typename SrcScalarType>
readSnormClamp(tcu::Vec4 & dst,const int size,const void * ptr)92*35238bceSAndroid Build Coastguard Worker inline void readSnormClamp(tcu::Vec4 &dst, const int size, const void *ptr)
93*35238bceSAndroid Build Coastguard Worker {
94*35238bceSAndroid Build Coastguard Worker // Clamped formats, GLES3-style conversion: max{c / (2^(b-1) - 1), -1 }
95*35238bceSAndroid Build Coastguard Worker const uint32_t range = (uint32_t)((1ull << (sizeof(SrcScalarType) * 8 - 1)) - 1);
96*35238bceSAndroid Build Coastguard Worker
97*35238bceSAndroid Build Coastguard Worker SrcScalarType aligned[4];
98*35238bceSAndroid Build Coastguard Worker deMemcpy(aligned, ptr, size * sizeof(SrcScalarType));
99*35238bceSAndroid Build Coastguard Worker
100*35238bceSAndroid Build Coastguard Worker dst[0] = de::max(-1.0f, float(aligned[0]) / float(range));
101*35238bceSAndroid Build Coastguard Worker if (size >= 2)
102*35238bceSAndroid Build Coastguard Worker dst[1] = de::max(-1.0f, float(aligned[1]) / float(range));
103*35238bceSAndroid Build Coastguard Worker if (size >= 3)
104*35238bceSAndroid Build Coastguard Worker dst[2] = de::max(-1.0f, float(aligned[2]) / float(range));
105*35238bceSAndroid Build Coastguard Worker if (size >= 4)
106*35238bceSAndroid Build Coastguard Worker dst[3] = de::max(-1.0f, float(aligned[3]) / float(range));
107*35238bceSAndroid Build Coastguard Worker }
108*35238bceSAndroid Build Coastguard Worker
109*35238bceSAndroid Build Coastguard Worker template <typename SrcScalarType>
readSnormScale(tcu::Vec4 & dst,const int size,const void * ptr)110*35238bceSAndroid Build Coastguard Worker inline void readSnormScale(tcu::Vec4 &dst, const int size, const void *ptr)
111*35238bceSAndroid Build Coastguard Worker {
112*35238bceSAndroid Build Coastguard Worker // Scaled formats, GLES2-style conversion: (2c + 1) / (2^b - 1)
113*35238bceSAndroid Build Coastguard Worker const uint32_t range = (uint32_t)((1ull << (sizeof(SrcScalarType) * 8)) - 1);
114*35238bceSAndroid Build Coastguard Worker
115*35238bceSAndroid Build Coastguard Worker SrcScalarType aligned[4];
116*35238bceSAndroid Build Coastguard Worker deMemcpy(aligned, ptr, size * sizeof(SrcScalarType));
117*35238bceSAndroid Build Coastguard Worker
118*35238bceSAndroid Build Coastguard Worker dst[0] = (float(aligned[0]) * 2.0f + 1.0f) / float(range);
119*35238bceSAndroid Build Coastguard Worker if (size >= 2)
120*35238bceSAndroid Build Coastguard Worker dst[1] = (float(aligned[1]) * 2.0f + 1.0f) / float(range);
121*35238bceSAndroid Build Coastguard Worker if (size >= 3)
122*35238bceSAndroid Build Coastguard Worker dst[2] = (float(aligned[2]) * 2.0f + 1.0f) / float(range);
123*35238bceSAndroid Build Coastguard Worker if (size >= 4)
124*35238bceSAndroid Build Coastguard Worker dst[3] = (float(aligned[3]) * 2.0f + 1.0f) / float(range);
125*35238bceSAndroid Build Coastguard Worker }
126*35238bceSAndroid Build Coastguard Worker
readHalf(tcu::Vec4 & dst,const int size,const void * ptr)127*35238bceSAndroid Build Coastguard Worker inline void readHalf(tcu::Vec4 &dst, const int size, const void *ptr)
128*35238bceSAndroid Build Coastguard Worker {
129*35238bceSAndroid Build Coastguard Worker uint16_t aligned[4];
130*35238bceSAndroid Build Coastguard Worker deMemcpy(aligned, ptr, size * sizeof(uint16_t));
131*35238bceSAndroid Build Coastguard Worker
132*35238bceSAndroid Build Coastguard Worker dst[0] = tcu::Float16(aligned[0]).asFloat();
133*35238bceSAndroid Build Coastguard Worker if (size >= 2)
134*35238bceSAndroid Build Coastguard Worker dst[1] = tcu::Float16(aligned[1]).asFloat();
135*35238bceSAndroid Build Coastguard Worker if (size >= 3)
136*35238bceSAndroid Build Coastguard Worker dst[2] = tcu::Float16(aligned[2]).asFloat();
137*35238bceSAndroid Build Coastguard Worker if (size >= 4)
138*35238bceSAndroid Build Coastguard Worker dst[3] = tcu::Float16(aligned[3]).asFloat();
139*35238bceSAndroid Build Coastguard Worker }
140*35238bceSAndroid Build Coastguard Worker
readFixed(tcu::Vec4 & dst,const int size,const void * ptr)141*35238bceSAndroid Build Coastguard Worker inline void readFixed(tcu::Vec4 &dst, const int size, const void *ptr)
142*35238bceSAndroid Build Coastguard Worker {
143*35238bceSAndroid Build Coastguard Worker int32_t aligned[4];
144*35238bceSAndroid Build Coastguard Worker deMemcpy(aligned, ptr, size * sizeof(int32_t));
145*35238bceSAndroid Build Coastguard Worker
146*35238bceSAndroid Build Coastguard Worker dst[0] = float(aligned[0]) / float(1 << 16);
147*35238bceSAndroid Build Coastguard Worker if (size >= 2)
148*35238bceSAndroid Build Coastguard Worker dst[1] = float(aligned[1]) / float(1 << 16);
149*35238bceSAndroid Build Coastguard Worker if (size >= 3)
150*35238bceSAndroid Build Coastguard Worker dst[2] = float(aligned[2]) / float(1 << 16);
151*35238bceSAndroid Build Coastguard Worker if (size >= 4)
152*35238bceSAndroid Build Coastguard Worker dst[3] = float(aligned[3]) / float(1 << 16);
153*35238bceSAndroid Build Coastguard Worker }
154*35238bceSAndroid Build Coastguard Worker
readDouble(tcu::Vec4 & dst,const int size,const void * ptr)155*35238bceSAndroid Build Coastguard Worker inline void readDouble(tcu::Vec4 &dst, const int size, const void *ptr)
156*35238bceSAndroid Build Coastguard Worker {
157*35238bceSAndroid Build Coastguard Worker double aligned[4];
158*35238bceSAndroid Build Coastguard Worker deMemcpy(aligned, ptr, size * sizeof(double));
159*35238bceSAndroid Build Coastguard Worker
160*35238bceSAndroid Build Coastguard Worker dst[0] = float(aligned[0]);
161*35238bceSAndroid Build Coastguard Worker if (size >= 2)
162*35238bceSAndroid Build Coastguard Worker dst[1] = float(aligned[1]);
163*35238bceSAndroid Build Coastguard Worker if (size >= 3)
164*35238bceSAndroid Build Coastguard Worker dst[2] = float(aligned[2]);
165*35238bceSAndroid Build Coastguard Worker if (size >= 4)
166*35238bceSAndroid Build Coastguard Worker dst[3] = float(aligned[3]);
167*35238bceSAndroid Build Coastguard Worker }
168*35238bceSAndroid Build Coastguard Worker
169*35238bceSAndroid Build Coastguard Worker template <int integerLen>
extendSign(uint32_t integer)170*35238bceSAndroid Build Coastguard Worker inline int32_t extendSign(uint32_t integer)
171*35238bceSAndroid Build Coastguard Worker {
172*35238bceSAndroid Build Coastguard Worker return uint32_t(0 - int32_t((integer & (1 << (integerLen - 1))) << 1)) | integer;
173*35238bceSAndroid Build Coastguard Worker }
174*35238bceSAndroid Build Coastguard Worker
175*35238bceSAndroid Build Coastguard Worker template <typename DstScalarType>
readUint2101010Rev(typename tcu::Vector<DstScalarType,4> & dst,const int size,const void * ptr)176*35238bceSAndroid Build Coastguard Worker inline void readUint2101010Rev(typename tcu::Vector<DstScalarType, 4> &dst, const int size, const void *ptr)
177*35238bceSAndroid Build Coastguard Worker {
178*35238bceSAndroid Build Coastguard Worker uint32_t aligned;
179*35238bceSAndroid Build Coastguard Worker deMemcpy(&aligned, ptr, sizeof(uint32_t));
180*35238bceSAndroid Build Coastguard Worker
181*35238bceSAndroid Build Coastguard Worker dst[0] = DstScalarType((aligned >> 0) & ((1 << 10) - 1));
182*35238bceSAndroid Build Coastguard Worker if (size >= 2)
183*35238bceSAndroid Build Coastguard Worker dst[1] = DstScalarType((aligned >> 10) & ((1 << 10) - 1));
184*35238bceSAndroid Build Coastguard Worker if (size >= 3)
185*35238bceSAndroid Build Coastguard Worker dst[2] = DstScalarType((aligned >> 20) & ((1 << 10) - 1));
186*35238bceSAndroid Build Coastguard Worker if (size >= 4)
187*35238bceSAndroid Build Coastguard Worker dst[3] = DstScalarType((aligned >> 30) & ((1 << 2) - 1));
188*35238bceSAndroid Build Coastguard Worker }
189*35238bceSAndroid Build Coastguard Worker
190*35238bceSAndroid Build Coastguard Worker template <typename DstScalarType>
readInt2101010Rev(typename tcu::Vector<DstScalarType,4> & dst,const int size,const void * ptr)191*35238bceSAndroid Build Coastguard Worker inline void readInt2101010Rev(typename tcu::Vector<DstScalarType, 4> &dst, const int size, const void *ptr)
192*35238bceSAndroid Build Coastguard Worker {
193*35238bceSAndroid Build Coastguard Worker uint32_t aligned;
194*35238bceSAndroid Build Coastguard Worker deMemcpy(&aligned, ptr, sizeof(uint32_t));
195*35238bceSAndroid Build Coastguard Worker
196*35238bceSAndroid Build Coastguard Worker dst[0] = (DstScalarType)extendSign<10>((aligned >> 0) & ((1 << 10) - 1));
197*35238bceSAndroid Build Coastguard Worker if (size >= 2)
198*35238bceSAndroid Build Coastguard Worker dst[1] = (DstScalarType)extendSign<10>((aligned >> 10) & ((1 << 10) - 1));
199*35238bceSAndroid Build Coastguard Worker if (size >= 3)
200*35238bceSAndroid Build Coastguard Worker dst[2] = (DstScalarType)extendSign<10>((aligned >> 20) & ((1 << 10) - 1));
201*35238bceSAndroid Build Coastguard Worker if (size >= 4)
202*35238bceSAndroid Build Coastguard Worker dst[3] = (DstScalarType)extendSign<2>((aligned >> 30) & ((1 << 2) - 1));
203*35238bceSAndroid Build Coastguard Worker }
204*35238bceSAndroid Build Coastguard Worker
205*35238bceSAndroid Build Coastguard Worker template <typename Order>
readUnorm2101010RevOrder(tcu::Vec4 & dst,const int size,const void * ptr)206*35238bceSAndroid Build Coastguard Worker inline void readUnorm2101010RevOrder(tcu::Vec4 &dst, const int size, const void *ptr)
207*35238bceSAndroid Build Coastguard Worker {
208*35238bceSAndroid Build Coastguard Worker const uint32_t range10 = (uint32_t)((1ull << 10) - 1);
209*35238bceSAndroid Build Coastguard Worker const uint32_t range2 = (uint32_t)((1ull << 2) - 1);
210*35238bceSAndroid Build Coastguard Worker
211*35238bceSAndroid Build Coastguard Worker uint32_t aligned;
212*35238bceSAndroid Build Coastguard Worker deMemcpy(&aligned, ptr, sizeof(uint32_t));
213*35238bceSAndroid Build Coastguard Worker
214*35238bceSAndroid Build Coastguard Worker dst[Order::T0] = float((aligned >> 0) & ((1 << 10) - 1)) / float(range10);
215*35238bceSAndroid Build Coastguard Worker if (size >= 2)
216*35238bceSAndroid Build Coastguard Worker dst[Order::T1] = float((aligned >> 10) & ((1 << 10) - 1)) / float(range10);
217*35238bceSAndroid Build Coastguard Worker if (size >= 3)
218*35238bceSAndroid Build Coastguard Worker dst[Order::T2] = float((aligned >> 20) & ((1 << 10) - 1)) / float(range10);
219*35238bceSAndroid Build Coastguard Worker if (size >= 4)
220*35238bceSAndroid Build Coastguard Worker dst[Order::T3] = float((aligned >> 30) & ((1 << 2) - 1)) / float(range2);
221*35238bceSAndroid Build Coastguard Worker }
222*35238bceSAndroid Build Coastguard Worker
223*35238bceSAndroid Build Coastguard Worker template <typename Order>
readSnorm2101010RevClampOrder(tcu::Vec4 & dst,const int size,const void * ptr)224*35238bceSAndroid Build Coastguard Worker inline void readSnorm2101010RevClampOrder(tcu::Vec4 &dst, const int size, const void *ptr)
225*35238bceSAndroid Build Coastguard Worker {
226*35238bceSAndroid Build Coastguard Worker // Clamped formats, GLES3-style conversion: max{c / (2^(b-1) - 1), -1 }
227*35238bceSAndroid Build Coastguard Worker const uint32_t range10 = (uint32_t)((1ull << (10 - 1)) - 1);
228*35238bceSAndroid Build Coastguard Worker const uint32_t range2 = (uint32_t)((1ull << (2 - 1)) - 1);
229*35238bceSAndroid Build Coastguard Worker
230*35238bceSAndroid Build Coastguard Worker uint32_t aligned;
231*35238bceSAndroid Build Coastguard Worker deMemcpy(&aligned, ptr, sizeof(uint32_t));
232*35238bceSAndroid Build Coastguard Worker
233*35238bceSAndroid Build Coastguard Worker dst[Order::T0] = de::max(-1.0f, float(extendSign<10>((aligned >> 0) & ((1 << 10) - 1))) / float(range10));
234*35238bceSAndroid Build Coastguard Worker if (size >= 2)
235*35238bceSAndroid Build Coastguard Worker dst[Order::T1] = de::max(-1.0f, float(extendSign<10>((aligned >> 10) & ((1 << 10) - 1))) / float(range10));
236*35238bceSAndroid Build Coastguard Worker if (size >= 3)
237*35238bceSAndroid Build Coastguard Worker dst[Order::T2] = de::max(-1.0f, float(extendSign<10>((aligned >> 20) & ((1 << 10) - 1))) / float(range10));
238*35238bceSAndroid Build Coastguard Worker if (size >= 4)
239*35238bceSAndroid Build Coastguard Worker dst[Order::T3] = de::max(-1.0f, float(extendSign<2>((aligned >> 30) & ((1 << 2) - 1))) / float(range2));
240*35238bceSAndroid Build Coastguard Worker }
241*35238bceSAndroid Build Coastguard Worker
242*35238bceSAndroid Build Coastguard Worker template <typename Order>
readSnorm2101010RevScaleOrder(tcu::Vec4 & dst,const int size,const void * ptr)243*35238bceSAndroid Build Coastguard Worker inline void readSnorm2101010RevScaleOrder(tcu::Vec4 &dst, const int size, const void *ptr)
244*35238bceSAndroid Build Coastguard Worker {
245*35238bceSAndroid Build Coastguard Worker // Scaled formats, GLES2-style conversion: (2c + 1) / (2^b - 1)
246*35238bceSAndroid Build Coastguard Worker const uint32_t range10 = (uint32_t)((1ull << 10) - 1);
247*35238bceSAndroid Build Coastguard Worker const uint32_t range2 = (uint32_t)((1ull << 2) - 1);
248*35238bceSAndroid Build Coastguard Worker
249*35238bceSAndroid Build Coastguard Worker uint32_t aligned;
250*35238bceSAndroid Build Coastguard Worker deMemcpy(&aligned, ptr, sizeof(uint32_t));
251*35238bceSAndroid Build Coastguard Worker
252*35238bceSAndroid Build Coastguard Worker dst[Order::T0] = (float(extendSign<10>((aligned >> 0) & ((1 << 10) - 1))) * 2.0f + 1.0f) / float(range10);
253*35238bceSAndroid Build Coastguard Worker if (size >= 2)
254*35238bceSAndroid Build Coastguard Worker dst[Order::T1] = (float(extendSign<10>((aligned >> 10) & ((1 << 10) - 1))) * 2.0f + 1.0f) / float(range10);
255*35238bceSAndroid Build Coastguard Worker if (size >= 3)
256*35238bceSAndroid Build Coastguard Worker dst[Order::T2] = (float(extendSign<10>((aligned >> 20) & ((1 << 10) - 1))) * 2.0f + 1.0f) / float(range10);
257*35238bceSAndroid Build Coastguard Worker if (size >= 4)
258*35238bceSAndroid Build Coastguard Worker dst[Order::T3] = (float(extendSign<2>((aligned >> 30) & ((1 << 2) - 1))) * 2.0f + 1.0f) / float(range2);
259*35238bceSAndroid Build Coastguard Worker }
260*35238bceSAndroid Build Coastguard Worker
261*35238bceSAndroid Build Coastguard Worker // ordered readers
262*35238bceSAndroid Build Coastguard Worker
263*35238bceSAndroid Build Coastguard Worker template <typename SrcScalarType, typename DstScalarType>
read(typename tcu::Vector<DstScalarType,4> & dst,const int size,const void * ptr)264*35238bceSAndroid Build Coastguard Worker inline void read(typename tcu::Vector<DstScalarType, 4> &dst, const int size, const void *ptr)
265*35238bceSAndroid Build Coastguard Worker {
266*35238bceSAndroid Build Coastguard Worker readOrder<SrcScalarType, DstScalarType, NormalOrder>(dst, size, ptr);
267*35238bceSAndroid Build Coastguard Worker }
268*35238bceSAndroid Build Coastguard Worker
269*35238bceSAndroid Build Coastguard Worker template <typename SrcScalarType>
readUnorm(tcu::Vec4 & dst,const int size,const void * ptr)270*35238bceSAndroid Build Coastguard Worker inline void readUnorm(tcu::Vec4 &dst, const int size, const void *ptr)
271*35238bceSAndroid Build Coastguard Worker {
272*35238bceSAndroid Build Coastguard Worker readUnormOrder<SrcScalarType, NormalOrder>(dst, size, ptr);
273*35238bceSAndroid Build Coastguard Worker }
274*35238bceSAndroid Build Coastguard Worker
275*35238bceSAndroid Build Coastguard Worker template <typename SrcScalarType>
readUnormBGRA(tcu::Vec4 & dst,const int size,const void * ptr)276*35238bceSAndroid Build Coastguard Worker inline void readUnormBGRA(tcu::Vec4 &dst, const int size, const void *ptr)
277*35238bceSAndroid Build Coastguard Worker {
278*35238bceSAndroid Build Coastguard Worker readUnormOrder<SrcScalarType, BGRAOrder>(dst, size, ptr);
279*35238bceSAndroid Build Coastguard Worker }
280*35238bceSAndroid Build Coastguard Worker
readUnorm2101010Rev(tcu::Vec4 & dst,const int size,const void * ptr)281*35238bceSAndroid Build Coastguard Worker inline void readUnorm2101010Rev(tcu::Vec4 &dst, const int size, const void *ptr)
282*35238bceSAndroid Build Coastguard Worker {
283*35238bceSAndroid Build Coastguard Worker readUnorm2101010RevOrder<NormalOrder>(dst, size, ptr);
284*35238bceSAndroid Build Coastguard Worker }
285*35238bceSAndroid Build Coastguard Worker
readUnorm2101010RevBGRA(tcu::Vec4 & dst,const int size,const void * ptr)286*35238bceSAndroid Build Coastguard Worker inline void readUnorm2101010RevBGRA(tcu::Vec4 &dst, const int size, const void *ptr)
287*35238bceSAndroid Build Coastguard Worker {
288*35238bceSAndroid Build Coastguard Worker readUnorm2101010RevOrder<BGRAOrder>(dst, size, ptr);
289*35238bceSAndroid Build Coastguard Worker }
290*35238bceSAndroid Build Coastguard Worker
readSnorm2101010RevClamp(tcu::Vec4 & dst,const int size,const void * ptr)291*35238bceSAndroid Build Coastguard Worker inline void readSnorm2101010RevClamp(tcu::Vec4 &dst, const int size, const void *ptr)
292*35238bceSAndroid Build Coastguard Worker {
293*35238bceSAndroid Build Coastguard Worker readSnorm2101010RevClampOrder<NormalOrder>(dst, size, ptr);
294*35238bceSAndroid Build Coastguard Worker }
295*35238bceSAndroid Build Coastguard Worker
readSnorm2101010RevClampBGRA(tcu::Vec4 & dst,const int size,const void * ptr)296*35238bceSAndroid Build Coastguard Worker inline void readSnorm2101010RevClampBGRA(tcu::Vec4 &dst, const int size, const void *ptr)
297*35238bceSAndroid Build Coastguard Worker {
298*35238bceSAndroid Build Coastguard Worker readSnorm2101010RevClampOrder<BGRAOrder>(dst, size, ptr);
299*35238bceSAndroid Build Coastguard Worker }
300*35238bceSAndroid Build Coastguard Worker
readSnorm2101010RevScale(tcu::Vec4 & dst,const int size,const void * ptr)301*35238bceSAndroid Build Coastguard Worker inline void readSnorm2101010RevScale(tcu::Vec4 &dst, const int size, const void *ptr)
302*35238bceSAndroid Build Coastguard Worker {
303*35238bceSAndroid Build Coastguard Worker readSnorm2101010RevScaleOrder<NormalOrder>(dst, size, ptr);
304*35238bceSAndroid Build Coastguard Worker }
305*35238bceSAndroid Build Coastguard Worker
readSnorm2101010RevScaleBGRA(tcu::Vec4 & dst,const int size,const void * ptr)306*35238bceSAndroid Build Coastguard Worker inline void readSnorm2101010RevScaleBGRA(tcu::Vec4 &dst, const int size, const void *ptr)
307*35238bceSAndroid Build Coastguard Worker {
308*35238bceSAndroid Build Coastguard Worker readSnorm2101010RevScaleOrder<BGRAOrder>(dst, size, ptr);
309*35238bceSAndroid Build Coastguard Worker }
310*35238bceSAndroid Build Coastguard Worker
311*35238bceSAndroid Build Coastguard Worker // utils
312*35238bceSAndroid Build Coastguard Worker
readFloat(tcu::Vec4 & dst,const VertexAttribType type,const int size,const void * ptr)313*35238bceSAndroid Build Coastguard Worker void readFloat(tcu::Vec4 &dst, const VertexAttribType type, const int size, const void *ptr)
314*35238bceSAndroid Build Coastguard Worker {
315*35238bceSAndroid Build Coastguard Worker switch (type)
316*35238bceSAndroid Build Coastguard Worker {
317*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_FLOAT:
318*35238bceSAndroid Build Coastguard Worker read<float>(dst, size, ptr);
319*35238bceSAndroid Build Coastguard Worker break;
320*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_HALF:
321*35238bceSAndroid Build Coastguard Worker readHalf(dst, size, ptr);
322*35238bceSAndroid Build Coastguard Worker break;
323*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_FIXED:
324*35238bceSAndroid Build Coastguard Worker readFixed(dst, size, ptr);
325*35238bceSAndroid Build Coastguard Worker break;
326*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_DOUBLE:
327*35238bceSAndroid Build Coastguard Worker readDouble(dst, size, ptr);
328*35238bceSAndroid Build Coastguard Worker break;
329*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM8:
330*35238bceSAndroid Build Coastguard Worker readUnorm<uint8_t>(dst, size, ptr);
331*35238bceSAndroid Build Coastguard Worker break;
332*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM16:
333*35238bceSAndroid Build Coastguard Worker readUnorm<uint16_t>(dst, size, ptr);
334*35238bceSAndroid Build Coastguard Worker break;
335*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM32:
336*35238bceSAndroid Build Coastguard Worker readUnorm<uint32_t>(dst, size, ptr);
337*35238bceSAndroid Build Coastguard Worker break;
338*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM_2_10_10_10_REV:
339*35238bceSAndroid Build Coastguard Worker readUnorm2101010Rev(dst, size, ptr);
340*35238bceSAndroid Build Coastguard Worker break;
341*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM8_CLAMP:
342*35238bceSAndroid Build Coastguard Worker readSnormClamp<int8_t>(dst, size, ptr);
343*35238bceSAndroid Build Coastguard Worker break;
344*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM16_CLAMP:
345*35238bceSAndroid Build Coastguard Worker readSnormClamp<int16_t>(dst, size, ptr);
346*35238bceSAndroid Build Coastguard Worker break;
347*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM32_CLAMP:
348*35238bceSAndroid Build Coastguard Worker readSnormClamp<int32_t>(dst, size, ptr);
349*35238bceSAndroid Build Coastguard Worker break;
350*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_CLAMP:
351*35238bceSAndroid Build Coastguard Worker readSnorm2101010RevClamp(dst, size, ptr);
352*35238bceSAndroid Build Coastguard Worker break;
353*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM8_SCALE:
354*35238bceSAndroid Build Coastguard Worker readSnormScale<int8_t>(dst, size, ptr);
355*35238bceSAndroid Build Coastguard Worker break;
356*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM16_SCALE:
357*35238bceSAndroid Build Coastguard Worker readSnormScale<int16_t>(dst, size, ptr);
358*35238bceSAndroid Build Coastguard Worker break;
359*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM32_SCALE:
360*35238bceSAndroid Build Coastguard Worker readSnormScale<int32_t>(dst, size, ptr);
361*35238bceSAndroid Build Coastguard Worker break;
362*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_SCALE:
363*35238bceSAndroid Build Coastguard Worker readSnorm2101010RevScale(dst, size, ptr);
364*35238bceSAndroid Build Coastguard Worker break;
365*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT8:
366*35238bceSAndroid Build Coastguard Worker read<uint8_t>(dst, size, ptr);
367*35238bceSAndroid Build Coastguard Worker break;
368*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT16:
369*35238bceSAndroid Build Coastguard Worker read<uint16_t>(dst, size, ptr);
370*35238bceSAndroid Build Coastguard Worker break;
371*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT32:
372*35238bceSAndroid Build Coastguard Worker read<uint32_t>(dst, size, ptr);
373*35238bceSAndroid Build Coastguard Worker break;
374*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT8:
375*35238bceSAndroid Build Coastguard Worker read<int8_t>(dst, size, ptr);
376*35238bceSAndroid Build Coastguard Worker break;
377*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT16:
378*35238bceSAndroid Build Coastguard Worker read<int16_t>(dst, size, ptr);
379*35238bceSAndroid Build Coastguard Worker break;
380*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT32:
381*35238bceSAndroid Build Coastguard Worker read<int32_t>(dst, size, ptr);
382*35238bceSAndroid Build Coastguard Worker break;
383*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT_2_10_10_10_REV:
384*35238bceSAndroid Build Coastguard Worker readUint2101010Rev(dst, size, ptr);
385*35238bceSAndroid Build Coastguard Worker break;
386*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT_2_10_10_10_REV:
387*35238bceSAndroid Build Coastguard Worker readInt2101010Rev(dst, size, ptr);
388*35238bceSAndroid Build Coastguard Worker break;
389*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM8_BGRA:
390*35238bceSAndroid Build Coastguard Worker readUnormBGRA<uint8_t>(dst, size, ptr);
391*35238bceSAndroid Build Coastguard Worker break;
392*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM_2_10_10_10_REV_BGRA:
393*35238bceSAndroid Build Coastguard Worker readUnorm2101010RevBGRA(dst, size, ptr);
394*35238bceSAndroid Build Coastguard Worker break;
395*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_CLAMP_BGRA:
396*35238bceSAndroid Build Coastguard Worker readSnorm2101010RevClampBGRA(dst, size, ptr);
397*35238bceSAndroid Build Coastguard Worker break;
398*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_SCALE_BGRA:
399*35238bceSAndroid Build Coastguard Worker readSnorm2101010RevScaleBGRA(dst, size, ptr);
400*35238bceSAndroid Build Coastguard Worker break;
401*35238bceSAndroid Build Coastguard Worker
402*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_UINT8:
403*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_UINT16:
404*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_UINT32:
405*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_INT8:
406*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_INT16:
407*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_INT32:
408*35238bceSAndroid Build Coastguard Worker DE_FATAL("Invalid read");
409*35238bceSAndroid Build Coastguard Worker break;
410*35238bceSAndroid Build Coastguard Worker
411*35238bceSAndroid Build Coastguard Worker default:
412*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
413*35238bceSAndroid Build Coastguard Worker }
414*35238bceSAndroid Build Coastguard Worker }
415*35238bceSAndroid Build Coastguard Worker
readInt(tcu::IVec4 & dst,const VertexAttribType type,const int size,const void * ptr)416*35238bceSAndroid Build Coastguard Worker void readInt(tcu::IVec4 &dst, const VertexAttribType type, const int size, const void *ptr)
417*35238bceSAndroid Build Coastguard Worker {
418*35238bceSAndroid Build Coastguard Worker switch (type)
419*35238bceSAndroid Build Coastguard Worker {
420*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_INT8:
421*35238bceSAndroid Build Coastguard Worker read<int8_t>(dst, size, ptr);
422*35238bceSAndroid Build Coastguard Worker break;
423*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_INT16:
424*35238bceSAndroid Build Coastguard Worker read<int16_t>(dst, size, ptr);
425*35238bceSAndroid Build Coastguard Worker break;
426*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_INT32:
427*35238bceSAndroid Build Coastguard Worker read<int32_t>(dst, size, ptr);
428*35238bceSAndroid Build Coastguard Worker break;
429*35238bceSAndroid Build Coastguard Worker
430*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_FLOAT:
431*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_HALF:
432*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_FIXED:
433*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_DOUBLE:
434*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM8:
435*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM16:
436*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM32:
437*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM_2_10_10_10_REV:
438*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM8_CLAMP:
439*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM16_CLAMP:
440*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM32_CLAMP:
441*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_CLAMP:
442*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM8_SCALE:
443*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM16_SCALE:
444*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM32_SCALE:
445*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_SCALE:
446*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT8:
447*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT16:
448*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT32:
449*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT8:
450*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT16:
451*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT32:
452*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT_2_10_10_10_REV:
453*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT_2_10_10_10_REV:
454*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_UINT8:
455*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_UINT16:
456*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_UINT32:
457*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM8_BGRA:
458*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM_2_10_10_10_REV_BGRA:
459*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_CLAMP_BGRA:
460*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_SCALE_BGRA:
461*35238bceSAndroid Build Coastguard Worker DE_FATAL("Invalid read");
462*35238bceSAndroid Build Coastguard Worker break;
463*35238bceSAndroid Build Coastguard Worker
464*35238bceSAndroid Build Coastguard Worker default:
465*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
466*35238bceSAndroid Build Coastguard Worker }
467*35238bceSAndroid Build Coastguard Worker }
468*35238bceSAndroid Build Coastguard Worker
readUint(tcu::UVec4 & dst,const VertexAttribType type,const int size,const void * ptr)469*35238bceSAndroid Build Coastguard Worker void readUint(tcu::UVec4 &dst, const VertexAttribType type, const int size, const void *ptr)
470*35238bceSAndroid Build Coastguard Worker {
471*35238bceSAndroid Build Coastguard Worker switch (type)
472*35238bceSAndroid Build Coastguard Worker {
473*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_UINT8:
474*35238bceSAndroid Build Coastguard Worker read<uint8_t>(dst, size, ptr);
475*35238bceSAndroid Build Coastguard Worker break;
476*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_UINT16:
477*35238bceSAndroid Build Coastguard Worker read<uint16_t>(dst, size, ptr);
478*35238bceSAndroid Build Coastguard Worker break;
479*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_UINT32:
480*35238bceSAndroid Build Coastguard Worker read<uint32_t>(dst, size, ptr);
481*35238bceSAndroid Build Coastguard Worker break;
482*35238bceSAndroid Build Coastguard Worker
483*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_FLOAT:
484*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_HALF:
485*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_FIXED:
486*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_DOUBLE:
487*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM8:
488*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM16:
489*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM32:
490*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM_2_10_10_10_REV:
491*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM8_CLAMP:
492*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM16_CLAMP:
493*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM32_CLAMP:
494*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_CLAMP:
495*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM8_SCALE:
496*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM16_SCALE:
497*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM32_SCALE:
498*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_SCALE:
499*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT8:
500*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT16:
501*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT32:
502*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT8:
503*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT16:
504*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT32:
505*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT_2_10_10_10_REV:
506*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT_2_10_10_10_REV:
507*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_INT8:
508*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_INT16:
509*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_INT32:
510*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM8_BGRA:
511*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM_2_10_10_10_REV_BGRA:
512*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_CLAMP_BGRA:
513*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_SCALE_BGRA:
514*35238bceSAndroid Build Coastguard Worker DE_FATAL("Invalid read");
515*35238bceSAndroid Build Coastguard Worker break;
516*35238bceSAndroid Build Coastguard Worker
517*35238bceSAndroid Build Coastguard Worker default:
518*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
519*35238bceSAndroid Build Coastguard Worker }
520*35238bceSAndroid Build Coastguard Worker }
521*35238bceSAndroid Build Coastguard Worker
getComponentSize(const VertexAttribType type)522*35238bceSAndroid Build Coastguard Worker int getComponentSize(const VertexAttribType type)
523*35238bceSAndroid Build Coastguard Worker {
524*35238bceSAndroid Build Coastguard Worker switch (type)
525*35238bceSAndroid Build Coastguard Worker {
526*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_FLOAT:
527*35238bceSAndroid Build Coastguard Worker return 4;
528*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_HALF:
529*35238bceSAndroid Build Coastguard Worker return 2;
530*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_FIXED:
531*35238bceSAndroid Build Coastguard Worker return 4;
532*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_DOUBLE:
533*35238bceSAndroid Build Coastguard Worker return (int)sizeof(double);
534*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM8:
535*35238bceSAndroid Build Coastguard Worker return 1;
536*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM16:
537*35238bceSAndroid Build Coastguard Worker return 2;
538*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM32:
539*35238bceSAndroid Build Coastguard Worker return 4;
540*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM_2_10_10_10_REV:
541*35238bceSAndroid Build Coastguard Worker return (int)sizeof(uint32_t) / 4;
542*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM8_CLAMP:
543*35238bceSAndroid Build Coastguard Worker return 1;
544*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM16_CLAMP:
545*35238bceSAndroid Build Coastguard Worker return 2;
546*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM32_CLAMP:
547*35238bceSAndroid Build Coastguard Worker return 4;
548*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_CLAMP:
549*35238bceSAndroid Build Coastguard Worker return (int)sizeof(uint32_t) / 4;
550*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM8_SCALE:
551*35238bceSAndroid Build Coastguard Worker return 1;
552*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM16_SCALE:
553*35238bceSAndroid Build Coastguard Worker return 2;
554*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM32_SCALE:
555*35238bceSAndroid Build Coastguard Worker return 4;
556*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_SCALE:
557*35238bceSAndroid Build Coastguard Worker return (int)sizeof(uint32_t) / 4;
558*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT8:
559*35238bceSAndroid Build Coastguard Worker return 1;
560*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT16:
561*35238bceSAndroid Build Coastguard Worker return 2;
562*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT32:
563*35238bceSAndroid Build Coastguard Worker return 4;
564*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT8:
565*35238bceSAndroid Build Coastguard Worker return 1;
566*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT16:
567*35238bceSAndroid Build Coastguard Worker return 2;
568*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT32:
569*35238bceSAndroid Build Coastguard Worker return 4;
570*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UINT_2_10_10_10_REV:
571*35238bceSAndroid Build Coastguard Worker return (int)sizeof(uint32_t) / 4;
572*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_INT_2_10_10_10_REV:
573*35238bceSAndroid Build Coastguard Worker return (int)sizeof(uint32_t) / 4;
574*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_UINT8:
575*35238bceSAndroid Build Coastguard Worker return 1;
576*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_UINT16:
577*35238bceSAndroid Build Coastguard Worker return 2;
578*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_UINT32:
579*35238bceSAndroid Build Coastguard Worker return 4;
580*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_INT8:
581*35238bceSAndroid Build Coastguard Worker return 1;
582*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_INT16:
583*35238bceSAndroid Build Coastguard Worker return 2;
584*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_PURE_INT32:
585*35238bceSAndroid Build Coastguard Worker return 4;
586*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM8_BGRA:
587*35238bceSAndroid Build Coastguard Worker return 1;
588*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_UNORM_2_10_10_10_REV_BGRA:
589*35238bceSAndroid Build Coastguard Worker return (int)sizeof(uint32_t) / 4;
590*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_CLAMP_BGRA:
591*35238bceSAndroid Build Coastguard Worker return (int)sizeof(uint32_t) / 4;
592*35238bceSAndroid Build Coastguard Worker case VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_SCALE_BGRA:
593*35238bceSAndroid Build Coastguard Worker return (int)sizeof(uint32_t) / 4;
594*35238bceSAndroid Build Coastguard Worker default:
595*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
596*35238bceSAndroid Build Coastguard Worker return 0;
597*35238bceSAndroid Build Coastguard Worker }
598*35238bceSAndroid Build Coastguard Worker }
599*35238bceSAndroid Build Coastguard Worker
600*35238bceSAndroid Build Coastguard Worker } // namespace
601*35238bceSAndroid Build Coastguard Worker
isValidVertexAttrib(const VertexAttrib & vertexAttrib)602*35238bceSAndroid Build Coastguard Worker bool isValidVertexAttrib(const VertexAttrib &vertexAttrib)
603*35238bceSAndroid Build Coastguard Worker {
604*35238bceSAndroid Build Coastguard Worker // Trivial range checks.
605*35238bceSAndroid Build Coastguard Worker if (!de::inBounds<int>(vertexAttrib.type, 0, VERTEXATTRIBTYPE_LAST) || !de::inRange(vertexAttrib.size, 0, 4) ||
606*35238bceSAndroid Build Coastguard Worker vertexAttrib.instanceDivisor < 0)
607*35238bceSAndroid Build Coastguard Worker return false;
608*35238bceSAndroid Build Coastguard Worker
609*35238bceSAndroid Build Coastguard Worker // Generic attributes
610*35238bceSAndroid Build Coastguard Worker if (!vertexAttrib.pointer && vertexAttrib.type != VERTEXATTRIBTYPE_DONT_CARE)
611*35238bceSAndroid Build Coastguard Worker return false;
612*35238bceSAndroid Build Coastguard Worker
613*35238bceSAndroid Build Coastguard Worker // Packed formats
614*35238bceSAndroid Build Coastguard Worker if ((vertexAttrib.type == VERTEXATTRIBTYPE_NONPURE_INT_2_10_10_10_REV ||
615*35238bceSAndroid Build Coastguard Worker vertexAttrib.type == VERTEXATTRIBTYPE_NONPURE_UINT_2_10_10_10_REV ||
616*35238bceSAndroid Build Coastguard Worker vertexAttrib.type == VERTEXATTRIBTYPE_NONPURE_UNORM_2_10_10_10_REV ||
617*35238bceSAndroid Build Coastguard Worker vertexAttrib.type == VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_CLAMP ||
618*35238bceSAndroid Build Coastguard Worker vertexAttrib.type == VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_SCALE ||
619*35238bceSAndroid Build Coastguard Worker vertexAttrib.type == VERTEXATTRIBTYPE_NONPURE_UNORM_2_10_10_10_REV_BGRA ||
620*35238bceSAndroid Build Coastguard Worker vertexAttrib.type == VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_CLAMP_BGRA ||
621*35238bceSAndroid Build Coastguard Worker vertexAttrib.type == VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_SCALE_BGRA) &&
622*35238bceSAndroid Build Coastguard Worker vertexAttrib.size != 4)
623*35238bceSAndroid Build Coastguard Worker return false;
624*35238bceSAndroid Build Coastguard Worker
625*35238bceSAndroid Build Coastguard Worker return true;
626*35238bceSAndroid Build Coastguard Worker }
627*35238bceSAndroid Build Coastguard Worker
readVertexAttrib(tcu::Vec4 & dst,const VertexAttrib & vertexAttrib,const int instanceNdx,const int vertexNdx,const int baseInstanceNdx)628*35238bceSAndroid Build Coastguard Worker void readVertexAttrib(tcu::Vec4 &dst, const VertexAttrib &vertexAttrib, const int instanceNdx, const int vertexNdx,
629*35238bceSAndroid Build Coastguard Worker const int baseInstanceNdx)
630*35238bceSAndroid Build Coastguard Worker {
631*35238bceSAndroid Build Coastguard Worker DE_ASSERT(isValidVertexAttrib(vertexAttrib));
632*35238bceSAndroid Build Coastguard Worker
633*35238bceSAndroid Build Coastguard Worker if (vertexAttrib.pointer)
634*35238bceSAndroid Build Coastguard Worker {
635*35238bceSAndroid Build Coastguard Worker const int elementNdx = (vertexAttrib.instanceDivisor != 0) ?
636*35238bceSAndroid Build Coastguard Worker baseInstanceNdx + (instanceNdx / vertexAttrib.instanceDivisor) :
637*35238bceSAndroid Build Coastguard Worker vertexNdx;
638*35238bceSAndroid Build Coastguard Worker const int compSize = getComponentSize(vertexAttrib.type);
639*35238bceSAndroid Build Coastguard Worker const int stride = (vertexAttrib.stride != 0) ? (vertexAttrib.stride) : (vertexAttrib.size * compSize);
640*35238bceSAndroid Build Coastguard Worker const int byteOffset = elementNdx * stride;
641*35238bceSAndroid Build Coastguard Worker
642*35238bceSAndroid Build Coastguard Worker dst = tcu::Vec4(0, 0, 0, 1); // defaults
643*35238bceSAndroid Build Coastguard Worker readFloat(dst, vertexAttrib.type, vertexAttrib.size, (const uint8_t *)vertexAttrib.pointer + byteOffset);
644*35238bceSAndroid Build Coastguard Worker }
645*35238bceSAndroid Build Coastguard Worker else
646*35238bceSAndroid Build Coastguard Worker {
647*35238bceSAndroid Build Coastguard Worker dst = vertexAttrib.generic.get<float>();
648*35238bceSAndroid Build Coastguard Worker }
649*35238bceSAndroid Build Coastguard Worker }
650*35238bceSAndroid Build Coastguard Worker
readVertexAttrib(tcu::IVec4 & dst,const VertexAttrib & vertexAttrib,const int instanceNdx,const int vertexNdx,const int baseInstanceNdx)651*35238bceSAndroid Build Coastguard Worker void readVertexAttrib(tcu::IVec4 &dst, const VertexAttrib &vertexAttrib, const int instanceNdx, const int vertexNdx,
652*35238bceSAndroid Build Coastguard Worker const int baseInstanceNdx)
653*35238bceSAndroid Build Coastguard Worker {
654*35238bceSAndroid Build Coastguard Worker DE_ASSERT(isValidVertexAttrib(vertexAttrib));
655*35238bceSAndroid Build Coastguard Worker
656*35238bceSAndroid Build Coastguard Worker if (vertexAttrib.pointer)
657*35238bceSAndroid Build Coastguard Worker {
658*35238bceSAndroid Build Coastguard Worker const int elementNdx = (vertexAttrib.instanceDivisor != 0) ?
659*35238bceSAndroid Build Coastguard Worker baseInstanceNdx + (instanceNdx / vertexAttrib.instanceDivisor) :
660*35238bceSAndroid Build Coastguard Worker vertexNdx;
661*35238bceSAndroid Build Coastguard Worker const int compSize = getComponentSize(vertexAttrib.type);
662*35238bceSAndroid Build Coastguard Worker const int stride = (vertexAttrib.stride != 0) ? (vertexAttrib.stride) : (vertexAttrib.size * compSize);
663*35238bceSAndroid Build Coastguard Worker const int byteOffset = elementNdx * stride;
664*35238bceSAndroid Build Coastguard Worker
665*35238bceSAndroid Build Coastguard Worker dst = tcu::IVec4(0, 0, 0, 1); // defaults
666*35238bceSAndroid Build Coastguard Worker readInt(dst, vertexAttrib.type, vertexAttrib.size, (const uint8_t *)vertexAttrib.pointer + byteOffset);
667*35238bceSAndroid Build Coastguard Worker }
668*35238bceSAndroid Build Coastguard Worker else
669*35238bceSAndroid Build Coastguard Worker {
670*35238bceSAndroid Build Coastguard Worker dst = vertexAttrib.generic.get<int32_t>();
671*35238bceSAndroid Build Coastguard Worker }
672*35238bceSAndroid Build Coastguard Worker }
673*35238bceSAndroid Build Coastguard Worker
readVertexAttrib(tcu::UVec4 & dst,const VertexAttrib & vertexAttrib,const int instanceNdx,const int vertexNdx,const int baseInstanceNdx)674*35238bceSAndroid Build Coastguard Worker void readVertexAttrib(tcu::UVec4 &dst, const VertexAttrib &vertexAttrib, const int instanceNdx, const int vertexNdx,
675*35238bceSAndroid Build Coastguard Worker const int baseInstanceNdx)
676*35238bceSAndroid Build Coastguard Worker {
677*35238bceSAndroid Build Coastguard Worker DE_ASSERT(isValidVertexAttrib(vertexAttrib));
678*35238bceSAndroid Build Coastguard Worker
679*35238bceSAndroid Build Coastguard Worker if (vertexAttrib.pointer)
680*35238bceSAndroid Build Coastguard Worker {
681*35238bceSAndroid Build Coastguard Worker const int elementNdx = (vertexAttrib.instanceDivisor != 0) ?
682*35238bceSAndroid Build Coastguard Worker baseInstanceNdx + (instanceNdx / vertexAttrib.instanceDivisor) :
683*35238bceSAndroid Build Coastguard Worker vertexNdx;
684*35238bceSAndroid Build Coastguard Worker const int compSize = getComponentSize(vertexAttrib.type);
685*35238bceSAndroid Build Coastguard Worker const int stride = (vertexAttrib.stride != 0) ? (vertexAttrib.stride) : (vertexAttrib.size * compSize);
686*35238bceSAndroid Build Coastguard Worker const int byteOffset = elementNdx * stride;
687*35238bceSAndroid Build Coastguard Worker
688*35238bceSAndroid Build Coastguard Worker dst = tcu::UVec4(0, 0, 0, 1); // defaults
689*35238bceSAndroid Build Coastguard Worker readUint(dst, vertexAttrib.type, vertexAttrib.size, (const uint8_t *)vertexAttrib.pointer + byteOffset);
690*35238bceSAndroid Build Coastguard Worker }
691*35238bceSAndroid Build Coastguard Worker else
692*35238bceSAndroid Build Coastguard Worker {
693*35238bceSAndroid Build Coastguard Worker dst = vertexAttrib.generic.get<uint32_t>();
694*35238bceSAndroid Build Coastguard Worker }
695*35238bceSAndroid Build Coastguard Worker }
696*35238bceSAndroid Build Coastguard Worker
697*35238bceSAndroid Build Coastguard Worker } // namespace rr
698