[MIPS] Add MIPS architecture support to opengl framework

Change-Id: Id7704d35bed14d96a85dc1f29db0566cd03872b5
This commit is contained in:
Duane Sand 2013-03-27 10:58:06 -07:00
parent cd91024ca1
commit 46b4253b76
4 changed files with 116 additions and 1 deletions

View File

@ -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) \

View File

@ -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.

View File

@ -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.

View File

@ -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