1b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul/* 2b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * Mesa 3-D graphics library 3f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul * Version: 7.5 4b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * 5e03dd83209929ca0925172c962bc41cab8268164Brian * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * 7b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a 8b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * copy of this software and associated documentation files (the "Software"), 9b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * to deal in the Software without restriction, including without limitation 10b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * and/or sell copies of the Software, and to permit persons to whom the 12b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * Software is furnished to do so, subject to the following conditions: 13b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * 14b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * The above copyright notice and this permission notice shall be included 15b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * in all copies or substantial portions of the Software. 16b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * 17b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul */ 24b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul 25b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul 26f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 27f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \file imports.h 28f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Standard C library function wrappers. 29f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 30f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * This file provides wrappers for all the standard C library functions 31f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * like malloc(), free(), printf(), getenv(), etc. 32f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 33f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 34f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 35b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul#ifndef IMPORTS_H 36b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul#define IMPORTS_H 37b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul 38b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul 39f2c023291a1f2887294d2aac504f8b82857ad092Brian Paul#include "compiler.h" 4027558a160a9fe91745728d7626995cd88f8fe339Brian Paul#include "glheader.h" 415ab088c7e201ea7e55459a24a945abcaa90d12c6nobled#include "errors.h" 4227558a160a9fe91745728d7626995cd88f8fe339Brian Paul 43c6dcb0fe89aed5ca3659c9bd0206bbd6ab352e44Brian Paul#ifdef __cplusplus 44c6dcb0fe89aed5ca3659c9bd0206bbd6ab352e44Brian Paulextern "C" { 45c6dcb0fe89aed5ca3659c9bd0206bbd6ab352e44Brian Paul#endif 46c6dcb0fe89aed5ca3659c9bd0206bbd6ab352e44Brian Paul 47c6dcb0fe89aed5ca3659c9bd0206bbd6ab352e44Brian Paul 486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/**********************************************************************/ 496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** Memory macros */ 506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@{*/ 5127558a160a9fe91745728d7626995cd88f8fe339Brian Paul 526dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** Allocate \p BYTES bytes */ 5332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg#define MALLOC(BYTES) malloc(BYTES) 546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** Allocate and zero \p BYTES bytes */ 5532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg#define CALLOC(BYTES) calloc(1, BYTES) 566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** Allocate a structure of type \p T */ 5732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg#define MALLOC_STRUCT(T) (struct T *) malloc(sizeof(struct T)) 586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** Allocate and zero a structure of type \p T */ 5932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg#define CALLOC_STRUCT(T) (struct T *) calloc(1, sizeof(struct T)) 606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** Free memory */ 6132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg#define FREE(PTR) free(PTR) 623c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul 636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/*@}*/ 646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 6657d882b6847128fe5f72575f61a2b2dace7ac46cBrian Paul/* 6757d882b6847128fe5f72575f61a2b2dace7ac46cBrian Paul * For GL_ARB_vertex_buffer_object we need to treat vertex array pointers 6857d882b6847128fe5f72575f61a2b2dace7ac46cBrian Paul * as offsets into buffer stores. Since the vertex array pointer and 6957d882b6847128fe5f72575f61a2b2dace7ac46cBrian Paul * buffer store pointer are both pointers and we need to add them, we use 7057d882b6847128fe5f72575f61a2b2dace7ac46cBrian Paul * this macro. 7157d882b6847128fe5f72575f61a2b2dace7ac46cBrian Paul * Both pointers/offsets are expressed in bytes. 7257d882b6847128fe5f72575f61a2b2dace7ac46cBrian Paul */ 736258b76c49f49a56a7c713914b798e80c6553b06Karl Schultz#define ADD_POINTERS(A, B) ( (GLubyte *) (A) + (uintptr_t) (B) ) 7457d882b6847128fe5f72575f61a2b2dace7ac46cBrian Paul 7557d882b6847128fe5f72575f61a2b2dace7ac46cBrian Paul 76936028f8b0db83595fda77ed4b9f30452cdf9c8bBrian Paul/** 77936028f8b0db83595fda77ed4b9f30452cdf9c8bBrian Paul * Sometimes we treat GLfloats as GLints. On x86 systems, moving a float 78936028f8b0db83595fda77ed4b9f30452cdf9c8bBrian Paul * as a int (thereby using integer registers instead of FP registers) is 79936028f8b0db83595fda77ed4b9f30452cdf9c8bBrian Paul * a performance win. Typically, this can be done with ordinary casts. 80936028f8b0db83595fda77ed4b9f30452cdf9c8bBrian Paul * But with gcc's -fstrict-aliasing flag (which defaults to on in gcc 3.0) 81936028f8b0db83595fda77ed4b9f30452cdf9c8bBrian Paul * these casts generate warnings. 82936028f8b0db83595fda77ed4b9f30452cdf9c8bBrian Paul * The following union typedef is used to solve that. 83936028f8b0db83595fda77ed4b9f30452cdf9c8bBrian Paul */ 84492b69f3be3e355064c67bc6f4a30d40e997ce9dMarek Olšáktypedef union { GLfloat f; GLint i; GLuint u; } fi_type; 85936028f8b0db83595fda77ed4b9f30452cdf9c8bBrian Paul 86936028f8b0db83595fda77ed4b9f30452cdf9c8bBrian Paul 8727558a160a9fe91745728d7626995cd88f8fe339Brian Paul 8827558a160a9fe91745728d7626995cd88f8fe339Brian Paul/********************************************************************** 8927558a160a9fe91745728d7626995cd88f8fe339Brian Paul * Math macros 9027558a160a9fe91745728d7626995cd88f8fe339Brian Paul */ 9127558a160a9fe91745728d7626995cd88f8fe339Brian Paul 9227558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define MAX_GLUSHORT 0xffff 9327558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define MAX_GLUINT 0xffffffff 9427558a160a9fe91745728d7626995cd88f8fe339Brian Paul 9527558a160a9fe91745728d7626995cd88f8fe339Brian Paul/* Degrees to radians conversion: */ 9627558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define DEG2RAD (M_PI/180.0) 9727558a160a9fe91745728d7626995cd88f8fe339Brian Paul 9827558a160a9fe91745728d7626995cd88f8fe339Brian Paul 9927558a160a9fe91745728d7626995cd88f8fe339Brian Paul/*** 10027558a160a9fe91745728d7626995cd88f8fe339Brian Paul *** SQRTF: single-precision square root 10127558a160a9fe91745728d7626995cd88f8fe339Brian Paul ***/ 102948b1c541f32b12e8264b1eeb79ccbb696661f54Matt Turner#define SQRTF(X) (float) sqrt((float) (X)) 10327558a160a9fe91745728d7626995cd88f8fe339Brian Paul 10427558a160a9fe91745728d7626995cd88f8fe339Brian Paul 10527558a160a9fe91745728d7626995cd88f8fe339Brian Paul/*** 106f9b1e5241facc8cf255c258082d5cb5b04783e93Brian Paul *** INV_SQRTF: single-precision inverse square root 107f9b1e5241facc8cf255c258082d5cb5b04783e93Brian Paul ***/ 108f58ba6ca9147137c7a2d31a1014235f7077b7752Matt Turner#define INV_SQRTF(X) (1.0F / SQRTF(X)) 109f9b1e5241facc8cf255c258082d5cb5b04783e93Brian Paul 110f9b1e5241facc8cf255c258082d5cb5b04783e93Brian Paul 1112f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick/** 1122f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick * \name Work-arounds for platforms that lack C99 math functions 1132f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick */ 1142f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick/*@{*/ 11544a6c13ac33fc00fc4d0cf7435ac23eaa8058300Aras Pranckevicius#if (!defined(_XOPEN_SOURCE) || (_XOPEN_SOURCE < 600)) && !defined(_ISOC99_SOURCE) \ 1168881b0fe43540c44c1b6ba95d51651fc6b612ffbJosé Fonseca && (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L)) \ 1178881b0fe43540c44c1b6ba95d51651fc6b612ffbJosé Fonseca && (!defined(_MSC_VER) || (_MSC_VER < 1400)) 1182f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define acosf(f) ((float) acos(f)) 1192f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define asinf(f) ((float) asin(f)) 12068f602afb1423eecf6d56bc91fc8ac7419969990José Fonseca#define atan2f(x,y) ((float) atan2(x,y)) 1212f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define atanf(f) ((float) atan(f)) 122cfdf60f236a525a0309146ce2da156bd3856c8b7Matt Turner#define ceilf(f) ((float) ceil(f)) 1232f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define cosf(f) ((float) cos(f)) 1242f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define coshf(f) ((float) cosh(f)) 1252f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define expf(f) ((float) exp(f)) 1262f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define exp2f(f) ((float) exp2(f)) 1272f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define floorf(f) ((float) floor(f)) 1282f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define logf(f) ((float) log(f)) 129504f92c739ffc916084ed821cb9f437276213057Chia-I Wu 130504f92c739ffc916084ed821cb9f437276213057Chia-I Wu#ifdef ANDROID 131504f92c739ffc916084ed821cb9f437276213057Chia-I Wu#define log2f(f) (logf(f) * (float) (1.0 / M_LN2)) 132504f92c739ffc916084ed821cb9f437276213057Chia-I Wu#else 1332f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define log2f(f) ((float) log2(f)) 134504f92c739ffc916084ed821cb9f437276213057Chia-I Wu#endif 135504f92c739ffc916084ed821cb9f437276213057Chia-I Wu 13668f602afb1423eecf6d56bc91fc8ac7419969990José Fonseca#define powf(x,y) ((float) pow(x,y)) 1372f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define sinf(f) ((float) sin(f)) 1382f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define sinhf(f) ((float) sinh(f)) 1392f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define sqrtf(f) ((float) sqrt(f)) 1402f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define tanf(f) ((float) tan(f)) 1412f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#define tanhf(f) ((float) tanh(f)) 142c1928c7f1065876345d00477eac5558f4cf85158Brian Paul#define acoshf(f) ((float) acosh(f)) 143c1928c7f1065876345d00477eac5558f4cf85158Brian Paul#define asinhf(f) ((float) asinh(f)) 144c1928c7f1065876345d00477eac5558f4cf85158Brian Paul#define atanhf(f) ((float) atanh(f)) 14544a6c13ac33fc00fc4d0cf7435ac23eaa8058300Aras Pranckevicius#endif 14644a6c13ac33fc00fc4d0cf7435ac23eaa8058300Aras Pranckevicius 14744a6c13ac33fc00fc4d0cf7435ac23eaa8058300Aras Pranckevicius#if defined(_MSC_VER) 1489520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline float truncf(float x) { return x < 0.0f ? ceilf(x) : floorf(x); } 1499520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline float exp2f(float x) { return powf(2.0f, x); } 1509520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline float log2f(float x) { return logf(x) * 1.442695041f; } 1519520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline float asinhf(float x) { return logf(x + sqrtf(x * x + 1.0f)); } 1529520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline float acoshf(float x) { return logf(x + sqrtf(x * x - 1.0f)); } 1539520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline float atanhf(float x) { return (logf(1.0f + x) - logf(1.0f - x)) / 2.0f; } 1549520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline int isblank(int ch) { return ch == ' ' || ch == '\t'; } 155653ddaab2636764b9e7999fa39b37edde7fe7c6dAras Pranckevicius#define strtoll(p, e, b) _strtoi64(p, e, b) 1562f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick#endif 1572f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick/*@}*/ 1582f8ee757ab324d599fcb8287789eb5f1a7890d74Ian Romanick 159f9b1e5241facc8cf255c258082d5cb5b04783e93Brian Paul/*** 16027558a160a9fe91745728d7626995cd88f8fe339Brian Paul *** LOG2: Log base 2 of float 16127558a160a9fe91745728d7626995cd88f8fe339Brian Paul ***/ 16227558a160a9fe91745728d7626995cd88f8fe339Brian Paul#ifdef USE_IEEE 16327558a160a9fe91745728d7626995cd88f8fe339Brian Paul#if 0 16427558a160a9fe91745728d7626995cd88f8fe339Brian Paul/* This is pretty fast, but not accurate enough (only 2 fractional bits). 16527558a160a9fe91745728d7626995cd88f8fe339Brian Paul * Based on code from http://www.stereopsis.com/log2.html 16627558a160a9fe91745728d7626995cd88f8fe339Brian Paul */ 1679520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline GLfloat LOG2(GLfloat x) 16827558a160a9fe91745728d7626995cd88f8fe339Brian Paul{ 16927558a160a9fe91745728d7626995cd88f8fe339Brian Paul const GLfloat y = x * x * x * x; 17027558a160a9fe91745728d7626995cd88f8fe339Brian Paul const GLuint ix = *((GLuint *) &y); 17127558a160a9fe91745728d7626995cd88f8fe339Brian Paul const GLuint exp = (ix >> 23) & 0xFF; 17227558a160a9fe91745728d7626995cd88f8fe339Brian Paul const GLint log2 = ((GLint) exp) - 127; 17327558a160a9fe91745728d7626995cd88f8fe339Brian Paul return (GLfloat) log2 * (1.0 / 4.0); /* 4, because of x^4 above */ 17427558a160a9fe91745728d7626995cd88f8fe339Brian Paul} 17527558a160a9fe91745728d7626995cd88f8fe339Brian Paul#endif 17627558a160a9fe91745728d7626995cd88f8fe339Brian Paul/* Pretty fast, and accurate. 17727558a160a9fe91745728d7626995cd88f8fe339Brian Paul * Based on code from http://www.flipcode.com/totd/ 17827558a160a9fe91745728d7626995cd88f8fe339Brian Paul */ 1799520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline GLfloat LOG2(GLfloat val) 18027558a160a9fe91745728d7626995cd88f8fe339Brian Paul{ 1819e3a7cd6dd02b12f880d9e9e220bfdadc09417e1Brian Paul fi_type num; 1829e3a7cd6dd02b12f880d9e9e220bfdadc09417e1Brian Paul GLint log_2; 1839e3a7cd6dd02b12f880d9e9e220bfdadc09417e1Brian Paul num.f = val; 1849e3a7cd6dd02b12f880d9e9e220bfdadc09417e1Brian Paul log_2 = ((num.i >> 23) & 255) - 128; 1859e3a7cd6dd02b12f880d9e9e220bfdadc09417e1Brian Paul num.i &= ~(255 << 23); 1869e3a7cd6dd02b12f880d9e9e220bfdadc09417e1Brian Paul num.i += 127 << 23; 1879e3a7cd6dd02b12f880d9e9e220bfdadc09417e1Brian Paul num.f = ((-1.0f/3) * num.f + 2) * num.f - 2.0f/3; 1889e3a7cd6dd02b12f880d9e9e220bfdadc09417e1Brian Paul return num.f + log_2; 18927558a160a9fe91745728d7626995cd88f8fe339Brian Paul} 19027558a160a9fe91745728d7626995cd88f8fe339Brian Paul#else 19127558a160a9fe91745728d7626995cd88f8fe339Brian Paul/* 19227558a160a9fe91745728d7626995cd88f8fe339Brian Paul * NOTE: log_base_2(x) = log(x) / log(2) 19327558a160a9fe91745728d7626995cd88f8fe339Brian Paul * NOTE: 1.442695 = 1/log(2). 19427558a160a9fe91745728d7626995cd88f8fe339Brian Paul */ 19527558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define LOG2(x) ((GLfloat) (log(x) * 1.442695F)) 19627558a160a9fe91745728d7626995cd88f8fe339Brian Paul#endif 19727558a160a9fe91745728d7626995cd88f8fe339Brian Paul 19827558a160a9fe91745728d7626995cd88f8fe339Brian Paul 19927558a160a9fe91745728d7626995cd88f8fe339Brian Paul/*** 20027558a160a9fe91745728d7626995cd88f8fe339Brian Paul *** IS_INF_OR_NAN: test if float is infinite or NaN 20127558a160a9fe91745728d7626995cd88f8fe339Brian Paul ***/ 20227558a160a9fe91745728d7626995cd88f8fe339Brian Paul#ifdef USE_IEEE 2039520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline int IS_INF_OR_NAN( float x ) 20427558a160a9fe91745728d7626995cd88f8fe339Brian Paul{ 20527558a160a9fe91745728d7626995cd88f8fe339Brian Paul fi_type tmp; 20627558a160a9fe91745728d7626995cd88f8fe339Brian Paul tmp.f = x; 20727558a160a9fe91745728d7626995cd88f8fe339Brian Paul return !(int)((unsigned int)((tmp.i & 0x7fffffff)-0x7f800000) >> 31); 20827558a160a9fe91745728d7626995cd88f8fe339Brian Paul} 20927558a160a9fe91745728d7626995cd88f8fe339Brian Paul#elif defined(isfinite) 21027558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define IS_INF_OR_NAN(x) (!isfinite(x)) 21127558a160a9fe91745728d7626995cd88f8fe339Brian Paul#elif defined(finite) 21227558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define IS_INF_OR_NAN(x) (!finite(x)) 2137873f856848ce5489f05c79581e2439aaff4bae7Alan Hourihane#elif defined(__VMS) 21427558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define IS_INF_OR_NAN(x) (!finite(x)) 21527558a160a9fe91745728d7626995cd88f8fe339Brian Paul#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L 21627558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define IS_INF_OR_NAN(x) (!isfinite(x)) 21727558a160a9fe91745728d7626995cd88f8fe339Brian Paul#else 21827558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define IS_INF_OR_NAN(x) (!finite(x)) 219b29b8ca47d322f1f93f5321be7529cf0c440c695Kendall Bennett#endif 22027558a160a9fe91745728d7626995cd88f8fe339Brian Paul 22127558a160a9fe91745728d7626995cd88f8fe339Brian Paul 22227558a160a9fe91745728d7626995cd88f8fe339Brian Paul/*** 22327558a160a9fe91745728d7626995cd88f8fe339Brian Paul *** IS_NEGATIVE: test if float is negative 22427558a160a9fe91745728d7626995cd88f8fe339Brian Paul ***/ 22527558a160a9fe91745728d7626995cd88f8fe339Brian Paul#if defined(USE_IEEE) 2269520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline int GET_FLOAT_BITS( float x ) 22794dd520210293750ab6f3094a6a8c67e23f61ef2Daniel Borca{ 22894dd520210293750ab6f3094a6a8c67e23f61ef2Daniel Borca fi_type fi; 22994dd520210293750ab6f3094a6a8c67e23f61ef2Daniel Borca fi.f = x; 23094dd520210293750ab6f3094a6a8c67e23f61ef2Daniel Borca return fi.i; 23194dd520210293750ab6f3094a6a8c67e23f61ef2Daniel Borca} 23294dd520210293750ab6f3094a6a8c67e23f61ef2Daniel Borca#define IS_NEGATIVE(x) (GET_FLOAT_BITS(x) < 0) 23327558a160a9fe91745728d7626995cd88f8fe339Brian Paul#else 23427558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define IS_NEGATIVE(x) (x < 0.0F) 23527558a160a9fe91745728d7626995cd88f8fe339Brian Paul#endif 23627558a160a9fe91745728d7626995cd88f8fe339Brian Paul 23727558a160a9fe91745728d7626995cd88f8fe339Brian Paul 23827558a160a9fe91745728d7626995cd88f8fe339Brian Paul/*** 23927558a160a9fe91745728d7626995cd88f8fe339Brian Paul *** DIFFERENT_SIGNS: test if two floats have opposite signs 24027558a160a9fe91745728d7626995cd88f8fe339Brian Paul ***/ 24127558a160a9fe91745728d7626995cd88f8fe339Brian Paul#if defined(USE_IEEE) 24227558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define DIFFERENT_SIGNS(x,y) ((GET_FLOAT_BITS(x) ^ GET_FLOAT_BITS(y)) & (1<<31)) 24327558a160a9fe91745728d7626995cd88f8fe339Brian Paul#else 24427558a160a9fe91745728d7626995cd88f8fe339Brian Paul/* Could just use (x*y<0) except for the flatshading requirements. 24527558a160a9fe91745728d7626995cd88f8fe339Brian Paul * Maybe there's a better way? 24627558a160a9fe91745728d7626995cd88f8fe339Brian Paul */ 24727558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define DIFFERENT_SIGNS(x,y) ((x) * (y) <= 0.0F && (x) - (y) != 0.0F) 24827558a160a9fe91745728d7626995cd88f8fe339Brian Paul#endif 24927558a160a9fe91745728d7626995cd88f8fe339Brian Paul 25027558a160a9fe91745728d7626995cd88f8fe339Brian Paul 25127558a160a9fe91745728d7626995cd88f8fe339Brian Paul/*** 25227558a160a9fe91745728d7626995cd88f8fe339Brian Paul *** CEILF: ceiling of float 25327558a160a9fe91745728d7626995cd88f8fe339Brian Paul *** FLOORF: floor of float 25427558a160a9fe91745728d7626995cd88f8fe339Brian Paul *** FABSF: absolute value of float 255b3aefd1cfb6aacd1695c52911dd39da50d893eceBrian Paul *** LOGF: the natural logarithm (base e) of the value 256b3aefd1cfb6aacd1695c52911dd39da50d893eceBrian Paul *** EXPF: raise e to the value 2576fe7a0dc01887e39f028d8d400b98d199744c18fBrian Paul *** LDEXPF: multiply value by an integral power of two 2586fe7a0dc01887e39f028d8d400b98d199744c18fBrian Paul *** FREXPF: extract mantissa and exponent from value 25927558a160a9fe91745728d7626995cd88f8fe339Brian Paul ***/ 260b766643e5c3c9ed174c59b54e520f94e3420e39aGeorge Sapountzis#if defined(__gnu_linux__) 261bb5ebf17248d1d389525d4fcd9e238fb13b695bfBrian Paul/* C99 functions */ 26227558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define CEILF(x) ceilf(x) 26327558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define FLOORF(x) floorf(x) 26427558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define FABSF(x) fabsf(x) 265b3aefd1cfb6aacd1695c52911dd39da50d893eceBrian Paul#define LOGF(x) logf(x) 266b3aefd1cfb6aacd1695c52911dd39da50d893eceBrian Paul#define EXPF(x) expf(x) 2673f7cb794ea154ddcc7b1a8d792eae658d077db81Keith Whitwell#define LDEXPF(x,y) ldexpf(x,y) 2686fe7a0dc01887e39f028d8d400b98d199744c18fBrian Paul#define FREXPF(x,y) frexpf(x,y) 269bb5ebf17248d1d389525d4fcd9e238fb13b695bfBrian Paul#else 270bb5ebf17248d1d389525d4fcd9e238fb13b695bfBrian Paul#define CEILF(x) ((GLfloat) ceil(x)) 271bb5ebf17248d1d389525d4fcd9e238fb13b695bfBrian Paul#define FLOORF(x) ((GLfloat) floor(x)) 272bb5ebf17248d1d389525d4fcd9e238fb13b695bfBrian Paul#define FABSF(x) ((GLfloat) fabs(x)) 273b3aefd1cfb6aacd1695c52911dd39da50d893eceBrian Paul#define LOGF(x) ((GLfloat) log(x)) 274b3aefd1cfb6aacd1695c52911dd39da50d893eceBrian Paul#define EXPF(x) ((GLfloat) exp(x)) 2753f7cb794ea154ddcc7b1a8d792eae658d077db81Keith Whitwell#define LDEXPF(x,y) ((GLfloat) ldexp(x,y)) 2766fe7a0dc01887e39f028d8d400b98d199744c18fBrian Paul#define FREXPF(x,y) ((GLfloat) frexp(x,y)) 27727558a160a9fe91745728d7626995cd88f8fe339Brian Paul#endif 27827558a160a9fe91745728d7626995cd88f8fe339Brian Paul 27927558a160a9fe91745728d7626995cd88f8fe339Brian Paul 280699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul/** 281699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul * Convert float to int by rounding to nearest integer, away from zero. 282699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul */ 283699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paulstatic inline int IROUND(float f) 284699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul{ 285699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul return (int) ((f >= 0.0F) ? (f + 0.5F) : (f - 0.5F)); 286699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul} 287699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul 288699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul 289699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul/** 290699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul * Convert float to int64 by rounding to nearest integer. 291699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul */ 292699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paulstatic inline GLint64 IROUND64(float f) 293699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul{ 294699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul return (GLint64) ((f >= 0.0F) ? (f + 0.5F) : (f - 0.5F)); 295699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul} 296699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul 297699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul 298699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul/** 299699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul * Convert positive float to int by rounding to nearest integer. 300699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul */ 301699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paulstatic inline int IROUND_POS(float f) 302699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul{ 303699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul assert(f >= 0.0F); 304699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul return (int) (f + 0.5F); 305699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul} 306699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul 307699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul 308699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul/** 309699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul * Convert float to int using a fast method. The rounding mode may vary. 310699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul * XXX We could use an x86-64/SSE2 version here. 311699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul */ 312016fc30839f0fb67bb37d4a7353a7e38749deab5Ian Romanick#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__) 313699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paulstatic inline int F_TO_I(float f) 31427558a160a9fe91745728d7626995cd88f8fe339Brian Paul{ 31527558a160a9fe91745728d7626995cd88f8fe339Brian Paul int r; 31627558a160a9fe91745728d7626995cd88f8fe339Brian Paul __asm__ ("fistpl %0" : "=m" (r) : "t" (f) : "st"); 31727558a160a9fe91745728d7626995cd88f8fe339Brian Paul return r; 31827558a160a9fe91745728d7626995cd88f8fe339Brian Paul} 319f8e50dd796a72c396bb22d414feba75c426c5e7eJosé Fonseca#elif defined(USE_X86_ASM) && defined(_MSC_VER) 320699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paulstatic inline int F_TO_I(float f) 32127558a160a9fe91745728d7626995cd88f8fe339Brian Paul{ 32227558a160a9fe91745728d7626995cd88f8fe339Brian Paul int r; 32327558a160a9fe91745728d7626995cd88f8fe339Brian Paul _asm { 32427558a160a9fe91745728d7626995cd88f8fe339Brian Paul fld f 32527558a160a9fe91745728d7626995cd88f8fe339Brian Paul fistp r 32627558a160a9fe91745728d7626995cd88f8fe339Brian Paul } 32727558a160a9fe91745728d7626995cd88f8fe339Brian Paul return r; 32827558a160a9fe91745728d7626995cd88f8fe339Brian Paul} 3297d8eb0604ab8b59bea5977741729e719f7327363Kendall Bennett#elif defined(__WATCOMC__) && defined(__386__) 330699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paullong F_TO_I(float f); 3317d8eb0604ab8b59bea5977741729e719f7327363Kendall Bennett#pragma aux iround = \ 33227558a160a9fe91745728d7626995cd88f8fe339Brian Paul "push eax" \ 33327558a160a9fe91745728d7626995cd88f8fe339Brian Paul "fistp dword ptr [esp]" \ 33427558a160a9fe91745728d7626995cd88f8fe339Brian Paul "pop eax" \ 33527558a160a9fe91745728d7626995cd88f8fe339Brian Paul parm [8087] \ 33627558a160a9fe91745728d7626995cd88f8fe339Brian Paul value [eax] \ 33727558a160a9fe91745728d7626995cd88f8fe339Brian Paul modify exact [eax]; 33827558a160a9fe91745728d7626995cd88f8fe339Brian Paul#else 339699c1894eea6a42a747ebbc3974bf0abf3d1dd88Brian Paul#define F_TO_I(f) IROUND(f) 34027558a160a9fe91745728d7626995cd88f8fe339Brian Paul#endif 34127558a160a9fe91745728d7626995cd88f8fe339Brian Paul 34227558a160a9fe91745728d7626995cd88f8fe339Brian Paul 34327558a160a9fe91745728d7626995cd88f8fe339Brian Paul/*** 34427558a160a9fe91745728d7626995cd88f8fe339Brian Paul *** IFLOOR: return (as an integer) floor of float 34527558a160a9fe91745728d7626995cd88f8fe339Brian Paul ***/ 34627558a160a9fe91745728d7626995cd88f8fe339Brian Paul#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__) 34727558a160a9fe91745728d7626995cd88f8fe339Brian Paul/* 34827558a160a9fe91745728d7626995cd88f8fe339Brian Paul * IEEE floor for computers that round to nearest or even. 34927558a160a9fe91745728d7626995cd88f8fe339Brian Paul * 'f' must be between -4194304 and 4194303. 35027558a160a9fe91745728d7626995cd88f8fe339Brian Paul * This floor operation is done by "(iround(f + .5) + iround(f - .5)) >> 1", 35127558a160a9fe91745728d7626995cd88f8fe339Brian Paul * but uses some IEEE specific tricks for better speed. 35227558a160a9fe91745728d7626995cd88f8fe339Brian Paul * Contributed by Josh Vanderhoof 35327558a160a9fe91745728d7626995cd88f8fe339Brian Paul */ 3549520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline int ifloor(float f) 35527558a160a9fe91745728d7626995cd88f8fe339Brian Paul{ 35627558a160a9fe91745728d7626995cd88f8fe339Brian Paul int ai, bi; 35727558a160a9fe91745728d7626995cd88f8fe339Brian Paul double af, bf; 35827558a160a9fe91745728d7626995cd88f8fe339Brian Paul af = (3 << 22) + 0.5 + (double)f; 35927558a160a9fe91745728d7626995cd88f8fe339Brian Paul bf = (3 << 22) + 0.5 - (double)f; 36027558a160a9fe91745728d7626995cd88f8fe339Brian Paul /* GCC generates an extra fstp/fld without this. */ 36127558a160a9fe91745728d7626995cd88f8fe339Brian Paul __asm__ ("fstps %0" : "=m" (ai) : "t" (af) : "st"); 36227558a160a9fe91745728d7626995cd88f8fe339Brian Paul __asm__ ("fstps %0" : "=m" (bi) : "t" (bf) : "st"); 36327558a160a9fe91745728d7626995cd88f8fe339Brian Paul return (ai - bi) >> 1; 36427558a160a9fe91745728d7626995cd88f8fe339Brian Paul} 36527558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define IFLOOR(x) ifloor(x) 36627558a160a9fe91745728d7626995cd88f8fe339Brian Paul#elif defined(USE_IEEE) 3679520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline int ifloor(float f) 36827558a160a9fe91745728d7626995cd88f8fe339Brian Paul{ 36927558a160a9fe91745728d7626995cd88f8fe339Brian Paul int ai, bi; 37027558a160a9fe91745728d7626995cd88f8fe339Brian Paul double af, bf; 37127558a160a9fe91745728d7626995cd88f8fe339Brian Paul fi_type u; 37227558a160a9fe91745728d7626995cd88f8fe339Brian Paul 37327558a160a9fe91745728d7626995cd88f8fe339Brian Paul af = (3 << 22) + 0.5 + (double)f; 37427558a160a9fe91745728d7626995cd88f8fe339Brian Paul bf = (3 << 22) + 0.5 - (double)f; 37512f8fb60844be2e074b878b8d6f55ef724b65ac3Brian Paul u.f = (float) af; ai = u.i; 37612f8fb60844be2e074b878b8d6f55ef724b65ac3Brian Paul u.f = (float) bf; bi = u.i; 37727558a160a9fe91745728d7626995cd88f8fe339Brian Paul return (ai - bi) >> 1; 37827558a160a9fe91745728d7626995cd88f8fe339Brian Paul} 37927558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define IFLOOR(x) ifloor(x) 38027558a160a9fe91745728d7626995cd88f8fe339Brian Paul#else 3819520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline int ifloor(float f) 38227558a160a9fe91745728d7626995cd88f8fe339Brian Paul{ 38327558a160a9fe91745728d7626995cd88f8fe339Brian Paul int i = IROUND(f); 38427558a160a9fe91745728d7626995cd88f8fe339Brian Paul return (i > f) ? i - 1 : i; 38527558a160a9fe91745728d7626995cd88f8fe339Brian Paul} 38627558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define IFLOOR(x) ifloor(x) 38727558a160a9fe91745728d7626995cd88f8fe339Brian Paul#endif 38827558a160a9fe91745728d7626995cd88f8fe339Brian Paul 38927558a160a9fe91745728d7626995cd88f8fe339Brian Paul 39027558a160a9fe91745728d7626995cd88f8fe339Brian Paul/*** 39127558a160a9fe91745728d7626995cd88f8fe339Brian Paul *** ICEIL: return (as an integer) ceiling of float 39227558a160a9fe91745728d7626995cd88f8fe339Brian Paul ***/ 39327558a160a9fe91745728d7626995cd88f8fe339Brian Paul#if defined(USE_X86_ASM) && defined(__GNUC__) && defined(__i386__) 39427558a160a9fe91745728d7626995cd88f8fe339Brian Paul/* 39527558a160a9fe91745728d7626995cd88f8fe339Brian Paul * IEEE ceil for computers that round to nearest or even. 39627558a160a9fe91745728d7626995cd88f8fe339Brian Paul * 'f' must be between -4194304 and 4194303. 39727558a160a9fe91745728d7626995cd88f8fe339Brian Paul * This ceil operation is done by "(iround(f + .5) + iround(f - .5) + 1) >> 1", 39827558a160a9fe91745728d7626995cd88f8fe339Brian Paul * but uses some IEEE specific tricks for better speed. 39927558a160a9fe91745728d7626995cd88f8fe339Brian Paul * Contributed by Josh Vanderhoof 40027558a160a9fe91745728d7626995cd88f8fe339Brian Paul */ 4019520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline int iceil(float f) 40227558a160a9fe91745728d7626995cd88f8fe339Brian Paul{ 40327558a160a9fe91745728d7626995cd88f8fe339Brian Paul int ai, bi; 40427558a160a9fe91745728d7626995cd88f8fe339Brian Paul double af, bf; 40527558a160a9fe91745728d7626995cd88f8fe339Brian Paul af = (3 << 22) + 0.5 + (double)f; 40627558a160a9fe91745728d7626995cd88f8fe339Brian Paul bf = (3 << 22) + 0.5 - (double)f; 40727558a160a9fe91745728d7626995cd88f8fe339Brian Paul /* GCC generates an extra fstp/fld without this. */ 40827558a160a9fe91745728d7626995cd88f8fe339Brian Paul __asm__ ("fstps %0" : "=m" (ai) : "t" (af) : "st"); 40927558a160a9fe91745728d7626995cd88f8fe339Brian Paul __asm__ ("fstps %0" : "=m" (bi) : "t" (bf) : "st"); 41027558a160a9fe91745728d7626995cd88f8fe339Brian Paul return (ai - bi + 1) >> 1; 41127558a160a9fe91745728d7626995cd88f8fe339Brian Paul} 41227558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define ICEIL(x) iceil(x) 41327558a160a9fe91745728d7626995cd88f8fe339Brian Paul#elif defined(USE_IEEE) 4149520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline int iceil(float f) 41527558a160a9fe91745728d7626995cd88f8fe339Brian Paul{ 41627558a160a9fe91745728d7626995cd88f8fe339Brian Paul int ai, bi; 41727558a160a9fe91745728d7626995cd88f8fe339Brian Paul double af, bf; 41827558a160a9fe91745728d7626995cd88f8fe339Brian Paul fi_type u; 41927558a160a9fe91745728d7626995cd88f8fe339Brian Paul af = (3 << 22) + 0.5 + (double)f; 42027558a160a9fe91745728d7626995cd88f8fe339Brian Paul bf = (3 << 22) + 0.5 - (double)f; 421a3793214e941607b31faac33e73a23387ed2163eBrian Paul u.f = (float) af; ai = u.i; 422a3793214e941607b31faac33e73a23387ed2163eBrian Paul u.f = (float) bf; bi = u.i; 42327558a160a9fe91745728d7626995cd88f8fe339Brian Paul return (ai - bi + 1) >> 1; 42427558a160a9fe91745728d7626995cd88f8fe339Brian Paul} 42527558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define ICEIL(x) iceil(x) 42627558a160a9fe91745728d7626995cd88f8fe339Brian Paul#else 4279520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline int iceil(float f) 42827558a160a9fe91745728d7626995cd88f8fe339Brian Paul{ 42927558a160a9fe91745728d7626995cd88f8fe339Brian Paul int i = IROUND(f); 43027558a160a9fe91745728d7626995cd88f8fe339Brian Paul return (i < f) ? i + 1 : i; 43127558a160a9fe91745728d7626995cd88f8fe339Brian Paul} 43227558a160a9fe91745728d7626995cd88f8fe339Brian Paul#define ICEIL(x) iceil(x) 43327558a160a9fe91745728d7626995cd88f8fe339Brian Paul#endif 43427558a160a9fe91745728d7626995cd88f8fe339Brian Paul 43527558a160a9fe91745728d7626995cd88f8fe339Brian Paul 436be1b8e5d6c6692010a3ec117035d9b218929e2b3Brian/** 437be1b8e5d6c6692010a3ec117035d9b218929e2b3Brian * Is x a power of two? 438be1b8e5d6c6692010a3ec117035d9b218929e2b3Brian */ 4399520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline int 440be1b8e5d6c6692010a3ec117035d9b218929e2b3Brian_mesa_is_pow_two(int x) 441be1b8e5d6c6692010a3ec117035d9b218929e2b3Brian{ 442be1b8e5d6c6692010a3ec117035d9b218929e2b3Brian return !(x & (x - 1)); 443be1b8e5d6c6692010a3ec117035d9b218929e2b3Brian} 444be1b8e5d6c6692010a3ec117035d9b218929e2b3Brian 445d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen/** 446d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen * Round given integer to next higer power of two 447d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen * If X is zero result is undefined. 448d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen * 449d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen * Source for the fallback implementation is 450d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen * Sean Eron Anderson's webpage "Bit Twiddling Hacks" 451d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen * http://graphics.stanford.edu/~seander/bithacks.html 4526e958832afe9544973528bed78dd3a340b8686f3Pauli Nieminen * 4536e958832afe9544973528bed78dd3a340b8686f3Pauli Nieminen * When using builtin function have to do some work 4546e958832afe9544973528bed78dd3a340b8686f3Pauli Nieminen * for case when passed values 1 to prevent hiting 4556e958832afe9544973528bed78dd3a340b8686f3Pauli Nieminen * undefined result from __builtin_clz. Undefined 4566e958832afe9544973528bed78dd3a340b8686f3Pauli Nieminen * results would be different depending on optimization 4576e958832afe9544973528bed78dd3a340b8686f3Pauli Nieminen * level used for build. 458d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen */ 4599520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline int32_t 460d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen_mesa_next_pow_two_32(uint32_t x) 461d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen{ 462cf7d08b4434325220488d4c9e871e230bafd7b7cMatthieu Herrb#if defined(__GNUC__) && \ 4637986e4c5a9db24f840af31458bcc254fa52dbb60Alan Coopersmith ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) /* gcc 3.4 or later */ 4646e958832afe9544973528bed78dd3a340b8686f3Pauli Nieminen uint32_t y = (x != 1); 4656e958832afe9544973528bed78dd3a340b8686f3Pauli Nieminen return (1 + y) << ((__builtin_clz(x - y) ^ 31) ); 466d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen#else 467d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x--; 468d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x |= x >> 1; 469d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x |= x >> 2; 470d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x |= x >> 4; 471d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x |= x >> 8; 472d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x |= x >> 16; 473d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x++; 474d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen return x; 475d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen#endif 476d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen} 477d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen 4789520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline int64_t 479d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen_mesa_next_pow_two_64(uint64_t x) 480d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen{ 481cf7d08b4434325220488d4c9e871e230bafd7b7cMatthieu Herrb#if defined(__GNUC__) && \ 4827986e4c5a9db24f840af31458bcc254fa52dbb60Alan Coopersmith ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) /* gcc 3.4 or later */ 4836e958832afe9544973528bed78dd3a340b8686f3Pauli Nieminen uint64_t y = (x != 1); 484d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen if (sizeof(x) == sizeof(long)) 4856e958832afe9544973528bed78dd3a340b8686f3Pauli Nieminen return (1 + y) << ((__builtin_clzl(x - y) ^ 63)); 486d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen else 4876e958832afe9544973528bed78dd3a340b8686f3Pauli Nieminen return (1 + y) << ((__builtin_clzll(x - y) ^ 63)); 488d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen#else 489d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x--; 490d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x |= x >> 1; 491d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x |= x >> 2; 492d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x |= x >> 4; 493d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x |= x >> 8; 494d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x |= x >> 16; 495d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x |= x >> 32; 496d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen x++; 497d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen return x; 498d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen#endif 499d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen} 500d41740e969ce1ef084fa7a51208d43ac6883adf8Pauli Nieminen 501be1b8e5d6c6692010a3ec117035d9b218929e2b3Brian 502b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger/* 503b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger * Returns the floor form of binary logarithm for a 32-bit integer. 504b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger */ 5059520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline GLuint 506b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger_mesa_logbase2(GLuint n) 507b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger{ 508b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger#if defined(__GNUC__) && \ 5097986e4c5a9db24f840af31458bcc254fa52dbb60Alan Coopersmith ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) /* gcc 3.4 or later */ 510b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger return (31 - __builtin_clz(n | 1)); 511b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger#else 512b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger GLuint pos = 0; 513b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger if (n >= 1<<16) { n >>= 16; pos += 16; } 514b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger if (n >= 1<< 8) { n >>= 8; pos += 8; } 515b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger if (n >= 1<< 4) { n >>= 4; pos += 4; } 516b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger if (n >= 1<< 2) { n >>= 2; pos += 2; } 517b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger if (n >= 1<< 1) { pos += 1; } 518b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger return pos; 519b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger#endif 520b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger} 521b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger 522b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger 52332e0efbdbeb06170befc63af685d67711acc6c81Brian Paul/** 52432e0efbdbeb06170befc63af685d67711acc6c81Brian Paul * Return 1 if this is a little endian machine, 0 if big endian. 52532e0efbdbeb06170befc63af685d67711acc6c81Brian Paul */ 5269520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline GLboolean 52732e0efbdbeb06170befc63af685d67711acc6c81Brian Paul_mesa_little_endian(void) 52832e0efbdbeb06170befc63af685d67711acc6c81Brian Paul{ 52932e0efbdbeb06170befc63af685d67711acc6c81Brian Paul const GLuint ui = 1; /* intentionally not static */ 53032e0efbdbeb06170befc63af685d67711acc6c81Brian Paul return *((const GLubyte *) &ui); 53132e0efbdbeb06170befc63af685d67711acc6c81Brian Paul} 53232e0efbdbeb06170befc63af685d67711acc6c81Brian Paul 53332e0efbdbeb06170befc63af685d67711acc6c81Brian Paul 53427558a160a9fe91745728d7626995cd88f8fe339Brian Paul 53527558a160a9fe91745728d7626995cd88f8fe339Brian Paul/********************************************************************** 53627558a160a9fe91745728d7626995cd88f8fe339Brian Paul * Functions 53727558a160a9fe91745728d7626995cd88f8fe339Brian Paul */ 53827558a160a9fe91745728d7626995cd88f8fe339Brian Paul 5393c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paulextern void * 5403c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul_mesa_align_malloc( size_t bytes, unsigned long alignment ); 5413c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul 5423c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paulextern void * 5433c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul_mesa_align_calloc( size_t bytes, unsigned long alignment ); 5444e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul 5454e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paulextern void 5463c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul_mesa_align_free( void *ptr ); 5473c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul 5483c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paulextern void * 5491798d9a8a4a779746f5e665357b6bc10a2894d0bBrian Paul_mesa_align_realloc(void *oldBuffer, size_t oldSize, size_t newSize, 5501798d9a8a4a779746f5e665357b6bc10a2894d0bBrian Paul unsigned long alignment); 5511798d9a8a4a779746f5e665357b6bc10a2894d0bBrian Paul 5521798d9a8a4a779746f5e665357b6bc10a2894d0bBrian Paulextern void * 553d99c37bca6c53535e748804b15ab5b614aa0da48Brian Paul_mesa_exec_malloc( GLuint size ); 554d99c37bca6c53535e748804b15ab5b614aa0da48Brian Paul 555d99c37bca6c53535e748804b15ab5b614aa0da48Brian Paulextern void 556d99c37bca6c53535e748804b15ab5b614aa0da48Brian Paul_mesa_exec_free( void *addr ); 557d99c37bca6c53535e748804b15ab5b614aa0da48Brian Paul 558d99c37bca6c53535e748804b15ab5b614aa0da48Brian Paulextern void * 5590cebd5822a39ad3b3d7621f8e59efab329bfb5b9Brian Paul_mesa_realloc( void *oldBuffer, size_t oldSize, size_t newSize ); 5600cebd5822a39ad3b3d7621f8e59efab329bfb5b9Brian Paul 561eab036a6eaebd532f88c49bd26550c6225f96005Brian Paul 562eab036a6eaebd532f88c49bd26550c6225f96005Brian Paul#ifndef FFS_DEFINED 563eab036a6eaebd532f88c49bd26550c6225f96005Brian Paul#define FFS_DEFINED 1 56441260a9bf63aa61f88f188053f1ed4dba3a852d2Chris Wilson#ifdef __GNUC__ 565c6cedd43feccb9341c597329e28bb432c491939fJosé Fonseca 5660ddb759991c1b39baf04cbe366328630bceeaca7Vinson Lee#if defined(__MINGW32__) || defined(__CYGWIN__) || defined(ANDROID) || defined(__APPLE__) 567c6cedd43feccb9341c597329e28bb432c491939fJosé Fonseca#define ffs __builtin_ffs 568c6cedd43feccb9341c597329e28bb432c491939fJosé Fonseca#define ffsll __builtin_ffsll 569c6cedd43feccb9341c597329e28bb432c491939fJosé Fonseca#endif 570c6cedd43feccb9341c597329e28bb432c491939fJosé Fonseca 5719a548c27aa704236cc1d8a5d4ebf68cea9c5c99cBrian Paul#else 5729a548c27aa704236cc1d8a5d4ebf68cea9c5c99cBrian Paul 5739a548c27aa704236cc1d8a5d4ebf68cea9c5c99cBrian Paulextern int ffs(int i); 5749a548c27aa704236cc1d8a5d4ebf68cea9c5c99cBrian Paulextern int ffsll(long long int i); 5759a548c27aa704236cc1d8a5d4ebf68cea9c5c99cBrian Paul 5769a548c27aa704236cc1d8a5d4ebf68cea9c5c99cBrian Paul#endif /*__ GNUC__ */ 577eab036a6eaebd532f88c49bd26550c6225f96005Brian Paul#endif /* FFS_DEFINED */ 57841260a9bf63aa61f88f188053f1ed4dba3a852d2Chris Wilson 5799a548c27aa704236cc1d8a5d4ebf68cea9c5c99cBrian Paul 5809a548c27aa704236cc1d8a5d4ebf68cea9c5c99cBrian Paul#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) /* gcc 3.4 or later */ 58141260a9bf63aa61f88f188053f1ed4dba3a852d2Chris Wilson#define _mesa_bitcount(i) __builtin_popcount(i) 582c163072197b56e76b656cc472bbe6df650cf11baPaul Berry#define _mesa_bitcount_64(i) __builtin_popcountll(i) 58341260a9bf63aa61f88f188053f1ed4dba3a852d2Chris Wilson#else 58441260a9bf63aa61f88f188053f1ed4dba3a852d2Chris Wilsonextern unsigned int 58541260a9bf63aa61f88f188053f1ed4dba3a852d2Chris Wilson_mesa_bitcount(unsigned int n); 586c163072197b56e76b656cc472bbe6df650cf11baPaul Berryextern unsigned int 587c163072197b56e76b656cc472bbe6df650cf11baPaul Berry_mesa_bitcount_64(uint64_t n); 58841260a9bf63aa61f88f188053f1ed4dba3a852d2Chris Wilson#endif 58941260a9bf63aa61f88f188053f1ed4dba3a852d2Chris Wilson 59066e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke/** 59166e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke * Find the last (most significant) bit set in a word. 59266e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke * 59366e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke * Essentially ffs() in the reverse direction. 59466e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke */ 59566e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunkestatic inline unsigned int 59666e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke_mesa_fls(unsigned int n) 59766e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke{ 59866e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) 59966e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke return n == 0 ? 0 : 32 - __builtin_clz(n); 60066e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke#else 60166e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke unsigned int v = 1; 60266e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke 60366e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke if (n == 0) 60466e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke return 0; 60566e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke 60666e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke while (n >>= 1) 60766e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke v++; 60866e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke 60966e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke return v; 61066e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke#endif 61166e8f863d34fc8b8f7602c45bb3230fe663d4eb0Kenneth Graunke} 61227558a160a9fe91745728d7626995cd88f8fe339Brian Paul 613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulextern GLhalfARB 6147eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul_mesa_float_to_half(float f); 6157eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul 6167eb3e9b9648938500c6172a88fb2998e6264467fBrian Paulextern float 617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul_mesa_half_to_float(GLhalfARB h); 6187eb3e9b9648938500c6172a88fb2998e6264467fBrian Paul 619367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul 620b3aefd1cfb6aacd1695c52911dd39da50d893eceBrian Paulextern void * 621b3aefd1cfb6aacd1695c52911dd39da50d893eceBrian Paul_mesa_bsearch( const void *key, const void *base, size_t nmemb, size_t size, 622b3aefd1cfb6aacd1695c52911dd39da50d893eceBrian Paul int (*compar)(const void *, const void *) ); 623b3aefd1cfb6aacd1695c52911dd39da50d893eceBrian Paul 6243c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paulextern char * 6253c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul_mesa_getenv( const char *var ); 6263c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul 6274097ea012a14656f468f3e41480ef4cbec926038Brian Paulextern char * 6284097ea012a14656f468f3e41480ef4cbec926038Brian Paul_mesa_strdup( const char *s ); 6294097ea012a14656f468f3e41480ef4cbec926038Brian Paul 630346298c7658f2ec8b105e5e53101637af232724fMarcin Baczyńskiextern float 631346298c7658f2ec8b105e5e53101637af232724fMarcin Baczyński_mesa_strtof( const char *s, char **end ); 6324097ea012a14656f468f3e41480ef4cbec926038Brian Paul 6339f8110adcc5a6f47b5db0915bb9265925d520856Brian Paulextern unsigned int 6349f8110adcc5a6f47b5db0915bb9265925d520856Brian Paul_mesa_str_checksum(const char *str); 6359f8110adcc5a6f47b5db0915bb9265925d520856Brian Paul 63678a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paulextern int 6373cddc15d9dcf44a0998dd5f29ae6f6d17370584eEric Anholt_mesa_snprintf( char *str, size_t size, const char *fmt, ... ) PRINTFLIKE(3, 4); 63878a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul 6395ab088c7e201ea7e55459a24a945abcaa90d12c6nobledextern int 6405ab088c7e201ea7e55459a24a945abcaa90d12c6nobled_mesa_vsnprintf(char *str, size_t size, const char *fmt, va_list arg); 641f7657d037eb262ee6437d7714f709026f2ecea85Brian Paul 6426dad5a4e8d5c4ea90bb9342e329defb9c8eb2092Ian Romanick 6436dad5a4e8d5c4ea90bb9342e329defb9c8eb2092Ian Romanick#if defined(_MSC_VER) && !defined(snprintf) 6446dad5a4e8d5c4ea90bb9342e329defb9c8eb2092Ian Romanick#define snprintf _snprintf 6456dad5a4e8d5c4ea90bb9342e329defb9c8eb2092Ian Romanick#endif 6466dad5a4e8d5c4ea90bb9342e329defb9c8eb2092Ian Romanick 6476dad5a4e8d5c4ea90bb9342e329defb9c8eb2092Ian Romanick 648a59ce9041df800936905f64287b82bc2d42d1c8bBrian Paul#ifdef __cplusplus 649a59ce9041df800936905f64287b82bc2d42d1c8bBrian Paul} 650a59ce9041df800936905f64287b82bc2d42d1c8bBrian Paul#endif 6513c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul 652a59ce9041df800936905f64287b82bc2d42d1c8bBrian Paul 653a59ce9041df800936905f64287b82bc2d42d1c8bBrian Paul#endif /* IMPORTS_H */ 654