getProcAddress.cpp revision 1cadb25da1ed875bdd078270e642966724a0c39a
124035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian/* 224035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ** Copyright 2009, The Android Open Source Project 324035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ** 424035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ** Licensed under the Apache License, Version 2.0 (the "License"); 524035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ** you may not use this file except in compliance with the License. 624035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ** You may obtain a copy of the License at 724035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ** 824035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ** http://www.apache.org/licenses/LICENSE-2.0 924035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ** 1024035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ** Unless required by applicable law or agreed to in writing, software 1124035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ** distributed under the License is distributed on an "AS IS" BASIS, 1224035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1324035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ** See the License for the specific language governing permissions and 1424035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ** limitations under the License. 1524035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian */ 1624035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 1724035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian#include <ctype.h> 1824035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian#include <stdlib.h> 1924035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian#include <errno.h> 2024035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 2124035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian#include <cutils/log.h> 2224035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 231cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian#include "egldefs.h" 2424035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian#include "hooks.h" 2524035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 2624035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian// ---------------------------------------------------------------------------- 2724035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopiannamespace android { 2824035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian// ---------------------------------------------------------------------------- 2924035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 3024035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian#undef API_ENTRY 317f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian#undef CALL_GL_EXTENSION_API 3224035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian#undef GL_EXTENSION 3324035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian#undef GL_EXTENSION_NAME 347f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian#undef GL_EXTENSION_ARRAY 357f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian#undef GL_EXTENSION_LIST 367f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian#undef GET_TLS 3724035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 381cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian#if USE_FAST_TLS_KEY 3924035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 4024035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian #ifdef HAVE_ARM_TLS_REGISTER 4124035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian #define GET_TLS(reg) \ 4224035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian "mrc p15, 0, " #reg ", c13, c0, 3 \n" 4324035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian #else 4424035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian #define GET_TLS(reg) \ 4524035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian "mov " #reg ", #0xFFFF0FFF \n" \ 4624035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian "ldr " #reg ", [" #reg ", #-15] \n" 4724035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian #endif 4824035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 4924035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian #define API_ENTRY(_api) __attribute__((naked)) _api 5024035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 5124035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian #define CALL_GL_EXTENSION_API(_api) \ 5224035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian asm volatile( \ 5324035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian GET_TLS(r12) \ 5424035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian "ldr r12, [r12, %[tls]] \n" \ 5524035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian "cmp r12, #0 \n" \ 5624035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian "ldrne r12, [r12, %[api]] \n" \ 5724035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian "cmpne r12, #0 \n" \ 5824035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian "bxne r12 \n" \ 5924035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian "bx lr \n" \ 6024035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian : \ 6124035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian : [tls] "J"(TLS_SLOT_OPENGL_API*4), \ 6224035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian [api] "J"(__builtin_offsetof(gl_hooks_t, \ 6324035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ext.extensions[_api])) \ 6424035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian : \ 6524035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian ); 6624035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 677f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian #define GL_EXTENSION_NAME(_n) __glExtFwd##_n 6824035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 6924035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian #define GL_EXTENSION(_n) \ 7024035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian void API_ENTRY(GL_EXTENSION_NAME(_n))() { \ 7124035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian CALL_GL_EXTENSION_API(_n); \ 7224035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian } 7324035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 7424035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 7524035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian#else 7624035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 7724035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian #define GL_EXTENSION_NAME(_n) NULL 7824035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 7924035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian #define GL_EXTENSION(_n) 8024035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 811cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian #warning "eglGetProcAddress() partially supported" 8224035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 8324035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian#endif 8424035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 857f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian#define GL_EXTENSION_LIST(name) \ 867f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(0) name(1) name(2) name(3) \ 877f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(4) name(5) name(6) name(7) \ 887f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(8) name(9) name(10) name(11) \ 897f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(12) name(13) name(14) name(15) \ 907f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(16) name(17) name(18) name(19) \ 917f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(20) name(21) name(22) name(23) \ 927f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(24) name(25) name(26) name(27) \ 937f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(28) name(29) name(30) name(31) \ 947f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(32) name(33) name(34) name(35) \ 957f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(36) name(37) name(38) name(39) \ 967f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(40) name(41) name(42) name(43) \ 977f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(44) name(45) name(46) name(47) \ 987f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(48) name(49) name(50) name(51) \ 997f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(52) name(53) name(54) name(55) \ 1007f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(56) name(57) name(58) name(59) \ 1017f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian name(60) name(61) name(62) name(63) 1027f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian 1037f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian 1047f781d155221c4067c93f85b4153c204423f49f2Mathias AgopianGL_EXTENSION_LIST( GL_EXTENSION ) 1057f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian 1067f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian#define GL_EXTENSION_ARRAY(_n) GL_EXTENSION_NAME(_n), 10724035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 10824035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopianextern const __eglMustCastToProperFunctionPointerType gExtensionForwarders[MAX_NUMBER_OF_GL_EXTENSIONS] = { 1097f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian GL_EXTENSION_LIST( GL_EXTENSION_ARRAY ) 11024035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian }; 11124035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 1127f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian#undef GET_TLS 1137f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian#undef GL_EXTENSION_LIST 1147f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian#undef GL_EXTENSION_ARRAY 11524035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian#undef GL_EXTENSION_NAME 11624035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian#undef GL_EXTENSION 11724035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian#undef API_ENTRY 1187f781d155221c4067c93f85b4153c204423f49f2Mathias Agopian#undef CALL_GL_EXTENSION_API 11924035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 12024035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian// ---------------------------------------------------------------------------- 12124035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian}; // namespace android 12224035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian// ---------------------------------------------------------------------------- 12324035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian 124