Home | History | Annotate | Download | only in GLES2
      1 /*
      2  ** Copyright 2007, 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 <string.h>
     19 #include <errno.h>
     20 
     21 #include <sys/ioctl.h>
     22 
     23 #include <GLES2/gl2.h>
     24 #include <GLES2/gl2ext.h>
     25 
     26 #include <cutils/log.h>
     27 #include <cutils/properties.h>
     28 
     29 #include "hooks.h"
     30 #include "egl_impl.h"
     31 
     32 using namespace android;
     33 
     34 // ----------------------------------------------------------------------------
     35 // Actual GL entry-points
     36 // ----------------------------------------------------------------------------
     37 
     38 #undef API_ENTRY
     39 #undef CALL_GL_API
     40 #undef CALL_GL_API_RETURN
     41 
     42 #if USE_FAST_TLS_KEY
     43 
     44     #ifdef HAVE_ARM_TLS_REGISTER
     45         #define GET_TLS(reg) \
     46             "mrc p15, 0, " #reg ", c13, c0, 3 \n"
     47     #else
     48         #define GET_TLS(reg) \
     49             "mov   " #reg ", #0xFFFF0FFF      \n"  \
     50             "ldr   " #reg ", [" #reg ", #-15] \n"
     51     #endif
     52 
     53     #define API_ENTRY(_api) __attribute__((naked)) _api
     54 
     55     #define CALL_GL_API(_api, ...)                              \
     56          asm volatile(                                          \
     57             GET_TLS(r12)                                        \
     58             "ldr   r12, [r12, %[tls]] \n"                       \
     59             "cmp   r12, #0            \n"                       \
     60             "ldrne pc,  [r12, %[api]] \n"                       \
     61             "mov   r0, #0             \n"                       \
     62             "bx    lr                 \n"                       \
     63             :                                                   \
     64             : [tls] "J"(TLS_SLOT_OPENGL_API*4),                 \
     65               [api] "J"(__builtin_offsetof(gl_hooks_t, gl._api))    \
     66             :                                                   \
     67             );
     68 
     69     #define CALL_GL_API_RETURN(_api, ...) \
     70         CALL_GL_API(_api, __VA_ARGS__) \
     71         return 0; // placate gcc's warnings. never reached.
     72 
     73 #else
     74 
     75     #define API_ENTRY(_api) _api
     76 
     77     #define CALL_GL_API(_api, ...)                                       \
     78         gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl;  \
     79         _c->_api(__VA_ARGS__);
     80 
     81     #define CALL_GL_API_RETURN(_api, ...)                                \
     82         gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl;  \
     83         return _c->_api(__VA_ARGS__)
     84 
     85 #endif
     86 
     87 
     88 extern "C" {
     89 #include "gl2_api.in"
     90 #include "gl2ext_api.in"
     91 }
     92 
     93 #undef API_ENTRY
     94 #undef CALL_GL_API
     95 #undef CALL_GL_API_RETURN
     96 
     97 /*
     98  * glGetString() is special because we expose some extensions in the wrapper
     99  */
    100 
    101 extern "C" const GLubyte * __glGetString(GLenum name);
    102 
    103 const GLubyte * glGetString(GLenum name)
    104 {
    105     const GLubyte * ret = egl_get_string_for_current_context(name);
    106     if (ret == NULL) {
    107         ret = __glGetString(name);
    108     }
    109     return ret;
    110 }
    111