1 /*
2 ** Copyright 2018, 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 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
18
19 #include <EGL/egl.h>
20 #include <EGL/eglext.h>
21
22 #include "../egl_impl.h"
23
24 #include "egl_layers.h"
25 #include "egl_platform_entries.h"
26 #include "egl_tls.h"
27 #include "egl_trace.h"
28
29 using namespace android;
30
31 namespace android {
32
33 extern EGLBoolean egl_init_drivers();
34
35 } // namespace android
36
clearError()37 static inline void clearError() {
38 egl_tls_t::clearError();
39 }
40
eglGetDisplay(EGLNativeDisplayType display)41 EGLDisplay eglGetDisplay(EGLNativeDisplayType display) {
42 ATRACE_CALL();
43 clearError();
44
45 if (egl_init_drivers() == EGL_FALSE) {
46 return setError(EGL_BAD_PARAMETER, EGL_NO_DISPLAY);
47 }
48
49 // Call down the chain, which usually points directly to the impl
50 // but may also be routed through layers
51 egl_connection_t* const cnx = &gEGLImpl;
52 return cnx->platform.eglGetDisplay(display);
53 }
54
eglGetPlatformDisplay(EGLenum platform,EGLNativeDisplayType display,const EGLAttrib * attrib_list)55 EGLDisplay eglGetPlatformDisplay(EGLenum platform, EGLNativeDisplayType display,
56 const EGLAttrib* attrib_list) {
57 ATRACE_CALL();
58 clearError();
59
60 if (egl_init_drivers() == EGL_FALSE) {
61 return setError(EGL_BAD_PARAMETER, EGL_NO_DISPLAY);
62 }
63
64 // Call down the chain, which usually points directly to the impl
65 // but may also be routed through layers
66 egl_connection_t* const cnx = &gEGLImpl;
67 return cnx->platform.eglGetPlatformDisplay(platform, display, attrib_list);
68 }
69
eglInitialize(EGLDisplay dpy,EGLint * major,EGLint * minor)70 EGLBoolean eglInitialize(EGLDisplay dpy, EGLint* major, EGLint* minor) {
71 clearError();
72
73 egl_connection_t* const cnx = &gEGLImpl;
74 return cnx->platform.eglInitialize(dpy, major, minor);
75 }
76
eglTerminate(EGLDisplay dpy)77 EGLBoolean eglTerminate(EGLDisplay dpy) {
78 clearError();
79
80 egl_connection_t* const cnx = &gEGLImpl;
81 return cnx->platform.eglTerminate(dpy);
82 }
83
eglGetConfigs(EGLDisplay dpy,EGLConfig * configs,EGLint config_size,EGLint * num_config)84 EGLBoolean eglGetConfigs(EGLDisplay dpy, EGLConfig* configs, EGLint config_size,
85 EGLint* num_config) {
86 clearError();
87
88 egl_connection_t* const cnx = &gEGLImpl;
89 return cnx->platform.eglGetConfigs(dpy, configs, config_size, num_config);
90 }
91
eglChooseConfig(EGLDisplay dpy,const EGLint * attrib_list,EGLConfig * configs,EGLint config_size,EGLint * num_config)92 EGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint* attrib_list, EGLConfig* configs,
93 EGLint config_size, EGLint* num_config) {
94 clearError();
95
96 egl_connection_t* const cnx = &gEGLImpl;
97 return cnx->platform.eglChooseConfig(dpy, attrib_list, configs, config_size, num_config);
98 }
99
eglGetConfigAttrib(EGLDisplay dpy,EGLConfig config,EGLint attribute,EGLint * value)100 EGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint* value) {
101 clearError();
102
103 egl_connection_t* const cnx = &gEGLImpl;
104 return cnx->platform.eglGetConfigAttrib(dpy, config, attribute, value);
105 }
106
eglCreateWindowSurface(EGLDisplay dpy,EGLConfig config,NativeWindowType window,const EGLint * attrib_list)107 EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, NativeWindowType window,
108 const EGLint* attrib_list) {
109 clearError();
110
111 egl_connection_t* const cnx = &gEGLImpl;
112 return cnx->platform.eglCreateWindowSurface(dpy, config, window, attrib_list);
113 }
114
eglCreatePlatformWindowSurface(EGLDisplay dpy,EGLConfig config,void * native_window,const EGLAttrib * attrib_list)115 EGLSurface eglCreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config, void* native_window,
116 const EGLAttrib* attrib_list) {
117 clearError();
118
119 egl_connection_t* const cnx = &gEGLImpl;
120 return cnx->platform.eglCreatePlatformWindowSurface(dpy, config, native_window, attrib_list);
121 }
122
eglCreatePixmapSurface(EGLDisplay dpy,EGLConfig config,NativePixmapType pixmap,const EGLint * attrib_list)123 EGLSurface eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, NativePixmapType pixmap,
124 const EGLint* attrib_list) {
125 clearError();
126
127 egl_connection_t* const cnx = &gEGLImpl;
128 return cnx->platform.eglCreatePixmapSurface(dpy, config, pixmap, attrib_list);
129 }
130
eglCreatePlatformPixmapSurface(EGLDisplay dpy,EGLConfig config,void * native_pixmap,const EGLAttrib * attrib_list)131 EGLSurface eglCreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, void* native_pixmap,
132 const EGLAttrib* attrib_list) {
133 clearError();
134
135 egl_connection_t* const cnx = &gEGLImpl;
136 return cnx->platform.eglCreatePlatformPixmapSurface(dpy, config, native_pixmap, attrib_list);
137 }
138
eglCreatePbufferSurface(EGLDisplay dpy,EGLConfig config,const EGLint * attrib_list)139 EGLSurface eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint* attrib_list) {
140 clearError();
141
142 egl_connection_t* const cnx = &gEGLImpl;
143 return cnx->platform.eglCreatePbufferSurface(dpy, config, attrib_list);
144 }
145
eglDestroySurface(EGLDisplay dpy,EGLSurface surface)146 EGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface surface) {
147 clearError();
148
149 egl_connection_t* const cnx = &gEGLImpl;
150 return cnx->platform.eglDestroySurface(dpy, surface);
151 }
152
eglQuerySurface(EGLDisplay dpy,EGLSurface surface,EGLint attribute,EGLint * value)153 EGLBoolean eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint* value) {
154 clearError();
155
156 egl_connection_t* const cnx = &gEGLImpl;
157 return cnx->platform.eglQuerySurface(dpy, surface, attribute, value);
158 }
159
eglBeginFrame(EGLDisplay dpy,EGLSurface surface)160 void EGLAPI eglBeginFrame(EGLDisplay dpy, EGLSurface surface) {
161 ATRACE_CALL();
162 clearError();
163
164 egl_connection_t* const cnx = &gEGLImpl;
165 cnx->platform.eglBeginFrame(dpy, surface);
166 }
167
eglCreateContext(EGLDisplay dpy,EGLConfig config,EGLContext share_list,const EGLint * attrib_list)168 EGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
169 const EGLint* attrib_list) {
170 clearError();
171
172 egl_connection_t* const cnx = &gEGLImpl;
173 return cnx->platform.eglCreateContext(dpy, config, share_list, attrib_list);
174 }
175
eglDestroyContext(EGLDisplay dpy,EGLContext ctx)176 EGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) {
177 clearError();
178
179 egl_connection_t* const cnx = &gEGLImpl;
180 return cnx->platform.eglDestroyContext(dpy, ctx);
181 }
182
eglMakeCurrent(EGLDisplay dpy,EGLSurface draw,EGLSurface read,EGLContext ctx)183 EGLBoolean eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) {
184 clearError();
185
186 egl_connection_t* const cnx = &gEGLImpl;
187 return cnx->platform.eglMakeCurrent(dpy, draw, read, ctx);
188 }
189
eglQueryContext(EGLDisplay dpy,EGLContext ctx,EGLint attribute,EGLint * value)190 EGLBoolean eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint* value) {
191 clearError();
192
193 egl_connection_t* const cnx = &gEGLImpl;
194 return cnx->platform.eglQueryContext(dpy, ctx, attribute, value);
195 }
196
eglGetCurrentContext(void)197 EGLContext eglGetCurrentContext(void) {
198 clearError();
199
200 egl_connection_t* const cnx = &gEGLImpl;
201 return cnx->platform.eglGetCurrentContext();
202 }
203
eglGetCurrentSurface(EGLint readdraw)204 EGLSurface eglGetCurrentSurface(EGLint readdraw) {
205 clearError();
206
207 egl_connection_t* const cnx = &gEGLImpl;
208 return cnx->platform.eglGetCurrentSurface(readdraw);
209 }
210
eglGetCurrentDisplay(void)211 EGLDisplay eglGetCurrentDisplay(void) {
212 clearError();
213
214 egl_connection_t* const cnx = &gEGLImpl;
215 return cnx->platform.eglGetCurrentDisplay();
216 }
217
eglWaitGL(void)218 EGLBoolean eglWaitGL(void) {
219 clearError();
220
221 egl_connection_t* const cnx = &gEGLImpl;
222 return cnx->platform.eglWaitGL();
223 }
224
eglWaitNative(EGLint engine)225 EGLBoolean eglWaitNative(EGLint engine) {
226 clearError();
227
228 egl_connection_t* const cnx = &gEGLImpl;
229 return cnx->platform.eglWaitNative(engine);
230 }
231
eglGetError(void)232 EGLint eglGetError(void) {
233 egl_connection_t* const cnx = &gEGLImpl;
234 return cnx->platform.eglGetError();
235 }
236
eglGetProcAddress(const char * procname)237 __eglMustCastToProperFunctionPointerType eglGetProcAddress(const char* procname) {
238 // eglGetProcAddress() could be the very first function called
239 // in which case we must make sure we've initialized ourselves, this
240 // happens the first time egl_get_display() is called.
241
242 clearError();
243
244 if (egl_init_drivers() == EGL_FALSE) {
245 setError(EGL_BAD_PARAMETER, NULL);
246 return nullptr;
247 }
248
249 egl_connection_t* const cnx = &gEGLImpl;
250 return cnx->platform.eglGetProcAddress(procname);
251 }
252
eglSwapBuffersWithDamageKHR(EGLDisplay dpy,EGLSurface draw,EGLint * rects,EGLint n_rects)253 EGLBoolean eglSwapBuffersWithDamageKHR(EGLDisplay dpy, EGLSurface draw, EGLint* rects,
254 EGLint n_rects) {
255 ATRACE_CALL();
256 clearError();
257
258 egl_connection_t* const cnx = &gEGLImpl;
259 return cnx->platform.eglSwapBuffersWithDamageKHR(dpy, draw, rects, n_rects);
260 }
261
eglSwapBuffers(EGLDisplay dpy,EGLSurface surface)262 EGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) {
263 ATRACE_CALL();
264 clearError();
265
266 egl_connection_t* const cnx = &gEGLImpl;
267 return cnx->platform.eglSwapBuffers(dpy, surface);
268 }
269
eglCopyBuffers(EGLDisplay dpy,EGLSurface surface,NativePixmapType target)270 EGLBoolean eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, NativePixmapType target) {
271 clearError();
272
273 egl_connection_t* const cnx = &gEGLImpl;
274 return cnx->platform.eglCopyBuffers(dpy, surface, target);
275 }
276
eglQueryString(EGLDisplay dpy,EGLint name)277 const char* eglQueryString(EGLDisplay dpy, EGLint name) {
278 clearError();
279
280 egl_connection_t* const cnx = &gEGLImpl;
281 return cnx->platform.eglQueryString(dpy, name);
282 }
283
eglQueryStringImplementationANDROID(EGLDisplay dpy,EGLint name)284 extern "C" EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name) {
285 clearError();
286
287 egl_connection_t* const cnx = &gEGLImpl;
288 return cnx->platform.eglQueryStringImplementationANDROID(dpy, name);
289 }
290
eglSurfaceAttrib(EGLDisplay dpy,EGLSurface surface,EGLint attribute,EGLint value)291 EGLBoolean eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) {
292 clearError();
293
294 egl_connection_t* const cnx = &gEGLImpl;
295 return cnx->platform.eglSurfaceAttrib(dpy, surface, attribute, value);
296 }
297
eglBindTexImage(EGLDisplay dpy,EGLSurface surface,EGLint buffer)298 EGLBoolean eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) {
299 clearError();
300
301 egl_connection_t* const cnx = &gEGLImpl;
302 return cnx->platform.eglBindTexImage(dpy, surface, buffer);
303 }
304
eglReleaseTexImage(EGLDisplay dpy,EGLSurface surface,EGLint buffer)305 EGLBoolean eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) {
306 clearError();
307
308 egl_connection_t* const cnx = &gEGLImpl;
309 return cnx->platform.eglReleaseTexImage(dpy, surface, buffer);
310 }
311
eglSwapInterval(EGLDisplay dpy,EGLint interval)312 EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) {
313 clearError();
314
315 egl_connection_t* const cnx = &gEGLImpl;
316 return cnx->platform.eglSwapInterval(dpy, interval);
317 }
318
eglWaitClient(void)319 EGLBoolean eglWaitClient(void) {
320 clearError();
321
322 egl_connection_t* const cnx = &gEGLImpl;
323 return cnx->platform.eglWaitClient();
324 }
325
eglBindAPI(EGLenum api)326 EGLBoolean eglBindAPI(EGLenum api) {
327 clearError();
328
329 if (egl_init_drivers() == EGL_FALSE) {
330 return setError(EGL_BAD_PARAMETER, (EGLBoolean)EGL_FALSE);
331 }
332
333 egl_connection_t* const cnx = &gEGLImpl;
334 return cnx->platform.eglBindAPI(api);
335 }
336
eglQueryAPI(void)337 EGLenum eglQueryAPI(void) {
338 clearError();
339
340 if (egl_init_drivers() == EGL_FALSE) {
341 return setError(EGL_BAD_PARAMETER, (EGLBoolean)EGL_FALSE);
342 }
343
344 egl_connection_t* const cnx = &gEGLImpl;
345 return cnx->platform.eglQueryAPI();
346 }
347
eglReleaseThread(void)348 EGLBoolean eglReleaseThread(void) {
349 clearError();
350
351 egl_connection_t* const cnx = &gEGLImpl;
352 return cnx->platform.eglReleaseThread();
353 }
354
eglCreatePbufferFromClientBuffer(EGLDisplay dpy,EGLenum buftype,EGLClientBuffer buffer,EGLConfig config,const EGLint * attrib_list)355 EGLSurface eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
356 EGLConfig config, const EGLint* attrib_list) {
357 clearError();
358
359 egl_connection_t* const cnx = &gEGLImpl;
360 return cnx->platform.eglCreatePbufferFromClientBuffer(dpy, buftype, buffer, config,
361 attrib_list);
362 }
363
eglLockSurfaceKHR(EGLDisplay dpy,EGLSurface surface,const EGLint * attrib_list)364 EGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface, const EGLint* attrib_list) {
365 clearError();
366
367 egl_connection_t* const cnx = &gEGLImpl;
368 return cnx->platform.eglLockSurfaceKHR(dpy, surface, attrib_list);
369 }
370
eglUnlockSurfaceKHR(EGLDisplay dpy,EGLSurface surface)371 EGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface) {
372 clearError();
373
374 egl_connection_t* const cnx = &gEGLImpl;
375 return cnx->platform.eglUnlockSurfaceKHR(dpy, surface);
376 }
377
eglCreateImageKHR(EGLDisplay dpy,EGLContext ctx,EGLenum target,EGLClientBuffer buffer,const EGLint * attrib_list)378 EGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
379 EGLClientBuffer buffer, const EGLint* attrib_list) {
380 clearError();
381
382 egl_connection_t* const cnx = &gEGLImpl;
383 return cnx->platform.eglCreateImageKHR(dpy, ctx, target, buffer, attrib_list);
384 }
385
eglCreateImage(EGLDisplay dpy,EGLContext ctx,EGLenum target,EGLClientBuffer buffer,const EGLAttrib * attrib_list)386 EGLImage eglCreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer,
387 const EGLAttrib* attrib_list) {
388 clearError();
389
390 egl_connection_t* const cnx = &gEGLImpl;
391 return cnx->platform.eglCreateImage(dpy, ctx, target, buffer, attrib_list);
392 }
393
eglDestroyImageKHR(EGLDisplay dpy,EGLImageKHR img)394 EGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img) {
395 clearError();
396
397 egl_connection_t* const cnx = &gEGLImpl;
398 return cnx->platform.eglDestroyImageKHR(dpy, img);
399 }
400
eglDestroyImage(EGLDisplay dpy,EGLImageKHR img)401 EGLBoolean eglDestroyImage(EGLDisplay dpy, EGLImageKHR img) {
402 clearError();
403
404 egl_connection_t* const cnx = &gEGLImpl;
405 return cnx->platform.eglDestroyImage(dpy, img);
406 }
407
408 // ----------------------------------------------------------------------------
409 // EGL_EGLEXT_VERSION 5
410 // ----------------------------------------------------------------------------
411
eglCreateSync(EGLDisplay dpy,EGLenum type,const EGLAttrib * attrib_list)412 EGLSyncKHR eglCreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib* attrib_list) {
413 clearError();
414
415 egl_connection_t* const cnx = &gEGLImpl;
416 return cnx->platform.eglCreateSync(dpy, type, attrib_list);
417 }
418
eglCreateSyncKHR(EGLDisplay dpy,EGLenum type,const EGLint * attrib_list)419 EGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint* attrib_list) {
420 clearError();
421
422 egl_connection_t* const cnx = &gEGLImpl;
423 return cnx->platform.eglCreateSyncKHR(dpy, type, attrib_list);
424 }
425
eglDestroySync(EGLDisplay dpy,EGLSyncKHR sync)426 EGLBoolean eglDestroySync(EGLDisplay dpy, EGLSyncKHR sync) {
427 clearError();
428
429 egl_connection_t* const cnx = &gEGLImpl;
430 return cnx->platform.eglDestroySync(dpy, sync);
431 }
432
eglDestroySyncKHR(EGLDisplay dpy,EGLSyncKHR sync)433 EGLBoolean eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync) {
434 clearError();
435
436 egl_connection_t* const cnx = &gEGLImpl;
437 return cnx->platform.eglDestroySyncKHR(dpy, sync);
438 }
439
eglSignalSyncKHR(EGLDisplay dpy,EGLSyncKHR sync,EGLenum mode)440 EGLBoolean eglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode) {
441 clearError();
442
443 egl_connection_t* const cnx = &gEGLImpl;
444 return cnx->platform.eglSignalSyncKHR(dpy, sync, mode);
445 }
446
eglClientWaitSync(EGLDisplay dpy,EGLSync sync,EGLint flags,EGLTimeKHR timeout)447 EGLint eglClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTimeKHR timeout) {
448 clearError();
449
450 egl_connection_t* const cnx = &gEGLImpl;
451 return cnx->platform.eglClientWaitSyncKHR(dpy, sync, flags, timeout);
452 }
453
eglClientWaitSyncKHR(EGLDisplay dpy,EGLSyncKHR sync,EGLint flags,EGLTimeKHR timeout)454 EGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout) {
455 clearError();
456
457 egl_connection_t* const cnx = &gEGLImpl;
458 return cnx->platform.eglClientWaitSyncKHR(dpy, sync, flags, timeout);
459 }
460
eglGetSyncAttrib(EGLDisplay dpy,EGLSync sync,EGLint attribute,EGLAttrib * value)461 EGLBoolean eglGetSyncAttrib(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib* value) {
462 clearError();
463
464 egl_connection_t* const cnx = &gEGLImpl;
465 return cnx->platform.eglGetSyncAttrib(dpy, sync, attribute, value);
466 }
467
eglGetSyncAttribKHR(EGLDisplay dpy,EGLSyncKHR sync,EGLint attribute,EGLint * value)468 EGLBoolean eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint* value) {
469 clearError();
470
471 egl_connection_t* const cnx = &gEGLImpl;
472 return cnx->platform.eglGetSyncAttribKHR(dpy, sync, attribute, value);
473 }
474
eglCreateStreamKHR(EGLDisplay dpy,const EGLint * attrib_list)475 EGLStreamKHR eglCreateStreamKHR(EGLDisplay dpy, const EGLint* attrib_list) {
476 clearError();
477
478 egl_connection_t* const cnx = &gEGLImpl;
479 return cnx->platform.eglCreateStreamKHR(dpy, attrib_list);
480 }
481
eglDestroyStreamKHR(EGLDisplay dpy,EGLStreamKHR stream)482 EGLBoolean eglDestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream) {
483 clearError();
484
485 egl_connection_t* const cnx = &gEGLImpl;
486 return cnx->platform.eglDestroyStreamKHR(dpy, stream);
487 }
488
eglStreamAttribKHR(EGLDisplay dpy,EGLStreamKHR stream,EGLenum attribute,EGLint value)489 EGLBoolean eglStreamAttribKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute,
490 EGLint value) {
491 clearError();
492
493 egl_connection_t* const cnx = &gEGLImpl;
494 return cnx->platform.eglStreamAttribKHR(dpy, stream, attribute, value);
495 }
496
eglQueryStreamKHR(EGLDisplay dpy,EGLStreamKHR stream,EGLenum attribute,EGLint * value)497 EGLBoolean eglQueryStreamKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute,
498 EGLint* value) {
499 clearError();
500
501 egl_connection_t* const cnx = &gEGLImpl;
502 return cnx->platform.eglQueryStreamKHR(dpy, stream, attribute, value);
503 }
504
eglQueryStreamu64KHR(EGLDisplay dpy,EGLStreamKHR stream,EGLenum attribute,EGLuint64KHR * value)505 EGLBoolean eglQueryStreamu64KHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute,
506 EGLuint64KHR* value) {
507 clearError();
508
509 egl_connection_t* const cnx = &gEGLImpl;
510 return cnx->platform.eglQueryStreamu64KHR(dpy, stream, attribute, value);
511 }
512
eglQueryStreamTimeKHR(EGLDisplay dpy,EGLStreamKHR stream,EGLenum attribute,EGLTimeKHR * value)513 EGLBoolean eglQueryStreamTimeKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute,
514 EGLTimeKHR* value) {
515 clearError();
516
517 egl_connection_t* const cnx = &gEGLImpl;
518 return cnx->platform.eglQueryStreamTimeKHR(dpy, stream, attribute, value);
519 }
520
eglCreateStreamProducerSurfaceKHR(EGLDisplay dpy,EGLConfig config,EGLStreamKHR stream,const EGLint * attrib_list)521 EGLSurface eglCreateStreamProducerSurfaceKHR(EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream,
522 const EGLint* attrib_list) {
523 clearError();
524
525 egl_connection_t* const cnx = &gEGLImpl;
526 return cnx->platform.eglCreateStreamProducerSurfaceKHR(dpy, config, stream, attrib_list);
527 }
528
eglStreamConsumerGLTextureExternalKHR(EGLDisplay dpy,EGLStreamKHR stream)529 EGLBoolean eglStreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EGLStreamKHR stream) {
530 clearError();
531
532 egl_connection_t* const cnx = &gEGLImpl;
533 return cnx->platform.eglStreamConsumerGLTextureExternalKHR(dpy, stream);
534 }
535
eglStreamConsumerAcquireKHR(EGLDisplay dpy,EGLStreamKHR stream)536 EGLBoolean eglStreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream) {
537 clearError();
538
539 egl_connection_t* const cnx = &gEGLImpl;
540 return cnx->platform.eglStreamConsumerAcquireKHR(dpy, stream);
541 }
542
eglStreamConsumerReleaseKHR(EGLDisplay dpy,EGLStreamKHR stream)543 EGLBoolean eglStreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream) {
544 clearError();
545
546 egl_connection_t* const cnx = &gEGLImpl;
547 return cnx->platform.eglStreamConsumerReleaseKHR(dpy, stream);
548 }
549
eglGetStreamFileDescriptorKHR(EGLDisplay dpy,EGLStreamKHR stream)550 EGLNativeFileDescriptorKHR eglGetStreamFileDescriptorKHR(EGLDisplay dpy, EGLStreamKHR stream) {
551 clearError();
552
553 egl_connection_t* const cnx = &gEGLImpl;
554 return cnx->platform.eglGetStreamFileDescriptorKHR(dpy, stream);
555 }
556
eglCreateStreamFromFileDescriptorKHR(EGLDisplay dpy,EGLNativeFileDescriptorKHR file_descriptor)557 EGLStreamKHR eglCreateStreamFromFileDescriptorKHR(EGLDisplay dpy,
558 EGLNativeFileDescriptorKHR file_descriptor) {
559 clearError();
560
561 egl_connection_t* const cnx = &gEGLImpl;
562 return cnx->platform.eglCreateStreamFromFileDescriptorKHR(dpy, file_descriptor);
563 }
564
eglWaitSyncKHR(EGLDisplay dpy,EGLSyncKHR sync,EGLint flags)565 EGLint eglWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags) {
566 clearError();
567 egl_connection_t* const cnx = &gEGLImpl;
568 return cnx->platform.eglWaitSyncKHR(dpy, sync, flags);
569 }
570
eglWaitSync(EGLDisplay dpy,EGLSync sync,EGLint flags)571 EGLBoolean eglWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags) {
572 clearError();
573 egl_connection_t* const cnx = &gEGLImpl;
574 return cnx->platform.eglWaitSync(dpy, sync, flags);
575 }
576
eglDupNativeFenceFDANDROID(EGLDisplay dpy,EGLSyncKHR sync)577 EGLint eglDupNativeFenceFDANDROID(EGLDisplay dpy, EGLSyncKHR sync) {
578 clearError();
579
580 egl_connection_t* const cnx = &gEGLImpl;
581 return cnx->platform.eglDupNativeFenceFDANDROID(dpy, sync);
582 }
583
eglPresentationTimeANDROID(EGLDisplay dpy,EGLSurface surface,EGLnsecsANDROID time)584 EGLBoolean eglPresentationTimeANDROID(EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time) {
585 clearError();
586
587 egl_connection_t* const cnx = &gEGLImpl;
588 return cnx->platform.eglPresentationTimeANDROID(dpy, surface, time);
589 }
590
eglGetNativeClientBufferANDROID(const AHardwareBuffer * buffer)591 EGLClientBuffer eglGetNativeClientBufferANDROID(const AHardwareBuffer* buffer) {
592 clearError();
593 egl_connection_t* const cnx = &gEGLImpl;
594 return cnx->platform.eglGetNativeClientBufferANDROID(buffer);
595 }
596
eglGetSystemTimeFrequencyNV()597 EGLuint64NV eglGetSystemTimeFrequencyNV() {
598 clearError();
599
600 if (egl_init_drivers() == EGL_FALSE) {
601 return setError(EGL_BAD_PARAMETER, (EGLuint64NV)EGL_FALSE);
602 }
603
604 egl_connection_t* const cnx = &gEGLImpl;
605 return cnx->platform.eglGetSystemTimeFrequencyNV();
606 }
607
eglGetSystemTimeNV()608 EGLuint64NV eglGetSystemTimeNV() {
609 clearError();
610
611 if (egl_init_drivers() == EGL_FALSE) {
612 return setError(EGL_BAD_PARAMETER, (EGLuint64NV)EGL_FALSE);
613 }
614
615 egl_connection_t* const cnx = &gEGLImpl;
616 return cnx->platform.eglGetSystemTimeNV();
617 }
618
eglSetDamageRegionKHR(EGLDisplay dpy,EGLSurface surface,EGLint * rects,EGLint n_rects)619 EGLBoolean eglSetDamageRegionKHR(EGLDisplay dpy, EGLSurface surface, EGLint* rects,
620 EGLint n_rects) {
621 clearError();
622
623 egl_connection_t* const cnx = &gEGLImpl;
624 return cnx->platform.eglSetDamageRegionKHR(dpy, surface, rects, n_rects);
625 }
626
eglGetNextFrameIdANDROID(EGLDisplay dpy,EGLSurface surface,EGLuint64KHR * frameId)627 EGLBoolean eglGetNextFrameIdANDROID(EGLDisplay dpy, EGLSurface surface, EGLuint64KHR* frameId) {
628 clearError();
629
630 egl_connection_t* const cnx = &gEGLImpl;
631 return cnx->platform.eglGetNextFrameIdANDROID(dpy, surface, frameId);
632 }
633
eglGetCompositorTimingANDROID(EGLDisplay dpy,EGLSurface surface,EGLint numTimestamps,const EGLint * names,EGLnsecsANDROID * values)634 EGLBoolean eglGetCompositorTimingANDROID(EGLDisplay dpy, EGLSurface surface, EGLint numTimestamps,
635 const EGLint* names, EGLnsecsANDROID* values) {
636 clearError();
637
638 egl_connection_t* const cnx = &gEGLImpl;
639 return cnx->platform.eglGetCompositorTimingANDROID(dpy, surface, numTimestamps, names, values);
640 }
641
eglGetCompositorTimingSupportedANDROID(EGLDisplay dpy,EGLSurface surface,EGLint name)642 EGLBoolean eglGetCompositorTimingSupportedANDROID(EGLDisplay dpy, EGLSurface surface, EGLint name) {
643 clearError();
644
645 egl_connection_t* const cnx = &gEGLImpl;
646 return cnx->platform.eglGetCompositorTimingSupportedANDROID(dpy, surface, name);
647 }
648
eglGetFrameTimestampsANDROID(EGLDisplay dpy,EGLSurface surface,EGLuint64KHR frameId,EGLint numTimestamps,const EGLint * timestamps,EGLnsecsANDROID * values)649 EGLBoolean eglGetFrameTimestampsANDROID(EGLDisplay dpy, EGLSurface surface, EGLuint64KHR frameId,
650 EGLint numTimestamps, const EGLint* timestamps,
651 EGLnsecsANDROID* values) {
652 clearError();
653
654 egl_connection_t* const cnx = &gEGLImpl;
655 return cnx->platform.eglGetFrameTimestampsANDROID(dpy, surface, frameId, numTimestamps,
656 timestamps, values);
657 }
658
eglGetFrameTimestampSupportedANDROID(EGLDisplay dpy,EGLSurface surface,EGLint timestamp)659 EGLBoolean eglGetFrameTimestampSupportedANDROID(EGLDisplay dpy, EGLSurface surface,
660 EGLint timestamp) {
661 clearError();
662
663 egl_connection_t* const cnx = &gEGLImpl;
664 return cnx->platform.eglGetFrameTimestampSupportedANDROID(dpy, surface, timestamp);
665 }
666