blob: 0c9352ec75440f2918a4d85cd12c9ac84352d529 [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/*
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
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080017#include <ctype.h>
18#include <string.h>
19#include <errno.h>
20
21#include <sys/ioctl.h>
22
23#include <GLES/gl.h>
24#include <GLES/glext.h>
25
26#include <cutils/log.h>
27#include <cutils/properties.h>
28
29#include "hooks.h"
Mathias Agopian076b1cc2009-04-10 14:24:30 -070030#include "egl_impl.h"
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080031
32using namespace android;
33
Mathias Agopian7d21a742009-10-08 15:58:11 -070034// set this to 1 for crude GL debugging
35#define CHECK_FOR_GL_ERRORS 0
36
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080037// ----------------------------------------------------------------------------
38// extensions for the framework
39// ----------------------------------------------------------------------------
40
Mathias Agopiand373c632009-05-08 15:35:17 -070041extern "C" {
42GL_API void GL_APIENTRY glColorPointerBounds(GLint size, GLenum type, GLsizei stride,
43 const GLvoid *ptr, GLsizei count);
44GL_API void GL_APIENTRY glNormalPointerBounds(GLenum type, GLsizei stride,
45 const GLvoid *pointer, GLsizei count);
46GL_API void GL_APIENTRY glTexCoordPointerBounds(GLint size, GLenum type,
47 GLsizei stride, const GLvoid *pointer, GLsizei count);
48GL_API void GL_APIENTRY glVertexPointerBounds(GLint size, GLenum type,
49 GLsizei stride, const GLvoid *pointer, GLsizei count);
50}
51
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080052void glColorPointerBounds(GLint size, GLenum type, GLsizei stride,
53 const GLvoid *ptr, GLsizei count) {
54 glColorPointer(size, type, stride, ptr);
55}
56void glNormalPointerBounds(GLenum type, GLsizei stride,
57 const GLvoid *pointer, GLsizei count) {
58 glNormalPointer(type, stride, pointer);
59}
60void glTexCoordPointerBounds(GLint size, GLenum type,
61 GLsizei stride, const GLvoid *pointer, GLsizei count) {
62 glTexCoordPointer(size, type, stride, pointer);
63}
64void glVertexPointerBounds(GLint size, GLenum type,
65 GLsizei stride, const GLvoid *pointer, GLsizei count) {
66 glVertexPointer(size, type, stride, pointer);
67}
68
69// ----------------------------------------------------------------------------
70// Actual GL entry-points
71// ----------------------------------------------------------------------------
72
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080073#undef API_ENTRY
74#undef CALL_GL_API
75#undef CALL_GL_API_RETURN
76
Mathias Agopian7d21a742009-10-08 15:58:11 -070077#if USE_FAST_TLS_KEY && !CHECK_FOR_GL_ERRORS
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080078
Mathias Agopian673d2db2009-10-14 02:39:53 -070079 #ifdef HAVE_ARM_TLS_REGISTER
80 #define GET_TLS(reg) \
81 "mrc p15, 0, " #reg ", c13, c0, 3 \n"
82 #else
83 #define GET_TLS(reg) \
84 "mov " #reg ", #0xFFFF0FFF \n" \
85 "ldr " #reg ", [" #reg ", #-15] \n"
86 #endif
87
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080088 #define API_ENTRY(_api) __attribute__((naked)) _api
89
90 #define CALL_GL_API(_api, ...) \
91 asm volatile( \
Mathias Agopian673d2db2009-10-14 02:39:53 -070092 GET_TLS(r12) \
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080093 "ldr r12, [r12, %[tls]] \n" \
94 "cmp r12, #0 \n" \
95 "ldrne pc, [r12, %[api]] \n" \
96 "bx lr \n" \
97 : \
98 : [tls] "J"(TLS_SLOT_OPENGL_API*4), \
99 [api] "J"(__builtin_offsetof(gl_hooks_t, gl._api)) \
100 : \
101 );
Mathias Agopian673d2db2009-10-14 02:39:53 -0700102
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800103 #define CALL_GL_API_RETURN(_api, ...) \
104 CALL_GL_API(_api, __VA_ARGS__) \
105 return 0; // placate gcc's warnings. never reached.
106
107#else
108
Mathias Agopian7d21a742009-10-08 15:58:11 -0700109 #if CHECK_FOR_GL_ERRORS
110
111 #define CHECK_GL_ERRORS(_api) \
112 do { GLint err = glGetError(); \
113 LOGE_IF(err != GL_NO_ERROR, "%s failed (0x%04X)", #_api, err); \
114 } while(false);
115
116 #else
117
118 #define CHECK_GL_ERRORS(_api) do { } while(false);
119
120 #endif
121
122
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800123 #define API_ENTRY(_api) _api
124
125 #define CALL_GL_API(_api, ...) \
126 gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; \
Mathias Agopian7d21a742009-10-08 15:58:11 -0700127 _c->_api(__VA_ARGS__); \
128 CHECK_GL_ERRORS(_api)
129
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800130 #define CALL_GL_API_RETURN(_api, ...) \
131 gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl; \
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800132 return _c->_api(__VA_ARGS__)
133
134#endif
135
Mathias Agopian076b1cc2009-04-10 14:24:30 -0700136
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800137extern "C" {
138#include "gl_api.in"
Mathias Agopianb519abb2009-04-23 18:05:44 -0700139#include "glext_api.in"
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800140}
141
142#undef API_ENTRY
143#undef CALL_GL_API
144#undef CALL_GL_API_RETURN
145
Mathias Agopian076b1cc2009-04-10 14:24:30 -0700146
147/*
148 * These GL calls are special because they need to EGL to retrieve some
149 * informations before they can execute.
150 */
151
152extern "C" void __glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image);
153extern "C" void __glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image);
154
155
156void glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
157{
158 GLeglImageOES implImage =
159 (GLeglImageOES)egl_get_image_for_current_context((EGLImageKHR)image);
160 __glEGLImageTargetTexture2DOES(target, implImage);
161}
162
163void glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
164{
165 GLeglImageOES implImage =
166 (GLeglImageOES)egl_get_image_for_current_context((EGLImageKHR)image);
167 __glEGLImageTargetRenderbufferStorageOES(target, image);
168}
169