diff options
author | Keun-young Park <keunyoung@google.com> | 2013-03-28 23:08:17 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-03-28 23:08:17 -0700 |
commit | 111d920bb588669006bdd8699e786d6305f14c36 (patch) | |
tree | 2d3a6d44730592e8a09b2983cba1512b074b23bd /opengl/libs | |
parent | 4194b3898df867a5c4377de49ddc72ad3e51122b (diff) | |
parent | d3b2c029eba356e7bed3754d60ade556c216348e (diff) | |
download | frameworks_native-111d920bb588669006bdd8699e786d6305f14c36.zip frameworks_native-111d920bb588669006bdd8699e786d6305f14c36.tar.gz frameworks_native-111d920bb588669006bdd8699e786d6305f14c36.tar.bz2 |
am d3b2c029: Merge "[MIPS] Add MIPS architecture support to opengl framework"
* commit 'd3b2c029eba356e7bed3754d60ade556c216348e':
[MIPS] Add MIPS architecture support to opengl framework
Diffstat (limited to 'opengl/libs')
-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 |
4 files changed, 116 insertions, 1 deletions
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 |