Home | History | Annotate | Download | only in main
      1 /*
      2  * Mesa 3-D graphics library
      3  * Version:  7.5
      4  *
      5  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the "Software"),
      9  * to deal in the Software without restriction, including without limitation
     10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     11  * and/or sell copies of the Software, and to permit persons to whom the
     12  * Software is furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included
     15  * in all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
     21  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     23  */
     24 
     25 
     26 /**
     27  * \file imports.h
     28  * Standard C library function wrappers.
     29  *
     30  * This file provides wrappers for all the standard C library functions
     31  * like malloc(), free(), printf(), getenv(), etc.
     32  */
     33 
     34 
     35 #ifndef IMPORTS_H
     36 #define IMPORTS_H
     37 
     38 
     39 #include "compiler.h"
     40 #include "glheader.h"
     41 
     42 
     43 #ifdef __cplusplus
     44 extern "C" {
     45 #endif
     46 
     47 
     48 /**********************************************************************/
     49 /** Memory macros */
     50 /*@{*/
     51 
     52 /** Allocate \p BYTES bytes */
     53 #define MALLOC(BYTES)      malloc(BYTES)
     54 /** Allocate and zero \p BYTES bytes */
     55 #define CALLOC(BYTES)      calloc(1, BYTES)
     56 /** Allocate a structure of type \p T */
     57 #define MALLOC_STRUCT(T)   (struct T *) malloc(sizeof(struct T))
     58 /** Allocate and zero a structure of type \p T */
     59 #define CALLOC_STRUCT(T)   (struct T *) calloc(1, sizeof(struct T))
     60 /** Free memory */
     61 #define FREE(PTR)          free(PTR)
     62 
     63 /*@}*/
     64 
     65 
     66 /*
     67  * For GL_ARB_vertex_buffer_object we need to treat vertex array pointers
     68  * as offsets into buffer stores.  Since the vertex array pointer and
     69  * buffer store pointer are both pointers and we need to add them, we use
     70  * this macro.
     71  * Both pointers/offsets are expressed in bytes.
     72  */
     73 #define ADD_POINTERS(A, B)  ( (GLubyte *) (A) + (uintptr_t) (B) )
     74 
     75 
     76 /**
     77  * Sometimes we treat GLfloats as GLints.  On x86 systems, moving a float
     78  * as a int (thereby using integer registers instead of FP registers) is
     79  * a performance win.  Typically, this can be done with ordinary casts.
     80  * But with gcc's -fstrict-aliasing flag (which defaults to on in gcc 3.0)
     81  * these casts generate warnings.
     82  * The following union typedef is used to solve that.
     83  */
     84 typedef union { GLfloat f; GLint i; } fi_type;
     85 
     86 
     87 
     88 /**********************************************************************
     89  * Math macros
     90  */
     91 
     92 #define MAX_GLUSHORT	0xffff
     93 #define MAX_GLUINT	0xffffffff
     94 
     95 /* Degrees to radians conversion: */
     96 #define DEG2RAD (M_PI/180.0)
     97 
     98 
     99 /***
    100  *** SQRTF: single-precision square root
    101  ***/
    102 #if 0 /* _mesa_sqrtf() not accurate enough - temporarily disabled */
    103 #  define SQRTF(X)  _mesa_sqrtf(X)
    104 #else
    105 #  define SQRTF(X)  (float) sqrt((float) (X))
    106 #endif
    107 
    108 
    109 /***
    110  *** INV_SQRTF: single-precision inverse square root
    111  ***/
    112 #if 0
    113 #define INV_SQRTF(X) _mesa_inv_sqrt(X)
    114 #else
    115 #define INV_SQRTF(X) (1.0F / SQRTF(X))  /* this is faster on a P4 */
    116 #endif
    117 
    118 
    119 /**
    120  * \name Work-arounds for platforms that lack C99 math functions
    121  */
    122 /*@{*/
    123 #if (!defined(_XOPEN_SOURCE) || (_XOPEN_SOURCE < 600)) && !defined(_ISOC99_SOURCE) \
    124    && (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L)) \
    125    && (!defined(_MSC_VER) || (_MSC_VER < 1400))
    126 /*#define acosf(f) ((float) acos(f))
    127 #define asinf(f) ((float) asin(f))
    128 #define atan2f(x,y) ((float) atan2(x,y))
    129 #define atanf(f) ((float) atan(f))
    130 #define cielf(f) ((float) ciel(f))
    131 #define cosf(f) ((float) cos(f))
    132 #define coshf(f) ((float) cosh(f))
    133 #define expf(f) ((float) exp(f))
    134 #define exp2f(f) ((float) exp2(f))
    135 #define floorf(f) ((float) floor(f))
    136 #define logf(f) ((float) log(f))
    137 #define log2f(f) ((float) log2(f))
    138 #define powf(x,y) ((float) pow(x,y))
    139 #define sinf(f) ((float) sin(f))
    140 #define sinhf(f) ((float) sinh(f))
    141 #define sqrtf(f) ((float) sqrt(f))
    142 #define tanf(f) ((float) tan(f))
    143 #define tanhf(f) ((float) tanh(f))
    144 #define acoshf(f) ((float) acosh(f))
    145 #define asinhf(f) ((float) asinh(f))
    146 #define atanhf(f) ((float) atanh(f))*/
    147 #endif
    148 
    149 #if defined(_MSC_VER)
    150 static INLINE float truncf(float x) { return x < 0.0f ? ceilf(x) : floorf(x); }
    151 static INLINE float exp2f(float x) { return powf(2.0f, x); }
    152 static INLINE float log2f(float x) { return logf(x) * 1.442695041f; }
    153 static INLINE float asinhf(float x) { return logf(x + sqrtf(x * x + 1.0f)); }
    154 static INLINE float acoshf(float x) { return logf(x + sqrtf(x * x - 1.0f)); }
    155 static INLINE float atanhf(float x) { return (logf(1.0f + x) - logf(1.0f - x)) / 2.0f; }
    156 static INLINE int isblank(int ch) { return ch == ' ' || ch == '\t'; }
    157 #define strtoll(p, e, b) _strtoi64(p, e, b)
    158 #endif
    159 /*@}*/
    160 
    161 /***
    162  *** LOG2: Log base 2 of float
    163  ***/
    164 #ifdef USE_IEEE
    165 #if 0
    166 /* This is pretty fast, but not accurate enough (only 2 fractional bits).
    167  * Based on code from http://www.stereopsis.com/log2.html
    168  */
    169 static INLINE GLfloat LOG2(GLfloat x)
    170 {
    171    const GLfloat y = x * x * x * x;
    172    const GLuint ix = *((GLuint *) &y);
    173    const GLuint exp = (ix >> 23) & 0xFF;
    174    const GLint log2 = ((GLint) exp) - 127;
    175    return (GLfloat) log2 * (1.0 / 4.0);  /* 4, because of x^4 above */
    176 }
    177 #endif
    178 /* Pretty fast, and accurate.
    179  * Based on code from http://www.flipcode.com/totd/
    180  */
    181 static INLINE GLfloat LOG2(GLfloat val)
    182 {
    183    fi_type num;
    184    GLint log_2;
    185    num.f = val;
    186    log_2 = ((num.i >> 23) & 255) - 128;
    187    num.i &= ~(255 << 23);
    188    num.i += 127 << 23;
    189    num.f = ((-1.0f/3) * num.f + 2) * num.f - 2.0f/3;
    190    return num.f + log_2;
    191 }
    192 #else
    193 /*
    194  * NOTE: log_base_2(x) = log(x) / log(2)
    195  * NOTE: 1.442695 = 1/log(2).
    196  */
    197 #define LOG2(x)  ((GLfloat) (log(x) * 1.442695F))
    198 #endif
    199 
    200 
    201 /***
    202  *** IS_INF_OR_NAN: test if float is infinite or NaN
    203  ***/
    204 #ifdef USE_IEEE
    205 static INLINE int IS_INF_OR_NAN( float x )
    206 {
    207    fi_type tmp;
    208    tmp.f = x;
    209    return !(int)((unsigned int)((tmp.i & 0x7fffffff)-0x7f800000) >> 31);
    210 }
    211 #elif defined(isfinite)
    212 #define IS_INF_OR_NAN(x)        (!isfinite(x))
    213 #elif defined(finite)
    214 #define IS_INF_OR_NAN(x)        (!finite(x))
    215 #elif defined(__VMS)
    216 #define IS_INF_OR_NAN(x)        (!finite(x))
    217 #elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    218 #define IS_INF_OR_NAN(x)        (!isfinite(x))
    219 #else
    220 #define IS_INF_OR_NAN(x)        (!finite(x))
    221 #endif
    222 
    223 
    224 /***
    225  *** IS_NEGATIVE: test if float is negative
    226  ***/
    227 #if defined(USE_IEEE)
    228 static INLINE int GET_FLOAT_BITS( float x )
    229 {
    230    fi_type fi;
    231    fi.f = x;
    232    return fi.i;
    233 }
    234 #define IS_NEGATIVE(x) (GET_FLOAT_BITS(x) < 0)
    235 #else
    236 #define IS_NEGATIVE(x) (x < 0.0F)
    237 #endif
    238 
    239 
    240 /***
    241  *** DIFFERENT_SIGNS: test if two floats have opposite signs
    242  ***/
    243 #if defined(USE_IEEE)
    244 #define DIFFERENT_SIGNS(x,y) ((GET_FLOAT_BITS(x) ^ GET_FLOAT_BITS(y)) & (1<<31))
    245 #else
    246 /* Could just use (x*y<0) except for the flatshading requirements.
    247  * Maybe there's a better way?
    248  */
    249 #define DIFFERENT_SIGNS(x,y) ((x) * (y) <= 0.0F && (x) - (y) != 0.0F)
    250 #endif
    251 
    252 
    253 /***
    254  *** CEILF: ceiling of float
    255  *** FLOORF: floor of float
    256  *** FABSF: absolute value of float
    257  *** LOGF: the natural logarithm (base e) of the value
    258  *** EXPF: raise e to the value
    259  *** LDEXPF: multiply value by an integral power of two
    260  *** FREXPF: extract mantissa and exponent from value
    261  ***/
    262 #if defined(__gnu_linux__)
    263 /* C99 functions */
    264 #define CEILF(x)   ceilf(x)
    265 #define FLOORF(x)  floorf(x)
    266 #define FABSF(x)   fabsf(x)
    267 #define LOGF(x)    logf(x)
    268 #define EXPF(x)    expf(x)
    269 #define LDEXPF(x,y)  ldexpf(x,y)
    270 #define FREXPF(x,y)  frexpf(x,y)
    271 #else
    272 #define CEILF(x)   ((GLfloat) ceil(x))
    273 #define FLOORF(x)  ((GLfloat) floor(x))
    274 #define FABSF(x)   ((GLfloat) fabs(x))
    275 #define LOGF(x)    ((GLfloat) log(x))
    276 #define EXPF(x)    ((GLfloat) exp(x))
    277 #define LDEXPF(x,y)  ((GLfloat) ldexp(x,y))
    278 #define FREXPF(x,y)  ((GLfloat) frexp(x,y))
    279 #endif
    280 
    281 
    282 /***
    283  *** IROUND: return (as an integer) float rounded to nearest integer
    284  ***/
    285 #if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__)
    286 static INLINE int iround(float f)
    287 {
    288    int r;
    289    __asm__ ("fistpl %0" : "=m" (r) : "t" (f) : "st");
    290    return r;
    291 }
    292 #define IROUND(x)  iround(x)
    293 #elif defined(USE_X86_ASM) && defined(_MSC_VER)
    294 static INLINE int iround(float f)
    295 {
    296    int r;
    297    _asm {
    298 	 fld f
    299 	 fistp r
    300 	}
    301    return r;
    302 }
    303 #define IROUND(x)  iround(x)
    304 #elif defined(__WATCOMC__) && defined(__386__)
    305 long iround(float f);
    306 #pragma aux iround =                    \
    307 	"push   eax"                        \
    308 	"fistp  dword ptr [esp]"            \
    309 	"pop    eax"                        \
    310 	parm [8087]                         \
    311 	value [eax]                         \
    312 	modify exact [eax];
    313 #define IROUND(x)  iround(x)
    314 #else
    315 #define IROUND(f)  ((int) (((f) >= 0.0F) ? ((f) + 0.5F) : ((f) - 0.5F)))
    316 #endif
    317 
    318 #define IROUND64(f)  ((GLint64) (((f) >= 0.0F) ? ((f) + 0.5F) : ((f) - 0.5F)))
    319 
    320 /***
    321  *** IROUND_POS: return (as an integer) positive float rounded to nearest int
    322  ***/
    323 #ifdef DEBUG
    324 #define IROUND_POS(f) (assert((f) >= 0.0F), IROUND(f))
    325 #else
    326 #define IROUND_POS(f) (IROUND(f))
    327 #endif
    328 
    329 
    330 /***
    331  *** IFLOOR: return (as an integer) floor of float
    332  ***/
    333 #if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__)
    334 /*
    335  * IEEE floor for computers that round to nearest or even.
    336  * 'f' must be between -4194304 and 4194303.
    337  * This floor operation is done by "(iround(f + .5) + iround(f - .5)) >> 1",
    338  * but uses some IEEE specific tricks for better speed.
    339  * Contributed by Josh Vanderhoof
    340  */
    341 static INLINE int ifloor(float f)
    342 {
    343    int ai, bi;
    344    double af, bf;
    345    af = (3 << 22) + 0.5 + (double)f;
    346    bf = (3 << 22) + 0.5 - (double)f;
    347    /* GCC generates an extra fstp/fld without this. */
    348    __asm__ ("fstps %0" : "=m" (ai) : "t" (af) : "st");
    349    __asm__ ("fstps %0" : "=m" (bi) : "t" (bf) : "st");
    350    return (ai - bi) >> 1;
    351 }
    352 #define IFLOOR(x)  ifloor(x)
    353 #elif defined(USE_IEEE)
    354 static INLINE int ifloor(float f)
    355 {
    356    int ai, bi;
    357    double af, bf;
    358    fi_type u;
    359 
    360    af = (3 << 22) + 0.5 + (double)f;
    361    bf = (3 << 22) + 0.5 - (double)f;
    362    u.f = (float) af;  ai = u.i;
    363    u.f = (float) bf;  bi = u.i;
    364    return (ai - bi) >> 1;
    365 }
    366 #define IFLOOR(x)  ifloor(x)
    367 #else
    368 static INLINE int ifloor(float f)
    369 {
    370    int i = IROUND(f);
    371    return (i > f) ? i - 1 : i;
    372 }
    373 #define IFLOOR(x)  ifloor(x)
    374 #endif
    375 
    376 
    377 /***
    378  *** ICEIL: return (as an integer) ceiling of float
    379  ***/
    380 #if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__)
    381 /*
    382  * IEEE ceil for computers that round to nearest or even.
    383  * 'f' must be between -4194304 and 4194303.
    384  * This ceil operation is done by "(iround(f + .5) + iround(f - .5) + 1) >> 1",
    385  * but uses some IEEE specific tricks for better speed.
    386  * Contributed by Josh Vanderhoof
    387  */
    388 static INLINE int iceil(float f)
    389 {
    390    int ai, bi;
    391    double af, bf;
    392    af = (3 << 22) + 0.5 + (double)f;
    393    bf = (3 << 22) + 0.5 - (double)f;
    394    /* GCC generates an extra fstp/fld without this. */
    395    __asm__ ("fstps %0" : "=m" (ai) : "t" (af) : "st");
    396    __asm__ ("fstps %0" : "=m" (bi) : "t" (bf) : "st");
    397    return (ai - bi + 1) >> 1;
    398 }
    399 #define ICEIL(x)  iceil(x)
    400 #elif defined(USE_IEEE)
    401 static INLINE int iceil(float f)
    402 {
    403    int ai, bi;
    404    double af, bf;
    405    fi_type u;
    406    af = (3 << 22) + 0.5 + (double)f;
    407    bf = (3 << 22) + 0.5 - (double)f;
    408    u.f = (float) af; ai = u.i;
    409    u.f = (float) bf; bi = u.i;
    410    return (ai - bi + 1) >> 1;
    411 }
    412 #define ICEIL(x)  iceil(x)
    413 #else
    414 static INLINE int iceil(float f)
    415 {
    416    int i = IROUND(f);
    417    return (i < f) ? i + 1 : i;
    418 }
    419 #define ICEIL(x)  iceil(x)
    420 #endif
    421 
    422 
    423 /**
    424  * Is x a power of two?
    425  */
    426 static INLINE int
    427 _mesa_is_pow_two(int x)
    428 {
    429    return !(x & (x - 1));
    430 }
    431 
    432 /**
    433  * Round given integer to next higer power of two
    434  * If X is zero result is undefined.
    435  *
    436  * Source for the fallback implementation is
    437  * Sean Eron Anderson's webpage "Bit Twiddling Hacks"
    438  * http://graphics.stanford.edu/~seander/bithacks.html
    439  *
    440  * When using builtin function have to do some work
    441  * for case when passed values 1 to prevent hiting
    442  * undefined result from __builtin_clz. Undefined
    443  * results would be different depending on optimization
    444  * level used for build.
    445  */
    446 static INLINE int32_t
    447 _mesa_next_pow_two_32(uint32_t x)
    448 {
    449 #if defined(__GNUC__) && \
    450 	((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4)
    451 	uint32_t y = (x != 1);
    452 	return (1 + y) << ((__builtin_clz(x - y) ^ 31) );
    453 #else
    454 	x--;
    455 	x |= x >> 1;
    456 	x |= x >> 2;
    457 	x |= x >> 4;
    458 	x |= x >> 8;
    459 	x |= x >> 16;
    460 	x++;
    461 	return x;
    462 #endif
    463 }
    464 
    465 static INLINE int64_t
    466 _mesa_next_pow_two_64(uint64_t x)
    467 {
    468 #if defined(__GNUC__) && \
    469 	((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4)
    470 	uint64_t y = (x != 1);
    471 	if (sizeof(x) == sizeof(long))
    472 		return (1 + y) << ((__builtin_clzl(x - y) ^ 63));
    473 	else
    474 		return (1 + y) << ((__builtin_clzll(x - y) ^ 63));
    475 #else
    476 	x--;
    477 	x |= x >> 1;
    478 	x |= x >> 2;
    479 	x |= x >> 4;
    480 	x |= x >> 8;
    481 	x |= x >> 16;
    482 	x |= x >> 32;
    483 	x++;
    484 	return x;
    485 #endif
    486 }
    487 
    488 
    489 /**
    490  * Return 1 if this is a little endian machine, 0 if big endian.
    491  */
    492 static INLINE GLboolean
    493 _mesa_little_endian(void)
    494 {
    495    const GLuint ui = 1; /* intentionally not static */
    496    return *((const GLubyte *) &ui);
    497 }
    498 
    499 
    500 
    501 /**********************************************************************
    502  * Functions
    503  */
    504 
    505 extern void *
    506 _mesa_align_malloc( size_t bytes, unsigned long alignment );
    507 
    508 extern void *
    509 _mesa_align_calloc( size_t bytes, unsigned long alignment );
    510 
    511 extern void
    512 _mesa_align_free( void *ptr );
    513 
    514 extern void *
    515 _mesa_align_realloc(void *oldBuffer, size_t oldSize, size_t newSize,
    516                     unsigned long alignment);
    517 
    518 extern void *
    519 _mesa_exec_malloc( GLuint size );
    520 
    521 extern void
    522 _mesa_exec_free( void *addr );
    523 
    524 extern void *
    525 _mesa_realloc( void *oldBuffer, size_t oldSize, size_t newSize );
    526 
    527 extern void
    528 _mesa_memset16( unsigned short *dst, unsigned short val, size_t n );
    529 
    530 extern double
    531 _mesa_sqrtd(double x);
    532 
    533 extern float
    534 _mesa_sqrtf(float x);
    535 
    536 extern float
    537 _mesa_inv_sqrtf(float x);
    538 
    539 extern void
    540 _mesa_init_sqrt_table(void);
    541 
    542 extern int
    543 _mesa_ffs(int32_t i);
    544 
    545 extern int
    546 _mesa_ffsll(int64_t i);
    547 
    548 extern unsigned int
    549 _mesa_bitcount(unsigned int n);
    550 
    551 extern GLhalfARB
    552 _mesa_float_to_half(float f);
    553 
    554 extern float
    555 _mesa_half_to_float(GLhalfARB h);
    556 
    557 
    558 extern void *
    559 _mesa_bsearch( const void *key, const void *base, size_t nmemb, size_t size,
    560                int (*compar)(const void *, const void *) );
    561 
    562 extern char *
    563 _mesa_getenv( const char *var );
    564 
    565 extern char *
    566 _mesa_strdup( const char *s );
    567 
    568 extern float
    569 _mesa_strtof( const char *s, char **end );
    570 
    571 extern unsigned int
    572 _mesa_str_checksum(const char *str);
    573 
    574 extern int
    575 _mesa_snprintf( char *str, size_t size, const char *fmt, ... ) PRINTFLIKE(3, 4);
    576 
    577 struct gl_context;
    578 
    579 extern void
    580 _mesa_warning( struct gl_context *gc, const char *fmtString, ... ) PRINTFLIKE(2, 3);
    581 
    582 extern void
    583 _mesa_problem( const struct gl_context *ctx, const char *fmtString, ... ) PRINTFLIKE(2, 3);
    584 
    585 extern void
    586 _mesa_error( struct gl_context *ctx, GLenum error, const char *fmtString, ... ) PRINTFLIKE(3, 4);
    587 
    588 extern void
    589 _mesa_debug( const struct gl_context *ctx, const char *fmtString, ... ) PRINTFLIKE(2, 3);
    590 
    591 
    592 #if defined(_MSC_VER) && !defined(snprintf)
    593 #define snprintf _snprintf
    594 #endif
    595 
    596 
    597 #ifdef __cplusplus
    598 }
    599 #endif
    600 
    601 
    602 #endif /* IMPORTS_H */
    603