gl2.cpp revision b1a39d67be99fe6c4545b25e10ac82a5dd1df634
1b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian/*
2b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** Copyright 2007, The Android Open Source Project
3b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian **
4b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** Licensed under the Apache License, Version 2.0 (the "License");
5b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** you may not use this file except in compliance with the License.
6b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** You may obtain a copy of the License at
7b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian **
8b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian **     http://www.apache.org/licenses/LICENSE-2.0
9b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian **
10b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** Unless required by applicable law or agreed to in writing, software
11b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** distributed under the License is distributed on an "AS IS" BASIS,
12b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian ** 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
23b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <GLES2/gl2.h>
24b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <GLES2/gl2ext.h>
25b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
26b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <cutils/log.h>
27b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include <cutils/properties.h>
28b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
29b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include "hooks.h"
30b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include "egl_impl.h"
31b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
32b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopianusing namespace android;
33b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
34b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian// ----------------------------------------------------------------------------
35b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian// Actual GL entry-points
36b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian// ----------------------------------------------------------------------------
37b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
38b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef API_ENTRY
39b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API
40b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API_RETURN
41b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
42b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#if USE_FAST_TLS_KEY
43b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
44b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    #define API_ENTRY(_api) __attribute__((naked)) _api
45b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
46b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    #define CALL_GL_API(_api, ...)                              \
47b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian         asm volatile(                                          \
48b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            "mov   r12, #0xFFFF0FFF   \n"                       \
49b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            "ldr   r12, [r12, #-15]   \n"                       \
50b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            "ldr   r12, [r12, %[tls]] \n"                       \
51b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            "cmp   r12, #0            \n"                       \
52b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            "ldrne pc,  [r12, %[api]] \n"                       \
53b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            "bx    lr                 \n"                       \
54b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            :                                                   \
55b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            : [tls] "J"(TLS_SLOT_OPENGL_API*4),                 \
56b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian              [api] "J"(__builtin_offsetof(gl_hooks_t, gl2._api))    \
57b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            :                                                   \
58b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian            );
59b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
60b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    #define CALL_GL_API_RETURN(_api, ...) \
61b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian        CALL_GL_API(_api, __VA_ARGS__) \
62b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian        return 0; // placate gcc's warnings. never reached.
63b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
64b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#else
65b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
66b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    #define API_ENTRY(_api) _api
67b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
68b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    #define CALL_GL_API(_api, ...)                                       \
69b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian        gl_hooks_t::gl2_t const * const _c = &getGlThreadSpecific()->gl2; \
70b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian        _c->_api(__VA_ARGS__)
71b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
72b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    #define CALL_GL_API_RETURN(_api, ...)                                \
73b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian        gl_hooks_t::gl2_t const * const _c = &getGlThreadSpecific()->gl2; \
74b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian        return _c->_api(__VA_ARGS__)
75b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
76b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#endif
77b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
78b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
79b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopianextern "C" {
80b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include "gl2_api.in"
81b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#include "gl2ext_api.in"
82b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian}
83b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
84b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef API_ENTRY
85b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API
86b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian#undef CALL_GL_API_RETURN
87b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
88b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
89b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian/*
90b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian * These GL calls are special because they need to EGL to retrieve some
91b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian * informations before they can execute.
92b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian */
93b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
94b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopianextern "C" void __glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image);
95b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopianextern "C" void __glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image);
96b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
97b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
98b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopianvoid glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
99b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian{
100b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    GLeglImageOES implImage =
101b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian        (GLeglImageOES)egl_get_image_for_current_context((EGLImageKHR)image);
102b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    __glEGLImageTargetTexture2DOES(target, implImage);
103b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian}
104b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
105b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopianvoid glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
106b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian{
107b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    GLeglImageOES implImage =
108b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian        (GLeglImageOES)egl_get_image_for_current_context((EGLImageKHR)image);
109b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian    __glEGLImageTargetRenderbufferStorageOES(target, image);
110b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian}
111b1a39d67be99fe6c4545b25e10ac82a5dd1df634Mathias Agopian
112