• 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  #ifndef ANDROID_GLES_CM_HOOKS_H
18  #define ANDROID_GLES_CM_HOOKS_H
19  
20  #include <ctype.h>
21  #include <string.h>
22  #include <errno.h>
23  
24  #include <pthread.h>
25  
26  #include <EGL/egl.h>
27  #include <EGL/eglext.h>
28  #include <GLES/gl.h>
29  #include <GLES/glext.h>
30  #include <GLES2/gl2.h>
31  #include <GLES2/gl2ext.h>
32  #include <GLES3/gl3.h>
33  #include <GLES3/gl31.h>
34  
35  // set to 1 for debugging
36  #define USE_SLOW_BINDING    0
37  
38  #undef NELEM
39  #define NELEM(x)            (sizeof(x)/sizeof(*(x)))
40  
41  // maximum number of GL extensions that can be used simultaneously in
42  // a given process. this limitation exists because we need to have
43  // a static function for each extension and currently these static functions
44  // are generated at compile time.
45  #define MAX_NUMBER_OF_GL_EXTENSIONS 256
46  
47  
48  #include <bionic_tls.h>  /* special private C library header */
49  
50  // ----------------------------------------------------------------------------
51  namespace android {
52  // ----------------------------------------------------------------------------
53  
54  // GL / EGL hooks
55  
56  #undef GL_ENTRY
57  #undef EGL_ENTRY
58  #define GL_ENTRY(_r, _api, ...) _r (*_api)(__VA_ARGS__);
59  #define EGL_ENTRY(_r, _api, ...) _r (*_api)(__VA_ARGS__);
60  
61  struct egl_t {
62      #include "EGL/egl_entries.in"
63  };
64  
65  struct gl_hooks_t {
66      struct gl_t {
67          #include "entries.in"
68      } gl;
69      struct gl_ext_t {
70          __eglMustCastToProperFunctionPointerType extensions[MAX_NUMBER_OF_GL_EXTENSIONS];
71      } ext;
72  };
73  #undef GL_ENTRY
74  #undef EGL_ENTRY
75  
76  EGLAPI void setGlThreadSpecific(gl_hooks_t const *value);
77  
78  // We have a dedicated TLS slot in bionic
get_tls_hooks()79  inline gl_hooks_t const * volatile * get_tls_hooks() {
80      volatile void *tls_base = __get_tls();
81      gl_hooks_t const * volatile * tls_hooks =
82              reinterpret_cast<gl_hooks_t const * volatile *>(tls_base);
83      return tls_hooks;
84  }
85  
getGlThreadSpecific()86  inline EGLAPI gl_hooks_t const* getGlThreadSpecific() {
87      gl_hooks_t const * volatile * tls_hooks = get_tls_hooks();
88      gl_hooks_t const* hooks = tls_hooks[TLS_SLOT_OPENGL_API];
89      return hooks;
90  }
91  
92  // ----------------------------------------------------------------------------
93  }; // namespace android
94  // ----------------------------------------------------------------------------
95  
96  #endif /* ANDROID_GLES_CM_HOOKS_H */
97