1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* libs/opengles/fp.h 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2006, The Android Open Source Project 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** you may not use this file except in compliance with the License. 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** You may obtain a copy of the License at 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** See the License for the specific language governing permissions and 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License. 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/ 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_OPENGLES_FP_H 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_OPENGLES_FP_H 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stddef.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <math.h> 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <private/pixelflinger/ggl_context.h> 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DEBUG_USE_FLOATS 0 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectextern "C" GLfixed gglFloatToFixed(float f) __attribute__((const)); 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace gl { 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfloat fixedToFloat(GLfixed) CONST; 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void sincosf(GLfloat angle, GLfloat* s, GLfloat* c); 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float sinef(GLfloat x) CONST; 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float cosinef(GLfloat x) CONST; 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline bool cmpf(GLfloat a, GLfloat b) CONST; 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline bool isZerof(GLfloat) CONST; 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline bool isOnef(GLfloat) CONST; 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline int isZeroOrNegativef(GLfloat) CONST; 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline int exponent(GLfloat) CONST; 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline int32_t mantissa(GLfloat) CONST; 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline GLfloat clampToZerof(GLfloat) CONST; 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline GLfloat reciprocalf(GLfloat) CONST; 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline GLfloat rsqrtf(GLfloat) CONST; 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline GLfloat sqrf(GLfloat) CONST; 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline GLfloat addExpf(GLfloat v, int e) CONST; 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline GLfloat mul2f(GLfloat v) CONST; 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline GLfloat div2f(GLfloat v) CONST; 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline GLfloat absf(GLfloat v) CONST; 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * float fastexpf(float) : a fast approximation of expf(x) 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * give somewhat accurate results for -88 <= x <= 88 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * exp(x) = 2^(x/ln(2)) 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * we use the properties of float encoding 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * to get a fast 2^ and linear interpolation 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline float fastexpf(float y) __attribute__((const)); 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline float fastexpf(float y) 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project union { 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float r; 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t i; 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } u; 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 127*ln(2) = 88 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (y < -88.0f) { 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project u.r = 0.0f; 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (y > 88.0f) { 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project u.r = INFINITY; 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const float kOneOverLogTwo = (1L<<23) / M_LN2; 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int32_t kExponentBias = 127L<<23; 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int32_t e = int32_t(y*kOneOverLogTwo); 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project u.i = e + kExponentBias; 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return u.r; 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool cmpf(GLfloat a, GLfloat b) { 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if DEBUG_USE_FLOATS 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return a == b; 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project union { 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float f; 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t i; 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } ua, ub; 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ua.f = a; 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ub.f = b; 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ua.i == ub.i; 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool isZerof(GLfloat v) { 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if DEBUG_USE_FLOATS 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return v == 0; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project union { 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float f; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t i; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f = v; 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (i<<1) == 0; 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool isOnef(GLfloat v) { 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return cmpf(v, 1.0f); 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint isZeroOrNegativef(GLfloat v) { 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if DEBUG_USE_FLOATS 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return v <= 0; 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project union { 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float f; 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t i; 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f = v; 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return isZerof(v) | (i>>31); 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint exponent(GLfloat v) { 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project union { 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float f; 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t i; 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f = v; 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ((i << 1) >> 24) - 127; 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint32_t mantissa(GLfloat v) { 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project union { 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float f; 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t i; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f = v; 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!(i&0x7F800000)) return 0; 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int s = i >> 31; 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project i |= (1L<<23); 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project i &= ~0xFF000000; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return s ? -i : i; 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfloat clampToZerof(GLfloat v) { 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if DEBUG_USE_FLOATS 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return v<0 ? 0 : (v>1 ? 1 : v); 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project union { 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float f; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t i; 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f = v; 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project i &= ~(i>>31); 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return f; 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfloat reciprocalf(GLfloat v) { 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // XXX: do better 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1.0f / v; 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfloat rsqrtf(GLfloat v) { 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // XXX: do better 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return 1.0f / sqrtf(v); 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfloat sqrf(GLfloat v) { 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // XXX: do better 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return v*v; 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfloat addExpf(GLfloat v, int e) { 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project union { 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float f; 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t i; 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f = v; 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (i<<1) { // XXX: deal with over/underflow 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project i += int32_t(e)<<23; 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return f; 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfloat mul2f(GLfloat v) { 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if DEBUG_USE_FLOATS 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return v*2; 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return addExpf(v, 1); 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfloat div2f(GLfloat v) { 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if DEBUG_USE_FLOATS 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return v*0.5f; 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return addExpf(v, -1); 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLfloat absf(GLfloat v) { 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if DEBUG_USE_FLOATS 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return v<0 ? -v : v; 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#else 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project union { 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float f; 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int32_t i; 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project f = v; 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project i &= ~0x80000000; 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return f; 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace gl 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_OPENGLES_FP_H 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 244