gl2.cpp revision 4774338bd0ad1ebe42c311fd0c72f13786b5c800
14774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall/*
2b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** Copyright 2007, The Android Open Source Project
3b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian **
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
7b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian **
84774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall **     http://www.apache.org/licenses/LICENSE-2.0
9b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian **
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
14b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** limitations under the License.
15b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian */
16b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
17b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <ctype.h>
18b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <string.h>
19b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <errno.h>
20b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
21b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <sys/ioctl.h>
22b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
234774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall#include <GLES3/gl3.h>
244774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall#include <GLES3/gl3ext.h>
25b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <GLES2/gl2ext.h>
26b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
27b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <cutils/log.h>
28b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <cutils/properties.h>
29b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
30b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include "hooks.h"
31b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include "egl_impl.h"
32b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
33b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopianusing namespace android;
34b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
35b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian// ----------------------------------------------------------------------------
36b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian// Actual GL entry-points
37b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian// ----------------------------------------------------------------------------
38b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
39b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef API_ENTRY
40b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API
41b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API_RETURN
42b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
43e8b0fac720b249639fa1cf2f3a06f7d88d207b76Chet Haase#if USE_FAST_TLS_KEY
44b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
45673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian    #ifdef HAVE_ARM_TLS_REGISTER
46673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian        #define GET_TLS(reg) \
47673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian            "mrc p15, 0, " #reg ", c13, c0, 3 \n"
48673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian    #else
49673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian        #define GET_TLS(reg) \
50673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian            "mov   " #reg ", #0xFFFF0FFF      \n"  \
51673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian            "ldr   " #reg ", [" #reg ", #-15] \n"
52673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian    #endif
53673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian
54b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    #define API_ENTRY(_api) __attribute__((naked)) _api
55b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
56b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    #define CALL_GL_API(_api, ...)                              \
57b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian         asm volatile(                                          \
58673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian            GET_TLS(r12)                                        \
59b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            "ldr   r12, [r12, %[tls]] \n"                       \
60b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            "cmp   r12, #0            \n"                       \
61b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            "ldrne pc,  [r12, %[api]] \n"                       \
626f0871222f04dfeb479d37fe9753d491e3150e42Mathias Agopian            "mov   r0, #0             \n"                       \
63b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            "bx    lr                 \n"                       \
64b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            :                                                   \
65b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            : [tls] "J"(TLS_SLOT_OPENGL_API*4),                 \
66618fa10949c42eb83fa5fe105fe542bcff833ddaMathias Agopian              [api] "J"(__builtin_offsetof(gl_hooks_t, gl._api))    \
67b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            :                                                   \
68b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            );
69673d2dbaae647abc58b08de873fd364f0b2fa3f5Mathias Agopian
70b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    #define CALL_GL_API_RETURN(_api, ...) \
71b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian        CALL_GL_API(_api, __VA_ARGS__) \
72b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian        return 0; // placate gcc's warnings. never reached.
73b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
74b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#else
75b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
76b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    #define API_ENTRY(_api) _api
77b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
78b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    #define CALL_GL_API(_api, ...)                                       \
79618fa10949c42eb83fa5fe105fe542bcff833ddaMathias Agopian        gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl;  \
807e5099a9ece6a3ed7edb1b5bf60a43422428326cJesse Hall        _c->_api(__VA_ARGS__);
817e5099a9ece6a3ed7edb1b5bf60a43422428326cJesse Hall
82b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    #define CALL_GL_API_RETURN(_api, ...)                                \
83618fa10949c42eb83fa5fe105fe542bcff833ddaMathias Agopian        gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl;  \
84b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian        return _c->_api(__VA_ARGS__)
85b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
86b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#endif
87b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
88b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
89b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopianextern "C" {
904774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall#include "gl3_api.in"
91b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include "gl2ext_api.in"
924774338bd0ad1ebe42c311fd0c72f13786b5c800Jesse Hall#include "gl3ext_api.in"
93b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian}
94b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
95b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef API_ENTRY
96b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API
97b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API_RETURN
98b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
9948d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian/*
10048d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian * glGetString() is special because we expose some extensions in the wrapper
10148d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian */
10248d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian
10348d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopianextern "C" const GLubyte * __glGetString(GLenum name);
10448d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian
10548d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopianconst GLubyte * glGetString(GLenum name)
10648d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian{
10748d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian    const GLubyte * ret = egl_get_string_for_current_context(name);
10848d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian    if (ret == NULL) {
10948d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian        ret = __glGetString(name);
11048d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian    }
11148d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian    return ret;
11248d438d05f14c2f4bd83ae89f520368cd49122dfMathias Agopian}
113