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