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