getProcAddress.cpp revision 24035338ed6329e4d85fb00cf99a91e2cdd55ba5
1/* 2 ** Copyright 2009, The Android Open Source Project 3 ** 4 ** Licensed under the Apache License, Version 2.0 (the "License"); 5 ** you may not use this file except in compliance with the License. 6 ** You may obtain a copy of the License at 7 ** 8 ** http://www.apache.org/licenses/LICENSE-2.0 9 ** 10 ** Unless required by applicable law or agreed to in writing, software 11 ** distributed under the License is distributed on an "AS IS" BASIS, 12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 ** See the License for the specific language governing permissions and 14 ** limitations under the License. 15 */ 16 17#include <ctype.h> 18#include <stdlib.h> 19#include <errno.h> 20 21#include <cutils/log.h> 22 23#include "hooks.h" 24 25// ---------------------------------------------------------------------------- 26namespace android { 27// ---------------------------------------------------------------------------- 28 29#undef API_ENTRY 30#undef CALL_GL_API 31#undef GL_EXTENSION 32#undef GL_EXTENSION_NAME 33 34#if defined(__arm__) 35 36 #ifdef HAVE_ARM_TLS_REGISTER 37 #define GET_TLS(reg) \ 38 "mrc p15, 0, " #reg ", c13, c0, 3 \n" 39 #else 40 #define GET_TLS(reg) \ 41 "mov " #reg ", #0xFFFF0FFF \n" \ 42 "ldr " #reg ", [" #reg ", #-15] \n" 43 #endif 44 45 #define API_ENTRY(_api) __attribute__((naked)) _api 46 47 #define CALL_GL_EXTENSION_API(_api) \ 48 asm volatile( \ 49 GET_TLS(r12) \ 50 "ldr r12, [r12, %[tls]] \n" \ 51 "cmp r12, #0 \n" \ 52 "ldrne r12, [r12, %[api]] \n" \ 53 "cmpne r12, #0 \n" \ 54 "bxne r12 \n" \ 55 "bx lr \n" \ 56 : \ 57 : [tls] "J"(TLS_SLOT_OPENGL_API*4), \ 58 [api] "J"(__builtin_offsetof(gl_hooks_t, \ 59 ext.extensions[_api])) \ 60 : \ 61 ); 62 63 #define GL_EXTENSION_NAME(_n) __glExtFwd##_n 64 65 #define GL_EXTENSION(_n) \ 66 void API_ENTRY(GL_EXTENSION_NAME(_n))() { \ 67 CALL_GL_EXTENSION_API(_n); \ 68 } 69 70 71#else 72 73 #define GL_EXTENSION_NAME(_n) NULL 74 75 #define GL_EXTENSION(_n) 76 77 #warning "eglGetProcAddress() partially supported on this architecture" 78 79#endif 80 81GL_EXTENSION(0) 82GL_EXTENSION(1) 83GL_EXTENSION(2) 84GL_EXTENSION(3) 85GL_EXTENSION(4) 86GL_EXTENSION(5) 87GL_EXTENSION(6) 88GL_EXTENSION(7) 89GL_EXTENSION(8) 90GL_EXTENSION(9) 91GL_EXTENSION(10) 92GL_EXTENSION(11) 93GL_EXTENSION(12) 94GL_EXTENSION(13) 95GL_EXTENSION(14) 96GL_EXTENSION(15) 97 98GL_EXTENSION(16) 99GL_EXTENSION(17) 100GL_EXTENSION(18) 101GL_EXTENSION(19) 102GL_EXTENSION(20) 103GL_EXTENSION(21) 104GL_EXTENSION(22) 105GL_EXTENSION(23) 106GL_EXTENSION(24) 107GL_EXTENSION(25) 108GL_EXTENSION(26) 109GL_EXTENSION(27) 110GL_EXTENSION(28) 111GL_EXTENSION(29) 112GL_EXTENSION(30) 113GL_EXTENSION(31) 114 115GL_EXTENSION(32) 116GL_EXTENSION(33) 117GL_EXTENSION(34) 118GL_EXTENSION(35) 119GL_EXTENSION(36) 120GL_EXTENSION(37) 121GL_EXTENSION(38) 122GL_EXTENSION(39) 123GL_EXTENSION(40) 124GL_EXTENSION(41) 125GL_EXTENSION(42) 126GL_EXTENSION(43) 127GL_EXTENSION(44) 128GL_EXTENSION(45) 129GL_EXTENSION(46) 130GL_EXTENSION(47) 131 132GL_EXTENSION(48) 133GL_EXTENSION(49) 134GL_EXTENSION(50) 135GL_EXTENSION(51) 136GL_EXTENSION(52) 137GL_EXTENSION(53) 138GL_EXTENSION(54) 139GL_EXTENSION(55) 140GL_EXTENSION(56) 141GL_EXTENSION(57) 142GL_EXTENSION(58) 143GL_EXTENSION(59) 144GL_EXTENSION(60) 145GL_EXTENSION(61) 146GL_EXTENSION(62) 147GL_EXTENSION(63) 148 149extern const __eglMustCastToProperFunctionPointerType gExtensionForwarders[MAX_NUMBER_OF_GL_EXTENSIONS] = { 150 GL_EXTENSION_NAME(0), GL_EXTENSION_NAME(1), GL_EXTENSION_NAME(2), GL_EXTENSION_NAME(3), 151 GL_EXTENSION_NAME(4), GL_EXTENSION_NAME(5), GL_EXTENSION_NAME(6), GL_EXTENSION_NAME(7), 152 GL_EXTENSION_NAME(8), GL_EXTENSION_NAME(9), GL_EXTENSION_NAME(10), GL_EXTENSION_NAME(11), 153 GL_EXTENSION_NAME(12), GL_EXTENSION_NAME(13), GL_EXTENSION_NAME(14), GL_EXTENSION_NAME(15), 154 GL_EXTENSION_NAME(16), GL_EXTENSION_NAME(17), GL_EXTENSION_NAME(18), GL_EXTENSION_NAME(19), 155 GL_EXTENSION_NAME(20), GL_EXTENSION_NAME(21), GL_EXTENSION_NAME(22), GL_EXTENSION_NAME(23), 156 GL_EXTENSION_NAME(24), GL_EXTENSION_NAME(25), GL_EXTENSION_NAME(26), GL_EXTENSION_NAME(27), 157 GL_EXTENSION_NAME(28), GL_EXTENSION_NAME(29), GL_EXTENSION_NAME(30), GL_EXTENSION_NAME(31), 158 GL_EXTENSION_NAME(32), GL_EXTENSION_NAME(33), GL_EXTENSION_NAME(34), GL_EXTENSION_NAME(35), 159 GL_EXTENSION_NAME(36), GL_EXTENSION_NAME(37), GL_EXTENSION_NAME(38), GL_EXTENSION_NAME(39), 160 GL_EXTENSION_NAME(40), GL_EXTENSION_NAME(41), GL_EXTENSION_NAME(42), GL_EXTENSION_NAME(43), 161 GL_EXTENSION_NAME(44), GL_EXTENSION_NAME(45), GL_EXTENSION_NAME(46), GL_EXTENSION_NAME(47), 162 GL_EXTENSION_NAME(48), GL_EXTENSION_NAME(49), GL_EXTENSION_NAME(50), GL_EXTENSION_NAME(51), 163 GL_EXTENSION_NAME(52), GL_EXTENSION_NAME(53), GL_EXTENSION_NAME(54), GL_EXTENSION_NAME(55), 164 GL_EXTENSION_NAME(56), GL_EXTENSION_NAME(57), GL_EXTENSION_NAME(58), GL_EXTENSION_NAME(59), 165 GL_EXTENSION_NAME(60), GL_EXTENSION_NAME(61), GL_EXTENSION_NAME(62), GL_EXTENSION_NAME(63) 166 }; 167 168#undef GL_EXTENSION_NAME 169#undef GL_EXTENSION 170#undef API_ENTRY 171#undef CALL_GL_API 172 173// ---------------------------------------------------------------------------- 174}; // namespace android 175// ---------------------------------------------------------------------------- 176 177