xref: /aosp_15_r20/frameworks/native/opengl/libs/GLES2/gl2.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  ** Copyright 2007, The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  **
4*38e8c45fSAndroid Build Coastguard Worker  ** Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  ** you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  ** You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  **
8*38e8c45fSAndroid Build Coastguard Worker  **     http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  **
10*38e8c45fSAndroid Build Coastguard Worker  ** Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  ** distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  ** See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  ** limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #include <ctype.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <errno.h>
19*38e8c45fSAndroid Build Coastguard Worker #include <string.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <sys/ioctl.h>
21*38e8c45fSAndroid Build Coastguard Worker 
22*38e8c45fSAndroid Build Coastguard Worker #include <log/log.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <cutils/properties.h>
24*38e8c45fSAndroid Build Coastguard Worker 
25*38e8c45fSAndroid Build Coastguard Worker #include "../hooks.h"
26*38e8c45fSAndroid Build Coastguard Worker #include "../egl_impl.h"
27*38e8c45fSAndroid Build Coastguard Worker 
28*38e8c45fSAndroid Build Coastguard Worker using namespace android;
29*38e8c45fSAndroid Build Coastguard Worker 
30*38e8c45fSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
31*38e8c45fSAndroid Build Coastguard Worker // Actual GL entry-points
32*38e8c45fSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
33*38e8c45fSAndroid Build Coastguard Worker 
34*38e8c45fSAndroid Build Coastguard Worker #undef API_ENTRY
35*38e8c45fSAndroid Build Coastguard Worker #undef CALL_GL_API
36*38e8c45fSAndroid Build Coastguard Worker #undef CALL_GL_API_INTERNAL_CALL
37*38e8c45fSAndroid Build Coastguard Worker #undef CALL_GL_API_INTERNAL_SET_RETURN_VALUE
38*38e8c45fSAndroid Build Coastguard Worker #undef CALL_GL_API_INTERNAL_DO_RETURN
39*38e8c45fSAndroid Build Coastguard Worker #undef CALL_GL_API_RETURN
40*38e8c45fSAndroid Build Coastguard Worker 
41*38e8c45fSAndroid Build Coastguard Worker #if USE_SLOW_BINDING
42*38e8c45fSAndroid Build Coastguard Worker 
43*38e8c45fSAndroid Build Coastguard Worker     #define API_ENTRY(_api) _api
44*38e8c45fSAndroid Build Coastguard Worker 
45*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_CALL(_api, ...)                         \
46*38e8c45fSAndroid Build Coastguard Worker         gl_hooks_t::gl_t const * const _c = &getGlThreadSpecific()->gl;  \
47*38e8c45fSAndroid Build Coastguard Worker         if (_c) return _c->_api(__VA_ARGS__);
48*38e8c45fSAndroid Build Coastguard Worker 
49*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE return 0;
50*38e8c45fSAndroid Build Coastguard Worker 
51*38e8c45fSAndroid Build Coastguard Worker     // This stays blank, since void functions will implicitly return, and
52*38e8c45fSAndroid Build Coastguard Worker     // all of the other functions will return 0 based on the previous macro.
53*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_DO_RETURN
54*38e8c45fSAndroid Build Coastguard Worker 
55*38e8c45fSAndroid Build Coastguard Worker #elif defined(__arm__)
56*38e8c45fSAndroid Build Coastguard Worker 
57*38e8c45fSAndroid Build Coastguard Worker     #define GET_TLS(reg) "mrc p15, 0, " #reg ", c13, c0, 3 \n"
58*38e8c45fSAndroid Build Coastguard Worker 
59*38e8c45fSAndroid Build Coastguard Worker     #define API_ENTRY(_api) __attribute__((naked,noinline)) _api
60*38e8c45fSAndroid Build Coastguard Worker 
61*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_CALL(_api, ...)                 \
62*38e8c45fSAndroid Build Coastguard Worker         asm volatile(                                            \
63*38e8c45fSAndroid Build Coastguard Worker             GET_TLS(r12)                                         \
64*38e8c45fSAndroid Build Coastguard Worker             "ldr   r12, [r12, %[tls]] \n"                        \
65*38e8c45fSAndroid Build Coastguard Worker             "cmp   r12, #0            \n"                        \
66*38e8c45fSAndroid Build Coastguard Worker             "ldrne pc,  [r12, %[api]] \n"                        \
67*38e8c45fSAndroid Build Coastguard Worker             :                                                    \
68*38e8c45fSAndroid Build Coastguard Worker             : [tls] "J"(TLS_SLOT_OPENGL_API*4),                  \
69*38e8c45fSAndroid Build Coastguard Worker               [api] "J"(__builtin_offsetof(gl_hooks_t, gl._api)) \
70*38e8c45fSAndroid Build Coastguard Worker             : "r0", "r1", "r2", "r3", "r12"                      \
71*38e8c45fSAndroid Build Coastguard Worker         );
72*38e8c45fSAndroid Build Coastguard Worker 
73*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \
74*38e8c45fSAndroid Build Coastguard Worker         asm volatile(                             \
75*38e8c45fSAndroid Build Coastguard Worker             "mov r0, #0 \n"                       \
76*38e8c45fSAndroid Build Coastguard Worker             :                                     \
77*38e8c45fSAndroid Build Coastguard Worker             :                                     \
78*38e8c45fSAndroid Build Coastguard Worker             : "r0"                                \
79*38e8c45fSAndroid Build Coastguard Worker         );
80*38e8c45fSAndroid Build Coastguard Worker 
81*38e8c45fSAndroid Build Coastguard Worker 
82*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_DO_RETURN \
83*38e8c45fSAndroid Build Coastguard Worker         asm volatile(                      \
84*38e8c45fSAndroid Build Coastguard Worker             "bx lr \n"                     \
85*38e8c45fSAndroid Build Coastguard Worker             :                              \
86*38e8c45fSAndroid Build Coastguard Worker             :                              \
87*38e8c45fSAndroid Build Coastguard Worker             : "r0"                         \
88*38e8c45fSAndroid Build Coastguard Worker         );
89*38e8c45fSAndroid Build Coastguard Worker 
90*38e8c45fSAndroid Build Coastguard Worker #elif defined(__aarch64__)
91*38e8c45fSAndroid Build Coastguard Worker 
92*38e8c45fSAndroid Build Coastguard Worker     #define API_ENTRY(_api) __attribute__((naked,noinline)) _api
93*38e8c45fSAndroid Build Coastguard Worker 
94*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_CALL(_api, ...)                    \
95*38e8c45fSAndroid Build Coastguard Worker         asm volatile(                                               \
96*38e8c45fSAndroid Build Coastguard Worker             "mrs x16, tpidr_el0\n"                                  \
97*38e8c45fSAndroid Build Coastguard Worker             "ldr x16, [x16, %[tls]]\n"                              \
98*38e8c45fSAndroid Build Coastguard Worker             "cbz x16, 1f\n"                                         \
99*38e8c45fSAndroid Build Coastguard Worker             "ldr x16, [x16, %[api]]\n"                              \
100*38e8c45fSAndroid Build Coastguard Worker             "br  x16\n"                                             \
101*38e8c45fSAndroid Build Coastguard Worker             "1:\n"                                                  \
102*38e8c45fSAndroid Build Coastguard Worker             :                                                       \
103*38e8c45fSAndroid Build Coastguard Worker             : [tls] "i" (TLS_SLOT_OPENGL_API * sizeof(void*)),      \
104*38e8c45fSAndroid Build Coastguard Worker               [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api))   \
105*38e8c45fSAndroid Build Coastguard Worker             : "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x16" \
106*38e8c45fSAndroid Build Coastguard Worker         );
107*38e8c45fSAndroid Build Coastguard Worker 
108*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \
109*38e8c45fSAndroid Build Coastguard Worker         asm volatile(                             \
110*38e8c45fSAndroid Build Coastguard Worker             "mov w0, wzr \n"                      \
111*38e8c45fSAndroid Build Coastguard Worker             :                                     \
112*38e8c45fSAndroid Build Coastguard Worker             :                                     \
113*38e8c45fSAndroid Build Coastguard Worker             : "w0"                                \
114*38e8c45fSAndroid Build Coastguard Worker         );
115*38e8c45fSAndroid Build Coastguard Worker 
116*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_DO_RETURN \
117*38e8c45fSAndroid Build Coastguard Worker         asm volatile(                      \
118*38e8c45fSAndroid Build Coastguard Worker             "ret \n"                       \
119*38e8c45fSAndroid Build Coastguard Worker             :                              \
120*38e8c45fSAndroid Build Coastguard Worker             :                              \
121*38e8c45fSAndroid Build Coastguard Worker             :                              \
122*38e8c45fSAndroid Build Coastguard Worker         );
123*38e8c45fSAndroid Build Coastguard Worker 
124*38e8c45fSAndroid Build Coastguard Worker #elif defined(__i386__)
125*38e8c45fSAndroid Build Coastguard Worker 
126*38e8c45fSAndroid Build Coastguard Worker     #define API_ENTRY(_api) __attribute__((naked,noinline)) _api
127*38e8c45fSAndroid Build Coastguard Worker 
128*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_CALL(_api, ...)                    \
129*38e8c45fSAndroid Build Coastguard Worker         __asm__ volatile(                                           \
130*38e8c45fSAndroid Build Coastguard Worker             "mov %%gs:0, %%eax\n"                                   \
131*38e8c45fSAndroid Build Coastguard Worker             "mov %P[tls](%%eax), %%eax\n"                           \
132*38e8c45fSAndroid Build Coastguard Worker             "test %%eax, %%eax\n"                                   \
133*38e8c45fSAndroid Build Coastguard Worker             "je 1f\n"                                               \
134*38e8c45fSAndroid Build Coastguard Worker             "jmp *%P[api](%%eax)\n"                                 \
135*38e8c45fSAndroid Build Coastguard Worker             "1:\n"                                                  \
136*38e8c45fSAndroid Build Coastguard Worker             :                                                       \
137*38e8c45fSAndroid Build Coastguard Worker             : [tls] "i" (TLS_SLOT_OPENGL_API*sizeof(void*)),        \
138*38e8c45fSAndroid Build Coastguard Worker               [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api))   \
139*38e8c45fSAndroid Build Coastguard Worker             : "cc", "%eax"                                          \
140*38e8c45fSAndroid Build Coastguard Worker             );
141*38e8c45fSAndroid Build Coastguard Worker 
142*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \
143*38e8c45fSAndroid Build Coastguard Worker         __asm__ volatile(                         \
144*38e8c45fSAndroid Build Coastguard Worker             "xor %%eax, %%eax\n"                  \
145*38e8c45fSAndroid Build Coastguard Worker             :                                     \
146*38e8c45fSAndroid Build Coastguard Worker             :                                     \
147*38e8c45fSAndroid Build Coastguard Worker             : "%eax"                              \
148*38e8c45fSAndroid Build Coastguard Worker         );
149*38e8c45fSAndroid Build Coastguard Worker 
150*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_DO_RETURN \
151*38e8c45fSAndroid Build Coastguard Worker         __asm__ volatile(                  \
152*38e8c45fSAndroid Build Coastguard Worker             "ret\n"                        \
153*38e8c45fSAndroid Build Coastguard Worker             :                              \
154*38e8c45fSAndroid Build Coastguard Worker             :                              \
155*38e8c45fSAndroid Build Coastguard Worker             :                              \
156*38e8c45fSAndroid Build Coastguard Worker         );
157*38e8c45fSAndroid Build Coastguard Worker 
158*38e8c45fSAndroid Build Coastguard Worker #elif defined(__x86_64__)
159*38e8c45fSAndroid Build Coastguard Worker 
160*38e8c45fSAndroid Build Coastguard Worker     #define API_ENTRY(_api) __attribute__((naked,noinline)) _api
161*38e8c45fSAndroid Build Coastguard Worker 
162*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_CALL(_api, ...)                    \
163*38e8c45fSAndroid Build Coastguard Worker         __asm__ volatile(                                           \
164*38e8c45fSAndroid Build Coastguard Worker             "mov %%fs:0, %%rax\n"                                   \
165*38e8c45fSAndroid Build Coastguard Worker             "mov %P[tls](%%rax), %%rax\n"                           \
166*38e8c45fSAndroid Build Coastguard Worker             "test %%rax, %%rax\n"                                   \
167*38e8c45fSAndroid Build Coastguard Worker             "je 1f\n"                                               \
168*38e8c45fSAndroid Build Coastguard Worker             "jmp *%P[api](%%rax)\n"                                 \
169*38e8c45fSAndroid Build Coastguard Worker             "1:\n"                                                  \
170*38e8c45fSAndroid Build Coastguard Worker             :                                                       \
171*38e8c45fSAndroid Build Coastguard Worker             : [tls] "i" (TLS_SLOT_OPENGL_API*sizeof(void*)),        \
172*38e8c45fSAndroid Build Coastguard Worker               [api] "i" (__builtin_offsetof(gl_hooks_t, gl._api))   \
173*38e8c45fSAndroid Build Coastguard Worker             : "cc", "%rdi", "%rsi", "%rdx", "%rcx", "%r8", "%r9",   \
174*38e8c45fSAndroid Build Coastguard Worker               "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", \
175*38e8c45fSAndroid Build Coastguard Worker               "%xmm6", "%xmm7"                                      \
176*38e8c45fSAndroid Build Coastguard Worker         );
177*38e8c45fSAndroid Build Coastguard Worker 
178*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \
179*38e8c45fSAndroid Build Coastguard Worker         __asm__ volatile(                         \
180*38e8c45fSAndroid Build Coastguard Worker             "xor %%eax, %%eax\n"                  \
181*38e8c45fSAndroid Build Coastguard Worker             :                                     \
182*38e8c45fSAndroid Build Coastguard Worker             :                                     \
183*38e8c45fSAndroid Build Coastguard Worker             : "%eax"                              \
184*38e8c45fSAndroid Build Coastguard Worker         );
185*38e8c45fSAndroid Build Coastguard Worker 
186*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_DO_RETURN \
187*38e8c45fSAndroid Build Coastguard Worker         __asm__ volatile(                  \
188*38e8c45fSAndroid Build Coastguard Worker             "retq\n"                       \
189*38e8c45fSAndroid Build Coastguard Worker             :                              \
190*38e8c45fSAndroid Build Coastguard Worker             :                              \
191*38e8c45fSAndroid Build Coastguard Worker             :                              \
192*38e8c45fSAndroid Build Coastguard Worker         );
193*38e8c45fSAndroid Build Coastguard Worker 
194*38e8c45fSAndroid Build Coastguard Worker #elif defined(__riscv)
195*38e8c45fSAndroid Build Coastguard Worker 
196*38e8c45fSAndroid Build Coastguard Worker     #define API_ENTRY(_api) __attribute__((naked,noinline)) _api
197*38e8c45fSAndroid Build Coastguard Worker 
198*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_CALL(_api, ...)                 \
199*38e8c45fSAndroid Build Coastguard Worker         asm volatile(                                            \
200*38e8c45fSAndroid Build Coastguard Worker             "mv t0, tp\n"                                        \
201*38e8c45fSAndroid Build Coastguard Worker             "li t1, %[tls]\n"                                    \
202*38e8c45fSAndroid Build Coastguard Worker             "add t0, t0, t1\n"                                   \
203*38e8c45fSAndroid Build Coastguard Worker             "ld t0, 0(t0)\n"                                     \
204*38e8c45fSAndroid Build Coastguard Worker             "beqz t0, 1f\n"                                      \
205*38e8c45fSAndroid Build Coastguard Worker             "li t1, %[api]\n"                                    \
206*38e8c45fSAndroid Build Coastguard Worker             "add t0, t0, t1\n"                                   \
207*38e8c45fSAndroid Build Coastguard Worker             "ld t0, 0(t0)\n"                                     \
208*38e8c45fSAndroid Build Coastguard Worker             "jalr x0, t0\n"                                      \
209*38e8c45fSAndroid Build Coastguard Worker             "1:\n"                                               \
210*38e8c45fSAndroid Build Coastguard Worker             :                                                    \
211*38e8c45fSAndroid Build Coastguard Worker             : [tls] "i"(TLS_SLOT_OPENGL_API*sizeof(void *)),     \
212*38e8c45fSAndroid Build Coastguard Worker               [api] "i"(__builtin_offsetof(gl_hooks_t, gl._api)) \
213*38e8c45fSAndroid Build Coastguard Worker             : "t0", "t1", "t2", "a0", "a1", "a2", "a3", "a4",    \
214*38e8c45fSAndroid Build Coastguard Worker               "a5", "t6", "t3", "t4", "t5", "t6"                 \
215*38e8c45fSAndroid Build Coastguard Worker         );
216*38e8c45fSAndroid Build Coastguard Worker 
217*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_SET_RETURN_VALUE \
218*38e8c45fSAndroid Build Coastguard Worker         asm volatile(                             \
219*38e8c45fSAndroid Build Coastguard Worker             "li a0, 0\n"                          \
220*38e8c45fSAndroid Build Coastguard Worker             :                                     \
221*38e8c45fSAndroid Build Coastguard Worker             :                                     \
222*38e8c45fSAndroid Build Coastguard Worker             : "a0"                                \
223*38e8c45fSAndroid Build Coastguard Worker         );
224*38e8c45fSAndroid Build Coastguard Worker 
225*38e8c45fSAndroid Build Coastguard Worker     #define CALL_GL_API_INTERNAL_DO_RETURN \
226*38e8c45fSAndroid Build Coastguard Worker         asm volatile(                      \
227*38e8c45fSAndroid Build Coastguard Worker             "ret\n"                        \
228*38e8c45fSAndroid Build Coastguard Worker             :                              \
229*38e8c45fSAndroid Build Coastguard Worker             :                              \
230*38e8c45fSAndroid Build Coastguard Worker             :                              \
231*38e8c45fSAndroid Build Coastguard Worker         );
232*38e8c45fSAndroid Build Coastguard Worker 
233*38e8c45fSAndroid Build Coastguard Worker #endif
234*38e8c45fSAndroid Build Coastguard Worker 
235*38e8c45fSAndroid Build Coastguard Worker #define CALL_GL_API(_api, ...) \
236*38e8c45fSAndroid Build Coastguard Worker     CALL_GL_API_INTERNAL_CALL(_api, __VA_ARGS__) \
237*38e8c45fSAndroid Build Coastguard Worker     CALL_GL_API_INTERNAL_DO_RETURN
238*38e8c45fSAndroid Build Coastguard Worker 
239*38e8c45fSAndroid Build Coastguard Worker #define CALL_GL_API_RETURN(_api, ...) \
240*38e8c45fSAndroid Build Coastguard Worker     CALL_GL_API_INTERNAL_CALL(_api, __VA_ARGS__) \
241*38e8c45fSAndroid Build Coastguard Worker     CALL_GL_API_INTERNAL_SET_RETURN_VALUE \
242*38e8c45fSAndroid Build Coastguard Worker     CALL_GL_API_INTERNAL_DO_RETURN
243*38e8c45fSAndroid Build Coastguard Worker 
244*38e8c45fSAndroid Build Coastguard Worker extern "C" {
245*38e8c45fSAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wunused-parameter"
246*38e8c45fSAndroid Build Coastguard Worker #include "gl2_api.in"
247*38e8c45fSAndroid Build Coastguard Worker #include "gl2ext_api.in"
248*38e8c45fSAndroid Build Coastguard Worker #pragma GCC diagnostic warning "-Wunused-parameter"
249*38e8c45fSAndroid Build Coastguard Worker }
250*38e8c45fSAndroid Build Coastguard Worker 
251*38e8c45fSAndroid Build Coastguard Worker #undef API_ENTRY
252*38e8c45fSAndroid Build Coastguard Worker #undef CALL_GL_API
253*38e8c45fSAndroid Build Coastguard Worker #undef CALL_GL_API_INTERNAL_CALL
254*38e8c45fSAndroid Build Coastguard Worker #undef CALL_GL_API_INTERNAL_SET_RETURN_VALUE
255*38e8c45fSAndroid Build Coastguard Worker #undef CALL_GL_API_INTERNAL_DO_RETURN
256*38e8c45fSAndroid Build Coastguard Worker #undef CALL_GL_API_RETURN
257*38e8c45fSAndroid Build Coastguard Worker 
258*38e8c45fSAndroid Build Coastguard Worker /*
259*38e8c45fSAndroid Build Coastguard Worker  * glGetString() and glGetStringi() are special because we expose some
260*38e8c45fSAndroid Build Coastguard Worker  * extensions in the wrapper. Also, wrapping glGetXXX() is required because
261*38e8c45fSAndroid Build Coastguard Worker  * the value returned for GL_NUM_EXTENSIONS may have been altered by the
262*38e8c45fSAndroid Build Coastguard Worker  * injection of the additional extensions.
263*38e8c45fSAndroid Build Coastguard Worker  */
264*38e8c45fSAndroid Build Coastguard Worker 
265*38e8c45fSAndroid Build Coastguard Worker extern "C" {
266*38e8c45fSAndroid Build Coastguard Worker     const GLubyte * __glGetString(GLenum name);
267*38e8c45fSAndroid Build Coastguard Worker     const GLubyte * __glGetStringi(GLenum name, GLuint index);
268*38e8c45fSAndroid Build Coastguard Worker     void __glGetBooleanv(GLenum pname, GLboolean * data);
269*38e8c45fSAndroid Build Coastguard Worker     void __glGetFloatv(GLenum pname, GLfloat * data);
270*38e8c45fSAndroid Build Coastguard Worker     void __glGetIntegerv(GLenum pname, GLint * data);
271*38e8c45fSAndroid Build Coastguard Worker     void __glGetInteger64v(GLenum pname, GLint64 * data);
272*38e8c45fSAndroid Build Coastguard Worker }
273*38e8c45fSAndroid Build Coastguard Worker 
glGetString(GLenum name)274*38e8c45fSAndroid Build Coastguard Worker const GLubyte * glGetString(GLenum name) {
275*38e8c45fSAndroid Build Coastguard Worker     egl_connection_t* const cnx = egl_get_connection();
276*38e8c45fSAndroid Build Coastguard Worker     return cnx->platform.glGetString(name);
277*38e8c45fSAndroid Build Coastguard Worker }
278*38e8c45fSAndroid Build Coastguard Worker 
glGetStringi(GLenum name,GLuint index)279*38e8c45fSAndroid Build Coastguard Worker const GLubyte * glGetStringi(GLenum name, GLuint index) {
280*38e8c45fSAndroid Build Coastguard Worker     egl_connection_t* const cnx = egl_get_connection();
281*38e8c45fSAndroid Build Coastguard Worker     return cnx->platform.glGetStringi(name, index);
282*38e8c45fSAndroid Build Coastguard Worker }
283*38e8c45fSAndroid Build Coastguard Worker 
glGetBooleanv(GLenum pname,GLboolean * data)284*38e8c45fSAndroid Build Coastguard Worker void glGetBooleanv(GLenum pname, GLboolean * data) {
285*38e8c45fSAndroid Build Coastguard Worker     egl_connection_t* const cnx = egl_get_connection();
286*38e8c45fSAndroid Build Coastguard Worker     return cnx->platform.glGetBooleanv(pname, data);
287*38e8c45fSAndroid Build Coastguard Worker }
288*38e8c45fSAndroid Build Coastguard Worker 
glGetFloatv(GLenum pname,GLfloat * data)289*38e8c45fSAndroid Build Coastguard Worker void glGetFloatv(GLenum pname, GLfloat * data) {
290*38e8c45fSAndroid Build Coastguard Worker     egl_connection_t* const cnx = egl_get_connection();
291*38e8c45fSAndroid Build Coastguard Worker     return cnx->platform.glGetFloatv(pname, data);
292*38e8c45fSAndroid Build Coastguard Worker }
293*38e8c45fSAndroid Build Coastguard Worker 
glGetIntegerv(GLenum pname,GLint * data)294*38e8c45fSAndroid Build Coastguard Worker void glGetIntegerv(GLenum pname, GLint * data) {
295*38e8c45fSAndroid Build Coastguard Worker     egl_connection_t* const cnx = egl_get_connection();
296*38e8c45fSAndroid Build Coastguard Worker     return cnx->platform.glGetIntegerv(pname, data);
297*38e8c45fSAndroid Build Coastguard Worker }
298*38e8c45fSAndroid Build Coastguard Worker 
glGetInteger64v(GLenum pname,GLint64 * data)299*38e8c45fSAndroid Build Coastguard Worker void glGetInteger64v(GLenum pname, GLint64 * data) {
300*38e8c45fSAndroid Build Coastguard Worker     egl_connection_t* const cnx = egl_get_connection();
301*38e8c45fSAndroid Build Coastguard Worker     return cnx->platform.glGetInteger64v(pname, data);
302*38e8c45fSAndroid Build Coastguard Worker }
303