X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fimports.h;h=4eabdfdb0d249173d4f35daaa4318da7fc50a4d2;hb=4a96df73e770bcca6396d3c8ffe3fd1693c73e50;hp=b01fe5b0ab98d55f551b5be93d56114c3bab58c2;hpb=cd8614b0287dc5a69725ec4ee0208fad61f7789e;p=mesa.git diff --git a/src/mesa/main/imports.h b/src/mesa/main/imports.h index b01fe5b0ab9..436d1651a82 100644 --- a/src/mesa/main/imports.h +++ b/src/mesa/main/imports.h @@ -1,6 +1,5 @@ /* * Mesa 3-D graphics library - * Version: 7.5 * * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. * @@ -17,9 +16,10 @@ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. */ @@ -38,7 +38,7 @@ #include "compiler.h" #include "glheader.h" - +#include "errors.h" #ifdef __cplusplus extern "C" { @@ -49,32 +49,10 @@ extern "C" { /** Memory macros */ /*@{*/ -/** Allocate \p BYTES bytes */ -#define MALLOC(BYTES) _mesa_malloc(BYTES) -/** Allocate and zero \p BYTES bytes */ -#define CALLOC(BYTES) _mesa_calloc(BYTES) /** Allocate a structure of type \p T */ -#define MALLOC_STRUCT(T) (struct T *) _mesa_malloc(sizeof(struct T)) +#define MALLOC_STRUCT(T) (struct T *) malloc(sizeof(struct T)) /** Allocate and zero a structure of type \p T */ -#define CALLOC_STRUCT(T) (struct T *) _mesa_calloc(sizeof(struct T)) -/** Free memory */ -#define FREE(PTR) _mesa_free(PTR) - -/** Allocate \p BYTES aligned at \p N bytes */ -#define ALIGN_MALLOC(BYTES, N) _mesa_align_malloc(BYTES, N) -/** Allocate and zero \p BYTES bytes aligned at \p N bytes */ -#define ALIGN_CALLOC(BYTES, N) _mesa_align_calloc(BYTES, N) -/** Allocate a structure of type \p T aligned at \p N bytes */ -#define ALIGN_MALLOC_STRUCT(T, N) (struct T *) _mesa_align_malloc(sizeof(struct T), N) -/** Allocate and zero a structure of type \p T aligned at \p N bytes */ -#define ALIGN_CALLOC_STRUCT(T, N) (struct T *) _mesa_align_calloc(sizeof(struct T), N) -/** Free aligned memory */ -#define ALIGN_FREE(PTR) _mesa_align_free(PTR) - -/** Copy \p BYTES bytes from \p SRC into \p DST */ -#define MEMCPY( DST, SRC, BYTES) _mesa_memcpy(DST, SRC, BYTES) -/** Set \p N bytes in \p DST to \p VAL */ -#define MEMSET( DST, VAL, N ) _mesa_memset(DST, VAL, N) +#define CALLOC_STRUCT(T) (struct T *) calloc(1, sizeof(struct T)) /*@}*/ @@ -97,7 +75,7 @@ extern "C" { * these casts generate warnings. * The following union typedef is used to solve that. */ -typedef union { GLfloat f; GLint i; } fi_type; +typedef union { GLfloat f; GLint i; GLuint u; } fi_type; @@ -112,82 +90,112 @@ typedef union { GLfloat f; GLint i; } fi_type; #define DEG2RAD (M_PI/180.0) -/*** - *** SQRTF: single-precision square root - ***/ -#if 0 /* _mesa_sqrtf() not accurate enough - temporarily disabled */ -# define SQRTF(X) _mesa_sqrtf(X) +/** + * \name Work-arounds for platforms that lack C99 math functions + */ +/*@{*/ +#if (!defined(_XOPEN_SOURCE) || (_XOPEN_SOURCE < 600)) && !defined(_ISOC99_SOURCE) \ + && (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L)) \ + && (!defined(_MSC_VER) || (_MSC_VER < 1400)) +#define acosf(f) ((float) acos(f)) +#define asinf(f) ((float) asin(f)) +#define atan2f(x,y) ((float) atan2(x,y)) +#define atanf(f) ((float) atan(f)) +#define ceilf(f) ((float) ceil(f)) +#define cosf(f) ((float) cos(f)) +#define coshf(f) ((float) cosh(f)) +#define expf(f) ((float) exp(f)) +#define exp2f(f) ((float) exp2(f)) +#define floorf(f) ((float) floor(f)) +#define logf(f) ((float) log(f)) + +#ifdef ANDROID +#define log2f(f) (logf(f) * (float) (1.0 / M_LN2)) #else -# define SQRTF(X) (float) sqrt((float) (X)) +#define log2f(f) ((float) log2(f)) #endif +#define powf(x,y) ((float) pow(x,y)) +#define sinf(f) ((float) sin(f)) +#define sinhf(f) ((float) sinh(f)) +#define sqrtf(f) ((float) sqrt(f)) +#define tanf(f) ((float) tan(f)) +#define tanhf(f) ((float) tanh(f)) +#define acoshf(f) ((float) acosh(f)) +#define asinhf(f) ((float) asinh(f)) +#define atanhf(f) ((float) atanh(f)) +#endif -/*** - *** INV_SQRTF: single-precision inverse square root - ***/ -#if 0 -#define INV_SQRTF(X) _mesa_inv_sqrt(X) -#else -#define INV_SQRTF(X) (1.0F / SQRTF(X)) /* this is faster on a P4 */ +#if defined(_MSC_VER) +#if _MSC_VER < 1800 /* Not req'd on VS2013 and above */ +static inline float truncf(float x) { return x < 0.0f ? ceilf(x) : floorf(x); } +static inline float exp2f(float x) { return powf(2.0f, x); } +static inline float log2f(float x) { return logf(x) * 1.442695041f; } +static inline float asinhf(float x) { return logf(x + sqrtf(x * x + 1.0f)); } +static inline float acoshf(float x) { return logf(x + sqrtf(x * x - 1.0f)); } +static inline float atanhf(float x) { return (logf(1.0f + x) - logf(1.0f - x)) / 2.0f; } +static inline int isblank(int ch) { return ch == ' ' || ch == '\t'; } +#define strtoll(p, e, b) _strtoi64(p, e, b) +#endif /* _MSC_VER < 1800 */ +#define strcasecmp(s1, s2) _stricmp(s1, s2) #endif +/*@}*/ + + +/* + * signbit() is a macro on Linux. Not available on Windows. + */ +#ifndef signbit +#define signbit(x) ((x) < 0.0f) +#endif + + +/** single-precision inverse square root */ +static inline float +INV_SQRTF(float x) +{ + /* XXX we could try Quake's fast inverse square root function here */ + return 1.0F / sqrtf(x); +} /*** *** LOG2: Log base 2 of float ***/ -#ifdef USE_IEEE -#if 0 -/* This is pretty fast, but not accurate enough (only 2 fractional bits). - * Based on code from http://www.stereopsis.com/log2.html - */ -static INLINE GLfloat LOG2(GLfloat x) +static inline GLfloat LOG2(GLfloat x) { +#if 0 + /* This is pretty fast, but not accurate enough (only 2 fractional bits). + * Based on code from http://www.stereopsis.com/log2.html + */ const GLfloat y = x * x * x * x; const GLuint ix = *((GLuint *) &y); const GLuint exp = (ix >> 23) & 0xFF; const GLint log2 = ((GLint) exp) - 127; return (GLfloat) log2 * (1.0 / 4.0); /* 4, because of x^4 above */ -} #endif -/* Pretty fast, and accurate. - * Based on code from http://www.flipcode.com/totd/ - */ -static INLINE GLfloat LOG2(GLfloat val) -{ + /* Pretty fast, and accurate. + * Based on code from http://www.flipcode.com/totd/ + */ fi_type num; GLint log_2; - num.f = val; + num.f = x; log_2 = ((num.i >> 23) & 255) - 128; num.i &= ~(255 << 23); num.i += 127 << 23; num.f = ((-1.0f/3) * num.f + 2) * num.f - 2.0f/3; return num.f + log_2; } -#else -/* - * NOTE: log_base_2(x) = log(x) / log(2) - * NOTE: 1.442695 = 1/log(2). - */ -#define LOG2(x) ((GLfloat) (log(x) * 1.442695F)) -#endif + /*** *** IS_INF_OR_NAN: test if float is infinite or NaN ***/ -#ifdef USE_IEEE -static INLINE int IS_INF_OR_NAN( float x ) -{ - fi_type tmp; - tmp.f = x; - return !(int)((unsigned int)((tmp.i & 0x7fffffff)-0x7f800000) >> 31); -} -#elif defined(isfinite) +#if defined(isfinite) #define IS_INF_OR_NAN(x) (!isfinite(x)) #elif defined(finite) #define IS_INF_OR_NAN(x) (!finite(x)) -#elif defined(__VMS) -#define IS_INF_OR_NAN(x) (!finite(x)) #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define IS_INF_OR_NAN(x) (!isfinite(x)) #else @@ -195,35 +203,6 @@ static INLINE int IS_INF_OR_NAN( float x ) #endif -/*** - *** IS_NEGATIVE: test if float is negative - ***/ -#if defined(USE_IEEE) -static INLINE int GET_FLOAT_BITS( float x ) -{ - fi_type fi; - fi.f = x; - return fi.i; -} -#define IS_NEGATIVE(x) (GET_FLOAT_BITS(x) < 0) -#else -#define IS_NEGATIVE(x) (x < 0.0F) -#endif - - -/*** - *** DIFFERENT_SIGNS: test if two floats have opposite signs - ***/ -#if defined(USE_IEEE) -#define DIFFERENT_SIGNS(x,y) ((GET_FLOAT_BITS(x) ^ GET_FLOAT_BITS(y)) & (1<<31)) -#else -/* Could just use (x*y<0) except for the flatshading requirements. - * Maybe there's a better way? - */ -#define DIFFERENT_SIGNS(x,y) ((x) * (y) <= 0.0F && (x) - (y) != 0.0F) -#endif - - /*** *** CEILF: ceiling of float *** FLOORF: floor of float @@ -253,69 +232,72 @@ static INLINE int GET_FLOAT_BITS( float x ) #endif -/*** - *** IROUND: return (as an integer) float rounded to nearest integer - ***/ -#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__) && \ - (!(defined(__BEOS__) || defined(__HAIKU__)) || \ - (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))) -static INLINE int iround(float f) +/** + * Convert float to int by rounding to nearest integer, away from zero. + */ +static inline int IROUND(float f) { + return (int) ((f >= 0.0F) ? (f + 0.5F) : (f - 0.5F)); +} + + +/** + * Convert float to int64 by rounding to nearest integer. + */ +static inline GLint64 IROUND64(float f) +{ + return (GLint64) ((f >= 0.0F) ? (f + 0.5F) : (f - 0.5F)); +} + + +/** + * Convert positive float to int by rounding to nearest integer. + */ +static inline int IROUND_POS(float f) +{ + assert(f >= 0.0F); + return (int) (f + 0.5F); +} + +#ifdef __x86_64__ +# include +#endif + +/** + * Convert float to int using a fast method. The rounding mode may vary. + */ +static inline int F_TO_I(float f) +{ +#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__) int r; __asm__ ("fistpl %0" : "=m" (r) : "t" (f) : "st"); return r; -} -#define IROUND(x) iround(x) #elif defined(USE_X86_ASM) && defined(_MSC_VER) -static INLINE int iround(float f) -{ int r; _asm { fld f fistp r } return r; -} -#define IROUND(x) iround(x) -#elif defined(__WATCOMC__) && defined(__386__) -long iround(float f); -#pragma aux iround = \ - "push eax" \ - "fistp dword ptr [esp]" \ - "pop eax" \ - parm [8087] \ - value [eax] \ - modify exact [eax]; -#define IROUND(x) iround(x) +#elif defined(__x86_64__) + return _mm_cvt_ss2si(_mm_load_ss(&f)); #else -#define IROUND(f) ((int) (((f) >= 0.0F) ? ((f) + 0.5F) : ((f) - 0.5F))) -#endif - -#define IROUND64(f) ((GLint64) (((f) >= 0.0F) ? ((f) + 0.5F) : ((f) - 0.5F))) - -/*** - *** IROUND_POS: return (as an integer) positive float rounded to nearest int - ***/ -#ifdef DEBUG -#define IROUND_POS(f) (assert((f) >= 0.0F), IROUND(f)) -#else -#define IROUND_POS(f) (IROUND(f)) + return IROUND(f); #endif +} -/*** - *** IFLOOR: return (as an integer) floor of float - ***/ -#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__) -/* - * IEEE floor for computers that round to nearest or even. - * 'f' must be between -4194304 and 4194303. - * This floor operation is done by "(iround(f + .5) + iround(f - .5)) >> 1", - * but uses some IEEE specific tricks for better speed. - * Contributed by Josh Vanderhoof - */ -static INLINE int ifloor(float f) +/** Return (as an integer) floor of float */ +static inline int IFLOOR(float f) { +#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__) + /* + * IEEE floor for computers that round to nearest or even. + * 'f' must be between -4194304 and 4194303. + * This floor operation is done by "(iround(f + .5) + iround(f - .5)) >> 1", + * but uses some IEEE specific tricks for better speed. + * Contributed by Josh Vanderhoof + */ int ai, bi; double af, bf; af = (3 << 22) + 0.5 + (double)f; @@ -324,45 +306,30 @@ static INLINE int ifloor(float f) __asm__ ("fstps %0" : "=m" (ai) : "t" (af) : "st"); __asm__ ("fstps %0" : "=m" (bi) : "t" (bf) : "st"); return (ai - bi) >> 1; -} -#define IFLOOR(x) ifloor(x) -#elif defined(USE_IEEE) -static INLINE int ifloor(float f) -{ +#else int ai, bi; double af, bf; fi_type u; - af = (3 << 22) + 0.5 + (double)f; bf = (3 << 22) + 0.5 - (double)f; u.f = (float) af; ai = u.i; u.f = (float) bf; bi = u.i; return (ai - bi) >> 1; -} -#define IFLOOR(x) ifloor(x) -#else -static INLINE int ifloor(float f) -{ - int i = IROUND(f); - return (i > f) ? i - 1 : i; -} -#define IFLOOR(x) ifloor(x) #endif +} -/*** - *** ICEIL: return (as an integer) ceiling of float - ***/ -#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__) -/* - * IEEE ceil for computers that round to nearest or even. - * 'f' must be between -4194304 and 4194303. - * This ceil operation is done by "(iround(f + .5) + iround(f - .5) + 1) >> 1", - * but uses some IEEE specific tricks for better speed. - * Contributed by Josh Vanderhoof - */ -static INLINE int iceil(float f) +/** Return (as an integer) ceiling of float */ +static inline int ICEIL(float f) { +#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__) + /* + * IEEE ceil for computers that round to nearest or even. + * 'f' must be between -4194304 and 4194303. + * This ceil operation is done by "(iround(f + .5) + iround(f - .5) + 1) >> 1", + * but uses some IEEE specific tricks for better speed. + * Contributed by Josh Vanderhoof + */ int ai, bi; double af, bf; af = (3 << 22) + 0.5 + (double)f; @@ -371,11 +338,7 @@ static INLINE int iceil(float f) __asm__ ("fstps %0" : "=m" (ai) : "t" (af) : "st"); __asm__ ("fstps %0" : "=m" (bi) : "t" (bf) : "st"); return (ai - bi + 1) >> 1; -} -#define ICEIL(x) iceil(x) -#elif defined(USE_IEEE) -static INLINE int iceil(float f) -{ +#else int ai, bi; double af, bf; fi_type u; @@ -384,68 +347,96 @@ static INLINE int iceil(float f) u.f = (float) af; ai = u.i; u.f = (float) bf; bi = u.i; return (ai - bi + 1) >> 1; -} -#define ICEIL(x) iceil(x) -#else -static INLINE int iceil(float f) -{ - int i = IROUND(f); - return (i < f) ? i + 1 : i; -} -#define ICEIL(x) iceil(x) #endif +} /** * Is x a power of two? */ -static INLINE int +static inline int _mesa_is_pow_two(int x) { return !(x & (x - 1)); } +/** + * Round given integer to next higer power of two + * If X is zero result is undefined. + * + * Source for the fallback implementation is + * Sean Eron Anderson's webpage "Bit Twiddling Hacks" + * http://graphics.stanford.edu/~seander/bithacks.html + * + * When using builtin function have to do some work + * for case when passed values 1 to prevent hiting + * undefined result from __builtin_clz. Undefined + * results would be different depending on optimization + * level used for build. + */ +static inline int32_t +_mesa_next_pow_two_32(uint32_t x) +{ +#ifdef HAVE___BUILTIN_CLZ + uint32_t y = (x != 1); + return (1 + y) << ((__builtin_clz(x - y) ^ 31) ); +#else + x--; + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + x++; + return x; +#endif +} -/*** - *** UNCLAMPED_FLOAT_TO_UBYTE: clamp float to [0,1] and map to ubyte in [0,255] - *** CLAMPED_FLOAT_TO_UBYTE: map float known to be in [0,1] to ubyte in [0,255] - ***/ -#if defined(USE_IEEE) && !defined(DEBUG) -#define IEEE_0996 0x3f7f0000 /* 0.996 or so */ -/* This function/macro is sensitive to precision. Test very carefully - * if you change it! +static inline int64_t +_mesa_next_pow_two_64(uint64_t x) +{ +#ifdef HAVE___BUILTIN_CLZLL + uint64_t y = (x != 1); + STATIC_ASSERT(sizeof(x) == sizeof(long long)); + return (1 + y) << ((__builtin_clzll(x - y) ^ 63)); +#else + x--; + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + x |= x >> 32; + x++; + return x; +#endif +} + + +/* + * Returns the floor form of binary logarithm for a 32-bit integer. */ -#define UNCLAMPED_FLOAT_TO_UBYTE(UB, F) \ - do { \ - fi_type __tmp; \ - __tmp.f = (F); \ - if (__tmp.i < 0) \ - UB = (GLubyte) 0; \ - else if (__tmp.i >= IEEE_0996) \ - UB = (GLubyte) 255; \ - else { \ - __tmp.f = __tmp.f * (255.0F/256.0F) + 32768.0F; \ - UB = (GLubyte) __tmp.i; \ - } \ - } while (0) -#define CLAMPED_FLOAT_TO_UBYTE(UB, F) \ - do { \ - fi_type __tmp; \ - __tmp.f = (F) * (255.0F/256.0F) + 32768.0F; \ - UB = (GLubyte) __tmp.i; \ - } while (0) +static inline GLuint +_mesa_logbase2(GLuint n) +{ +#ifdef HAVE___BUILTIN_CLZ + return (31 - __builtin_clz(n | 1)); #else -#define UNCLAMPED_FLOAT_TO_UBYTE(ub, f) \ - ub = ((GLubyte) IROUND(CLAMP((f), 0.0F, 1.0F) * 255.0F)) -#define CLAMPED_FLOAT_TO_UBYTE(ub, f) \ - ub = ((GLubyte) IROUND((f) * 255.0F)) + GLuint pos = 0; + if (n >= 1<<16) { n >>= 16; pos += 16; } + if (n >= 1<< 8) { n >>= 8; pos += 8; } + if (n >= 1<< 4) { n >>= 4; pos += 4; } + if (n >= 1<< 2) { n >>= 2; pos += 2; } + if (n >= 1<< 1) { pos += 1; } + return pos; #endif +} /** * Return 1 if this is a little endian machine, 0 if big endian. */ -static INLINE GLboolean +static inline GLboolean _mesa_little_endian(void) { const GLuint ui = 1; /* intentionally not static */ @@ -458,15 +449,6 @@ _mesa_little_endian(void) * Functions */ -extern void * -_mesa_malloc( size_t bytes ); - -extern void * -_mesa_calloc( size_t bytes ); - -extern void -_mesa_free( void *ptr ); - extern void * _mesa_align_malloc( size_t bytes, unsigned long alignment ); @@ -486,62 +468,62 @@ _mesa_exec_malloc( GLuint size ); extern void _mesa_exec_free( void *addr ); -extern void * -_mesa_realloc( void *oldBuffer, size_t oldSize, size_t newSize ); - -extern void * -_mesa_memcpy( void *dest, const void *src, size_t n ); - -extern void -_mesa_memset( void *dst, int val, size_t n ); - -extern void -_mesa_memset16( unsigned short *dst, unsigned short val, size_t n ); - -extern void -_mesa_bzero( void *dst, size_t n ); - -extern int -_mesa_memcmp( const void *s1, const void *s2, size_t n ); - -extern double -_mesa_sin(double a); -extern float -_mesa_sinf(float a); - -extern double -_mesa_cos(double a); +#ifndef FFS_DEFINED +#define FFS_DEFINED 1 +#ifdef HAVE___BUILTIN_FFS +#define ffs __builtin_ffs +#else +extern int ffs(int i); +#endif -extern float -_mesa_asinf(float x); +#ifdef HAVE___BUILTIN_FFSLL +#define ffsll __builtin_ffsll +#else +extern int ffsll(long long int i); +#endif +#endif /* FFS_DEFINED */ -extern float -_mesa_atanf(float x); -extern double -_mesa_sqrtd(double x); +#ifdef HAVE___BUILTIN_POPCOUNT +#define _mesa_bitcount(i) __builtin_popcount(i) +#else +extern unsigned int +_mesa_bitcount(unsigned int n); +#endif -extern float -_mesa_sqrtf(float x); +#ifdef HAVE___BUILTIN_POPCOUNTLL +#define _mesa_bitcount_64(i) __builtin_popcountll(i) +#else +extern unsigned int +_mesa_bitcount_64(uint64_t n); +#endif -extern float -_mesa_inv_sqrtf(float x); +/** + * Find the last (most significant) bit set in a word. + * + * Essentially ffs() in the reverse direction. + */ +static inline unsigned int +_mesa_fls(unsigned int n) +{ +#ifdef HAVE___BUILTIN_CLZ + return n == 0 ? 0 : 32 - __builtin_clz(n); +#else + unsigned int v = 1; -extern void -_mesa_init_sqrt_table(void); + if (n == 0) + return 0; -extern double -_mesa_pow(double x, double y); + while (n >>= 1) + v++; -extern int -_mesa_ffs(int32_t i); + return v; +#endif +} extern int -_mesa_ffsll(int64_t i); - -extern unsigned int -_mesa_bitcount(unsigned int n); +_mesa_round_to_even(float val); extern GLhalfARB _mesa_float_to_half(float f); @@ -549,74 +531,32 @@ _mesa_float_to_half(float f); extern float _mesa_half_to_float(GLhalfARB h); - -extern void * -_mesa_bsearch( const void *key, const void *base, size_t nmemb, size_t size, - int (*compar)(const void *, const void *) ); - -extern char * -_mesa_getenv( const char *var ); - -extern char * -_mesa_strstr( const char *haystack, const char *needle ); - -extern char * -_mesa_strncat( char *dest, const char *src, size_t n ); - -extern char * -_mesa_strcpy( char *dest, const char *src ); - -extern char * -_mesa_strncpy( char *dest, const char *src, size_t n ); - -extern size_t -_mesa_strlen( const char *s ); - -extern int -_mesa_strcmp( const char *s1, const char *s2 ); - -extern int -_mesa_strncmp( const char *s1, const char *s2, size_t n ); +static inline bool +_mesa_half_is_negative(GLhalfARB h) +{ + return h & 0x8000; +} extern char * _mesa_strdup( const char *s ); -extern int -_mesa_atoi( const char *s ); - -extern double -_mesa_strtod( const char *s, char **end ); +extern float +_mesa_strtof( const char *s, char **end ); extern unsigned int _mesa_str_checksum(const char *str); extern int -_mesa_sprintf( char *str, const char *fmt, ... ); +_mesa_snprintf( char *str, size_t size, const char *fmt, ... ) PRINTFLIKE(3, 4); extern int -_mesa_snprintf( char *str, size_t size, const char *fmt, ... ); - -extern void -_mesa_printf( const char *fmtString, ... ); +_mesa_vsnprintf(char *str, size_t size, const char *fmt, va_list arg); -extern void -_mesa_fprintf( FILE *f, const char *fmtString, ... ); -extern int -_mesa_vsprintf( char *str, const char *fmt, va_list args ); - - -extern void -_mesa_warning( __GLcontext *gc, const char *fmtString, ... ); - -extern void -_mesa_problem( const __GLcontext *ctx, const char *fmtString, ... ); - -extern void -_mesa_error( __GLcontext *ctx, GLenum error, const char *fmtString, ... ); +#if defined(_MSC_VER) && !defined(snprintf) +#define snprintf _snprintf +#endif -extern void -_mesa_debug( const __GLcontext *ctx, const char *fmtString, ... ); #ifdef __cplusplus }