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