• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  /*
99   * These GL calls are special because they need to EGL to retrieve some
100   * informations before they can execute.
101   */
102  
103  extern "C" void __glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image);
104  extern "C" void __glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image);
105  
106  
glEGLImageTargetTexture2DOES(GLenum target,GLeglImageOES image)107  void glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
108  {
109      GLeglImageOES implImage =
110          (GLeglImageOES)egl_get_image_for_current_context((EGLImageKHR)image);
111      __glEGLImageTargetTexture2DOES(target, implImage);
112  }
113  
glEGLImageTargetRenderbufferStorageOES(GLenum target,GLeglImageOES image)114  void glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
115  {
116      GLeglImageOES implImage =
117          (GLeglImageOES)egl_get_image_for_current_context((EGLImageKHR)image);
118      __glEGLImageTargetRenderbufferStorageOES(target, implImage);
119  }
120  
121