xref: /aosp_15_r20/external/mesa3d/src/mesa/main/macros.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /**
2*61046927SAndroid Build Coastguard Worker  * \file macros.h
3*61046927SAndroid Build Coastguard Worker  * A collection of useful macros.
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker /*
7*61046927SAndroid Build Coastguard Worker  * Mesa 3-D graphics library
8*61046927SAndroid Build Coastguard Worker  *
9*61046927SAndroid Build Coastguard Worker  * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
12*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
13*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
14*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
16*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
17*61046927SAndroid Build Coastguard Worker  *
18*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included
19*61046927SAndroid Build Coastguard Worker  * in all copies or substantial portions of the Software.
20*61046927SAndroid Build Coastguard Worker  *
21*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22*61046927SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
24*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
25*61046927SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
26*61046927SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27*61046927SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
28*61046927SAndroid Build Coastguard Worker  */
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker #ifndef MACROS_H
32*61046927SAndroid Build Coastguard Worker #define MACROS_H
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
35*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
36*61046927SAndroid Build Coastguard Worker #include "util/rounding.h"
37*61046927SAndroid Build Coastguard Worker #include "util/compiler.h"
38*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
39*61046927SAndroid Build Coastguard Worker #include "mesa_private.h"
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker /**
43*61046927SAndroid Build Coastguard Worker  * \name Integer / float conversion for colors, normals, etc.
44*61046927SAndroid Build Coastguard Worker  */
45*61046927SAndroid Build Coastguard Worker /*@{*/
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker /** Convert GLubyte in [0,255] to GLfloat in [0.0,1.0] */
48*61046927SAndroid Build Coastguard Worker extern GLfloat _mesa_ubyte_to_float_color_tab[256];
49*61046927SAndroid Build Coastguard Worker #define UBYTE_TO_FLOAT(u) _mesa_ubyte_to_float_color_tab[(unsigned int)(u)]
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker /** Convert GLfloat in [0.0,1.0] to GLubyte in [0,255] */
52*61046927SAndroid Build Coastguard Worker #define FLOAT_TO_UBYTE(X)   ((GLubyte) (GLint) ((X) * 255.0F))
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker 
55*61046927SAndroid Build Coastguard Worker /** Convert GLbyte in [-128,127] to GLfloat in [-1.0,1.0] */
56*61046927SAndroid Build Coastguard Worker #define BYTE_TO_FLOAT(B)    ((2.0F * (B) + 1.0F) * (1.0F/255.0F))
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker /** Convert GLfloat in [-1.0,1.0] to GLbyte in [-128,127] */
59*61046927SAndroid Build Coastguard Worker #define FLOAT_TO_BYTE(X)    ( (((GLint) (255.0F * (X))) - 1) / 2 )
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker /** Convert GLbyte to GLfloat while preserving zero */
63*61046927SAndroid Build Coastguard Worker #define BYTE_TO_FLOATZ(B)   ((B) == 0 ? 0.0F : BYTE_TO_FLOAT(B))
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker /** Convert GLbyte in [-128,127] to GLfloat in [-1.0,1.0], texture/fb data */
67*61046927SAndroid Build Coastguard Worker #define BYTE_TO_FLOAT_TEX(B)    ((B) == -128 ? -1.0F : (B) * (1.0F/127.0F))
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker /** Convert GLfloat in [-1.0,1.0] to GLbyte in [-128,127], texture/fb data */
70*61046927SAndroid Build Coastguard Worker #define FLOAT_TO_BYTE_TEX(X)    CLAMP( (GLint) (127.0F * (X)), -128, 127 )
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker /** Convert GLushort in [0,65535] to GLfloat in [0.0,1.0] */
73*61046927SAndroid Build Coastguard Worker #define USHORT_TO_FLOAT(S)  ((GLfloat) (S) * (1.0F / 65535.0F))
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker /** Convert GLfloat in [0.0,1.0] to GLushort in [0, 65535] */
76*61046927SAndroid Build Coastguard Worker #define FLOAT_TO_USHORT(X)   ((GLuint) ((X) * 65535.0F))
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker /** Convert GLshort in [-32768,32767] to GLfloat in [-1.0,1.0] */
80*61046927SAndroid Build Coastguard Worker #define SHORT_TO_FLOAT(S)   ((2.0F * (S) + 1.0F) * (1.0F/65535.0F))
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker /** Convert GLfloat in [-1.0,1.0] to GLshort in [-32768,32767] */
83*61046927SAndroid Build Coastguard Worker #define FLOAT_TO_SHORT(X)   ( (((GLint) (65535.0F * (X))) - 1) / 2 )
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker /** Convert GLshort to GLfloat while preserving zero */
86*61046927SAndroid Build Coastguard Worker #define SHORT_TO_FLOATZ(S)   ((S) == 0 ? 0.0F : SHORT_TO_FLOAT(S))
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker /** Convert GLshort in [-32768,32767] to GLfloat in [-1.0,1.0], texture/fb data */
90*61046927SAndroid Build Coastguard Worker #define SHORT_TO_FLOAT_TEX(S)    ((S) == -32768 ? -1.0F : (S) * (1.0F/32767.0F))
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker /** Convert GLfloat in [-1.0,1.0] to GLshort in [-32768,32767], texture/fb data */
93*61046927SAndroid Build Coastguard Worker #define FLOAT_TO_SHORT_TEX(X)    ( (GLint) (32767.0F * (X)) )
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker /** Convert GLuint in [0,4294967295] to GLfloat in [0.0,1.0] */
97*61046927SAndroid Build Coastguard Worker #define UINT_TO_FLOAT(U)    ((GLfloat) ((U) * (1.0F / 4294967295.0)))
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker /** Convert GLfloat in [0.0,1.0] to GLuint in [0,4294967295] */
100*61046927SAndroid Build Coastguard Worker #define FLOAT_TO_UINT(X)    ((GLuint) ((X) * 4294967295.0))
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker /** Convert GLint in [-2147483648,2147483647] to GLfloat in [-1.0,1.0] */
104*61046927SAndroid Build Coastguard Worker #define INT_TO_FLOAT(I)     ((GLfloat) ((2.0F * (I) + 1.0F) * (1.0F/4294967294.0)))
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker /** Convert GLfloat in [-1.0,1.0] to GLint in [-2147483648,2147483647] */
107*61046927SAndroid Build Coastguard Worker /* causes overflow:
108*61046927SAndroid Build Coastguard Worker #define FLOAT_TO_INT(X)     ( (((GLint) (4294967294.0 * (X))) - 1) / 2 )
109*61046927SAndroid Build Coastguard Worker */
110*61046927SAndroid Build Coastguard Worker /* a close approximation: */
111*61046927SAndroid Build Coastguard Worker #define FLOAT_TO_INT(X)     ( (GLint) (2147483647.0 * (X)) )
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker /** Convert GLfloat in [-1.0,1.0] to GLint64 in [-(1<<63),(1 << 63) -1] */
114*61046927SAndroid Build Coastguard Worker #define FLOAT_TO_INT64(X)     ( (GLint64) (9223372036854775807.0 * (double)(X)) )
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker 
117*61046927SAndroid Build Coastguard Worker /** Convert GLint in [-2147483648,2147483647] to GLfloat in [-1.0,1.0], texture/fb data */
118*61046927SAndroid Build Coastguard Worker #define INT_TO_FLOAT_TEX(I)    ((I) == -2147483648 ? -1.0F : (I) * (1.0F/2147483647.0))
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker /** Convert GLfloat in [-1.0,1.0] to GLint in [-2147483648,2147483647], texture/fb data */
121*61046927SAndroid Build Coastguard Worker #define FLOAT_TO_INT_TEX(X)    ( (GLint) (2147483647.0 * (X)) )
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker #define BYTE_TO_UBYTE(b)   ((GLubyte) ((b) < 0 ? 0 : (GLubyte) (b)))
125*61046927SAndroid Build Coastguard Worker #define SHORT_TO_UBYTE(s)  ((GLubyte) ((s) < 0 ? 0 : (GLubyte) ((s) >> 7)))
126*61046927SAndroid Build Coastguard Worker #define USHORT_TO_UBYTE(s) ((GLubyte) ((s) >> 8))
127*61046927SAndroid Build Coastguard Worker #define INT_TO_UBYTE(i)    ((GLubyte) ((i) < 0 ? 0 : (GLubyte) ((i) >> 23)))
128*61046927SAndroid Build Coastguard Worker #define UINT_TO_UBYTE(i)   ((GLubyte) ((i) >> 24))
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker #define BYTE_TO_USHORT(b)  ((b) < 0 ? 0 : ((GLushort) (((b) * 65535) / 255)))
132*61046927SAndroid Build Coastguard Worker #define UBYTE_TO_USHORT(b) (((GLushort) (b) << 8) | (GLushort) (b))
133*61046927SAndroid Build Coastguard Worker #define SHORT_TO_USHORT(s) ((s) < 0 ? 0 : ((GLushort) (((s) * 65535 / 32767))))
134*61046927SAndroid Build Coastguard Worker #define INT_TO_USHORT(i)   ((i) < 0 ? 0 : ((GLushort) ((i) >> 15)))
135*61046927SAndroid Build Coastguard Worker #define UINT_TO_USHORT(i)  ((i) < 0 ? 0 : ((GLushort) ((i) >> 16)))
136*61046927SAndroid Build Coastguard Worker #define UNCLAMPED_FLOAT_TO_USHORT(us, f)  \
137*61046927SAndroid Build Coastguard Worker         us = ( (GLushort) _mesa_lroundevenf( CLAMP((f), 0.0F, 1.0F) * 65535.0F) )
138*61046927SAndroid Build Coastguard Worker #define CLAMPED_FLOAT_TO_USHORT(us, f)  \
139*61046927SAndroid Build Coastguard Worker         us = ( (GLushort) _mesa_lroundevenf( (f) * 65535.0F) )
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker #define UNCLAMPED_FLOAT_TO_SHORT(s, f)  \
142*61046927SAndroid Build Coastguard Worker         s = ( (GLshort) _mesa_lroundevenf( CLAMP((f), -1.0F, 1.0F) * 32767.0F) )
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker /***
145*61046927SAndroid Build Coastguard Worker  *** UNCLAMPED_FLOAT_TO_UBYTE: clamp float to [0,1] and map to ubyte in [0,255]
146*61046927SAndroid Build Coastguard Worker  *** CLAMPED_FLOAT_TO_UBYTE: map float known to be in [0,1] to ubyte in [0,255]
147*61046927SAndroid Build Coastguard Worker  ***/
148*61046927SAndroid Build Coastguard Worker #if !MESA_DEBUG
149*61046927SAndroid Build Coastguard Worker /* This function/macro is sensitive to precision.  Test very carefully
150*61046927SAndroid Build Coastguard Worker  * if you change it!
151*61046927SAndroid Build Coastguard Worker  */
152*61046927SAndroid Build Coastguard Worker #define UNCLAMPED_FLOAT_TO_UBYTE(UB, FLT)				\
153*61046927SAndroid Build Coastguard Worker         do {								\
154*61046927SAndroid Build Coastguard Worker            fi_type __tmp;						\
155*61046927SAndroid Build Coastguard Worker            __tmp.f = (FLT);						\
156*61046927SAndroid Build Coastguard Worker            if (__tmp.i < 0)						\
157*61046927SAndroid Build Coastguard Worker               UB = (GLubyte) 0;						\
158*61046927SAndroid Build Coastguard Worker            else if (__tmp.i >= IEEE_ONE)				\
159*61046927SAndroid Build Coastguard Worker               UB = (GLubyte) 255;					\
160*61046927SAndroid Build Coastguard Worker            else {							\
161*61046927SAndroid Build Coastguard Worker               __tmp.f = __tmp.f * (255.0F/256.0F) + 32768.0F;		\
162*61046927SAndroid Build Coastguard Worker               UB = (GLubyte) __tmp.i;					\
163*61046927SAndroid Build Coastguard Worker            }								\
164*61046927SAndroid Build Coastguard Worker         } while (0)
165*61046927SAndroid Build Coastguard Worker #define CLAMPED_FLOAT_TO_UBYTE(UB, FLT)					\
166*61046927SAndroid Build Coastguard Worker         do {								\
167*61046927SAndroid Build Coastguard Worker            fi_type __tmp;						\
168*61046927SAndroid Build Coastguard Worker            __tmp.f = (FLT) * (255.0F/256.0F) + 32768.0F;		\
169*61046927SAndroid Build Coastguard Worker            UB = (GLubyte) __tmp.i;					\
170*61046927SAndroid Build Coastguard Worker         } while (0)
171*61046927SAndroid Build Coastguard Worker #else
172*61046927SAndroid Build Coastguard Worker #define UNCLAMPED_FLOAT_TO_UBYTE(ub, f) \
173*61046927SAndroid Build Coastguard Worker 	ub = ((GLubyte) _mesa_lroundevenf(CLAMP((f), 0.0F, 1.0F) * 255.0F))
174*61046927SAndroid Build Coastguard Worker #define CLAMPED_FLOAT_TO_UBYTE(ub, f) \
175*61046927SAndroid Build Coastguard Worker 	ub = ((GLubyte) _mesa_lroundevenf((f) * 255.0F))
176*61046927SAndroid Build Coastguard Worker #endif
177*61046927SAndroid Build Coastguard Worker 
UINT_AS_UNION(GLuint u)178*61046927SAndroid Build Coastguard Worker static fi_type UINT_AS_UNION(GLuint u)
179*61046927SAndroid Build Coastguard Worker {
180*61046927SAndroid Build Coastguard Worker    fi_type tmp;
181*61046927SAndroid Build Coastguard Worker    tmp.u = u;
182*61046927SAndroid Build Coastguard Worker    return tmp;
183*61046927SAndroid Build Coastguard Worker }
184*61046927SAndroid Build Coastguard Worker 
INT_AS_UNION(GLint i)185*61046927SAndroid Build Coastguard Worker static inline fi_type INT_AS_UNION(GLint i)
186*61046927SAndroid Build Coastguard Worker {
187*61046927SAndroid Build Coastguard Worker    fi_type tmp;
188*61046927SAndroid Build Coastguard Worker    tmp.i = i;
189*61046927SAndroid Build Coastguard Worker    return tmp;
190*61046927SAndroid Build Coastguard Worker }
191*61046927SAndroid Build Coastguard Worker 
FLOAT_AS_UNION(GLfloat f)192*61046927SAndroid Build Coastguard Worker static inline fi_type FLOAT_AS_UNION(GLfloat f)
193*61046927SAndroid Build Coastguard Worker {
194*61046927SAndroid Build Coastguard Worker    fi_type tmp;
195*61046927SAndroid Build Coastguard Worker    tmp.f = f;
196*61046927SAndroid Build Coastguard Worker    return tmp;
197*61046927SAndroid Build Coastguard Worker }
198*61046927SAndroid Build Coastguard Worker 
DOUBLE_AS_UINT64(double d)199*61046927SAndroid Build Coastguard Worker static inline uint64_t DOUBLE_AS_UINT64(double d)
200*61046927SAndroid Build Coastguard Worker {
201*61046927SAndroid Build Coastguard Worker    union {
202*61046927SAndroid Build Coastguard Worker       double d;
203*61046927SAndroid Build Coastguard Worker       uint64_t u64;
204*61046927SAndroid Build Coastguard Worker    } tmp;
205*61046927SAndroid Build Coastguard Worker    tmp.d = d;
206*61046927SAndroid Build Coastguard Worker    return tmp.u64;
207*61046927SAndroid Build Coastguard Worker }
208*61046927SAndroid Build Coastguard Worker 
UINT64_AS_DOUBLE(uint64_t u)209*61046927SAndroid Build Coastguard Worker static inline double UINT64_AS_DOUBLE(uint64_t u)
210*61046927SAndroid Build Coastguard Worker {
211*61046927SAndroid Build Coastguard Worker    union {
212*61046927SAndroid Build Coastguard Worker       double d;
213*61046927SAndroid Build Coastguard Worker       uint64_t u64;
214*61046927SAndroid Build Coastguard Worker    } tmp;
215*61046927SAndroid Build Coastguard Worker    tmp.u64 = u;
216*61046927SAndroid Build Coastguard Worker    return tmp.d;
217*61046927SAndroid Build Coastguard Worker }
218*61046927SAndroid Build Coastguard Worker 
219*61046927SAndroid Build Coastguard Worker /* First sign-extend x, then return uint32_t. */
220*61046927SAndroid Build Coastguard Worker #define INT_AS_UINT(x) ((uint32_t)((int32_t)(x)))
221*61046927SAndroid Build Coastguard Worker #define FLOAT_AS_UINT(x) (FLOAT_AS_UNION(x).u)
222*61046927SAndroid Build Coastguard Worker 
223*61046927SAndroid Build Coastguard Worker /**
224*61046927SAndroid Build Coastguard Worker  * Convert a floating point value to an unsigned fixed point value.
225*61046927SAndroid Build Coastguard Worker  *
226*61046927SAndroid Build Coastguard Worker  * \param frac_bits   The number of bits used to store the fractional part.
227*61046927SAndroid Build Coastguard Worker  */
228*61046927SAndroid Build Coastguard Worker static inline uint32_t
U_FIXED(float value,uint32_t frac_bits)229*61046927SAndroid Build Coastguard Worker U_FIXED(float value, uint32_t frac_bits)
230*61046927SAndroid Build Coastguard Worker {
231*61046927SAndroid Build Coastguard Worker    value *= (1 << frac_bits);
232*61046927SAndroid Build Coastguard Worker    return value < 0.0f ? 0 : (uint32_t) value;
233*61046927SAndroid Build Coastguard Worker }
234*61046927SAndroid Build Coastguard Worker 
235*61046927SAndroid Build Coastguard Worker /**
236*61046927SAndroid Build Coastguard Worker  * Convert a floating point value to an signed fixed point value.
237*61046927SAndroid Build Coastguard Worker  *
238*61046927SAndroid Build Coastguard Worker  * \param frac_bits   The number of bits used to store the fractional part.
239*61046927SAndroid Build Coastguard Worker  */
240*61046927SAndroid Build Coastguard Worker static inline int32_t
S_FIXED(float value,uint32_t frac_bits)241*61046927SAndroid Build Coastguard Worker S_FIXED(float value, uint32_t frac_bits)
242*61046927SAndroid Build Coastguard Worker {
243*61046927SAndroid Build Coastguard Worker    return (int32_t) (value * (1 << frac_bits));
244*61046927SAndroid Build Coastguard Worker }
245*61046927SAndroid Build Coastguard Worker /*@}*/
246*61046927SAndroid Build Coastguard Worker 
247*61046927SAndroid Build Coastguard Worker 
248*61046927SAndroid Build Coastguard Worker /** Stepping a GLfloat pointer by a byte stride */
249*61046927SAndroid Build Coastguard Worker #define STRIDE_F(p, i)  (p = (GLfloat *)((GLubyte *)p + i))
250*61046927SAndroid Build Coastguard Worker /** Stepping a GLuint pointer by a byte stride */
251*61046927SAndroid Build Coastguard Worker #define STRIDE_UI(p, i)  (p = (GLuint *)((GLubyte *)p + i))
252*61046927SAndroid Build Coastguard Worker /** Stepping a GLubyte[4] pointer by a byte stride */
253*61046927SAndroid Build Coastguard Worker #define STRIDE_4UB(p, i)  (p = (GLubyte (*)[4])((GLubyte *)p + i))
254*61046927SAndroid Build Coastguard Worker /** Stepping a GLfloat[4] pointer by a byte stride */
255*61046927SAndroid Build Coastguard Worker #define STRIDE_4F(p, i)  (p = (GLfloat (*)[4])((GLubyte *)p + i))
256*61046927SAndroid Build Coastguard Worker /** Stepping a \p t pointer by a byte stride */
257*61046927SAndroid Build Coastguard Worker #define STRIDE_T(p, t, i)  (p = (t)((GLubyte *)p + i))
258*61046927SAndroid Build Coastguard Worker 
259*61046927SAndroid Build Coastguard Worker 
260*61046927SAndroid Build Coastguard Worker /**********************************************************************/
261*61046927SAndroid Build Coastguard Worker /** \name 4-element vector operations */
262*61046927SAndroid Build Coastguard Worker /*@{*/
263*61046927SAndroid Build Coastguard Worker 
264*61046927SAndroid Build Coastguard Worker /** Zero */
265*61046927SAndroid Build Coastguard Worker #define ZERO_4V( DST )  (DST)[0] = (DST)[1] = (DST)[2] = (DST)[3] = 0
266*61046927SAndroid Build Coastguard Worker 
267*61046927SAndroid Build Coastguard Worker /** Test for equality */
268*61046927SAndroid Build Coastguard Worker #define TEST_EQ_4V(a,b)  ((a)[0] == (b)[0] &&   \
269*61046927SAndroid Build Coastguard Worker               (a)[1] == (b)[1] &&   \
270*61046927SAndroid Build Coastguard Worker               (a)[2] == (b)[2] &&   \
271*61046927SAndroid Build Coastguard Worker               (a)[3] == (b)[3])
272*61046927SAndroid Build Coastguard Worker 
273*61046927SAndroid Build Coastguard Worker /** Test for equality (unsigned bytes) */
274*61046927SAndroid Build Coastguard Worker static inline GLboolean
TEST_EQ_4UBV(const GLubyte a[4],const GLubyte b[4])275*61046927SAndroid Build Coastguard Worker TEST_EQ_4UBV(const GLubyte a[4], const GLubyte b[4])
276*61046927SAndroid Build Coastguard Worker {
277*61046927SAndroid Build Coastguard Worker #if defined(__i386__)
278*61046927SAndroid Build Coastguard Worker    return *((const GLuint *) a) == *((const GLuint *) b);
279*61046927SAndroid Build Coastguard Worker #else
280*61046927SAndroid Build Coastguard Worker    return TEST_EQ_4V(a, b);
281*61046927SAndroid Build Coastguard Worker #endif
282*61046927SAndroid Build Coastguard Worker }
283*61046927SAndroid Build Coastguard Worker 
284*61046927SAndroid Build Coastguard Worker 
285*61046927SAndroid Build Coastguard Worker /** Copy a 4-element vector */
286*61046927SAndroid Build Coastguard Worker #define COPY_4V( DST, SRC )         \
287*61046927SAndroid Build Coastguard Worker do {                                \
288*61046927SAndroid Build Coastguard Worker    (DST)[0] = (SRC)[0];             \
289*61046927SAndroid Build Coastguard Worker    (DST)[1] = (SRC)[1];             \
290*61046927SAndroid Build Coastguard Worker    (DST)[2] = (SRC)[2];             \
291*61046927SAndroid Build Coastguard Worker    (DST)[3] = (SRC)[3];             \
292*61046927SAndroid Build Coastguard Worker } while (0)
293*61046927SAndroid Build Coastguard Worker 
294*61046927SAndroid Build Coastguard Worker /** Copy a 4-element unsigned byte vector */
295*61046927SAndroid Build Coastguard Worker static inline void
COPY_4UBV(GLubyte dst[4],const GLubyte src[4])296*61046927SAndroid Build Coastguard Worker COPY_4UBV(GLubyte dst[4], const GLubyte src[4])
297*61046927SAndroid Build Coastguard Worker {
298*61046927SAndroid Build Coastguard Worker #if defined(__i386__)
299*61046927SAndroid Build Coastguard Worker    *((GLuint *) dst) = *((GLuint *) src);
300*61046927SAndroid Build Coastguard Worker #else
301*61046927SAndroid Build Coastguard Worker    /* The GLuint cast might fail if DST or SRC are not dword-aligned (RISC) */
302*61046927SAndroid Build Coastguard Worker    COPY_4V(dst, src);
303*61046927SAndroid Build Coastguard Worker #endif
304*61046927SAndroid Build Coastguard Worker }
305*61046927SAndroid Build Coastguard Worker 
306*61046927SAndroid Build Coastguard Worker /** Copy \p SZ elements into a 4-element vector */
307*61046927SAndroid Build Coastguard Worker #define COPY_SZ_4V(DST, SZ, SRC)                  \
308*61046927SAndroid Build Coastguard Worker do {                                              \
309*61046927SAndroid Build Coastguard Worker    switch (SZ) {                                  \
310*61046927SAndroid Build Coastguard Worker    case 4: (DST)[3] = (SRC)[3];                   \
311*61046927SAndroid Build Coastguard Worker            FALLTHROUGH;                           \
312*61046927SAndroid Build Coastguard Worker    case 3: (DST)[2] = (SRC)[2];                   \
313*61046927SAndroid Build Coastguard Worker            FALLTHROUGH;                           \
314*61046927SAndroid Build Coastguard Worker    case 2: (DST)[1] = (SRC)[1];                   \
315*61046927SAndroid Build Coastguard Worker            FALLTHROUGH;                           \
316*61046927SAndroid Build Coastguard Worker    case 1: (DST)[0] = (SRC)[0];                   \
317*61046927SAndroid Build Coastguard Worker    }                                              \
318*61046927SAndroid Build Coastguard Worker } while(0)
319*61046927SAndroid Build Coastguard Worker 
320*61046927SAndroid Build Coastguard Worker /** Copy \p SZ elements into a homegeneous (4-element) vector, giving
321*61046927SAndroid Build Coastguard Worker  * default values to the remaining */
322*61046927SAndroid Build Coastguard Worker #define COPY_CLEAN_4V(DST, SZ, SRC)  \
323*61046927SAndroid Build Coastguard Worker do {                                 \
324*61046927SAndroid Build Coastguard Worker       ASSIGN_4V( DST, 0, 0, 0, 1 );  \
325*61046927SAndroid Build Coastguard Worker       COPY_SZ_4V( DST, SZ, SRC );    \
326*61046927SAndroid Build Coastguard Worker } while (0)
327*61046927SAndroid Build Coastguard Worker 
328*61046927SAndroid Build Coastguard Worker /** Subtraction */
329*61046927SAndroid Build Coastguard Worker #define SUB_4V( DST, SRCA, SRCB )           \
330*61046927SAndroid Build Coastguard Worker do {                                        \
331*61046927SAndroid Build Coastguard Worker       (DST)[0] = (SRCA)[0] - (SRCB)[0];     \
332*61046927SAndroid Build Coastguard Worker       (DST)[1] = (SRCA)[1] - (SRCB)[1];     \
333*61046927SAndroid Build Coastguard Worker       (DST)[2] = (SRCA)[2] - (SRCB)[2];     \
334*61046927SAndroid Build Coastguard Worker       (DST)[3] = (SRCA)[3] - (SRCB)[3];     \
335*61046927SAndroid Build Coastguard Worker } while (0)
336*61046927SAndroid Build Coastguard Worker 
337*61046927SAndroid Build Coastguard Worker /** Addition */
338*61046927SAndroid Build Coastguard Worker #define ADD_4V( DST, SRCA, SRCB )           \
339*61046927SAndroid Build Coastguard Worker do {                                        \
340*61046927SAndroid Build Coastguard Worker       (DST)[0] = (SRCA)[0] + (SRCB)[0];     \
341*61046927SAndroid Build Coastguard Worker       (DST)[1] = (SRCA)[1] + (SRCB)[1];     \
342*61046927SAndroid Build Coastguard Worker       (DST)[2] = (SRCA)[2] + (SRCB)[2];     \
343*61046927SAndroid Build Coastguard Worker       (DST)[3] = (SRCA)[3] + (SRCB)[3];     \
344*61046927SAndroid Build Coastguard Worker } while (0)
345*61046927SAndroid Build Coastguard Worker 
346*61046927SAndroid Build Coastguard Worker /** Element-wise multiplication */
347*61046927SAndroid Build Coastguard Worker #define SCALE_4V( DST, SRCA, SRCB )         \
348*61046927SAndroid Build Coastguard Worker do {                                        \
349*61046927SAndroid Build Coastguard Worker       (DST)[0] = (SRCA)[0] * (SRCB)[0];     \
350*61046927SAndroid Build Coastguard Worker       (DST)[1] = (SRCA)[1] * (SRCB)[1];     \
351*61046927SAndroid Build Coastguard Worker       (DST)[2] = (SRCA)[2] * (SRCB)[2];     \
352*61046927SAndroid Build Coastguard Worker       (DST)[3] = (SRCA)[3] * (SRCB)[3];     \
353*61046927SAndroid Build Coastguard Worker } while (0)
354*61046927SAndroid Build Coastguard Worker 
355*61046927SAndroid Build Coastguard Worker /** In-place addition */
356*61046927SAndroid Build Coastguard Worker #define ACC_4V( DST, SRC )          \
357*61046927SAndroid Build Coastguard Worker do {                                \
358*61046927SAndroid Build Coastguard Worker       (DST)[0] += (SRC)[0];         \
359*61046927SAndroid Build Coastguard Worker       (DST)[1] += (SRC)[1];         \
360*61046927SAndroid Build Coastguard Worker       (DST)[2] += (SRC)[2];         \
361*61046927SAndroid Build Coastguard Worker       (DST)[3] += (SRC)[3];         \
362*61046927SAndroid Build Coastguard Worker } while (0)
363*61046927SAndroid Build Coastguard Worker 
364*61046927SAndroid Build Coastguard Worker /** Element-wise multiplication and addition */
365*61046927SAndroid Build Coastguard Worker #define ACC_SCALE_4V( DST, SRCA, SRCB )     \
366*61046927SAndroid Build Coastguard Worker do {                                        \
367*61046927SAndroid Build Coastguard Worker       (DST)[0] += (SRCA)[0] * (SRCB)[0];    \
368*61046927SAndroid Build Coastguard Worker       (DST)[1] += (SRCA)[1] * (SRCB)[1];    \
369*61046927SAndroid Build Coastguard Worker       (DST)[2] += (SRCA)[2] * (SRCB)[2];    \
370*61046927SAndroid Build Coastguard Worker       (DST)[3] += (SRCA)[3] * (SRCB)[3];    \
371*61046927SAndroid Build Coastguard Worker } while (0)
372*61046927SAndroid Build Coastguard Worker 
373*61046927SAndroid Build Coastguard Worker /** In-place scalar multiplication and addition */
374*61046927SAndroid Build Coastguard Worker #define ACC_SCALE_SCALAR_4V( DST, S, SRCB ) \
375*61046927SAndroid Build Coastguard Worker do {                                        \
376*61046927SAndroid Build Coastguard Worker       (DST)[0] += S * (SRCB)[0];            \
377*61046927SAndroid Build Coastguard Worker       (DST)[1] += S * (SRCB)[1];            \
378*61046927SAndroid Build Coastguard Worker       (DST)[2] += S * (SRCB)[2];            \
379*61046927SAndroid Build Coastguard Worker       (DST)[3] += S * (SRCB)[3];            \
380*61046927SAndroid Build Coastguard Worker } while (0)
381*61046927SAndroid Build Coastguard Worker 
382*61046927SAndroid Build Coastguard Worker /** Scalar multiplication */
383*61046927SAndroid Build Coastguard Worker #define SCALE_SCALAR_4V( DST, S, SRCB ) \
384*61046927SAndroid Build Coastguard Worker do {                                    \
385*61046927SAndroid Build Coastguard Worker       (DST)[0] = S * (SRCB)[0];         \
386*61046927SAndroid Build Coastguard Worker       (DST)[1] = S * (SRCB)[1];         \
387*61046927SAndroid Build Coastguard Worker       (DST)[2] = S * (SRCB)[2];         \
388*61046927SAndroid Build Coastguard Worker       (DST)[3] = S * (SRCB)[3];         \
389*61046927SAndroid Build Coastguard Worker } while (0)
390*61046927SAndroid Build Coastguard Worker 
391*61046927SAndroid Build Coastguard Worker /** In-place scalar multiplication */
392*61046927SAndroid Build Coastguard Worker #define SELF_SCALE_SCALAR_4V( DST, S ) \
393*61046927SAndroid Build Coastguard Worker do {                                   \
394*61046927SAndroid Build Coastguard Worker       (DST)[0] *= S;                   \
395*61046927SAndroid Build Coastguard Worker       (DST)[1] *= S;                   \
396*61046927SAndroid Build Coastguard Worker       (DST)[2] *= S;                   \
397*61046927SAndroid Build Coastguard Worker       (DST)[3] *= S;                   \
398*61046927SAndroid Build Coastguard Worker } while (0)
399*61046927SAndroid Build Coastguard Worker 
400*61046927SAndroid Build Coastguard Worker /*@}*/
401*61046927SAndroid Build Coastguard Worker 
402*61046927SAndroid Build Coastguard Worker 
403*61046927SAndroid Build Coastguard Worker /**********************************************************************/
404*61046927SAndroid Build Coastguard Worker /** \name 3-element vector operations*/
405*61046927SAndroid Build Coastguard Worker /*@{*/
406*61046927SAndroid Build Coastguard Worker 
407*61046927SAndroid Build Coastguard Worker /** Zero */
408*61046927SAndroid Build Coastguard Worker #define ZERO_3V( DST )  (DST)[0] = (DST)[1] = (DST)[2] = 0
409*61046927SAndroid Build Coastguard Worker 
410*61046927SAndroid Build Coastguard Worker /** Test for equality */
411*61046927SAndroid Build Coastguard Worker #define TEST_EQ_3V(a,b)  \
412*61046927SAndroid Build Coastguard Worker    ((a)[0] == (b)[0] &&  \
413*61046927SAndroid Build Coastguard Worker     (a)[1] == (b)[1] &&  \
414*61046927SAndroid Build Coastguard Worker     (a)[2] == (b)[2])
415*61046927SAndroid Build Coastguard Worker 
416*61046927SAndroid Build Coastguard Worker /** Copy a 3-element vector */
417*61046927SAndroid Build Coastguard Worker #define COPY_3V( DST, SRC )         \
418*61046927SAndroid Build Coastguard Worker do {                                \
419*61046927SAndroid Build Coastguard Worker    (DST)[0] = (SRC)[0];             \
420*61046927SAndroid Build Coastguard Worker    (DST)[1] = (SRC)[1];             \
421*61046927SAndroid Build Coastguard Worker    (DST)[2] = (SRC)[2];             \
422*61046927SAndroid Build Coastguard Worker } while (0)
423*61046927SAndroid Build Coastguard Worker 
424*61046927SAndroid Build Coastguard Worker /** Copy a 3-element vector with cast */
425*61046927SAndroid Build Coastguard Worker #define COPY_3V_CAST( DST, SRC, CAST )  \
426*61046927SAndroid Build Coastguard Worker do {                                    \
427*61046927SAndroid Build Coastguard Worker    (DST)[0] = (CAST)(SRC)[0];           \
428*61046927SAndroid Build Coastguard Worker    (DST)[1] = (CAST)(SRC)[1];           \
429*61046927SAndroid Build Coastguard Worker    (DST)[2] = (CAST)(SRC)[2];           \
430*61046927SAndroid Build Coastguard Worker } while (0)
431*61046927SAndroid Build Coastguard Worker 
432*61046927SAndroid Build Coastguard Worker /** Copy a 3-element float vector */
433*61046927SAndroid Build Coastguard Worker #define COPY_3FV( DST, SRC )        \
434*61046927SAndroid Build Coastguard Worker do {                                \
435*61046927SAndroid Build Coastguard Worker    const GLfloat *_tmp = (SRC);     \
436*61046927SAndroid Build Coastguard Worker    (DST)[0] = _tmp[0];              \
437*61046927SAndroid Build Coastguard Worker    (DST)[1] = _tmp[1];              \
438*61046927SAndroid Build Coastguard Worker    (DST)[2] = _tmp[2];              \
439*61046927SAndroid Build Coastguard Worker } while (0)
440*61046927SAndroid Build Coastguard Worker 
441*61046927SAndroid Build Coastguard Worker /** Subtraction */
442*61046927SAndroid Build Coastguard Worker #define SUB_3V( DST, SRCA, SRCB )        \
443*61046927SAndroid Build Coastguard Worker do {                                     \
444*61046927SAndroid Build Coastguard Worker       (DST)[0] = (SRCA)[0] - (SRCB)[0];  \
445*61046927SAndroid Build Coastguard Worker       (DST)[1] = (SRCA)[1] - (SRCB)[1];  \
446*61046927SAndroid Build Coastguard Worker       (DST)[2] = (SRCA)[2] - (SRCB)[2];  \
447*61046927SAndroid Build Coastguard Worker } while (0)
448*61046927SAndroid Build Coastguard Worker 
449*61046927SAndroid Build Coastguard Worker /** Addition */
450*61046927SAndroid Build Coastguard Worker #define ADD_3V( DST, SRCA, SRCB )       \
451*61046927SAndroid Build Coastguard Worker do {                                    \
452*61046927SAndroid Build Coastguard Worker       (DST)[0] = (SRCA)[0] + (SRCB)[0]; \
453*61046927SAndroid Build Coastguard Worker       (DST)[1] = (SRCA)[1] + (SRCB)[1]; \
454*61046927SAndroid Build Coastguard Worker       (DST)[2] = (SRCA)[2] + (SRCB)[2]; \
455*61046927SAndroid Build Coastguard Worker } while (0)
456*61046927SAndroid Build Coastguard Worker 
457*61046927SAndroid Build Coastguard Worker /** In-place scalar multiplication */
458*61046927SAndroid Build Coastguard Worker #define SCALE_3V( DST, SRCA, SRCB )     \
459*61046927SAndroid Build Coastguard Worker do {                                    \
460*61046927SAndroid Build Coastguard Worker       (DST)[0] = (SRCA)[0] * (SRCB)[0]; \
461*61046927SAndroid Build Coastguard Worker       (DST)[1] = (SRCA)[1] * (SRCB)[1]; \
462*61046927SAndroid Build Coastguard Worker       (DST)[2] = (SRCA)[2] * (SRCB)[2]; \
463*61046927SAndroid Build Coastguard Worker } while (0)
464*61046927SAndroid Build Coastguard Worker 
465*61046927SAndroid Build Coastguard Worker /** In-place element-wise multiplication */
466*61046927SAndroid Build Coastguard Worker #define SELF_SCALE_3V( DST, SRC )   \
467*61046927SAndroid Build Coastguard Worker do {                                \
468*61046927SAndroid Build Coastguard Worker       (DST)[0] *= (SRC)[0];         \
469*61046927SAndroid Build Coastguard Worker       (DST)[1] *= (SRC)[1];         \
470*61046927SAndroid Build Coastguard Worker       (DST)[2] *= (SRC)[2];         \
471*61046927SAndroid Build Coastguard Worker } while (0)
472*61046927SAndroid Build Coastguard Worker 
473*61046927SAndroid Build Coastguard Worker /** In-place addition */
474*61046927SAndroid Build Coastguard Worker #define ACC_3V( DST, SRC )          \
475*61046927SAndroid Build Coastguard Worker do {                                \
476*61046927SAndroid Build Coastguard Worker       (DST)[0] += (SRC)[0];         \
477*61046927SAndroid Build Coastguard Worker       (DST)[1] += (SRC)[1];         \
478*61046927SAndroid Build Coastguard Worker       (DST)[2] += (SRC)[2];         \
479*61046927SAndroid Build Coastguard Worker } while (0)
480*61046927SAndroid Build Coastguard Worker 
481*61046927SAndroid Build Coastguard Worker /** Element-wise multiplication and addition */
482*61046927SAndroid Build Coastguard Worker #define ACC_SCALE_3V( DST, SRCA, SRCB )     \
483*61046927SAndroid Build Coastguard Worker do {                                        \
484*61046927SAndroid Build Coastguard Worker       (DST)[0] += (SRCA)[0] * (SRCB)[0];    \
485*61046927SAndroid Build Coastguard Worker       (DST)[1] += (SRCA)[1] * (SRCB)[1];    \
486*61046927SAndroid Build Coastguard Worker       (DST)[2] += (SRCA)[2] * (SRCB)[2];    \
487*61046927SAndroid Build Coastguard Worker } while (0)
488*61046927SAndroid Build Coastguard Worker 
489*61046927SAndroid Build Coastguard Worker /** Scalar multiplication */
490*61046927SAndroid Build Coastguard Worker #define SCALE_SCALAR_3V( DST, S, SRCB ) \
491*61046927SAndroid Build Coastguard Worker do {                                    \
492*61046927SAndroid Build Coastguard Worker       (DST)[0] = S * (SRCB)[0];         \
493*61046927SAndroid Build Coastguard Worker       (DST)[1] = S * (SRCB)[1];         \
494*61046927SAndroid Build Coastguard Worker       (DST)[2] = S * (SRCB)[2];         \
495*61046927SAndroid Build Coastguard Worker } while (0)
496*61046927SAndroid Build Coastguard Worker 
497*61046927SAndroid Build Coastguard Worker /** In-place scalar multiplication and addition */
498*61046927SAndroid Build Coastguard Worker #define ACC_SCALE_SCALAR_3V( DST, S, SRCB ) \
499*61046927SAndroid Build Coastguard Worker do {                                        \
500*61046927SAndroid Build Coastguard Worker       (DST)[0] += S * (SRCB)[0];            \
501*61046927SAndroid Build Coastguard Worker       (DST)[1] += S * (SRCB)[1];            \
502*61046927SAndroid Build Coastguard Worker       (DST)[2] += S * (SRCB)[2];            \
503*61046927SAndroid Build Coastguard Worker } while (0)
504*61046927SAndroid Build Coastguard Worker 
505*61046927SAndroid Build Coastguard Worker /** In-place scalar multiplication */
506*61046927SAndroid Build Coastguard Worker #define SELF_SCALE_SCALAR_3V( DST, S ) \
507*61046927SAndroid Build Coastguard Worker do {                                   \
508*61046927SAndroid Build Coastguard Worker       (DST)[0] *= S;                   \
509*61046927SAndroid Build Coastguard Worker       (DST)[1] *= S;                   \
510*61046927SAndroid Build Coastguard Worker       (DST)[2] *= S;                   \
511*61046927SAndroid Build Coastguard Worker } while (0)
512*61046927SAndroid Build Coastguard Worker 
513*61046927SAndroid Build Coastguard Worker /** In-place scalar addition */
514*61046927SAndroid Build Coastguard Worker #define ACC_SCALAR_3V( DST, S )     \
515*61046927SAndroid Build Coastguard Worker do {                                \
516*61046927SAndroid Build Coastguard Worker       (DST)[0] += S;                \
517*61046927SAndroid Build Coastguard Worker       (DST)[1] += S;                \
518*61046927SAndroid Build Coastguard Worker       (DST)[2] += S;                \
519*61046927SAndroid Build Coastguard Worker } while (0)
520*61046927SAndroid Build Coastguard Worker 
521*61046927SAndroid Build Coastguard Worker /** Assignment */
522*61046927SAndroid Build Coastguard Worker #define ASSIGN_3V( V, V0, V1, V2 )  \
523*61046927SAndroid Build Coastguard Worker do {                                \
524*61046927SAndroid Build Coastguard Worker     V[0] = V0;                      \
525*61046927SAndroid Build Coastguard Worker     V[1] = V1;                      \
526*61046927SAndroid Build Coastguard Worker     V[2] = V2;                      \
527*61046927SAndroid Build Coastguard Worker } while(0)
528*61046927SAndroid Build Coastguard Worker 
529*61046927SAndroid Build Coastguard Worker /*@}*/
530*61046927SAndroid Build Coastguard Worker 
531*61046927SAndroid Build Coastguard Worker 
532*61046927SAndroid Build Coastguard Worker /**********************************************************************/
533*61046927SAndroid Build Coastguard Worker /** \name 2-element vector operations*/
534*61046927SAndroid Build Coastguard Worker /*@{*/
535*61046927SAndroid Build Coastguard Worker 
536*61046927SAndroid Build Coastguard Worker /** Zero */
537*61046927SAndroid Build Coastguard Worker #define ZERO_2V( DST )  (DST)[0] = (DST)[1] = 0
538*61046927SAndroid Build Coastguard Worker 
539*61046927SAndroid Build Coastguard Worker /** Copy a 2-element vector */
540*61046927SAndroid Build Coastguard Worker #define COPY_2V( DST, SRC )         \
541*61046927SAndroid Build Coastguard Worker do {                        \
542*61046927SAndroid Build Coastguard Worker    (DST)[0] = (SRC)[0];             \
543*61046927SAndroid Build Coastguard Worker    (DST)[1] = (SRC)[1];             \
544*61046927SAndroid Build Coastguard Worker } while (0)
545*61046927SAndroid Build Coastguard Worker 
546*61046927SAndroid Build Coastguard Worker /** Copy a 2-element vector with cast */
547*61046927SAndroid Build Coastguard Worker #define COPY_2V_CAST( DST, SRC, CAST )      \
548*61046927SAndroid Build Coastguard Worker do {                        \
549*61046927SAndroid Build Coastguard Worker    (DST)[0] = (CAST)(SRC)[0];           \
550*61046927SAndroid Build Coastguard Worker    (DST)[1] = (CAST)(SRC)[1];           \
551*61046927SAndroid Build Coastguard Worker } while (0)
552*61046927SAndroid Build Coastguard Worker 
553*61046927SAndroid Build Coastguard Worker /** Copy a 2-element float vector */
554*61046927SAndroid Build Coastguard Worker #define COPY_2FV( DST, SRC )            \
555*61046927SAndroid Build Coastguard Worker do {                        \
556*61046927SAndroid Build Coastguard Worker    const GLfloat *_tmp = (SRC);         \
557*61046927SAndroid Build Coastguard Worker    (DST)[0] = _tmp[0];              \
558*61046927SAndroid Build Coastguard Worker    (DST)[1] = _tmp[1];              \
559*61046927SAndroid Build Coastguard Worker } while (0)
560*61046927SAndroid Build Coastguard Worker 
561*61046927SAndroid Build Coastguard Worker /** Subtraction */
562*61046927SAndroid Build Coastguard Worker #define SUB_2V( DST, SRCA, SRCB )       \
563*61046927SAndroid Build Coastguard Worker do {                        \
564*61046927SAndroid Build Coastguard Worker       (DST)[0] = (SRCA)[0] - (SRCB)[0];     \
565*61046927SAndroid Build Coastguard Worker       (DST)[1] = (SRCA)[1] - (SRCB)[1];     \
566*61046927SAndroid Build Coastguard Worker } while (0)
567*61046927SAndroid Build Coastguard Worker 
568*61046927SAndroid Build Coastguard Worker /** Addition */
569*61046927SAndroid Build Coastguard Worker #define ADD_2V( DST, SRCA, SRCB )       \
570*61046927SAndroid Build Coastguard Worker do {                        \
571*61046927SAndroid Build Coastguard Worker       (DST)[0] = (SRCA)[0] + (SRCB)[0];     \
572*61046927SAndroid Build Coastguard Worker       (DST)[1] = (SRCA)[1] + (SRCB)[1];     \
573*61046927SAndroid Build Coastguard Worker } while (0)
574*61046927SAndroid Build Coastguard Worker 
575*61046927SAndroid Build Coastguard Worker /** In-place scalar multiplication */
576*61046927SAndroid Build Coastguard Worker #define SCALE_2V( DST, SRCA, SRCB )     \
577*61046927SAndroid Build Coastguard Worker do {                        \
578*61046927SAndroid Build Coastguard Worker       (DST)[0] = (SRCA)[0] * (SRCB)[0];     \
579*61046927SAndroid Build Coastguard Worker       (DST)[1] = (SRCA)[1] * (SRCB)[1];     \
580*61046927SAndroid Build Coastguard Worker } while (0)
581*61046927SAndroid Build Coastguard Worker 
582*61046927SAndroid Build Coastguard Worker /** In-place addition */
583*61046927SAndroid Build Coastguard Worker #define ACC_2V( DST, SRC )          \
584*61046927SAndroid Build Coastguard Worker do {                        \
585*61046927SAndroid Build Coastguard Worker       (DST)[0] += (SRC)[0];         \
586*61046927SAndroid Build Coastguard Worker       (DST)[1] += (SRC)[1];         \
587*61046927SAndroid Build Coastguard Worker } while (0)
588*61046927SAndroid Build Coastguard Worker 
589*61046927SAndroid Build Coastguard Worker /** Element-wise multiplication and addition */
590*61046927SAndroid Build Coastguard Worker #define ACC_SCALE_2V( DST, SRCA, SRCB )     \
591*61046927SAndroid Build Coastguard Worker do {                        \
592*61046927SAndroid Build Coastguard Worker       (DST)[0] += (SRCA)[0] * (SRCB)[0];    \
593*61046927SAndroid Build Coastguard Worker       (DST)[1] += (SRCA)[1] * (SRCB)[1];    \
594*61046927SAndroid Build Coastguard Worker } while (0)
595*61046927SAndroid Build Coastguard Worker 
596*61046927SAndroid Build Coastguard Worker /** Scalar multiplication */
597*61046927SAndroid Build Coastguard Worker #define SCALE_SCALAR_2V( DST, S, SRCB )     \
598*61046927SAndroid Build Coastguard Worker do {                        \
599*61046927SAndroid Build Coastguard Worker       (DST)[0] = S * (SRCB)[0];         \
600*61046927SAndroid Build Coastguard Worker       (DST)[1] = S * (SRCB)[1];         \
601*61046927SAndroid Build Coastguard Worker } while (0)
602*61046927SAndroid Build Coastguard Worker 
603*61046927SAndroid Build Coastguard Worker /** In-place scalar multiplication and addition */
604*61046927SAndroid Build Coastguard Worker #define ACC_SCALE_SCALAR_2V( DST, S, SRCB ) \
605*61046927SAndroid Build Coastguard Worker do {                        \
606*61046927SAndroid Build Coastguard Worker       (DST)[0] += S * (SRCB)[0];        \
607*61046927SAndroid Build Coastguard Worker       (DST)[1] += S * (SRCB)[1];        \
608*61046927SAndroid Build Coastguard Worker } while (0)
609*61046927SAndroid Build Coastguard Worker 
610*61046927SAndroid Build Coastguard Worker /** In-place scalar multiplication */
611*61046927SAndroid Build Coastguard Worker #define SELF_SCALE_SCALAR_2V( DST, S )      \
612*61046927SAndroid Build Coastguard Worker do {                        \
613*61046927SAndroid Build Coastguard Worker       (DST)[0] *= S;                \
614*61046927SAndroid Build Coastguard Worker       (DST)[1] *= S;                \
615*61046927SAndroid Build Coastguard Worker } while (0)
616*61046927SAndroid Build Coastguard Worker 
617*61046927SAndroid Build Coastguard Worker /** In-place scalar addition */
618*61046927SAndroid Build Coastguard Worker #define ACC_SCALAR_2V( DST, S )         \
619*61046927SAndroid Build Coastguard Worker do {                        \
620*61046927SAndroid Build Coastguard Worker       (DST)[0] += S;                \
621*61046927SAndroid Build Coastguard Worker       (DST)[1] += S;                \
622*61046927SAndroid Build Coastguard Worker } while (0)
623*61046927SAndroid Build Coastguard Worker 
624*61046927SAndroid Build Coastguard Worker /** Assign scalers to short vectors */
625*61046927SAndroid Build Coastguard Worker #define ASSIGN_2V( V, V0, V1 )	\
626*61046927SAndroid Build Coastguard Worker do {				\
627*61046927SAndroid Build Coastguard Worker     V[0] = V0;			\
628*61046927SAndroid Build Coastguard Worker     V[1] = V1;			\
629*61046927SAndroid Build Coastguard Worker } while(0)
630*61046927SAndroid Build Coastguard Worker 
631*61046927SAndroid Build Coastguard Worker /*@}*/
632*61046927SAndroid Build Coastguard Worker 
633*61046927SAndroid Build Coastguard Worker /** Copy \p sz elements into a homegeneous (4-element) vector, giving
634*61046927SAndroid Build Coastguard Worker  * default values to the remaining components.
635*61046927SAndroid Build Coastguard Worker  * The default values are chosen based on \p type.
636*61046927SAndroid Build Coastguard Worker  */
637*61046927SAndroid Build Coastguard Worker static inline void
COPY_CLEAN_4V_TYPE_AS_UNION(fi_type dst[4],int sz,const fi_type src[4],GLenum type)638*61046927SAndroid Build Coastguard Worker COPY_CLEAN_4V_TYPE_AS_UNION(fi_type dst[4], int sz, const fi_type src[4],
639*61046927SAndroid Build Coastguard Worker                             GLenum type)
640*61046927SAndroid Build Coastguard Worker {
641*61046927SAndroid Build Coastguard Worker    switch (type) {
642*61046927SAndroid Build Coastguard Worker    case GL_FLOAT:
643*61046927SAndroid Build Coastguard Worker       ASSIGN_4V(dst, FLOAT_AS_UNION(0), FLOAT_AS_UNION(0),
644*61046927SAndroid Build Coastguard Worker                 FLOAT_AS_UNION(0), FLOAT_AS_UNION(1));
645*61046927SAndroid Build Coastguard Worker       break;
646*61046927SAndroid Build Coastguard Worker    case GL_INT:
647*61046927SAndroid Build Coastguard Worker       ASSIGN_4V(dst, INT_AS_UNION(0), INT_AS_UNION(0),
648*61046927SAndroid Build Coastguard Worker                 INT_AS_UNION(0), INT_AS_UNION(1));
649*61046927SAndroid Build Coastguard Worker       break;
650*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_INT:
651*61046927SAndroid Build Coastguard Worker       ASSIGN_4V(dst, UINT_AS_UNION(0), UINT_AS_UNION(0),
652*61046927SAndroid Build Coastguard Worker                 UINT_AS_UNION(0), UINT_AS_UNION(1));
653*61046927SAndroid Build Coastguard Worker       break;
654*61046927SAndroid Build Coastguard Worker    default:
655*61046927SAndroid Build Coastguard Worker       ASSIGN_4V(dst, FLOAT_AS_UNION(0), FLOAT_AS_UNION(0),
656*61046927SAndroid Build Coastguard Worker                 FLOAT_AS_UNION(0), FLOAT_AS_UNION(1)); /* silence warnings */
657*61046927SAndroid Build Coastguard Worker       assert(!"Unexpected type in COPY_CLEAN_4V_TYPE_AS_UNION macro");
658*61046927SAndroid Build Coastguard Worker    }
659*61046927SAndroid Build Coastguard Worker    COPY_SZ_4V(dst, sz, src);
660*61046927SAndroid Build Coastguard Worker }
661*61046927SAndroid Build Coastguard Worker 
662*61046927SAndroid Build Coastguard Worker /** \name Linear interpolation functions */
663*61046927SAndroid Build Coastguard Worker /*@{*/
664*61046927SAndroid Build Coastguard Worker 
665*61046927SAndroid Build Coastguard Worker static inline GLfloat
LINTERP(GLfloat t,GLfloat out,GLfloat in)666*61046927SAndroid Build Coastguard Worker LINTERP(GLfloat t, GLfloat out, GLfloat in)
667*61046927SAndroid Build Coastguard Worker {
668*61046927SAndroid Build Coastguard Worker    return out + t * (in - out);
669*61046927SAndroid Build Coastguard Worker }
670*61046927SAndroid Build Coastguard Worker 
671*61046927SAndroid Build Coastguard Worker static inline void
INTERP_3F(GLfloat t,GLfloat dst[3],const GLfloat out[3],const GLfloat in[3])672*61046927SAndroid Build Coastguard Worker INTERP_3F(GLfloat t, GLfloat dst[3], const GLfloat out[3], const GLfloat in[3])
673*61046927SAndroid Build Coastguard Worker {
674*61046927SAndroid Build Coastguard Worker    dst[0] = LINTERP( t, out[0], in[0] );
675*61046927SAndroid Build Coastguard Worker    dst[1] = LINTERP( t, out[1], in[1] );
676*61046927SAndroid Build Coastguard Worker    dst[2] = LINTERP( t, out[2], in[2] );
677*61046927SAndroid Build Coastguard Worker }
678*61046927SAndroid Build Coastguard Worker 
679*61046927SAndroid Build Coastguard Worker static inline void
INTERP_4F(GLfloat t,GLfloat dst[4],const GLfloat out[4],const GLfloat in[4])680*61046927SAndroid Build Coastguard Worker INTERP_4F(GLfloat t, GLfloat dst[4], const GLfloat out[4], const GLfloat in[4])
681*61046927SAndroid Build Coastguard Worker {
682*61046927SAndroid Build Coastguard Worker    dst[0] = LINTERP( t, out[0], in[0] );
683*61046927SAndroid Build Coastguard Worker    dst[1] = LINTERP( t, out[1], in[1] );
684*61046927SAndroid Build Coastguard Worker    dst[2] = LINTERP( t, out[2], in[2] );
685*61046927SAndroid Build Coastguard Worker    dst[3] = LINTERP( t, out[3], in[3] );
686*61046927SAndroid Build Coastguard Worker }
687*61046927SAndroid Build Coastguard Worker 
688*61046927SAndroid Build Coastguard Worker /*@}*/
689*61046927SAndroid Build Coastguard Worker 
690*61046927SAndroid Build Coastguard Worker 
691*61046927SAndroid Build Coastguard Worker 
692*61046927SAndroid Build Coastguard Worker /** Cross product of two 3-element vectors */
693*61046927SAndroid Build Coastguard Worker static inline void
CROSS3(GLfloat n[3],const GLfloat u[3],const GLfloat v[3])694*61046927SAndroid Build Coastguard Worker CROSS3(GLfloat n[3], const GLfloat u[3], const GLfloat v[3])
695*61046927SAndroid Build Coastguard Worker {
696*61046927SAndroid Build Coastguard Worker    n[0] = u[1] * v[2] - u[2] * v[1];
697*61046927SAndroid Build Coastguard Worker    n[1] = u[2] * v[0] - u[0] * v[2];
698*61046927SAndroid Build Coastguard Worker    n[2] = u[0] * v[1] - u[1] * v[0];
699*61046927SAndroid Build Coastguard Worker }
700*61046927SAndroid Build Coastguard Worker 
701*61046927SAndroid Build Coastguard Worker 
702*61046927SAndroid Build Coastguard Worker /** Dot product of two 2-element vectors */
703*61046927SAndroid Build Coastguard Worker static inline GLfloat
DOT2(const GLfloat a[2],const GLfloat b[2])704*61046927SAndroid Build Coastguard Worker DOT2(const GLfloat a[2], const GLfloat b[2])
705*61046927SAndroid Build Coastguard Worker {
706*61046927SAndroid Build Coastguard Worker    return a[0] * b[0] + a[1] * b[1];
707*61046927SAndroid Build Coastguard Worker }
708*61046927SAndroid Build Coastguard Worker 
709*61046927SAndroid Build Coastguard Worker static inline GLfloat
DOT3(const GLfloat a[3],const GLfloat b[3])710*61046927SAndroid Build Coastguard Worker DOT3(const GLfloat a[3], const GLfloat b[3])
711*61046927SAndroid Build Coastguard Worker {
712*61046927SAndroid Build Coastguard Worker    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
713*61046927SAndroid Build Coastguard Worker }
714*61046927SAndroid Build Coastguard Worker 
715*61046927SAndroid Build Coastguard Worker static inline GLfloat
DOT4(const GLfloat a[4],const GLfloat b[4])716*61046927SAndroid Build Coastguard Worker DOT4(const GLfloat a[4], const GLfloat b[4])
717*61046927SAndroid Build Coastguard Worker {
718*61046927SAndroid Build Coastguard Worker    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
719*61046927SAndroid Build Coastguard Worker }
720*61046927SAndroid Build Coastguard Worker 
721*61046927SAndroid Build Coastguard Worker 
722*61046927SAndroid Build Coastguard Worker static inline GLfloat
LEN_SQUARED_3FV(const GLfloat v[3])723*61046927SAndroid Build Coastguard Worker LEN_SQUARED_3FV(const GLfloat v[3])
724*61046927SAndroid Build Coastguard Worker {
725*61046927SAndroid Build Coastguard Worker    return DOT3(v, v);
726*61046927SAndroid Build Coastguard Worker }
727*61046927SAndroid Build Coastguard Worker 
728*61046927SAndroid Build Coastguard Worker static inline GLfloat
LEN_SQUARED_2FV(const GLfloat v[2])729*61046927SAndroid Build Coastguard Worker LEN_SQUARED_2FV(const GLfloat v[2])
730*61046927SAndroid Build Coastguard Worker {
731*61046927SAndroid Build Coastguard Worker    return DOT2(v, v);
732*61046927SAndroid Build Coastguard Worker }
733*61046927SAndroid Build Coastguard Worker 
734*61046927SAndroid Build Coastguard Worker 
735*61046927SAndroid Build Coastguard Worker static inline GLfloat
LEN_3FV(const GLfloat v[3])736*61046927SAndroid Build Coastguard Worker LEN_3FV(const GLfloat v[3])
737*61046927SAndroid Build Coastguard Worker {
738*61046927SAndroid Build Coastguard Worker    return sqrtf(LEN_SQUARED_3FV(v));
739*61046927SAndroid Build Coastguard Worker }
740*61046927SAndroid Build Coastguard Worker 
741*61046927SAndroid Build Coastguard Worker static inline GLfloat
LEN_2FV(const GLfloat v[2])742*61046927SAndroid Build Coastguard Worker LEN_2FV(const GLfloat v[2])
743*61046927SAndroid Build Coastguard Worker {
744*61046927SAndroid Build Coastguard Worker    return sqrtf(LEN_SQUARED_2FV(v));
745*61046927SAndroid Build Coastguard Worker }
746*61046927SAndroid Build Coastguard Worker 
747*61046927SAndroid Build Coastguard Worker 
748*61046927SAndroid Build Coastguard Worker /* Normalize a 3-element vector to unit length. */
749*61046927SAndroid Build Coastguard Worker static inline void
NORMALIZE_3FV(GLfloat v[3])750*61046927SAndroid Build Coastguard Worker NORMALIZE_3FV(GLfloat v[3])
751*61046927SAndroid Build Coastguard Worker {
752*61046927SAndroid Build Coastguard Worker    GLfloat len = (GLfloat) LEN_SQUARED_3FV(v);
753*61046927SAndroid Build Coastguard Worker    if (len) {
754*61046927SAndroid Build Coastguard Worker       len = 1.0f / sqrtf(len);
755*61046927SAndroid Build Coastguard Worker       v[0] *= len;
756*61046927SAndroid Build Coastguard Worker       v[1] *= len;
757*61046927SAndroid Build Coastguard Worker       v[2] *= len;
758*61046927SAndroid Build Coastguard Worker    }
759*61046927SAndroid Build Coastguard Worker }
760*61046927SAndroid Build Coastguard Worker 
761*61046927SAndroid Build Coastguard Worker 
762*61046927SAndroid Build Coastguard Worker /** Test two floats have opposite signs */
763*61046927SAndroid Build Coastguard Worker static inline GLboolean
DIFFERENT_SIGNS(GLfloat x,GLfloat y)764*61046927SAndroid Build Coastguard Worker DIFFERENT_SIGNS(GLfloat x, GLfloat y)
765*61046927SAndroid Build Coastguard Worker {
766*61046927SAndroid Build Coastguard Worker #ifdef _MSC_VER
767*61046927SAndroid Build Coastguard Worker #pragma warning( push )
768*61046927SAndroid Build Coastguard Worker #pragma warning( disable : 6334 ) /* sizeof operator applied to an expression with an operator may yield unexpected results */
769*61046927SAndroid Build Coastguard Worker #endif
770*61046927SAndroid Build Coastguard Worker    return signbit(x) != signbit(y);
771*61046927SAndroid Build Coastguard Worker #ifdef _MSC_VER
772*61046927SAndroid Build Coastguard Worker #pragma warning( pop )
773*61046927SAndroid Build Coastguard Worker #endif
774*61046927SAndroid Build Coastguard Worker }
775*61046927SAndroid Build Coastguard Worker 
776*61046927SAndroid Build Coastguard Worker 
777*61046927SAndroid Build Coastguard Worker /** casts to silence warnings with some compilers */
778*61046927SAndroid Build Coastguard Worker #define ENUM_TO_INT(E)     ((GLint)(E))
779*61046927SAndroid Build Coastguard Worker #define ENUM_TO_FLOAT(E)   ((GLfloat)(GLint)(E))
780*61046927SAndroid Build Coastguard Worker #define ENUM_TO_DOUBLE(E)  ((GLdouble)(GLint)(E))
781*61046927SAndroid Build Coastguard Worker #define ENUM_TO_BOOLEAN(E) ((E) ? GL_TRUE : GL_FALSE)
782*61046927SAndroid Build Coastguard Worker 
783*61046927SAndroid Build Coastguard Worker 
784*61046927SAndroid Build Coastguard Worker /* Stringify */
785*61046927SAndroid Build Coastguard Worker #define STRINGIFY(x) #x
786*61046927SAndroid Build Coastguard Worker 
787*61046927SAndroid Build Coastguard Worker /*
788*61046927SAndroid Build Coastguard Worker  * For GL_ARB_vertex_buffer_object we need to treat vertex array pointers
789*61046927SAndroid Build Coastguard Worker  * as offsets into buffer stores.  Since the vertex array pointer and
790*61046927SAndroid Build Coastguard Worker  * buffer store pointer are both pointers and we need to add them, we use
791*61046927SAndroid Build Coastguard Worker  * this macro.
792*61046927SAndroid Build Coastguard Worker  * Both pointers/offsets are expressed in bytes.
793*61046927SAndroid Build Coastguard Worker  */
794*61046927SAndroid Build Coastguard Worker #define ADD_POINTERS(A, B)  ( (GLubyte *) (A) + (uintptr_t) (B) )
795*61046927SAndroid Build Coastguard Worker 
796*61046927SAndroid Build Coastguard Worker #endif
797