gl2.cpp revision a5e161b1207ef447a51e99856097d69d4a6111e1
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 <errno.h> 19a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn#include <string.h> 20b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <sys/ioctl.h> 21b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 22a5e161b1207ef447a51e99856097d69d4a6111e1Mark Salyzyn#include <android/log.h> 23b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <cutils/properties.h> 24b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 2539c24a20bbc697630d2b92c251b70c04d6f9d00cMathias Agopian#include "../hooks.h" 2639c24a20bbc697630d2b92c251b70c04d6f9d00cMathias Agopian#include "../egl_impl.h" 27b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 28b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopianusing namespace android; 29b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 30b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian// ---------------------------------------------------------------------------- 31b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian// Actual GL entry-points 32b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian// ---------------------------------------------------------------------------- 33b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 34b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef API_ENTRY 35b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API 363e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#undef CALL_GL_API_INTERNAL_CALL 373e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#undef CALL_GL_API_INTERNAL_SET_RETURN_VALUE 383e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#undef CALL_GL_API_INTERNAL_DO_RETURN 39b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API_RETURN 40b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 4130a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall#if USE_SLOW_BINDING 4230a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall 4330a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall #define API_ENTRY(_api) _api 4430a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall 453e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ 4630a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; \ 4730a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall if (_c) return _c->_api(__VA_ARGS__); 4830a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall 493e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE return 0; 503e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 513e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // This stays blank, since void functions will implicitly return, and 523e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // all of the other functions will return 0 based on the previous macro. 533e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_DO_RETURN 543e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 5530a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall#elif defined(__arm__) 5646b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand 57288870ebc3da8121b7a237a53280bd8b931b7a2fElliott Hughes #define GET_TLS(reg) "mrc p15, 0, " #reg ", c13, c0, 3 \n" 58673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian 593e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define API_ENTRY(_api) __attribute__((naked,noinline)) _api 603e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 613e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ 623e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines asm volatile( \ 633e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines GET_TLS(r12) \ 643e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "ldr r12, [r12, %[tls]] \n" \ 653e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "cmp r12, #0 \n" \ 663e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "ldrne pc, [r12, %[api]] \n" \ 673e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 683e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : [tls] "J"(TLS_SLOT_OPENGL_API*4), \ 693e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines [api] "J"(__builtin_offsetof(gl_hooks_t, gl._api)) \ 703e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "r0", "r1", "r2", "r3", "r12" \ 713e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 723e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 733e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ 743e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines asm volatile( \ 753e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "mov r0, #0 \n" \ 763e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 773e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 783e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "r0" \ 793e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 803e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 813e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 823e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_DO_RETURN \ 833e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines asm volatile( \ 843e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "bx lr \n" \ 853e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 863e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 873e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "r0" \ 883e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 89673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian 9030a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall#elif defined(__aarch64__) 9130a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall 923e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define API_ENTRY(_api) __attribute__((naked,noinline)) _api 9330a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall 943e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ 9530a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall asm volatile( \ 9630a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall "mrs x16, tpidr_el0\n" \ 9730a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall "ldr x16, [x16, %[tls]]\n" \ 9830a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall "cbz x16, 1f\n" \ 9930a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall "ldr x16, [x16, %[api]]\n" \ 10030a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall "br x16\n" \ 10130a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall "1:\n" \ 10230a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall : \ 10330a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall : [tls] "i" (TLS_SLOT_OPENGL_API * sizeof(void*)), \ 10430a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api)) \ 1053e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x16" \ 1063e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 1073e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 1083e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ 1093e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines asm volatile( \ 1103e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "mov w0, wzr \n" \ 1113e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1123e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1133e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "w0" \ 1143e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 1153e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 1163e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_DO_RETURN \ 1173e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines asm volatile( \ 1183e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "ret \n" \ 1193e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1203e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1213e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 12230a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall ); 12330a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall 12430a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall#elif defined(__i386__) 125c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz 1263e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define API_ENTRY(_api) __attribute__((naked,noinline)) _api 127c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz 1283e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ 129c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz __asm__ volatile( \ 1303e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "mov %%gs:0, %%eax\n" \ 1313e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "mov %P[tls](%%eax), %%eax\n" \ 1323e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "test %%eax, %%eax\n" \ 133c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz "je 1f\n" \ 1343e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "jmp *%P[api](%%eax)\n" \ 135c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz "1:\n" \ 1363e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 137c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz : [tls] "i" (TLS_SLOT_OPENGL_API*sizeof(void*)), \ 138c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api)) \ 1393e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "cc", "%eax" \ 140c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz ); 141c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz 1423e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ 1433e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines __asm__ volatile( \ 1443e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "xor %%eax, %%eax\n" \ 1453e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1463e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1473e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "%eax" \ 1483e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 1493e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 1503e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_DO_RETURN \ 1513e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines __asm__ volatile( \ 1523e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "ret\n" \ 1533e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1543e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1553e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1563e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 1573e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 15830a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall#elif defined(__x86_64__) 159c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz 1603e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define API_ENTRY(_api) __attribute__((naked,noinline)) _api 161c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz 1623e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ 1633e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines __asm__ volatile( \ 1643e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "mov %%fs:0, %%rax\n" \ 1653e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "mov %P[tls](%%rax), %%rax\n" \ 1663e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "test %%rax, %%rax\n" \ 167c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz "je 1f\n" \ 1683e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "jmp *%P[api](%%rax)\n" \ 169c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz "1:\n" \ 1703e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 171c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz : [tls] "i" (TLS_SLOT_OPENGL_API*sizeof(void*)), \ 172c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api)) \ 1733e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "cc", "%rdi", "%rsi", "%rdx", "%rcx", "%r8", "%r9", \ 1743e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", \ 1753e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "%xmm6", "%xmm7" \ 1763e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 1773e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 1783e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ 1793e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines __asm__ volatile( \ 1803e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "xor %%eax, %%eax\n" \ 1813e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1823e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1833e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "%eax" \ 1843e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 1853e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 1863e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_DO_RETURN \ 1873e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines __asm__ volatile( \ 1883e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "retq\n" \ 1893e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1903e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1913e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 1923e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 193c80aafa61d619087a879dc1095ddf1ca2a5e69fbmwajdecz 1946701fbe5f0d799c5245b0cdf3a69ecdcbfd9fb08Duane Sand#elif defined(__mips64) 1956701fbe5f0d799c5245b0cdf3a69ecdcbfd9fb08Duane Sand 1963e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define API_ENTRY(_api) __attribute__((naked,noinline)) _api 1973e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 1983e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // t0: $12 1993e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // fn: $25 2003e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // tls: $3 2013e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // v0: $2 2023e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ 2033e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines asm volatile( \ 2043e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ".set push\n\t" \ 2053e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ".set noreorder\n\t" \ 2063e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "rdhwr $3, $29\n\t" \ 2073e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "ld $12, %[OPENGL_API]($3)\n\t" \ 2083e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "beqz $12, 1f\n\t" \ 2093e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines " move $25, $ra\n\t" \ 2103e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "ld $12, %[API]($12)\n\t" \ 2113e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "beqz $12, 1f\n\t" \ 2123e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines " nop\n\t" \ 2133e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "move $25, $12\n\t" \ 2143e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "1:\n\t" \ 2153e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "jalr $0, $25\n\t" \ 2163e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines " move $2, $0\n\t" \ 2173e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ".set pop\n\t" \ 2183e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 2193e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*sizeof(void*)),\ 2203e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines [API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \ 2213e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9", \ 2223e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "$10", "$11", "$12", "$25" \ 2236701fbe5f0d799c5245b0cdf3a69ecdcbfd9fb08Duane Sand ); 2246701fbe5f0d799c5245b0cdf3a69ecdcbfd9fb08Duane Sand 2253e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE 2263e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_DO_RETURN 2273e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines 22830a41aa1ccc47de41642308a243fa5df2bfeec06Jesse Hall#elif defined(__mips__) 22946b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand 2303e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define API_ENTRY(_api) __attribute__((naked,noinline)) _api 23146b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand 2323e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // t0: $8 2333e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // fn: $25 2343e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // tls: $3 2353e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines // v0: $2 2363e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_CALL(_api, ...) \ 23746b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand asm volatile( \ 23846b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand ".set push\n\t" \ 23946b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand ".set noreorder\n\t" \ 240ecacc3f164f2bf2c8c4ff5a20496511249d2cd4bDuane Sand ".set mips32r2\n\t" \ 2413e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "rdhwr $3, $29\n\t" \ 2423e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "lw $3, %[OPENGL_API]($3)\n\t" \ 2433e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "beqz $3, 1f\n\t" \ 2443e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines " move $25,$ra\n\t" \ 2453e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "lw $3, %[API]($3)\n\t" \ 2463e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "beqz $3, 1f\n\t" \ 2476701fbe5f0d799c5245b0cdf3a69ecdcbfd9fb08Duane Sand " nop\n\t" \ 2483e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "move $25, $3\n\t" \ 24946b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand "1:\n\t" \ 2503e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines "jalr $0, $25\n\t" \ 2513e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines " move $2, $0\n\t" \ 25246b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand ".set pop\n\t" \ 2533e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : \ 25446b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand : [OPENGL_API] "I"(TLS_SLOT_OPENGL_API*4), \ 25546b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand [API] "I"(__builtin_offsetof(gl_hooks_t, gl._api)) \ 2563e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines : "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$25" \ 2573e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines ); 25846b4253b760916ea8f64c8c32a51ae85ec3b050eDuane Sand 2593e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE 2603e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines #define CALL_GL_API_INTERNAL_DO_RETURN 261b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 2623e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#endif 263e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian 2643e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#define CALL_GL_API(_api, ...) \ 2653e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines CALL_GL_API_INTERNAL_CALL(_api, __VA_ARGS__) \ 2663e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines CALL_GL_API_INTERNAL_DO_RETURN 267e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian 2683e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#define CALL_GL_API_RETURN(_api, ...) \ 2693e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines CALL_GL_API_INTERNAL_CALL(_api, __VA_ARGS__) \ 2703e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines CALL_GL_API_INTERNAL_SET_RETURN_VALUE \ 2713e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines CALL_GL_API_INTERNAL_DO_RETURN 272b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 273b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopianextern "C" { 274bbbddb83bbd3ca2032294b55c91b1023acc927acJesse Hall#pragma GCC diagnostic ignored "-Wunused-parameter" 2754c0596f4cc7d3a0bbbe5862cb38585a58ef4d0a3Jesse Hall#include "gl2_api.in" 276b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include "gl2ext_api.in" 277bbbddb83bbd3ca2032294b55c91b1023acc927acJesse Hall#pragma GCC diagnostic warning "-Wunused-parameter" 278b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian} 279b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 280b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef API_ENTRY 281b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API 2823e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#undef CALL_GL_API_INTERNAL_CALL 2833e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#undef CALL_GL_API_INTERNAL_SET_RETURN_VALUE 2843e8fce48a6c768036c11290b93116665e8e8bddaStephen Hines#undef CALL_GL_API_INTERNAL_DO_RETURN 285b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API_RETURN 286b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian 28748d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian/* 288edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan * glGetString() and glGetStringi() are special because we expose some 289edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan * extensions in the wrapper. Also, wrapping glGetXXX() is required because 290edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan * the value returned for GL_NUM_EXTENSIONS may have been altered by the 291edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan * injection of the additional extensions. 29248d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian */ 29348d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian 294edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachanextern "C" { 295edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan const GLubyte * __glGetString(GLenum name); 296edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan const GLubyte * __glGetStringi(GLenum name, GLuint index); 297edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan void __glGetBooleanv(GLenum pname, GLboolean * data); 298edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan void __glGetFloatv(GLenum pname, GLfloat * data); 299edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan void __glGetIntegerv(GLenum pname, GLint * data); 300edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan void __glGetInteger64v(GLenum pname, GLint64 * data); 301edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan} 30248d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian 303edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachanconst GLubyte * glGetString(GLenum name) { 30448d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian const GLubyte * ret = egl_get_string_for_current_context(name); 30548d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian if (ret == NULL) { 306e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; 3070627071cc983aadb8d7447fe222b05d15c7c25beAnshuman Dani if(_c) ret = _c->glGetString(name); 30848d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian } 30948d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian return ret; 31048d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian} 311edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 312edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachanconst GLubyte * glGetStringi(GLenum name, GLuint index) { 313edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan const GLubyte * ret = egl_get_string_for_current_context(name, index); 314edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (ret == NULL) { 315edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; 316edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if(_c) ret = _c->glGetStringi(name, index); 317edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 318edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan return ret; 319edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan} 320edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 321edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachanvoid glGetBooleanv(GLenum pname, GLboolean * data) { 322edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (pname == GL_NUM_EXTENSIONS) { 323edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan int num_exts = egl_get_num_extensions_for_current_context(); 324edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (num_exts >= 0) { 325edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan *data = num_exts > 0 ? GL_TRUE : GL_FALSE; 326edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan return; 327edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 328edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 329edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 330edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; 331edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (_c) _c->glGetBooleanv(pname, data); 332edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan} 333edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 334edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachanvoid glGetFloatv(GLenum pname, GLfloat * data) { 335edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (pname == GL_NUM_EXTENSIONS) { 336edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan int num_exts = egl_get_num_extensions_for_current_context(); 337edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (num_exts >= 0) { 338edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan *data = (GLfloat)num_exts; 339edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan return; 340edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 341edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 342edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 343edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; 344edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (_c) _c->glGetFloatv(pname, data); 345edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan} 346edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 347edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachanvoid glGetIntegerv(GLenum pname, GLint * data) { 348edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (pname == GL_NUM_EXTENSIONS) { 349edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan int num_exts = egl_get_num_extensions_for_current_context(); 350edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (num_exts >= 0) { 351edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan *data = (GLint)num_exts; 352edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan return; 353edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 354edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 355edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 356edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; 357edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (_c) _c->glGetIntegerv(pname, data); 358edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan} 359edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 360edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachanvoid glGetInteger64v(GLenum pname, GLint64 * data) { 361edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (pname == GL_NUM_EXTENSIONS) { 362edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan int num_exts = egl_get_num_extensions_for_current_context(); 363edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (num_exts >= 0) { 364edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan *data = (GLint64)num_exts; 365edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan return; 366edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 367edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan } 368edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan 369edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; 370edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan if (_c) _c->glGetInteger64v(pname, data); 371edfe72ed6738d3798c5384b7aec8ab73af549d79Alistair Strachan} 372