diff options
Diffstat (limited to 'opengl/libs/GLES2/gl2.cpp')
-rw-r--r-- | opengl/libs/GLES2/gl2.cpp | 57 |
1 files changed, 46 insertions, 11 deletions
diff --git a/opengl/libs/GLES2/gl2.cpp b/opengl/libs/GLES2/gl2.cpp index b07228f..d5dc012 100644 --- a/opengl/libs/GLES2/gl2.cpp +++ b/opengl/libs/GLES2/gl2.cpp @@ -82,7 +82,7 @@ using namespace android; #elif defined(__i386__) - #define API_ENTRY(_api) __attribute__((noinline)) _api + #define API_ENTRY(_api) __attribute__((noinline,optimize("omit-frame-pointer"))) _api #define CALL_GL_API(_api, ...) \ register void** fn; \ @@ -101,7 +101,7 @@ using namespace android; #elif defined(__x86_64__) - #define API_ENTRY(_api) __attribute__((noinline)) _api + #define API_ENTRY(_api) __attribute__((noinline,optimize("omit-frame-pointer"))) _api #define CALL_GL_API(_api, ...) \ register void** fn; \ @@ -118,27 +118,62 @@ using namespace android; : "cc" \ ); +#elif defined(__mips64) + + #define API_ENTRY(_api) __attribute__((noinline)) _api + + #define CALL_GL_API(_api, ...) \ + register unsigned long _t0 asm("$12"); \ + register unsigned long _fn asm("$25"); \ + register unsigned long _tls asm("$3"); \ + register unsigned long _v0 asm("$2"); \ + 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__) #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"); \ + register unsigned int _t0 asm("$8"); \ + register unsigned int _fn asm("$25"); \ + register unsigned int _tls asm("$3"); \ + register unsigned int _v0 asm("$2"); \ asm volatile( \ ".set push\n\t" \ ".set noreorder\n\t" \ - ".set mips32r2\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" \ + "lw %[t0], %[API](%[t0])\n\t" \ + "beqz %[t0], 1f\n\t" \ + " nop\n\t" \ + "move %[fn], %[t0]\n\t" \ "1:\n\t" \ - "j %[fn]\n\t" \ + "jalr $0, %[fn]\n\t" \ " move %[v0], $0\n\t" \ ".set pop\n\t" \ : [fn] "=c"(_fn), \ @@ -180,7 +215,7 @@ const GLubyte * glGetString(GLenum name) const GLubyte * ret = egl_get_string_for_current_context(name); if (ret == NULL) { gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; - ret = _c->glGetString(name); + if(_c) ret = _c->glGetString(name); } return ret; } |