14774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** Copyright 2007, The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project **
44774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** Licensed under the Apache License, Version 2.0 (the "License");
54774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** you may not use this file except in compliance with the License.
64774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project **
84774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall **     http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project **
104774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** Unless required by applicable law or agreed to in writing, software
114774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** distributed under the License is distributed on an "AS IS" BASIS,
124774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall ** See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ** limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_GLES_CM_HOOKS_H
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_GLES_CM_HOOKS_H
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ctype.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <errno.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
24de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian#include <pthread.h>
25de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <EGL/egl.h>
2753238bddeab7b4633bfdb59fac67b0af1211955aMathias Agopian#include <EGL/eglext.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
2953238bddeab7b4633bfdb59fac67b0af1211955aMathias Agopian#include <GLES/glext.h>
30b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <GLES2/gl2.h>
31b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <GLES2/gl2ext.h>
324774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall#include <GLES3/gl3.h>
33fca1b54031a1ba2a3c82bbbbe71716cd7e6a61d7Jesse Hall#include <GLES3/gl31.h>
34b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
35e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian// set to 1 for debugging
36e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian#define USE_SLOW_BINDING    0
37e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef NELEM
39e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian#define NELEM(x)            (sizeof(x)/sizeof(*(x)))
4031272606149d83437a097800074b21e9e6a205adMathias Agopian
4131272606149d83437a097800074b21e9e6a205adMathias Agopian// maximum number of GL extensions that can be used simultaneously in
4231272606149d83437a097800074b21e9e6a205adMathias Agopian// a given process. this limitation exists because we need to have
4331272606149d83437a097800074b21e9e6a205adMathias Agopian// a static function for each extension and currently these static functions
4431272606149d83437a097800074b21e9e6a205adMathias Agopian// are generated at compile time.
4531272606149d83437a097800074b21e9e6a205adMathias Agopian#define MAX_NUMBER_OF_GL_EXTENSIONS 256
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
48e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian#include <bionic_tls.h>  /* special private C library header */
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// GL / EGL hooks
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef GL_ENTRY
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef EGL_ENTRY
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define GL_ENTRY(_r, _api, ...) _r (*_api)(__VA_ARGS__);
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define EGL_ENTRY(_r, _api, ...) _r (*_api)(__VA_ARGS__);
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61618fa10949c42eb83fa5fe105fe542bcff833ddaMathias Agopianstruct egl_t {
62618fa10949c42eb83fa5fe105fe542bcff833ddaMathias Agopian    #include "EGL/egl_entries.in"
63618fa10949c42eb83fa5fe105fe542bcff833ddaMathias Agopian};
64618fa10949c42eb83fa5fe105fe542bcff833ddaMathias Agopian
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct gl_hooks_t {
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    struct gl_t {
67618fa10949c42eb83fa5fe105fe542bcff833ddaMathias Agopian        #include "entries.in"
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } gl;
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    struct gl_ext_t {
7024035338ed6329e4d85fb00cf99a91e2cdd55ba5Mathias Agopian        __eglMustCastToProperFunctionPointerType extensions[MAX_NUMBER_OF_GL_EXTENSIONS];
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } ext;
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef GL_ENTRY
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#undef EGL_ENTRY
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
761cadb25da1ed875bdd078270e642966724a0c39aMathias AgopianEGLAPI void setGlThreadSpecific(gl_hooks_t const *value);
77e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian
78e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian// We have a dedicated TLS slot in bionic
79e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopianinline gl_hooks_t const * volatile * get_tls_hooks() {
80e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian    volatile void *tls_base = __get_tls();
81e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian    gl_hooks_t const * volatile * tls_hooks =
82e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian            reinterpret_cast<gl_hooks_t const * volatile *>(tls_base);
83e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian    return tls_hooks;
84e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian}
85e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian
86e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopianinline EGLAPI gl_hooks_t const* getGlThreadSpecific() {
87e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian    gl_hooks_t const * volatile * tls_hooks = get_tls_hooks();
88e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian    gl_hooks_t const* hooks = tls_hooks[TLS_SLOT_OPENGL_API];
89e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian    return hooks;
90e0ea89ceef3b0fc5f3efc5d709a8156f0628c6c8Mathias Agopian}
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ----------------------------------------------------------------------------
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif /* ANDROID_GLES_CM_HOOKS_H */
97