13944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian/*
23944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian ** Copyright 2009, The Android Open Source Project
33944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian **
43944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian ** Licensed under the Apache License, Version 2.0 (the "License");
53944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian ** you may not use this file except in compliance with the License.
63944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian ** You may obtain a copy of the License at
73944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian **
83944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian **     http://www.apache.org/licenses/LICENSE-2.0
93944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian **
103944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian ** Unless required by applicable law or agreed to in writing, software
113944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian ** distributed under the License is distributed on an "AS IS" BASIS,
123944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian ** See the License for the specific language governing permissions and
143944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian ** limitations under the License.
153944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian */
163944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
173944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian#include <ctype.h>
183944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian#include <stdlib.h>
193944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian#include <errno.h>
203944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
213944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian#include <cutils/log.h>
223944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
23f56a960105916a7fd12284109784e5f667661439Mathias Agopian#include "egldefs.h"
243944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian#include "hooks.h"
253944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
263944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian// ----------------------------------------------------------------------------
273944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopiannamespace android {
283944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian// ----------------------------------------------------------------------------
293944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
303944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian#undef API_ENTRY
318daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian#undef CALL_GL_EXTENSION_API
323944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian#undef GL_EXTENSION
333944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian#undef GL_EXTENSION_NAME
348daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian#undef GL_EXTENSION_ARRAY
358daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian#undef GL_EXTENSION_LIST
368daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian#undef GET_TLS
373944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
38f56a960105916a7fd12284109784e5f667661439Mathias Agopian#if USE_FAST_TLS_KEY
393944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
403944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian    #ifdef HAVE_ARM_TLS_REGISTER
413944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian        #define GET_TLS(reg) \
423944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            "mrc p15, 0, " #reg ", c13, c0, 3 \n"
433944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian    #else
443944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian        #define GET_TLS(reg) \
453944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            "mov   " #reg ", #0xFFFF0FFF      \n"  \
463944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            "ldr   " #reg ", [" #reg ", #-15] \n"
473944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian    #endif
483944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
493944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian    #define API_ENTRY(_api) __attribute__((naked)) _api
503944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
513944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian    #define CALL_GL_EXTENSION_API(_api)                         \
523944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian         asm volatile(                                          \
533944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            GET_TLS(r12)                                        \
543944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            "ldr   r12, [r12, %[tls]] \n"                       \
553944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            "cmp   r12, #0            \n"                       \
563944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            "ldrne r12, [r12, %[api]] \n"                       \
573944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            "cmpne r12, #0            \n"                       \
583944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            "bxne  r12                \n"                       \
593944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            "bx    lr                 \n"                       \
603944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            :                                                   \
613944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            : [tls] "J"(TLS_SLOT_OPENGL_API*4),                 \
623944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian              [api] "J"(__builtin_offsetof(gl_hooks_t,          \
633944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian                                      ext.extensions[_api]))    \
643944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            :                                                   \
653944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            );
663944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
678daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian    #define GL_EXTENSION_NAME(_n)   __glExtFwd##_n
683944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
693944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian    #define GL_EXTENSION(_n)                         \
703944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian        void API_ENTRY(GL_EXTENSION_NAME(_n))() {    \
713944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian            CALL_GL_EXTENSION_API(_n);               \
723944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian        }
733944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
743944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
753944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian#else
763944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
773944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian    #define GL_EXTENSION_NAME(_n) NULL
783944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
793944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian    #define GL_EXTENSION(_n)
803944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
81f56a960105916a7fd12284109784e5f667661439Mathias Agopian    #warning "eglGetProcAddress() partially supported"
823944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
833944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian#endif
843944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
858daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian#define GL_EXTENSION_LIST(name) \
868daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(0)   name(1)   name(2)   name(3)   \
878daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(4)   name(5)   name(6)   name(7)   \
888daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(8)   name(9)   name(10)  name(11)  \
898daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(12)  name(13)  name(14)  name(15)  \
908daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(16)  name(17)  name(18)  name(19)  \
918daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(20)  name(21)  name(22)  name(23)  \
928daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(24)  name(25)  name(26)  name(27)  \
938daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(28)  name(29)  name(30)  name(31)  \
948daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(32)  name(33)  name(34)  name(35)  \
958daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(36)  name(37)  name(38)  name(39)  \
968daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(40)  name(41)  name(42)  name(43)  \
978daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(44)  name(45)  name(46)  name(47)  \
988daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(48)  name(49)  name(50)  name(51)  \
998daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(52)  name(53)  name(54)  name(55)  \
1008daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(56)  name(57)  name(58)  name(59)  \
1018daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        name(60)  name(61)  name(62)  name(63)
1028daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian
1038daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian
1048daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias AgopianGL_EXTENSION_LIST( GL_EXTENSION )
1058daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian
1068daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian#define GL_EXTENSION_ARRAY(_n)  GL_EXTENSION_NAME(_n),
1073944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
1083944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopianextern const __eglMustCastToProperFunctionPointerType gExtensionForwarders[MAX_NUMBER_OF_GL_EXTENSIONS] = {
1098daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian        GL_EXTENSION_LIST( GL_EXTENSION_ARRAY )
1103944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian };
1113944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
1128daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian#undef GET_TLS
1138daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian#undef GL_EXTENSION_LIST
1148daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian#undef GL_EXTENSION_ARRAY
1153944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian#undef GL_EXTENSION_NAME
1163944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian#undef GL_EXTENSION
1173944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian#undef API_ENTRY
1188daae8f1497af620b3bc3ca6bea63c75340a81a1Mathias Agopian#undef CALL_GL_EXTENSION_API
1193944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
1203944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian// ----------------------------------------------------------------------------
1213944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian}; // namespace android
1223944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian// ----------------------------------------------------------------------------
1233944eab21c4e9511850d8743da498c2cf886d8a6Mathias Agopian
124