OSDN Git Service

Merge "Add runtime debugging capabilities to OpenGL" into jb-mr1-dev
[android-x86/frameworks-native.git] / opengl / libs / GLES2 / gl2.cpp
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 }