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