1bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu/************************************************************************** 2bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * 3bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 4bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * All Rights Reserved. 5bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * 6bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu **************************************************************************/ 7bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 8bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 9bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu/** 10bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * Code to implement GL_OES_query_matrix. See the spec at: 11bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * http://www.khronos.org/registry/gles/extensions/OES/OES_query_matrix.txt 12bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 13bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 14bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 15bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#include <stdlib.h> 16bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#include <math.h> 17bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#include "GLES/gl.h" 18bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#include "GLES/glext.h" 19bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 20bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 21bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu/** 22bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * This is from the GL_OES_query_matrix extension specification: 23bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * 24bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * GLbitfield glQueryMatrixxOES( GLfixed mantissa[16], 25bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * GLint exponent[16] ) 26bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * mantissa[16] contains the contents of the current matrix in GLfixed 27bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * format. exponent[16] contains the unbiased exponents applied to the 28bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * matrix components, so that the internal representation of component i 29bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * is close to mantissa[i] * 2^exponent[i]. The function returns a status 30bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * word which is zero if all the components are valid. If 31bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * status & (1<<i) != 0, the component i is invalid (e.g., NaN, Inf). 32bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * The implementations are not required to keep track of overflows. In 33bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * that case, the invalid bits are never set. 34bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 35bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 36bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#define INT_TO_FIXED(x) ((GLfixed) ((x) << 16)) 37bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#define FLOAT_TO_FIXED(x) ((GLfixed) ((x) * 65536.0)) 38bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 3906928ba3c343eee7098442fe387eaacd4933c401Vinson Lee#if defined(_MSC_VER) 40bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu/* Oddly, the fpclassify() function doesn't exist in such a form 4106928ba3c343eee7098442fe387eaacd4933c401Vinson Lee * on MSVC. This is an implementation using slightly different 42bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * lower-level Windows functions. 43bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 44bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#include <float.h> 45bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 46bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wuenum {FP_NAN, FP_INFINITE, FP_ZERO, FP_SUBNORMAL, FP_NORMAL} 47bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wufpclassify(double x) 48bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu{ 49bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu switch(_fpclass(x)) { 50bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case _FPCLASS_SNAN: /* signaling NaN */ 51bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case _FPCLASS_QNAN: /* quiet NaN */ 52bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu return FP_NAN; 53bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case _FPCLASS_NINF: /* negative infinity */ 54bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case _FPCLASS_PINF: /* positive infinity */ 55bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu return FP_INFINITE; 56bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case _FPCLASS_NN: /* negative normal */ 57bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case _FPCLASS_PN: /* positive normal */ 58bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu return FP_NORMAL; 59bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case _FPCLASS_ND: /* negative denormalized */ 60bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case _FPCLASS_PD: /* positive denormalized */ 61bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu return FP_SUBNORMAL; 62bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case _FPCLASS_NZ: /* negative zero */ 63bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case _FPCLASS_PZ: /* positive zero */ 64bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu return FP_ZERO; 65bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu default: 66bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* Should never get here; but if we do, this will guarantee 67bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * that the pattern is not treated like a number. 68bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 69bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu return FP_NAN; 70bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu } 71bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu} 72791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul 73beb5e1c807bbe90adc7490a043de623d7a3e6e4eAlan Coopersmith#elif defined(__APPLE__) || defined(__CYGWIN__) || defined(__FreeBSD__) || \ 742f0b01826dbae60fed60c0d744d42a1a4cde4a84Chia-I Wu defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || \ 75e1c7f3af0cb6769ef20a954459cfb87b9f99b4d6Vinson Lee (defined(__sun) && defined(__C99FEATURES__)) || defined(__MINGW32__) || \ 76a3752fa63bf8b16524ef2840866445247044e07dAlexander von Gluck (defined(__sun) && defined(__GNUC__)) || defined(ANDROID) || defined(__HAIKU__) 778191e5ae65e9dc05727235a5dd5d96f00702b852Vinson Lee 788191e5ae65e9dc05727235a5dd5d96f00702b852Vinson Lee/* fpclassify is available. */ 798191e5ae65e9dc05727235a5dd5d96f00702b852Vinson Lee 80791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul#elif !defined(_XOPEN_SOURCE) || _XOPEN_SOURCE < 600 81791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul 82791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paulenum {FP_NAN, FP_INFINITE, FP_ZERO, FP_SUBNORMAL, FP_NORMAL} 83791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paulfpclassify(double x) 84791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul{ 85791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul /* XXX do something better someday */ 86791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul return FP_NORMAL; 87791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul} 88791c3395ab2da8a20306bd1195e17040ea31d95bBrian Paul 89bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu#endif 90bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 91bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wuextern GLbitfield GL_APIENTRY _es_QueryMatrixxOES(GLfixed mantissa[16], GLint exponent[16]); 92bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 93bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu/* The Mesa functions we'll need */ 94bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wuextern void GL_APIENTRY _mesa_GetIntegerv(GLenum pname, GLint *params); 95bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wuextern void GL_APIENTRY _mesa_GetFloatv(GLenum pname, GLfloat *params); 96bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 97bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I WuGLbitfield GL_APIENTRY _es_QueryMatrixxOES(GLfixed mantissa[16], GLint exponent[16]) 98bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu{ 99bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu GLfloat matrix[16]; 100bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu GLint tmp; 101bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu GLenum currentMode = GL_FALSE; 102bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu GLenum desiredMatrix = GL_FALSE; 103bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* The bitfield returns 1 for each component that is invalid (i.e. 104bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * NaN or Inf). In case of error, everything is invalid. 105bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 106bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu GLbitfield rv; 107bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu register unsigned int i; 108bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu unsigned int bit; 109bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 110bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* This data structure defines the mapping between the current matrix 111bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * mode and the desired matrix identifier. 112bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 113bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu static struct { 114bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu GLenum currentMode; 115bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu GLenum desiredMatrix; 116bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu } modes[] = { 117bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu {GL_MODELVIEW, GL_MODELVIEW_MATRIX}, 118bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu {GL_PROJECTION, GL_PROJECTION_MATRIX}, 119bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu {GL_TEXTURE, GL_TEXTURE_MATRIX}, 120bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu }; 121bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 122bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* Call Mesa to get the current matrix in floating-point form. First, 123bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * we have to figure out what the current matrix mode is. 124bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 125bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu _mesa_GetIntegerv(GL_MATRIX_MODE, &tmp); 126bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu currentMode = (GLenum) tmp; 127bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 128bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* The mode is either GL_FALSE, if for some reason we failed to query 129bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * the mode, or a given mode from the above table. Search for the 130bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * returned mode to get the desired matrix; if we don't find it, 131bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * we can return immediately, as _mesa_GetInteger() will have 132bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * logged the necessary error already. 133bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 134bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu for (i = 0; i < sizeof(modes)/sizeof(modes[0]); i++) { 135bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu if (modes[i].currentMode == currentMode) { 136bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu desiredMatrix = modes[i].desiredMatrix; 137bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu break; 138bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu } 139bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu } 140bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu if (desiredMatrix == GL_FALSE) { 141bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* Early error means all values are invalid. */ 142bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu return 0xffff; 143bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu } 144bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 145bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* Now pull the matrix itself. */ 146bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu _mesa_GetFloatv(desiredMatrix, matrix); 147bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 148bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu rv = 0; 149bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu for (i = 0, bit = 1; i < 16; i++, bit<<=1) { 150bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu float normalizedFraction; 151bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu int exp; 152bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 153bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu switch (fpclassify(matrix[i])) { 154bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* A "subnormal" or denormalized number is too small to be 155bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * represented in normal format; but despite that it's a 156bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * valid floating point number. FP_ZERO and FP_NORMAL 157bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * are both valid as well. We should be fine treating 158bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * these three cases as legitimate floating-point numbers. 159bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 160bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case FP_SUBNORMAL: 161bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case FP_NORMAL: 162bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case FP_ZERO: 163bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu normalizedFraction = (GLfloat)frexp(matrix[i], &exp); 164bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu mantissa[i] = FLOAT_TO_FIXED(normalizedFraction); 165bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu exponent[i] = (GLint) exp; 166bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu break; 167bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 168bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* If the entry is not-a-number or an infinity, then the 169bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * matrix component is invalid. The invalid flag for 170bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * the component is already set; might as well set the 171bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * other return values to known values. We'll set 172bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * distinct values so that a savvy end user could determine 173bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * whether the matrix component was a NaN or an infinity, 174bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * but this is more useful for debugging than anything else 175bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * since the standard doesn't specify any such magic 176bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * values to return. 177bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 178bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case FP_NAN: 179bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu mantissa[i] = INT_TO_FIXED(0); 180bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu exponent[i] = (GLint) 0; 181bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu rv |= bit; 182bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu break; 183bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 184bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu case FP_INFINITE: 185bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* Return +/- 1 based on whether it's a positive or 186bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * negative infinity. 187bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 188bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu if (matrix[i] > 0) { 189bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu mantissa[i] = INT_TO_FIXED(1); 190bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu } 191bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu else { 192bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu mantissa[i] = -INT_TO_FIXED(1); 193bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu } 194bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu exponent[i] = (GLint) 0; 195bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu rv |= bit; 196bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu break; 197bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 198bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* We should never get here; but here's a catching case 199bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu * in case fpclassify() is returnings something unexpected. 200bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu */ 201bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu default: 202bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu mantissa[i] = INT_TO_FIXED(2); 203bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu exponent[i] = (GLint) 0; 204bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu rv |= bit; 205bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu break; 206bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu } 207bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 208bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu } /* for each component */ 209bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu 210bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu /* All done */ 211bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu return rv; 212bfa66bd6f941920cf32ce79fb103c3755b4dd8fbChia-I Wu} 213