gl2.cpp revision 3e8fce48a6c768036c11290b93116665e8e8bdda
14774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall/* 2b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** Copyright 2007, The Android Open Source Project 3b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** 44774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** Licensed under the Apache License, Version 2.0 (the "License"); 54774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** you may not use this file except in compliance with the License. 64774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** You may obtain a copy of the License at 7b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** 84774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** http://www.apache.org/licenses/LICENSE-2.0 9b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** 104774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** Unless required by applicable law or agreed to in writing, software 114774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** distributed under the License is distributed on an "AS IS" BASIS, 124774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** See the License for the specific language governing permissions and 14b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** limitations under the License. 15b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian */ 16b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 17b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <ctype.h> 18b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <string.h> 19b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <errno.h> 20b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 21b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <sys/ioctl.h> 22b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 23b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <cutils/log.h> 24b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <cutils/properties.h> 25b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 2639c24a20bbc697630d2b92c251b70c04d6f9d00cMathias Agopian#include "../hooks.h" 2739c24a20bbc697630d2b92c251b70c04d6f9d00cMathias Agopian#include "../egl_impl.h" 28b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 29b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopianusing namespace android; 30b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 31b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian// ---------------------------------------------------------------------------- 32b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian// Actual GL entry-points 33b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian// ---------------------------------------------------------------------------- 34b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 35b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef API_ENTRY 36b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API 373e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#undef CALL_GL_API_INTERNAL_CALL 383e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#undef CALL_GL_API_INTERNAL_SET_RETURN_VALUE 393e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#undef CALL_GL_API_INTERNAL_DO_RETURN 40b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API_RETURN 41b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 4230a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall#if USE_SLOW_BINDING 4330a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall 4430a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall #define API_ENTRY(_api) _api 4530a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall 463e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ 4730a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; \ 4830a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall if (_c) return _c->_api(__VA_ARGS__); 4930a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall 503e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE return 0; 513e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 523e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // This stays blank, since void functions will implicitly return, and 533e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // all of the other functions will return 0 based on the previous macro. 543e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_DO_RETURN 553e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 5630a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall#elif defined(__arm__) 5746b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand 58288870ebc3da8121b7a237a53280bd8b931b7a2fElliott Hughes #define GET_TLS(reg) "mrc p15, 0, " #reg ", c13, c0, 3 \n" 59673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian 603e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define API_ENTRY(_api) __attribute__((naked,noinline)) _api 613e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 623e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ 633e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines asm volatile( \ 643e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines GET_TLS(r12) \ 653e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "ldr r12, [r12, %[tls]] \n" \ 663e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "cmp r12, #0 \n" \ 673e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "ldrne pc, [r12, %[api]] \n" \ 683e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 693e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : [tls] "J"(TLS_SLOT_OPENGL_API*4), \ 703e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines [api] "J"(__builtin_offsetof(gl_hooks_t, gl._api)) \ 713e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "r0", "r1", "r2", "r3", "r12" \ 723e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 733e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 743e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ 753e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines asm volatile( \ 763e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "mov r0, #0 \n" \ 773e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 783e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 793e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "r0" \ 803e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 813e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 823e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 833e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_DO_RETURN \ 843e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines asm volatile( \ 853e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "bx lr \n" \ 863e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 873e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 883e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "r0" \ 893e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 90673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian 9130a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall#elif defined(__aarch64__) 9230a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall 933e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define API_ENTRY(_api) __attribute__((naked,noinline)) _api 9430a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall 953e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ 9630a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall asm volatile( \ 9730a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall "mrs x16, tpidr_el0\n" \ 9830a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall "ldr x16, [x16, %[tls]]\n" \ 9930a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall "cbz x16, 1f\n" \ 10030a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall "ldr x16, [x16, %[api]]\n" \ 10130a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall "br x16\n" \ 10230a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall "1:\n" \ 10330a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall : \ 10430a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall : [tls] "i" (TLS_SLOT_OPENGL_API * sizeof(void*)), \ 10530a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api)) \ 1063e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x16" \ 1073e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 1083e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 1093e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ 1103e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines asm volatile( \ 1113e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "mov w0, wzr \n" \ 1123e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1133e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1143e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "w0" \ 1153e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 1163e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 1173e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_DO_RETURN \ 1183e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines asm volatile( \ 1193e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "ret \n" \ 1203e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1213e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1223e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 12330a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall ); 12430a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall 12530a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall#elif defined(__i386__) 126c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz 1273e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define API_ENTRY(_api) __attribute__((naked,noinline)) _api 128c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz 1293e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ 130c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz __asm__ volatile( \ 1313e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "mov %%gs:0, %%eax\n" \ 1323e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "mov %P[tls](%%eax), %%eax\n" \ 1333e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "test %%eax, %%eax\n" \ 134c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz "je 1f\n" \ 1353e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "jmp *%P[api](%%eax)\n" \ 136c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz "1:\n" \ 1373e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 138c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz : [tls] "i" (TLS_SLOT_OPENGL_API*sizeof(void*)), \ 139c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api)) \ 1403e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "cc", "%eax" \ 141c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz ); 142c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz 1433e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ 1443e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines __asm__ volatile( \ 1453e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "xor %%eax, %%eax\n" \ 1463e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1473e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1483e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "%eax" \ 1493e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 1503e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 1513e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_DO_RETURN \ 1523e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines __asm__ volatile( \ 1533e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "ret\n" \ 1543e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1553e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1563e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1573e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 1583e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 15930a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall#elif defined(__x86_64__) 160c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz 1613e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define API_ENTRY(_api) __attribute__((naked,noinline)) _api 162c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz 1633e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ 1643e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines __asm__ volatile( \ 1653e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "mov %%fs:0, %%rax\n" \ 1663e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "mov %P[tls](%%rax), %%rax\n" \ 1673e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "test %%rax, %%rax\n" \ 168c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz "je 1f\n" \ 1693e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "jmp *%P[api](%%rax)\n" \ 170c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz "1:\n" \ 1713e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 172c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz : [tls] "i" (TLS_SLOT_OPENGL_API*sizeof(void*)), \ 173c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api)) \ 1743e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "cc", "%rdi", "%rsi", "%rdx", "%rcx", "%r8", "%r9", \ 1753e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", \ 1763e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "%xmm6", "%xmm7" \ 1773e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 1783e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 1793e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ 1803e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines __asm__ volatile( \ 1813e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "xor %%eax, %%eax\n" \ 1823e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1833e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1843e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "%eax" \ 1853e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 1863e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 1873e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_DO_RETURN \ 1883e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines __asm__ volatile( \ 1893e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "retq\n" \ 1903e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1913e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1923e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1933e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 194c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz 1956701fbe5f0d799c5245b0cdf3a69ecdcbfd9fb08Duane Sand#elif defined(__mips64) 1966701fbe5f0d799c5245b0cdf3a69ecdcbfd9fb08Duane Sand 1973e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define API_ENTRY(_api) __attribute__((naked,noinline)) _api 1983e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 1993e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // t0: $12 2003e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // fn: $25 2013e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // tls: $3 2023e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // v0: $2 2033e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ 2043e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines asm volatile( \ 2053e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ".set push\n\t" \ 2063e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ".set noreorder\n\t" \ 2073e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "rdhwr $3, $29\n\t" \ 2083e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "ld $12, %[OPENGL_API]($3)\n\t" \ 2093e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "beqz $12, 1f\n\t" \ 2103e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines " move $25, $ra\n\t" \ 2113e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "ld $12, %[API]($12)\n\t" \ 2123e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "beqz $12, 1f\n\t" \ 2133e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines " nop\n\t" \ 2143e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "move $25, $12\n\t" \ 2153e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "1:\n\t" \ 2163e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "jalr $0, $25\n\t" \ 2173e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines " move $2, $0\n\t" \ 2183e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ".set pop\n\t" \ 2193e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 2203e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*sizeof(void*)),\ 2213e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines [API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \ 2223e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9", \ 2233e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "$10", "$11", "$12", "$25" \ 2246701fbe5f0d799c5245b0cdf3a69ecdcbfd9fb08Duane Sand ); 2256701fbe5f0d799c5245b0cdf3a69ecdcbfd9fb08Duane Sand 2263e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE 2273e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_DO_RETURN 2283e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 22930a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall#elif defined(__mips__) 23046b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand 2313e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define API_ENTRY(_api) __attribute__((naked,noinline)) _api 23246b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand 2333e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // t0: $8 2343e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // fn: $25 2353e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // tls: $3 2363e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // v0: $2 2373e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ 23846b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand asm volatile( \ 23946b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand ".set push\n\t" \ 24046b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand ".set noreorder\n\t" \ 241ecacc3f164f2bf2c8c4ff5a20496511249d2cd4bDuane Sand ".set mips32r2\n\t" \ 2423e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "rdhwr $3, $29\n\t" \ 2433e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "lw $3, %[OPENGL_API]($3)\n\t" \ 2443e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "beqz $3, 1f\n\t" \ 2453e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines " move $25,$ra\n\t" \ 2463e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "lw $3, %[API]($3)\n\t" \ 2473e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "beqz $3, 1f\n\t" \ 2486701fbe5f0d799c5245b0cdf3a69ecdcbfd9fb08Duane Sand " nop\n\t" \ 2493e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "move $25, $3\n\t" \ 25046b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand "1:\n\t" \ 2513e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "jalr $0, $25\n\t" \ 2523e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines " move $2, $0\n\t" \ 25346b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand ".set pop\n\t" \ 2543e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 25546b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*4), \ 25646b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand [API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \ 2573e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$25" \ 2583e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 25946b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand 2603e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE 2613e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_DO_RETURN 262b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 2633e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#endif 264e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian 2653e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#define CALL_GL_API(_api, ...) \ 2663e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines CALL_GL_API_INTERNAL_CALL(_api, __VA_ARGS__) \ 2673e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines CALL_GL_API_INTERNAL_DO_RETURN 268e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian 2693e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#define CALL_GL_API_RETURN(_api, ...) \ 2703e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines CALL_GL_API_INTERNAL_CALL(_api, __VA_ARGS__) \ 2713e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ 2723e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines CALL_GL_API_INTERNAL_DO_RETURN 273b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 274b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopianextern "C" { 275bbbddb83bbd3ca2032294b55c91b1023acc927acJesse Hall#pragma GCC diagnostic ignored "-Wunused-parameter" 2764c0596f4cc7d3a0bbbe5862cb38585a58ef4d0a3Jesse Hall#include "gl2_api.in" 277b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include "gl2ext_api.in" 278bbbddb83bbd3ca2032294b55c91b1023acc927acJesse Hall#pragma GCC diagnostic warning "-Wunused-parameter" 279b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian} 280b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 281b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef API_ENTRY 282b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API 2833e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#undef CALL_GL_API_INTERNAL_CALL 2843e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#undef CALL_GL_API_INTERNAL_SET_RETURN_VALUE 2853e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#undef CALL_GL_API_INTERNAL_DO_RETURN 286b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API_RETURN 287b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 28848d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian/* 289edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan * glGetString() and glGetStringi() are special because we expose some 290edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan * extensions in the wrapper. Also, wrapping glGetXXX() is required because 291edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan * the value returned for GL_NUM_EXTENSIONS may have been altered by the 292edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan * injection of the additional extensions. 29348d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian */ 29448d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian 295edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachanextern "C" { 296edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan const GLubyte * __glGetString(GLenum name); 297edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan const GLubyte * __glGetStringi(GLenum name, GLuint index); 298edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan void __glGetBooleanv(GLenum pname, GLboolean * data); 299edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan void __glGetFloatv(GLenum pname, GLfloat * data); 300edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan void __glGetIntegerv(GLenum pname, GLint * data); 301edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan void __glGetInteger64v(GLenum pname, GLint64 * data); 302edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan} 30348d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian 304edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachanconst GLubyte * glGetString(GLenum name) { 30548d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian const GLubyte * ret = egl_get_string_for_current_context(name); 30648d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian if (ret == NULL) { 307e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; 3080627071cc983aadb8d7447fe222b05d15c7c25beAnshuman Dani if(_c) ret = _c->glGetString(name); 30948d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian } 31048d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian return ret; 31148d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian} 312edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 313edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachanconst GLubyte * glGetStringi(GLenum name, GLuint index) { 314edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan const GLubyte * ret = egl_get_string_for_current_context(name, index); 315edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (ret == NULL) { 316edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; 317edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if(_c) ret = _c->glGetStringi(name, index); 318edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 319edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan return ret; 320edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan} 321edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 322edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachanvoid glGetBooleanv(GLenum pname, GLboolean * data) { 323edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (pname == GL_NUM_EXTENSIONS) { 324edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan int num_exts = egl_get_num_extensions_for_current_context(); 325edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (num_exts >= 0) { 326edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan *data = num_exts > 0 ? GL_TRUE : GL_FALSE; 327edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan return; 328edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 329edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 330edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 331edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; 332edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (_c) _c->glGetBooleanv(pname, data); 333edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan} 334edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 335edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachanvoid glGetFloatv(GLenum pname, GLfloat * data) { 336edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (pname == GL_NUM_EXTENSIONS) { 337edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan int num_exts = egl_get_num_extensions_for_current_context(); 338edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (num_exts >= 0) { 339edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan *data = (GLfloat)num_exts; 340edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan return; 341edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 342edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 343edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 344edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; 345edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (_c) _c->glGetFloatv(pname, data); 346edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan} 347edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 348edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachanvoid glGetIntegerv(GLenum pname, GLint * data) { 349edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (pname == GL_NUM_EXTENSIONS) { 350edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan int num_exts = egl_get_num_extensions_for_current_context(); 351edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (num_exts >= 0) { 352edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan *data = (GLint)num_exts; 353edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan return; 354edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 355edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 356edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 357edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; 358edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (_c) _c->glGetIntegerv(pname, data); 359edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan} 360edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 361edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachanvoid glGetInteger64v(GLenum pname, GLint64 * data) { 362edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (pname == GL_NUM_EXTENSIONS) { 363edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan int num_exts = egl_get_num_extensions_for_current_context(); 364edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (num_exts >= 0) { 365edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan *data = (GLint64)num_exts; 366edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan return; 367edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 368edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 369edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 370edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; 371edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (_c) _c->glGetInteger64v(pname, data); 372edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan} 373