Merge "[MIPS] Further opengl support for mips64 and mipsr6"

This commit is contained in:
Jesse Hall 2015-01-22 16:55:04 +00:00 committed by Gerrit Code Review
commit f551e1c1a5
3 changed files with 115 additions and 14 deletions

View File

@ -120,6 +120,38 @@ namespace android {
: "cc" \ : "cc" \
); );
#elif defined(__mips64)
#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" \
"rdhwr %[tls], $29\n\t" \
"ld %[t0], %[OPENGL_API](%[tls])\n\t" \
"beqz %[t0], 1f\n\t" \
" move %[fn], $ra\n\t" \
"ld %[t0], %[API](%[t0])\n\t" \
"beqz %[t0], 1f\n\t" \
" nop\n\t" \
"move %[fn], %[t0]\n\t" \
"1:\n\t" \
"jalr $0, %[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])) \
: \
);
#elif defined(__mips__) #elif defined(__mips__)
#define API_ENTRY(_api) __attribute__((noinline)) _api #define API_ENTRY(_api) __attribute__((noinline)) _api
@ -131,15 +163,16 @@ namespace android {
asm volatile( \ asm volatile( \
".set push\n\t" \ ".set push\n\t" \
".set noreorder\n\t" \ ".set noreorder\n\t" \
".set mips32r2\n\t" \
"rdhwr %[tls], $29\n\t" \ "rdhwr %[tls], $29\n\t" \
"lw %[t0], %[OPENGL_API](%[tls])\n\t" \ "lw %[t0], %[OPENGL_API](%[tls])\n\t" \
"beqz %[t0], 1f\n\t" \ "beqz %[t0], 1f\n\t" \
" move %[fn], $ra\n\t" \ " move %[fn], $ra\n\t" \
"lw %[fn], %[API](%[t0])\n\t" \ "lw %[t0], %[API](%[t0])\n\t" \
"movz %[fn], $ra, %[fn]\n\t" \ "beqz %[t0], 1f\n\t" \
" nop\n\t" \
"move %[fn], %[t0]\n\t" \
"1:\n\t" \ "1:\n\t" \
"j %[fn]\n\t" \ "jalr $0, %[fn]\n\t" \
" nop\n\t" \ " nop\n\t" \
".set pop\n\t" \ ".set pop\n\t" \
: [fn] "=c"(_fn), \ : [fn] "=c"(_fn), \

View File

@ -118,27 +118,61 @@ using namespace android;
: "cc" \ : "cc" \
); );
#elif defined(__mips64)
#define API_ENTRY(_api) __attribute__((noinline)) _api
#define CALL_GL_API(_api, ...) \
register unsigned long _t0 asm("t0"); \
register unsigned long _fn asm("t9"); \
register unsigned long _tls asm("v1"); \
register unsigned long _v0 asm("v0"); \
asm volatile( \
".set push\n\t" \
".set noreorder\n\t" \
"rdhwr %[tls], $29\n\t" \
"ld %[t0], %[OPENGL_API](%[tls])\n\t" \
"beqz %[t0], 1f\n\t" \
" move %[fn], $ra\n\t" \
"ld %[t0], %[API](%[t0])\n\t" \
"beqz %[t0], 1f\n\t" \
" nop\n\t" \
"move %[fn], %[t0]\n\t" \
"1:\n\t" \
"jalr $0, %[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*sizeof(void*)),\
[API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \
: \
);
#elif defined(__mips__) #elif defined(__mips__)
#define API_ENTRY(_api) __attribute__((noinline)) _api #define API_ENTRY(_api) __attribute__((noinline)) _api
#define CALL_GL_API(_api, ...) \ #define CALL_GL_API(_api, ...) \
register unsigned int _t0 asm("t0"); \ register unsigned int _t0 asm("t0"); \
register unsigned int _fn asm("t1"); \ register unsigned int _fn asm("t9"); \
register unsigned int _tls asm("v1"); \ register unsigned int _tls asm("v1"); \
register unsigned int _v0 asm("v0"); \ register unsigned int _v0 asm("v0"); \
asm volatile( \ asm volatile( \
".set push\n\t" \ ".set push\n\t" \
".set noreorder\n\t" \ ".set noreorder\n\t" \
".set mips32r2\n\t" \
"rdhwr %[tls], $29\n\t" \ "rdhwr %[tls], $29\n\t" \
"lw %[t0], %[OPENGL_API](%[tls])\n\t" \ "lw %[t0], %[OPENGL_API](%[tls])\n\t" \
"beqz %[t0], 1f\n\t" \ "beqz %[t0], 1f\n\t" \
" move %[fn],$ra\n\t" \ " move %[fn],$ra\n\t" \
"lw %[fn], %[API](%[t0])\n\t" \ "lw %[t0], %[API](%[t0])\n\t" \
"movz %[fn], $ra, %[fn]\n\t" \ "beqz %[t0], 1f\n\t" \
" nop\n\t" \
"move %[fn], %[t0]\n\t" \
"1:\n\t" \ "1:\n\t" \
"j %[fn]\n\t" \ "jalr $0, %[fn]\n\t" \
" move %[v0], $0\n\t" \ " move %[v0], $0\n\t" \
".set pop\n\t" \ ".set pop\n\t" \
: [fn] "=c"(_fn), \ : [fn] "=c"(_fn), \

View File

@ -174,27 +174,61 @@ GL_API void GL_APIENTRY glWeightPointerOESBounds(GLint size, GLenum type,
: "cc" \ : "cc" \
); );
#elif defined(__mips64)
#define API_ENTRY(_api) __attribute__((noinline)) _api
#define CALL_GL_API(_api, ...) \
register unsigned long _t0 asm("t0"); \
register unsigned long _fn asm("t9"); \
register unsigned long _tls asm("v1"); \
register unsigned long _v0 asm("v0"); \
asm volatile( \
".set push\n\t" \
".set noreorder\n\t" \
"rdhwr %[tls], $29\n\t" \
"ld %[t0], %[OPENGL_API](%[tls])\n\t" \
"beqz %[t0], 1f\n\t" \
" move %[fn], $ra\n\t" \
"ld %[t0], %[API](%[t0])\n\t" \
"beqz %[t0], 1f\n\t" \
" nop\n\t" \
"move %[fn], %[t0]\n\t" \
"1:\n\t" \
"jalr $0, %[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*sizeof(void*)),\
[API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \
: \
);
#elif defined(__mips__) #elif defined(__mips__)
#define API_ENTRY(_api) __attribute__((noinline)) _api #define API_ENTRY(_api) __attribute__((noinline)) _api
#define CALL_GL_API(_api, ...) \ #define CALL_GL_API(_api, ...) \
register unsigned int _t0 asm("t0"); \ register unsigned int _t0 asm("t0"); \
register unsigned int _fn asm("t1"); \ register unsigned int _fn asm("t9"); \
register unsigned int _tls asm("v1"); \ register unsigned int _tls asm("v1"); \
register unsigned int _v0 asm("v0"); \ register unsigned int _v0 asm("v0"); \
asm volatile( \ asm volatile( \
".set push\n\t" \ ".set push\n\t" \
".set noreorder\n\t" \ ".set noreorder\n\t" \
".set mips32r2\n\t" \
"rdhwr %[tls], $29\n\t" \ "rdhwr %[tls], $29\n\t" \
"lw %[t0], %[OPENGL_API](%[tls])\n\t" \ "lw %[t0], %[OPENGL_API](%[tls])\n\t" \
"beqz %[t0], 1f\n\t" \ "beqz %[t0], 1f\n\t" \
" move %[fn], $ra\n\t" \ " move %[fn], $ra\n\t" \
"lw %[fn], %[API](%[t0])\n\t" \ "lw %[t0], %[API](%[t0])\n\t" \
"movz %[fn], $ra, %[fn]\n\t" \ "beqz %[t0], 1f\n\t" \
" nop\n\t" \
"move %[fn], %[t0]\n\t" \
"1:\n\t" \ "1:\n\t" \
"j %[fn]\n\t" \ "jalr $0, %[fn]\n\t" \
" move %[v0], $0\n\t" \ " move %[v0], $0\n\t" \
".set pop\n\t" \ ".set pop\n\t" \
: [fn] "=c"(_fn), \ : [fn] "=c"(_fn), \