diff options
Diffstat (limited to 'opengl')
-rw-r--r-- | opengl/libagl/Android.mk | 7 | ||||
-rw-r--r-- | opengl/libagl/arch-mips/fixed_asm.S | 61 | ||||
-rw-r--r-- | opengl/libagl/fp.cpp | 2 | ||||
-rw-r--r-- | opengl/libagl/matrix.h | 44 | ||||
-rw-r--r-- | opengl/libs/EGL/getProcAddress.cpp | 37 | ||||
-rw-r--r-- | opengl/libs/GLES2/gl2.cpp | 40 | ||||
-rw-r--r-- | opengl/libs/GLES_CM/gl.cpp | 38 | ||||
-rw-r--r-- | opengl/libs/hooks.h | 2 |
8 files changed, 229 insertions, 2 deletions
diff --git a/opengl/libagl/Android.mk b/opengl/libagl/Android.mk index 1b3d6ed..9b8d3fe 100644 --- a/opengl/libagl/Android.mk +++ b/opengl/libagl/Android.mk @@ -34,6 +34,13 @@ ifeq ($(TARGET_ARCH),arm) LOCAL_CFLAGS += -fstrict-aliasing endif +ifeq ($(TARGET_ARCH),mips) + LOCAL_SRC_FILES += arch-$(TARGET_ARCH)/fixed_asm.S + LOCAL_CFLAGS += -fstrict-aliasing + # The graphics code can generate division by zero + LOCAL_CFLAGS += -mno-check-zero-division +endif + # we need to access the private Bionic header <bionic_tls.h> LOCAL_C_INCLUDES += bionic/libc/private diff --git a/opengl/libagl/arch-mips/fixed_asm.S b/opengl/libagl/arch-mips/fixed_asm.S new file mode 100644 index 0000000..e1a53bc --- /dev/null +++ b/opengl/libagl/arch-mips/fixed_asm.S @@ -0,0 +1,61 @@ +/* libs/opengles/arch-mips/fixed_asm.S +** +** Copyright 2012, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + + + .text + .align + +/* + * this version rounds-to-nearest and saturates numbers + * outside the range (but not NaNs). + */ + + .global gglFloatToFixed + .ent gglFloatToFixed + .type gglFloatToFixed, @function +gglFloatToFixed: +#if !defined(__mips_soft_float) + mfc1 $a0,$f12 +#endif + srl $t0,$a0,31 /* t0 <- sign bit */ + srl $t1,$a0,23 + andi $t1,$t1,0xff /* get the e */ + li $t2,0x8e + subu $t1,$t2,$t1 /* t1=127+15-e */ + blez $t1,0f /* t1<=0? */ + sll $t2,$a0,8 /* mantissa<<8 */ + lui $t3,0x8000 + or $t2,$t2,$t3 /* add the missing 1 */ + subu $t1,$t1,1 + srl $v0,$t2,$t1 + sltiu $t3,$t1,32 /* t3=1 if t1<32, else t3=0. t1>=32 means the float value is too small. */ + andi $t4,$v0,0x1 + srl $v0,$v0,1 /* scale to 16.16 */ + addu $v0,$v0,$t4 /* round-to-nearest */ + subu $t2,$zero,$v0 + movn $v0,$t2,$t0 /* if negative? */ + or $t1,$a0,$zero /* a0=0? */ + movz $v0,$zero,$t1 + movz $v0,$zero,$t3 /* t3=0 then res=0 */ + jr $ra +0: + lui $t1,0x8000 + and $v0,$a0,$t1 /* keep only the sign bit */ + li $t1,0x7fffffff + movz $v0,$t1,$t0 /* positive, maximum value */ + jr $ra + .end gglFloatToFixed diff --git a/opengl/libagl/fp.cpp b/opengl/libagl/fp.cpp index ae5f1fe..aea4449 100644 --- a/opengl/libagl/fp.cpp +++ b/opengl/libagl/fp.cpp @@ -19,7 +19,7 @@ // ---------------------------------------------------------------------------- -#if !defined(__arm__) +#if !defined(__arm__) && !defined(__mips__) GGLfixed gglFloatToFixed(float v) { return GGLfixed(floorf(v * 65536.0f + 0.5f)); } diff --git a/opengl/libagl/matrix.h b/opengl/libagl/matrix.h index c9a38a9..5bd717a 100644 --- a/opengl/libagl/matrix.h +++ b/opengl/libagl/matrix.h @@ -74,6 +74,30 @@ GLfixed vsquare3(GLfixed a, GLfixed b, GLfixed c) ); return r; +#elif defined(__mips__) + + GLfixed res; + int32_t t1,t2,t3; + asm( + "mult %[a], %[a] \r\n" + "li %[res],0x8000 \r\n" + "madd %[b],%[b] \r\n" + "move %[t3],$zero \r\n" + "madd %[c],%[c] \r\n" + "mflo %[t1]\r\n" + "mfhi %[t2]\r\n" + "addu %[t1],%[res],%[t1]\r\n" /*add 0x8000*/ + "sltu %[t3],%[t1],%[res]\r\n" + "addu %[t2],%[t2],%[t3]\r\n" + "srl %[res],%[t1],16\r\n" + "sll %[t2],%[t2],16\r\n" + "or %[res],%[res],%[t2]\r\n" + : [res]"=&r"(res),[t1]"=&r"(t1),[t2]"=&r"(t2),[t3]"=&r"(t3) + : [a] "r" (a),[b] "r" (b),[c] "r" (c) + : "%hi","%lo" + ); + return res; + #else return (( int64_t(a)*a + @@ -136,6 +160,26 @@ static inline GLfixed mla3a( GLfixed a0, GLfixed b0, ); return r; +#elif defined(__mips__) + + GLfixed res; + int32_t t1,t2; + asm( + "mult %[a0],%[b0] \r\n" + "madd %[a1],%[b1] \r\n" + "madd %[a2],%[b2] \r\n" + "mflo %[t2]\r\n" + "mfhi %[t1]\r\n" + "srl %[t2],%[t2],16\r\n" + "sll %[t1],%[t1],16\r\n" + "or %[t2],%[t2],%[t1]\r\n" + "addu %[res],%[t2],%[c]" + : [res]"=&r"(res),[t1]"=&r"(t1),[t2]"=&r"(t2) + : [a0] "r" (a0),[b0] "r" (b0),[a1] "r" (a1),[b1] "r" (b1),[a2] "r" (a2),[b2] "r" (b2),[c] "r" (c) + : "%hi","%lo" + ); + return res; + #else return (( int64_t(a0)*b0 + diff --git a/opengl/libs/EGL/getProcAddress.cpp b/opengl/libs/EGL/getProcAddress.cpp index f453176..d23da7a 100644 --- a/opengl/libs/EGL/getProcAddress.cpp +++ b/opengl/libs/EGL/getProcAddress.cpp @@ -37,6 +37,8 @@ namespace android { #if USE_FAST_TLS_KEY + #if defined(__arm__) + #define GET_TLS(reg) "mrc p15, 0, " #reg ", c13, c0, 3 \n" #define API_ENTRY(_api) __attribute__((naked)) _api @@ -57,6 +59,41 @@ namespace android { : \ ); + #elif defined(__mips__) + + #define API_ENTRY(_api) __attribute__((noinline)) _api + + #define CALL_GL_EXTENSION_API(_api, ...) \ + register unsigned int t0 asm("t0"); \ + register unsigned int fn asm("t1"); \ + register unsigned int tls asm("v1"); \ + asm volatile( \ + ".set push\n\t" \ + ".set noreorder\n\t" \ + ".set mips32r2\n\t" \ + "rdhwr %[tls], $29\n\t" \ + "lw %[t0], %[OPENGL_API](%[tls])\n\t" \ + "beqz %[t0], 1f\n\t" \ + " move %[fn], $ra\n\t" \ + "lw %[fn], %[API](%[t0])\n\t" \ + "movz %[fn], $ra, %[fn]\n\t" \ + "1:\n\t" \ + "j %[fn]\n\t" \ + " nop\n\t" \ + ".set pop\n\t" \ + : [fn] "=c"(fn), \ + [tls] "=&r"(tls), \ + [t0] "=&r"(t0) \ + : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*4), \ + [API] "I"(__builtin_offsetof(gl_hooks_t, \ + ext.extensions[_api])) \ + : \ + ); + + #else + #error Unsupported architecture + #endif + #define GL_EXTENSION_NAME(_n) __glExtFwd##_n #define GL_EXTENSION(_n) \ diff --git a/opengl/libs/GLES2/gl2.cpp b/opengl/libs/GLES2/gl2.cpp index fca42ec..fb890fc 100644 --- a/opengl/libs/GLES2/gl2.cpp +++ b/opengl/libs/GLES2/gl2.cpp @@ -41,6 +41,8 @@ using namespace android; #if USE_FAST_TLS_KEY + #if defined(__arm__) + #define GET_TLS(reg) "mrc p15, 0, " #reg ", c13, c0, 3 \n" #define API_ENTRY(_api) __attribute__((naked)) _api @@ -59,6 +61,44 @@ using namespace android; : \ ); + #elif defined(__mips__) + + #define API_ENTRY(_api) __attribute__((noinline)) _api + + #define CALL_GL_API(_api, ...) \ + register unsigned int t0 asm("t0"); \ + register unsigned int fn asm("t1"); \ + register unsigned int tls asm("v1"); \ + register unsigned int v0 asm("v0"); \ + asm volatile( \ + ".set push\n\t" \ + ".set noreorder\n\t" \ + ".set mips32r2\n\t" \ + "rdhwr %[tls], $29\n\t" \ + "lw %[t0], %[OPENGL_API](%[tls])\n\t" \ + "beqz %[t0], 1f\n\t" \ + " move %[fn],$ra\n\t" \ + "lw %[fn], %[API](%[t0])\n\t" \ + "movz %[fn], $ra, %[fn]\n\t" \ + "1:\n\t" \ + "j %[fn]\n\t" \ + " move %[v0], $0\n\t" \ + ".set pop\n\t" \ + : [fn] "=c"(fn), \ + [tls] "=&r"(tls), \ + [t0] "=&r"(t0), \ + [v0] "=&r"(v0) \ + : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*4), \ + [API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \ + : \ + ); + + #else + + #error Unsupported architecture + + #endif + #define CALL_GL_API_RETURN(_api, ...) \ CALL_GL_API(_api, __VA_ARGS__) \ return 0; // placate gcc's warnings. never reached. diff --git a/opengl/libs/GLES_CM/gl.cpp b/opengl/libs/GLES_CM/gl.cpp index 48fd278..bd08942 100644 --- a/opengl/libs/GLES_CM/gl.cpp +++ b/opengl/libs/GLES_CM/gl.cpp @@ -97,6 +97,8 @@ GL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type, #if USE_FAST_TLS_KEY && !CHECK_FOR_GL_ERRORS + #if defined(__arm__) + #define GET_TLS(reg) "mrc p15, 0, " #reg ", c13, c0, 3 \n" #define API_ENTRY(_api) __attribute__((naked)) _api @@ -115,6 +117,42 @@ GL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type, : \ ); + #elif defined(__mips__) + + #define API_ENTRY(_api) __attribute__((noinline)) _api + + #define CALL_GL_API(_api, ...) \ + register unsigned int t0 asm("t0"); \ + register unsigned int fn asm("t1"); \ + register unsigned int tls asm("v1"); \ + register unsigned int v0 asm("v0"); \ + asm volatile( \ + ".set push\n\t" \ + ".set noreorder\n\t" \ + ".set mips32r2\n\t" \ + "rdhwr %[tls], $29\n\t" \ + "lw %[t0], %[OPENGL_API](%[tls])\n\t" \ + "beqz %[t0], 1f\n\t" \ + " move %[fn], $ra\n\t" \ + "lw %[fn], %[API](%[t0])\n\t" \ + "movz %[fn], $ra, %[fn]\n\t" \ + "1:\n\t" \ + "j %[fn]\n\t" \ + " move %[v0], $0\n\t" \ + ".set pop\n\t" \ + : [fn] "=c"(fn), \ + [tls] "=&r"(tls), \ + [t0] "=&r"(t0), \ + [v0] "=&r"(v0) \ + : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*4), \ + [API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \ + : \ + ); + + #else + #error Unsupported architecture + #endif + #define CALL_GL_API_RETURN(_api, ...) \ CALL_GL_API(_api, __VA_ARGS__) \ return 0; // placate gcc's warnings. never reached. diff --git a/opengl/libs/hooks.h b/opengl/libs/hooks.h index 8b1b389..e0ceb60 100644 --- a/opengl/libs/hooks.h +++ b/opengl/libs/hooks.h @@ -30,7 +30,7 @@ #include <GLES2/gl2.h> #include <GLES2/gl2ext.h> -#if !defined(__arm__) +#if !defined(__arm__) && !defined(__mips__) #define USE_SLOW_BINDING 1 #else #define USE_SLOW_BINDING 0 |