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