1*35ffd701SAndroid Build Coastguard Worker /*==============================================================================
2*35ffd701SAndroid Build Coastguard Worker Copyright(c) 2017 Intel Corporation
3*35ffd701SAndroid Build Coastguard Worker
4*35ffd701SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a
5*35ffd701SAndroid Build Coastguard Worker copy of this software and associated documentation files(the "Software"),
6*35ffd701SAndroid Build Coastguard Worker to deal in the Software without restriction, including without limitation
7*35ffd701SAndroid Build Coastguard Worker the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*35ffd701SAndroid Build Coastguard Worker and / or sell copies of the Software, and to permit persons to whom the
9*35ffd701SAndroid Build Coastguard Worker Software is furnished to do so, subject to the following conditions:
10*35ffd701SAndroid Build Coastguard Worker
11*35ffd701SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included
12*35ffd701SAndroid Build Coastguard Worker in all copies or substantial portions of the Software.
13*35ffd701SAndroid Build Coastguard Worker
14*35ffd701SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*35ffd701SAndroid Build Coastguard Worker OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*35ffd701SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*35ffd701SAndroid Build Coastguard Worker THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*35ffd701SAndroid Build Coastguard Worker OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*35ffd701SAndroid Build Coastguard Worker ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*35ffd701SAndroid Build Coastguard Worker OTHER DEALINGS IN THE SOFTWARE.
21*35ffd701SAndroid Build Coastguard Worker ============================================================================*/
22*35ffd701SAndroid Build Coastguard Worker
23*35ffd701SAndroid Build Coastguard Worker #ifndef __GFXMACRO_H__
24*35ffd701SAndroid Build Coastguard Worker #define __GFXMACRO_H__
25*35ffd701SAndroid Build Coastguard Worker
26*35ffd701SAndroid Build Coastguard Worker #include <limits.h>
27*35ffd701SAndroid Build Coastguard Worker #include <string.h> // for memcpy
28*35ffd701SAndroid Build Coastguard Worker #include <stdint.h>
29*35ffd701SAndroid Build Coastguard Worker
30*35ffd701SAndroid Build Coastguard Worker // ### __GFXMACRO_ASSERT ######################################################
31*35ffd701SAndroid Build Coastguard Worker // Since an "always-callable" GFX_ASSERT/etc. is no longer really in-place,
32*35ffd701SAndroid Build Coastguard Worker // this file will define its own assert statement...
33*35ffd701SAndroid Build Coastguard Worker #if DBG
34*35ffd701SAndroid Build Coastguard Worker #define __GFXMACRO_ASSERT(Expression) \
35*35ffd701SAndroid Build Coastguard Worker { \
36*35ffd701SAndroid Build Coastguard Worker if(!(Expression)) \
37*35ffd701SAndroid Build Coastguard Worker { \
38*35ffd701SAndroid Build Coastguard Worker __debugbreak(); \
39*35ffd701SAndroid Build Coastguard Worker } \
40*35ffd701SAndroid Build Coastguard Worker } // __GFXMACRO_ASSERT ##################
41*35ffd701SAndroid Build Coastguard Worker #else // Release Build
42*35ffd701SAndroid Build Coastguard Worker #define __GFXMACRO_ASSERT(Expression)
43*35ffd701SAndroid Build Coastguard Worker #endif
44*35ffd701SAndroid Build Coastguard Worker
45*35ffd701SAndroid Build Coastguard Worker
46*35ffd701SAndroid Build Coastguard Worker //------------------------------------------------------------------------
47*35ffd701SAndroid Build Coastguard Worker // Useful constants.
48*35ffd701SAndroid Build Coastguard Worker
49*35ffd701SAndroid Build Coastguard Worker #define GFX_ZERO (0.0f)
50*35ffd701SAndroid Build Coastguard Worker #define GFX_HALF (0.5f)
51*35ffd701SAndroid Build Coastguard Worker #define GFX_PI ((float) 3.14159265358979323846)
52*35ffd701SAndroid Build Coastguard Worker #define GFX_SQR_ROOT_OF_TWO ((float) 1.41421356237309504880)
53*35ffd701SAndroid Build Coastguard Worker #define GFX_E ((float) 2.7182818284590452354)
54*35ffd701SAndroid Build Coastguard Worker
55*35ffd701SAndroid Build Coastguard Worker //------------------------------------------------------------------------
56*35ffd701SAndroid Build Coastguard Worker
57*35ffd701SAndroid Build Coastguard Worker // !!! Many of these are macros (instead of functions) so 64-bit friendly (even on 32-bit builds)!!!
58*35ffd701SAndroid Build Coastguard Worker
59*35ffd701SAndroid Build Coastguard Worker #define GFX_IS_ALIGNED(A, B) (((B) > 0) && (((A) % (B)) == 0))
60*35ffd701SAndroid Build Coastguard Worker #define GFX_ALIGN(x, a) (((x) + ((a) - 1)) - (((x) + ((a) - 1)) & ((a) - 1))) // Alt implementation with bitwise not (~) has issue with uint32 align used with 64-bit value, since ~'ed value will remain 32-bit.
61*35ffd701SAndroid Build Coastguard Worker #define GFX_ALIGN_FLOOR(x, a) ((x) - ((x) & ((a) - 1)))
62*35ffd701SAndroid Build Coastguard Worker
63*35ffd701SAndroid Build Coastguard Worker #define GFX_ALIGN_NP2(x, a) (((a) > 0) ? ((x) + (((a) - 1) - (((x) + ((a) - 1)) % (a)))) : (x))
64*35ffd701SAndroid Build Coastguard Worker #define GFX_ALIGN_FLOOR_NP2(x, a) (((a) > 0) ? ((x) - ((x) % (a))) : (x))
65*35ffd701SAndroid Build Coastguard Worker
66*35ffd701SAndroid Build Coastguard Worker #define GFX_MASK(lo,hi) ((1UL << (hi)) | \
67*35ffd701SAndroid Build Coastguard Worker ((1UL << (hi)) - \
68*35ffd701SAndroid Build Coastguard Worker (1UL << (lo))))
69*35ffd701SAndroid Build Coastguard Worker
70*35ffd701SAndroid Build Coastguard Worker #define GFX_MASK_LARGE(lo,hi) (((uint64_t)1 << (hi)) | \
71*35ffd701SAndroid Build Coastguard Worker (((uint64_t)1 << (hi)) - \
72*35ffd701SAndroid Build Coastguard Worker ((uint64_t)1 << (lo))))
73*35ffd701SAndroid Build Coastguard Worker
74*35ffd701SAndroid Build Coastguard Worker #define GFX_IS_POWER_OF_2(a) (((a) > 0) && !((a) & ((a) - 1)))
75*35ffd701SAndroid Build Coastguard Worker
76*35ffd701SAndroid Build Coastguard Worker #define GFX_SWAP_VAR(a,b,t) (t=a, a=b, b=t)
77*35ffd701SAndroid Build Coastguard Worker #define GFX_SWAP_VAR3(a,b,c,t) (t=a, a=b, b=c, c=t)
78*35ffd701SAndroid Build Coastguard Worker
79*35ffd701SAndroid Build Coastguard Worker #define GFX_UF_ROUND(a) ((uint32_t) ((a) + 0.5F))
80*35ffd701SAndroid Build Coastguard Worker #define GFX_F_ROUND(a) ((int32_t) ((a) + ((a) < 0 ? -0.5F : 0.5F)))
81*35ffd701SAndroid Build Coastguard Worker #define GFX_ABS(a) (((a) < 0) ? -(a) : (a))
82*35ffd701SAndroid Build Coastguard Worker
83*35ffd701SAndroid Build Coastguard Worker #define GFX_MIN(a,b) (((a) < (b)) ? (a) : (b))
84*35ffd701SAndroid Build Coastguard Worker #define GFX_MAX(a,b) (((a) > (b)) ? (a) : (b))
85*35ffd701SAndroid Build Coastguard Worker
86*35ffd701SAndroid Build Coastguard Worker #define GFX_MIN3(a,b,c) (((a) < (b)) ? GFX_MIN((a), (c)) : GFX_MIN((b), (c)))
87*35ffd701SAndroid Build Coastguard Worker #define GFX_MAX3(a,b,c) (((a) > (b)) ? GFX_MAX((a), (c)) : GFX_MAX((b), (c)))
88*35ffd701SAndroid Build Coastguard Worker
89*35ffd701SAndroid Build Coastguard Worker #define GFX_CEIL_DIV(a,b) (((b) > 0) ? (((a) + ((b) - 1)) / (b)) : (a))
90*35ffd701SAndroid Build Coastguard Worker
91*35ffd701SAndroid Build Coastguard Worker #define GFX_SQ(a) ((a) * (a))
92*35ffd701SAndroid Build Coastguard Worker
93*35ffd701SAndroid Build Coastguard Worker #define GFX_CLAMP_MIN_MAX(a,min,max) ((a) < (min) ? (min) : GFX_MIN ((a), (max)))
94*35ffd701SAndroid Build Coastguard Worker
95*35ffd701SAndroid Build Coastguard Worker #define GFX_KB(k) ((k) * 1024)
96*35ffd701SAndroid Build Coastguard Worker #define GFX_MB(m) ((m) * 1024 * 1024)
97*35ffd701SAndroid Build Coastguard Worker
98*35ffd701SAndroid Build Coastguard Worker //------------ Macros for setting and removing bits.
99*35ffd701SAndroid Build Coastguard Worker
100*35ffd701SAndroid Build Coastguard Worker #define GFX_BIT(n) (1UL << (n))
101*35ffd701SAndroid Build Coastguard Worker #define GFX_BIT_ON(a,bit) ((a) |= (bit))
102*35ffd701SAndroid Build Coastguard Worker #define GFX_BIT_OFF(a,bit) ((a) &= ~(bit))
103*35ffd701SAndroid Build Coastguard Worker #define GFX_IS_BIT_SET(a,bit) ((a) & (bit))
104*35ffd701SAndroid Build Coastguard Worker
105*35ffd701SAndroid Build Coastguard Worker //*****************************************************************************
106*35ffd701SAndroid Build Coastguard Worker // MACRO: GFX_BIT_RANGE
107*35ffd701SAndroid Build Coastguard Worker // PURPOSE: Calculates the number of bits between the startbit and the endbit
108*35ffd701SAndroid Build Coastguard Worker // and count is inclusive of both bits. The bits are 0 based.
109*35ffd701SAndroid Build Coastguard Worker //*****************************************************************************
110*35ffd701SAndroid Build Coastguard Worker #define GFX_BIT_RANGE(endbit, startbit) ((endbit)-(startbit)+1)
111*35ffd701SAndroid Build Coastguard Worker
112*35ffd701SAndroid Build Coastguard Worker //------------ Macros for dealing with void pointers
113*35ffd701SAndroid Build Coastguard Worker
114*35ffd701SAndroid Build Coastguard Worker #define GFX_VOID_PTR_INC(p,n) ((void *) ((char *)(p) + (n)))
115*35ffd701SAndroid Build Coastguard Worker #define GFX_VOID_PTR_DEC(p,n) ((void *) ((char *)(p) - (n)))
116*35ffd701SAndroid Build Coastguard Worker
117*35ffd701SAndroid Build Coastguard Worker // While the difference of two pointers on a 64-bit machine can exceed
118*35ffd701SAndroid Build Coastguard Worker // 32-bits, it is mostly limited to 32-bits for the graphics driver. In
119*35ffd701SAndroid Build Coastguard Worker // order to avoid compilation warnings arising from assigning a 64-bit
120*35ffd701SAndroid Build Coastguard Worker // quantity to a 32-bit lvalue, we have two separate macros for obtaining
121*35ffd701SAndroid Build Coastguard Worker // pointer difference of two pointers.
122*35ffd701SAndroid Build Coastguard Worker
123*35ffd701SAndroid Build Coastguard Worker #define GFX_VOID_PTR_DIFF(a,b) (int32_t) ((char *) (a) - (char *) (b))
124*35ffd701SAndroid Build Coastguard Worker #define GFX_VOID_PTR_DIFF_LARGE(a,b) ((char *) (a) - (char *) (b))
125*35ffd701SAndroid Build Coastguard Worker
126*35ffd701SAndroid Build Coastguard Worker //------------ Bytes to page conversion
127*35ffd701SAndroid Build Coastguard Worker
128*35ffd701SAndroid Build Coastguard Worker #define GFX_BYTES_TO_PAGES(b) (((b) + PAGE_SIZE - 1) / PAGE_SIZE)
129*35ffd701SAndroid Build Coastguard Worker #define GFX_PAGES_TO_BYTES(p) ((p) * PAGE_SIZE)
130*35ffd701SAndroid Build Coastguard Worker
131*35ffd701SAndroid Build Coastguard Worker #define GFX_MEMSET(p,d,s) (memset(p, d, s))
132*35ffd701SAndroid Build Coastguard Worker
133*35ffd701SAndroid Build Coastguard Worker #if DBG
134*35ffd701SAndroid Build Coastguard Worker #define GFX_ULONG_CAST(x) \
135*35ffd701SAndroid Build Coastguard Worker ( \
136*35ffd701SAndroid Build Coastguard Worker ((x) <= 0xffffffff) ? \
137*35ffd701SAndroid Build Coastguard Worker 1 : __debugbreak(), \
138*35ffd701SAndroid Build Coastguard Worker (uint32_t)(x) \
139*35ffd701SAndroid Build Coastguard Worker )
140*35ffd701SAndroid Build Coastguard Worker #else // Release Build
141*35ffd701SAndroid Build Coastguard Worker #define GFX_ULONG_CAST(x) ((uint32_t)(x))
142*35ffd701SAndroid Build Coastguard Worker #endif
143*35ffd701SAndroid Build Coastguard Worker
144*35ffd701SAndroid Build Coastguard Worker // Since hardware addresses are still 32 bits, we need a safe way
145*35ffd701SAndroid Build Coastguard Worker // to convert 64 bit pointers into 32 bit hardware addresses.
146*35ffd701SAndroid Build Coastguard Worker // ASSERT that the upper 32 bits are 0 before truncating address.
147*35ffd701SAndroid Build Coastguard Worker #define GFX_VOID_PTR_TO_ULONG(ptr) ((uint32_t)(ptr))
148*35ffd701SAndroid Build Coastguard Worker
149*35ffd701SAndroid Build Coastguard Worker
150*35ffd701SAndroid Build Coastguard Worker //------------------------------------------------------------------------
151*35ffd701SAndroid Build Coastguard Worker // FAST FLOAT-TO_LONG CONVERSION
152*35ffd701SAndroid Build Coastguard Worker //
153*35ffd701SAndroid Build Coastguard Worker // We can convert floats to integers quickly by adding a floating-point
154*35ffd701SAndroid Build Coastguard Worker // constant to an IEEE float so that the integer value of the IEEE float is
155*35ffd701SAndroid Build Coastguard Worker // found in the least significant bits of the sum. We add 2^23 + 2^22, and
156*35ffd701SAndroid Build Coastguard Worker // thus the number is represented in IEEE single-precision as
157*35ffd701SAndroid Build Coastguard Worker // 2^23*(1.1xxxxxxx), where the first 1 is the implied one, the second is 1 .
158*35ffd701SAndroid Build Coastguard Worker //
159*35ffd701SAndroid Build Coastguard Worker // This technique has several limitations:
160*35ffd701SAndroid Build Coastguard Worker // 1. It only works on values in the range [0,2^22-1].
161*35ffd701SAndroid Build Coastguard Worker // 2. It is subject to the processor rounding mode, which we assume to be
162*35ffd701SAndroid Build Coastguard Worker // "round to nearest (even)". In this rounding mode, the conversion
163*35ffd701SAndroid Build Coastguard Worker // yields round(x), not floor(x) as called for in C.
164*35ffd701SAndroid Build Coastguard Worker //
165*35ffd701SAndroid Build Coastguard Worker // It can be made to work on negative values with a little fixed point
166*35ffd701SAndroid Build Coastguard Worker // trickery by:
167*35ffd701SAndroid Build Coastguard Worker // result = ((LONG) (result ^ 0x00800000) << 8) >> 8,
168*35ffd701SAndroid Build Coastguard Worker //
169*35ffd701SAndroid Build Coastguard Worker // However, when the result is masked to a byte or a short and directly
170*35ffd701SAndroid Build Coastguard Worker // assigned to the right type, no sign extension is required.
171*35ffd701SAndroid Build Coastguard Worker //
172*35ffd701SAndroid Build Coastguard Worker // The macros for -ve numbers since we use a constant of "1100" in binary
173*35ffd701SAndroid Build Coastguard Worker // representation. The msb 1 is force it to be the implicit bit. The next
174*35ffd701SAndroid Build Coastguard Worker // 1 is used for -ve numbers which will force other bits to be FFF..
175*35ffd701SAndroid Build Coastguard Worker //
176*35ffd701SAndroid Build Coastguard Worker // which flips and then smears the sign bit into the rest of the number. The
177*35ffd701SAndroid Build Coastguard Worker // intermediate values must be signed, so we do an arithmetic (fill with sign
178*35ffd701SAndroid Build Coastguard Worker // bit) instead of logical shift.
179*35ffd701SAndroid Build Coastguard Worker //
180*35ffd701SAndroid Build Coastguard Worker // We approximate the floor operation by subtracting off 0.5 before doing the
181*35ffd701SAndroid Build Coastguard Worker // round. This would work perfectly except that the processor breaks ties in
182*35ffd701SAndroid Build Coastguard Worker // rounding be selecting the even value. Thus, we compute floor(1.0) as
183*35ffd701SAndroid Build Coastguard Worker // round(0.5) = 0! Not good -- the caller must be careful to use
184*35ffd701SAndroid Build Coastguard Worker // __GL_FLOAT_TO_LONG_TRUNC only in cases where he can live with this
185*35ffd701SAndroid Build Coastguard Worker // behavior.
186*35ffd701SAndroid Build Coastguard Worker
187*35ffd701SAndroid Build Coastguard Worker #define GFX_FLOAT_TO_LONG_ROUND(ux,x,mask) \
188*35ffd701SAndroid Build Coastguard Worker { \
189*35ffd701SAndroid Build Coastguard Worker float fx; \
190*35ffd701SAndroid Build Coastguard Worker \
191*35ffd701SAndroid Build Coastguard Worker fx = x; \
192*35ffd701SAndroid Build Coastguard Worker fx += 0x00C00000; \
193*35ffd701SAndroid Build Coastguard Worker ux = mask & *(uint32_t *) &fx; \
194*35ffd701SAndroid Build Coastguard Worker }
195*35ffd701SAndroid Build Coastguard Worker
196*35ffd701SAndroid Build Coastguard Worker #define GFX_FLOAT_TO_LONG_TRUNC(ux,x,mask) \
197*35ffd701SAndroid Build Coastguard Worker { \
198*35ffd701SAndroid Build Coastguard Worker float fx; \
199*35ffd701SAndroid Build Coastguard Worker \
200*35ffd701SAndroid Build Coastguard Worker fx = x - GFX_HALF; \
201*35ffd701SAndroid Build Coastguard Worker fx += 0x00C00000; \
202*35ffd701SAndroid Build Coastguard Worker ux = mask & *(uint32_t *) &fx; \
203*35ffd701SAndroid Build Coastguard Worker }
204*35ffd701SAndroid Build Coastguard Worker
205*35ffd701SAndroid Build Coastguard Worker // Note: Double has 1 sign bit, 11 exponent and 52 mantissa bits.
206*35ffd701SAndroid Build Coastguard Worker // We need to add the following constant for fast conversion
207*35ffd701SAndroid Build Coastguard Worker //
208*35ffd701SAndroid Build Coastguard Worker // fx += (__LONG64) 0x18000000000000;
209*35ffd701SAndroid Build Coastguard Worker //
210*35ffd701SAndroid Build Coastguard Worker // This is done in a portable/decipherable manner through
211*35ffd701SAndroid Build Coastguard Worker // multiplications which are collapsed by the compiler at compile time.
212*35ffd701SAndroid Build Coastguard Worker
213*35ffd701SAndroid Build Coastguard Worker #define GFX_DOUBLE_TO_LONG_ROUND(ux,x,mask) \
214*35ffd701SAndroid Build Coastguard Worker { \
215*35ffd701SAndroid Build Coastguard Worker double fx; \
216*35ffd701SAndroid Build Coastguard Worker \
217*35ffd701SAndroid Build Coastguard Worker fx = x; \
218*35ffd701SAndroid Build Coastguard Worker fx += 24.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0 * 256; \
219*35ffd701SAndroid Build Coastguard Worker ux = mask & *(uint32_t *) &fx; \
220*35ffd701SAndroid Build Coastguard Worker }
221*35ffd701SAndroid Build Coastguard Worker
222*35ffd701SAndroid Build Coastguard Worker #define GFX_DOUBLE_TO_LONG_TRUNC(ux,x,mask) \
223*35ffd701SAndroid Build Coastguard Worker { \
224*35ffd701SAndroid Build Coastguard Worker double fx; \
225*35ffd701SAndroid Build Coastguard Worker \
226*35ffd701SAndroid Build Coastguard Worker fx = x - GFX_HALF; \
227*35ffd701SAndroid Build Coastguard Worker fx += 24.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0 * 256; \
228*35ffd701SAndroid Build Coastguard Worker ux = mask & *(uint32_t *) &fx; \
229*35ffd701SAndroid Build Coastguard Worker }
230*35ffd701SAndroid Build Coastguard Worker
231*35ffd701SAndroid Build Coastguard Worker #if __DEFINE_PROTO || defined __GFX_MACRO_C__
232*35ffd701SAndroid Build Coastguard Worker extern uint32_t GFX_LOG2 (uint32_t a);
233*35ffd701SAndroid Build Coastguard Worker extern uint32_t GFX_REAL_TO_UBYTE (float a);
234*35ffd701SAndroid Build Coastguard Worker extern int64_t GFX_POW2_SIZE (int64_t x);
235*35ffd701SAndroid Build Coastguard Worker extern uint32_t GFX_2_TO_POWER_OF (uint32_t w);
236*35ffd701SAndroid Build Coastguard Worker extern uint32_t GFX_MEMCPY_S(void *d, int dn, const void *s, int n);
237*35ffd701SAndroid Build Coastguard Worker extern void* GFX_MEMCPY_S_INC(void *d, int dn, const void *s, int n);
238*35ffd701SAndroid Build Coastguard Worker #endif // __DEFINE_PROTO
239*35ffd701SAndroid Build Coastguard Worker
240*35ffd701SAndroid Build Coastguard Worker #ifndef __S_INLINE
241*35ffd701SAndroid Build Coastguard Worker #define __S_INLINE __inline
242*35ffd701SAndroid Build Coastguard Worker #endif
243*35ffd701SAndroid Build Coastguard Worker
244*35ffd701SAndroid Build Coastguard Worker #if __DEFINE_MACRO || defined __GFX_MACRO_C__
245*35ffd701SAndroid Build Coastguard Worker //------------------------------------------------------------------------
246*35ffd701SAndroid Build Coastguard Worker
GFX_LOG2(uint32_t a)247*35ffd701SAndroid Build Coastguard Worker __S_INLINE uint32_t GFX_LOG2 (uint32_t a)
248*35ffd701SAndroid Build Coastguard Worker {
249*35ffd701SAndroid Build Coastguard Worker long i = 1;
250*35ffd701SAndroid Build Coastguard Worker
251*35ffd701SAndroid Build Coastguard Worker while ((a >> i) > 0) {
252*35ffd701SAndroid Build Coastguard Worker i++;
253*35ffd701SAndroid Build Coastguard Worker }
254*35ffd701SAndroid Build Coastguard Worker
255*35ffd701SAndroid Build Coastguard Worker return (i - 1);
256*35ffd701SAndroid Build Coastguard Worker }
257*35ffd701SAndroid Build Coastguard Worker
258*35ffd701SAndroid Build Coastguard Worker // Round-up to next power-of-2
GFX_POW2_SIZE(int64_t x)259*35ffd701SAndroid Build Coastguard Worker __S_INLINE int64_t GFX_POW2_SIZE (int64_t x)
260*35ffd701SAndroid Build Coastguard Worker { //-- Signed instead of unsigned since 64-bit is large enough that we don't need unsigned's range extension.
261*35ffd701SAndroid Build Coastguard Worker int64_t Pow2Size;
262*35ffd701SAndroid Build Coastguard Worker
263*35ffd701SAndroid Build Coastguard Worker /* Algorithm:
264*35ffd701SAndroid Build Coastguard Worker If there are no bits lit beneath the highest bit lit (HBL), the value
265*35ffd701SAndroid Build Coastguard Worker is already a power-of-2 and needs no further rounding but if there are
266*35ffd701SAndroid Build Coastguard Worker additional bits lit beneath the highest, the next higher power-of-2 is
267*35ffd701SAndroid Build Coastguard Worker (1 << (HBL + 1)). To determine if there are bits lit beneath the HBL,
268*35ffd701SAndroid Build Coastguard Worker we will subtract 1 from the given value before scanning for the HBL,
269*35ffd701SAndroid Build Coastguard Worker and only if there are no lower bits lit will the subtraction reduce the
270*35ffd701SAndroid Build Coastguard Worker HBL but in both cases, (1 << (HBL + 1)) will then produce the
271*35ffd701SAndroid Build Coastguard Worker appropriately rounded-up (or not) power-of-2.
272*35ffd701SAndroid Build Coastguard Worker */
273*35ffd701SAndroid Build Coastguard Worker
274*35ffd701SAndroid Build Coastguard Worker if(x > 1) // <-- Since we bit-scan for (x - 1) and can't bit-scan zero.
275*35ffd701SAndroid Build Coastguard Worker {
276*35ffd701SAndroid Build Coastguard Worker #define MSB (sizeof(x) * CHAR_BIT - 1)
277*35ffd701SAndroid Build Coastguard Worker
278*35ffd701SAndroid Build Coastguard Worker uint32_t HighBit;
279*35ffd701SAndroid Build Coastguard Worker
280*35ffd701SAndroid Build Coastguard Worker { // HighBit = HighestBitLit(x - 1)...
281*35ffd701SAndroid Build Coastguard Worker #if defined(__GNUC__) || defined(__clang__)
282*35ffd701SAndroid Build Coastguard Worker {
283*35ffd701SAndroid Build Coastguard Worker HighBit = MSB - __builtin_clzll(x - 1);
284*35ffd701SAndroid Build Coastguard Worker }
285*35ffd701SAndroid Build Coastguard Worker #else // Windows
286*35ffd701SAndroid Build Coastguard Worker {
287*35ffd701SAndroid Build Coastguard Worker #ifdef __CT__
288*35ffd701SAndroid Build Coastguard Worker {
289*35ffd701SAndroid Build Coastguard Worker _BitScanReverse64((DWORD *)&HighBit, x - 1);
290*35ffd701SAndroid Build Coastguard Worker }
291*35ffd701SAndroid Build Coastguard Worker #else // Break into separate Upper/Lower scans...
292*35ffd701SAndroid Build Coastguard Worker {
293*35ffd701SAndroid Build Coastguard Worker #define UDW_1 ((int64_t) _UI32_MAX + 1) // <-- UpperDW Value of 1 (i.e. 0x00000001`00000000).
294*35ffd701SAndroid Build Coastguard Worker
295*35ffd701SAndroid Build Coastguard Worker if(x < UDW_1)
296*35ffd701SAndroid Build Coastguard Worker {
297*35ffd701SAndroid Build Coastguard Worker _BitScanReverse((DWORD *)&HighBit, GFX_ULONG_CAST(x - 1));
298*35ffd701SAndroid Build Coastguard Worker }
299*35ffd701SAndroid Build Coastguard Worker else if(x > UDW_1)
300*35ffd701SAndroid Build Coastguard Worker {
301*35ffd701SAndroid Build Coastguard Worker _BitScanReverse((DWORD *)&HighBit, GFX_ULONG_CAST((x - 1) >> 32));
302*35ffd701SAndroid Build Coastguard Worker HighBit += 32;
303*35ffd701SAndroid Build Coastguard Worker }
304*35ffd701SAndroid Build Coastguard Worker else
305*35ffd701SAndroid Build Coastguard Worker {
306*35ffd701SAndroid Build Coastguard Worker HighBit = 31;
307*35ffd701SAndroid Build Coastguard Worker }
308*35ffd701SAndroid Build Coastguard Worker
309*35ffd701SAndroid Build Coastguard Worker #undef UDW_1
310*35ffd701SAndroid Build Coastguard Worker }
311*35ffd701SAndroid Build Coastguard Worker #endif
312*35ffd701SAndroid Build Coastguard Worker }
313*35ffd701SAndroid Build Coastguard Worker #endif
314*35ffd701SAndroid Build Coastguard Worker }
315*35ffd701SAndroid Build Coastguard Worker
316*35ffd701SAndroid Build Coastguard Worker if(HighBit < (MSB - 1)) // <-- -1 since operating on signed type.
317*35ffd701SAndroid Build Coastguard Worker {
318*35ffd701SAndroid Build Coastguard Worker Pow2Size = (int64_t) 1 << (HighBit + 1);
319*35ffd701SAndroid Build Coastguard Worker }
320*35ffd701SAndroid Build Coastguard Worker else
321*35ffd701SAndroid Build Coastguard Worker {
322*35ffd701SAndroid Build Coastguard Worker __GFXMACRO_ASSERT(0); // Overflow!
323*35ffd701SAndroid Build Coastguard Worker Pow2Size = 0;
324*35ffd701SAndroid Build Coastguard Worker }
325*35ffd701SAndroid Build Coastguard Worker
326*35ffd701SAndroid Build Coastguard Worker #undef MSB
327*35ffd701SAndroid Build Coastguard Worker }
328*35ffd701SAndroid Build Coastguard Worker else
329*35ffd701SAndroid Build Coastguard Worker {
330*35ffd701SAndroid Build Coastguard Worker Pow2Size = 1;
331*35ffd701SAndroid Build Coastguard Worker }
332*35ffd701SAndroid Build Coastguard Worker
333*35ffd701SAndroid Build Coastguard Worker return(Pow2Size);
334*35ffd701SAndroid Build Coastguard Worker } // GFX_POW2_SIZE
335*35ffd701SAndroid Build Coastguard Worker
336*35ffd701SAndroid Build Coastguard Worker // Find 2 to the power of w
GFX_2_TO_POWER_OF(uint32_t w)337*35ffd701SAndroid Build Coastguard Worker __S_INLINE uint32_t GFX_2_TO_POWER_OF (uint32_t w)
338*35ffd701SAndroid Build Coastguard Worker {
339*35ffd701SAndroid Build Coastguard Worker __GFXMACRO_ASSERT(w < (sizeof(w) * CHAR_BIT)); // Assert no overflow.
340*35ffd701SAndroid Build Coastguard Worker
341*35ffd701SAndroid Build Coastguard Worker return(1UL << w);
342*35ffd701SAndroid Build Coastguard Worker }
343*35ffd701SAndroid Build Coastguard Worker
GFX_REAL_TO_UBYTE(float a)344*35ffd701SAndroid Build Coastguard Worker __S_INLINE uint32_t GFX_REAL_TO_UBYTE (float a)
345*35ffd701SAndroid Build Coastguard Worker {
346*35ffd701SAndroid Build Coastguard Worker uint32_t x;
347*35ffd701SAndroid Build Coastguard Worker GFX_FLOAT_TO_LONG_ROUND(x, a, 0xFF);
348*35ffd701SAndroid Build Coastguard Worker return x;
349*35ffd701SAndroid Build Coastguard Worker }
350*35ffd701SAndroid Build Coastguard Worker
GFX_MEMCPY_S(void * d,int dn,const void * s,int n)351*35ffd701SAndroid Build Coastguard Worker __S_INLINE uint32_t GFX_MEMCPY_S(void *d, int dn, const void *s, int n)
352*35ffd701SAndroid Build Coastguard Worker {
353*35ffd701SAndroid Build Coastguard Worker uint32_t Error;
354*35ffd701SAndroid Build Coastguard Worker
355*35ffd701SAndroid Build Coastguard Worker // Check for the size, overlapping, etc.
356*35ffd701SAndroid Build Coastguard Worker // Calling code responsibility to avoid overlap regions
357*35ffd701SAndroid Build Coastguard Worker __GFXMACRO_ASSERT(n >= 0);
358*35ffd701SAndroid Build Coastguard Worker __GFXMACRO_ASSERT(
359*35ffd701SAndroid Build Coastguard Worker (((char*) d >= (char*) s) && ((ULONG_PTR)((char*) d - (char*) s) >= (ULONG_PTR) n) ) ||
360*35ffd701SAndroid Build Coastguard Worker (((char*) s >= (char*) d) && ((ULONG_PTR)((char*) s - (char*) d) >= (ULONG_PTR) n) ));
361*35ffd701SAndroid Build Coastguard Worker
362*35ffd701SAndroid Build Coastguard Worker #ifndef _WIN32
363*35ffd701SAndroid Build Coastguard Worker Error = 0;
364*35ffd701SAndroid Build Coastguard Worker if(n <= dn)
365*35ffd701SAndroid Build Coastguard Worker {
366*35ffd701SAndroid Build Coastguard Worker memcpy(d, s, n);
367*35ffd701SAndroid Build Coastguard Worker }
368*35ffd701SAndroid Build Coastguard Worker else
369*35ffd701SAndroid Build Coastguard Worker {
370*35ffd701SAndroid Build Coastguard Worker Error = !Error;
371*35ffd701SAndroid Build Coastguard Worker }
372*35ffd701SAndroid Build Coastguard Worker #else
373*35ffd701SAndroid Build Coastguard Worker Error = (uint32_t) memcpy_s(d, dn, s, n);
374*35ffd701SAndroid Build Coastguard Worker #endif
375*35ffd701SAndroid Build Coastguard Worker
376*35ffd701SAndroid Build Coastguard Worker __GFXMACRO_ASSERT(!Error);
377*35ffd701SAndroid Build Coastguard Worker return(Error);
378*35ffd701SAndroid Build Coastguard Worker }
379*35ffd701SAndroid Build Coastguard Worker
GFX_MEMCPY_S_INC(void * d,int dn,const void * s,int n)380*35ffd701SAndroid Build Coastguard Worker __S_INLINE void* GFX_MEMCPY_S_INC(void *d, int dn, const void *s, int n)
381*35ffd701SAndroid Build Coastguard Worker {
382*35ffd701SAndroid Build Coastguard Worker GFX_MEMCPY_S(d, dn, s, n);
383*35ffd701SAndroid Build Coastguard Worker return GFX_VOID_PTR_INC(d, n);
384*35ffd701SAndroid Build Coastguard Worker }
385*35ffd701SAndroid Build Coastguard Worker
GFX_GET_NONZERO_BIT_COUNT(uint32_t bitMask)386*35ffd701SAndroid Build Coastguard Worker __S_INLINE uint32_t GFX_GET_NONZERO_BIT_COUNT(uint32_t bitMask)
387*35ffd701SAndroid Build Coastguard Worker {
388*35ffd701SAndroid Build Coastguard Worker uint32_t bitCount = 0;
389*35ffd701SAndroid Build Coastguard Worker while(bitMask)
390*35ffd701SAndroid Build Coastguard Worker {
391*35ffd701SAndroid Build Coastguard Worker bitCount += bitMask & 0x1;
392*35ffd701SAndroid Build Coastguard Worker bitMask >>= 1;
393*35ffd701SAndroid Build Coastguard Worker }
394*35ffd701SAndroid Build Coastguard Worker
395*35ffd701SAndroid Build Coastguard Worker return bitCount;
396*35ffd701SAndroid Build Coastguard Worker }
397*35ffd701SAndroid Build Coastguard Worker
398*35ffd701SAndroid Build Coastguard Worker #endif
399*35ffd701SAndroid Build Coastguard Worker
400*35ffd701SAndroid Build Coastguard Worker //#include <intrin.h>
401*35ffd701SAndroid Build Coastguard Worker
402*35ffd701SAndroid Build Coastguard Worker // __readmsr should not be called for vGT cases, use __try __except to handle the
403*35ffd701SAndroid Build Coastguard Worker // exception and assign it with hard coded values
404*35ffd701SAndroid Build Coastguard Worker // isVGT flag will be set if it's being called from vGT.
405*35ffd701SAndroid Build Coastguard Worker
406*35ffd701SAndroid Build Coastguard Worker
407*35ffd701SAndroid Build Coastguard Worker #define GFX_READ_MSR(pHwDevExt, value, reg, retParam) \
408*35ffd701SAndroid Build Coastguard Worker if(!gfx_read_msr((pHwDevExt), &(value), (reg))) return retParam;
409*35ffd701SAndroid Build Coastguard Worker #define GFX_WRITE_MSR(pHwDevExt, reg, value, retParam)\
410*35ffd701SAndroid Build Coastguard Worker if(!gfx_write_msr((pHwDevExt), (value), (reg))) return retParam;
411*35ffd701SAndroid Build Coastguard Worker
412*35ffd701SAndroid Build Coastguard Worker #define GFX_READ_MSR_GOTO_LABEL_ON_ERROR(pHwDevExt, value, reg, label) \
413*35ffd701SAndroid Build Coastguard Worker if(!gfx_read_msr((pHwDevExt), &(value), (reg))) goto label;
414*35ffd701SAndroid Build Coastguard Worker
415*35ffd701SAndroid Build Coastguard Worker #define GFX_WRITE_MSR_GOTO_LABEL_ON_ERROR(pHwDevExt, reg, value, label)\
416*35ffd701SAndroid Build Coastguard Worker if(!gfx_write_msr((pHwDevExt), (value), (reg))) goto label;
417*35ffd701SAndroid Build Coastguard Worker #endif // __GFXMACRO_H__
418