blob: 619297feecba082459f9099334f8603678d3f8f9 [file] [log] [blame]
Cody Northrop68d10352018-10-15 07:22:09 -06001/*
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
29using namespace android;
30
31namespace android {
32
33extern EGLBoolean egl_init_drivers();
34
35} // namespace android
36
37static inline void clearError() {
38 egl_tls_t::clearError();
39}
40
41EGLDisplay 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
Courtney Goeltzenleuchter4adf75b2018-10-11 13:09:40 -060055EGLDisplay 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
Cody Northrop68d10352018-10-15 07:22:09 -060070EGLBoolean 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
77EGLBoolean eglTerminate(EGLDisplay dpy) {
78 clearError();
79
80 egl_connection_t* const cnx = &gEGLImpl;
81 return cnx->platform.eglTerminate(dpy);
82}
83
84EGLBoolean 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
92EGLBoolean 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
100EGLBoolean 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
107EGLSurface 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
115EGLSurface eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, NativePixmapType pixmap,
116 const EGLint* attrib_list) {
117 clearError();
118
119 egl_connection_t* const cnx = &gEGLImpl;
120 return cnx->platform.eglCreatePixmapSurface(dpy, config, pixmap, attrib_list);
121}
122
123EGLSurface eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint* attrib_list) {
124 clearError();
125
126 egl_connection_t* const cnx = &gEGLImpl;
127 return cnx->platform.eglCreatePbufferSurface(dpy, config, attrib_list);
128}
129
130EGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface surface) {
131 clearError();
132
133 egl_connection_t* const cnx = &gEGLImpl;
134 return cnx->platform.eglDestroySurface(dpy, surface);
135}
136
137EGLBoolean eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint* value) {
138 clearError();
139
140 egl_connection_t* const cnx = &gEGLImpl;
141 return cnx->platform.eglQuerySurface(dpy, surface, attribute, value);
142}
143
144void EGLAPI eglBeginFrame(EGLDisplay dpy, EGLSurface surface) {
145 ATRACE_CALL();
146 clearError();
147
148 egl_connection_t* const cnx = &gEGLImpl;
149 cnx->platform.eglBeginFrame(dpy, surface);
150}
151
152EGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
153 const EGLint* attrib_list) {
154 clearError();
155
156 egl_connection_t* const cnx = &gEGLImpl;
157 return cnx->platform.eglCreateContext(dpy, config, share_list, attrib_list);
158}
159
160EGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) {
161 clearError();
162
163 egl_connection_t* const cnx = &gEGLImpl;
164 return cnx->platform.eglDestroyContext(dpy, ctx);
165}
166
167EGLBoolean eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) {
168 clearError();
169
170 egl_connection_t* const cnx = &gEGLImpl;
171 return cnx->platform.eglMakeCurrent(dpy, draw, read, ctx);
172}
173
174EGLBoolean eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint* value) {
175 clearError();
176
177 egl_connection_t* const cnx = &gEGLImpl;
178 return cnx->platform.eglQueryContext(dpy, ctx, attribute, value);
179}
180
181EGLContext eglGetCurrentContext(void) {
182 clearError();
183
184 egl_connection_t* const cnx = &gEGLImpl;
185 return cnx->platform.eglGetCurrentContext();
186}
187
188EGLSurface eglGetCurrentSurface(EGLint readdraw) {
189 clearError();
190
191 egl_connection_t* const cnx = &gEGLImpl;
192 return cnx->platform.eglGetCurrentSurface(readdraw);
193}
194
195EGLDisplay eglGetCurrentDisplay(void) {
196 clearError();
197
198 egl_connection_t* const cnx = &gEGLImpl;
199 return cnx->platform.eglGetCurrentDisplay();
200}
201
202EGLBoolean eglWaitGL(void) {
203 clearError();
204
205 egl_connection_t* const cnx = &gEGLImpl;
206 return cnx->platform.eglWaitGL();
207}
208
209EGLBoolean eglWaitNative(EGLint engine) {
210 clearError();
211
212 egl_connection_t* const cnx = &gEGLImpl;
213 return cnx->platform.eglWaitNative(engine);
214}
215
216EGLint eglGetError(void) {
217 egl_connection_t* const cnx = &gEGLImpl;
Cody Northrop9a9a1f42018-10-15 18:32:41 -0600218 return cnx->platform.eglGetError();
Cody Northrop68d10352018-10-15 07:22:09 -0600219}
220
221__eglMustCastToProperFunctionPointerType eglGetProcAddress(const char* procname) {
222 // eglGetProcAddress() could be the very first function called
223 // in which case we must make sure we've initialized ourselves, this
224 // happens the first time egl_get_display() is called.
225
226 clearError();
227
228 if (egl_init_drivers() == EGL_FALSE) {
229 setError(EGL_BAD_PARAMETER, NULL);
230 return nullptr;
231 }
232
233 egl_connection_t* const cnx = &gEGLImpl;
234 return cnx->platform.eglGetProcAddress(procname);
235}
236
237EGLBoolean eglSwapBuffersWithDamageKHR(EGLDisplay dpy, EGLSurface draw, EGLint* rects,
238 EGLint n_rects) {
239 ATRACE_CALL();
240 clearError();
241
242 egl_connection_t* const cnx = &gEGLImpl;
243 return cnx->platform.eglSwapBuffersWithDamageKHR(dpy, draw, rects, n_rects);
244}
245
246EGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface surface) {
247 ATRACE_CALL();
248 clearError();
249
250 egl_connection_t* const cnx = &gEGLImpl;
251 return cnx->platform.eglSwapBuffers(dpy, surface);
252}
253
254EGLBoolean eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, NativePixmapType target) {
255 clearError();
256
257 egl_connection_t* const cnx = &gEGLImpl;
258 return cnx->platform.eglCopyBuffers(dpy, surface, target);
259}
260
261const char* eglQueryString(EGLDisplay dpy, EGLint name) {
262 clearError();
263
264 egl_connection_t* const cnx = &gEGLImpl;
265 return cnx->platform.eglQueryString(dpy, name);
266}
267
268extern "C" EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name) {
269 clearError();
270
271 egl_connection_t* const cnx = &gEGLImpl;
272 return cnx->platform.eglQueryStringImplementationANDROID(dpy, name);
273}
274
275EGLBoolean eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value) {
276 clearError();
277
278 egl_connection_t* const cnx = &gEGLImpl;
279 return cnx->platform.eglSurfaceAttrib(dpy, surface, attribute, value);
280}
281
282EGLBoolean eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) {
283 clearError();
284
285 egl_connection_t* const cnx = &gEGLImpl;
286 return cnx->platform.eglBindTexImage(dpy, surface, buffer);
287}
288
289EGLBoolean eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) {
290 clearError();
291
292 egl_connection_t* const cnx = &gEGLImpl;
293 return cnx->platform.eglReleaseTexImage(dpy, surface, buffer);
294}
295
296EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval) {
297 clearError();
298
299 egl_connection_t* const cnx = &gEGLImpl;
300 return cnx->platform.eglSwapInterval(dpy, interval);
301}
302
303EGLBoolean eglWaitClient(void) {
304 clearError();
305
306 egl_connection_t* const cnx = &gEGLImpl;
307 return cnx->platform.eglWaitClient();
308}
309
310EGLBoolean eglBindAPI(EGLenum api) {
311 clearError();
312
313 if (egl_init_drivers() == EGL_FALSE) {
314 return setError(EGL_BAD_PARAMETER, (EGLBoolean)EGL_FALSE);
315 }
316
317 egl_connection_t* const cnx = &gEGLImpl;
318 return cnx->platform.eglBindAPI(api);
319}
320
321EGLenum eglQueryAPI(void) {
322 clearError();
323
324 if (egl_init_drivers() == EGL_FALSE) {
325 return setError(EGL_BAD_PARAMETER, (EGLBoolean)EGL_FALSE);
326 }
327
328 egl_connection_t* const cnx = &gEGLImpl;
329 return cnx->platform.eglQueryAPI();
330}
331
332EGLBoolean eglReleaseThread(void) {
333 clearError();
334
335 egl_connection_t* const cnx = &gEGLImpl;
336 return cnx->platform.eglReleaseThread();
337}
338
339EGLSurface eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
340 EGLConfig config, const EGLint* attrib_list) {
341 clearError();
342
343 egl_connection_t* const cnx = &gEGLImpl;
344 return cnx->platform.eglCreatePbufferFromClientBuffer(dpy, buftype, buffer, config,
345 attrib_list);
346}
347
348EGLBoolean eglLockSurfaceKHR(EGLDisplay dpy, EGLSurface surface, const EGLint* attrib_list) {
349 clearError();
350
351 egl_connection_t* const cnx = &gEGLImpl;
352 return cnx->platform.eglLockSurfaceKHR(dpy, surface, attrib_list);
353}
354
355EGLBoolean eglUnlockSurfaceKHR(EGLDisplay dpy, EGLSurface surface) {
356 clearError();
357
358 egl_connection_t* const cnx = &gEGLImpl;
359 return cnx->platform.eglUnlockSurfaceKHR(dpy, surface);
360}
361
362EGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
363 EGLClientBuffer buffer, const EGLint* attrib_list) {
364 clearError();
365
366 egl_connection_t* const cnx = &gEGLImpl;
367 return cnx->platform.eglCreateImageKHR(dpy, ctx, target, buffer, attrib_list);
368}
369
Courtney Goeltzenleuchtere498a2d2018-07-19 17:11:04 -0600370EGLImage eglCreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer,
371 const EGLAttrib* attrib_list) {
372 clearError();
373
374 egl_connection_t* const cnx = &gEGLImpl;
375 return cnx->platform.eglCreateImage(dpy, ctx, target, buffer, attrib_list);
376}
377
Cody Northrop68d10352018-10-15 07:22:09 -0600378EGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img) {
379 clearError();
380
381 egl_connection_t* const cnx = &gEGLImpl;
382 return cnx->platform.eglDestroyImageKHR(dpy, img);
383}
384
Courtney Goeltzenleuchtere498a2d2018-07-19 17:11:04 -0600385EGLBoolean eglDestroyImage(EGLDisplay dpy, EGLImageKHR img) {
386 clearError();
387
388 egl_connection_t* const cnx = &gEGLImpl;
389 return cnx->platform.eglDestroyImage(dpy, img);
390}
391
392// ----------------------------------------------------------------------------
393// EGL_EGLEXT_VERSION 5
394// ----------------------------------------------------------------------------
395
Cody Northrop68d10352018-10-15 07:22:09 -0600396EGLSyncKHR eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint* attrib_list) {
397 clearError();
398
399 egl_connection_t* const cnx = &gEGLImpl;
400 return cnx->platform.eglCreateSyncKHR(dpy, type, attrib_list);
401}
402
403EGLBoolean eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync) {
404 clearError();
405
406 egl_connection_t* const cnx = &gEGLImpl;
407 return cnx->platform.eglDestroySyncKHR(dpy, sync);
408}
409
410EGLBoolean eglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode) {
411 clearError();
412
413 egl_connection_t* const cnx = &gEGLImpl;
414 return cnx->platform.eglSignalSyncKHR(dpy, sync, mode);
415}
416
417EGLint eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout) {
418 clearError();
419
420 egl_connection_t* const cnx = &gEGLImpl;
421 return cnx->platform.eglClientWaitSyncKHR(dpy, sync, flags, timeout);
422}
423
424EGLBoolean eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint* value) {
425 clearError();
426
427 egl_connection_t* const cnx = &gEGLImpl;
428 return cnx->platform.eglGetSyncAttribKHR(dpy, sync, attribute, value);
429}
430
431EGLStreamKHR eglCreateStreamKHR(EGLDisplay dpy, const EGLint* attrib_list) {
432 clearError();
433
434 egl_connection_t* const cnx = &gEGLImpl;
435 return cnx->platform.eglCreateStreamKHR(dpy, attrib_list);
436}
437
438EGLBoolean eglDestroyStreamKHR(EGLDisplay dpy, EGLStreamKHR stream) {
439 clearError();
440
441 egl_connection_t* const cnx = &gEGLImpl;
442 return cnx->platform.eglDestroyStreamKHR(dpy, stream);
443}
444
445EGLBoolean eglStreamAttribKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute,
446 EGLint value) {
447 clearError();
448
449 egl_connection_t* const cnx = &gEGLImpl;
450 return cnx->platform.eglStreamAttribKHR(dpy, stream, attribute, value);
451}
452
453EGLBoolean eglQueryStreamKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute,
454 EGLint* value) {
455 clearError();
456
457 egl_connection_t* const cnx = &gEGLImpl;
458 return cnx->platform.eglQueryStreamKHR(dpy, stream, attribute, value);
459}
460
461EGLBoolean eglQueryStreamu64KHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute,
462 EGLuint64KHR* value) {
463 clearError();
464
465 egl_connection_t* const cnx = &gEGLImpl;
466 return cnx->platform.eglQueryStreamu64KHR(dpy, stream, attribute, value);
467}
468
469EGLBoolean eglQueryStreamTimeKHR(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute,
470 EGLTimeKHR* value) {
471 clearError();
472
473 egl_connection_t* const cnx = &gEGLImpl;
474 return cnx->platform.eglQueryStreamTimeKHR(dpy, stream, attribute, value);
475}
476
477EGLSurface eglCreateStreamProducerSurfaceKHR(EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream,
478 const EGLint* attrib_list) {
479 clearError();
480
481 egl_connection_t* const cnx = &gEGLImpl;
482 return cnx->platform.eglCreateStreamProducerSurfaceKHR(dpy, config, stream, attrib_list);
483}
484
485EGLBoolean eglStreamConsumerGLTextureExternalKHR(EGLDisplay dpy, EGLStreamKHR stream) {
486 clearError();
487
488 egl_connection_t* const cnx = &gEGLImpl;
489 return cnx->platform.eglStreamConsumerGLTextureExternalKHR(dpy, stream);
490}
491
492EGLBoolean eglStreamConsumerAcquireKHR(EGLDisplay dpy, EGLStreamKHR stream) {
493 clearError();
494
495 egl_connection_t* const cnx = &gEGLImpl;
496 return cnx->platform.eglStreamConsumerAcquireKHR(dpy, stream);
497}
498
499EGLBoolean eglStreamConsumerReleaseKHR(EGLDisplay dpy, EGLStreamKHR stream) {
500 clearError();
501
502 egl_connection_t* const cnx = &gEGLImpl;
503 return cnx->platform.eglStreamConsumerReleaseKHR(dpy, stream);
504}
505
506EGLNativeFileDescriptorKHR eglGetStreamFileDescriptorKHR(EGLDisplay dpy, EGLStreamKHR stream) {
507 clearError();
508
509 egl_connection_t* const cnx = &gEGLImpl;
510 return cnx->platform.eglGetStreamFileDescriptorKHR(dpy, stream);
511}
512
513EGLStreamKHR eglCreateStreamFromFileDescriptorKHR(EGLDisplay dpy,
514 EGLNativeFileDescriptorKHR file_descriptor) {
515 clearError();
516
517 egl_connection_t* const cnx = &gEGLImpl;
518 return cnx->platform.eglCreateStreamFromFileDescriptorKHR(dpy, file_descriptor);
519}
520
521EGLint eglWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags) {
522 clearError();
523 egl_connection_t* const cnx = &gEGLImpl;
524 return cnx->platform.eglWaitSyncKHR(dpy, sync, flags);
525}
526
527EGLint eglDupNativeFenceFDANDROID(EGLDisplay dpy, EGLSyncKHR sync) {
528 clearError();
529
530 egl_connection_t* const cnx = &gEGLImpl;
531 return cnx->platform.eglDupNativeFenceFDANDROID(dpy, sync);
532}
533
534EGLBoolean eglPresentationTimeANDROID(EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time) {
535 clearError();
536
537 egl_connection_t* const cnx = &gEGLImpl;
538 return cnx->platform.eglPresentationTimeANDROID(dpy, surface, time);
539}
540
541EGLClientBuffer eglGetNativeClientBufferANDROID(const AHardwareBuffer* buffer) {
542 clearError();
543 egl_connection_t* const cnx = &gEGLImpl;
544 return cnx->platform.eglGetNativeClientBufferANDROID(buffer);
545}
546
547EGLuint64NV eglGetSystemTimeFrequencyNV() {
548 clearError();
549
550 if (egl_init_drivers() == EGL_FALSE) {
551 return setError(EGL_BAD_PARAMETER, (EGLuint64NV)EGL_FALSE);
552 }
553
554 egl_connection_t* const cnx = &gEGLImpl;
555 return cnx->platform.eglGetSystemTimeFrequencyNV();
556}
557
558EGLuint64NV eglGetSystemTimeNV() {
559 clearError();
560
561 if (egl_init_drivers() == EGL_FALSE) {
562 return setError(EGL_BAD_PARAMETER, (EGLuint64NV)EGL_FALSE);
563 }
564
565 egl_connection_t* const cnx = &gEGLImpl;
566 return cnx->platform.eglGetSystemTimeNV();
567}
568
569EGLBoolean eglSetDamageRegionKHR(EGLDisplay dpy, EGLSurface surface, EGLint* rects,
570 EGLint n_rects) {
571 clearError();
572
573 egl_connection_t* const cnx = &gEGLImpl;
574 return cnx->platform.eglSetDamageRegionKHR(dpy, surface, rects, n_rects);
575}
576
577EGLBoolean eglGetNextFrameIdANDROID(EGLDisplay dpy, EGLSurface surface, EGLuint64KHR* frameId) {
578 clearError();
579
580 egl_connection_t* const cnx = &gEGLImpl;
581 return cnx->platform.eglGetNextFrameIdANDROID(dpy, surface, frameId);
582}
583
584EGLBoolean eglGetCompositorTimingANDROID(EGLDisplay dpy, EGLSurface surface, EGLint numTimestamps,
585 const EGLint* names, EGLnsecsANDROID* values) {
586 clearError();
587
588 egl_connection_t* const cnx = &gEGLImpl;
589 return cnx->platform.eglGetCompositorTimingANDROID(dpy, surface, numTimestamps, names, values);
590}
591
592EGLBoolean eglGetCompositorTimingSupportedANDROID(EGLDisplay dpy, EGLSurface surface, EGLint name) {
593 clearError();
594
595 egl_connection_t* const cnx = &gEGLImpl;
596 return cnx->platform.eglGetCompositorTimingSupportedANDROID(dpy, surface, name);
597}
598
599EGLBoolean eglGetFrameTimestampsANDROID(EGLDisplay dpy, EGLSurface surface, EGLuint64KHR frameId,
600 EGLint numTimestamps, const EGLint* timestamps,
601 EGLnsecsANDROID* values) {
602 clearError();
603
604 egl_connection_t* const cnx = &gEGLImpl;
605 return cnx->platform.eglGetFrameTimestampsANDROID(dpy, surface, frameId, numTimestamps,
606 timestamps, values);
607}
608
609EGLBoolean eglGetFrameTimestampSupportedANDROID(EGLDisplay dpy, EGLSurface surface,
610 EGLint timestamp) {
611 clearError();
612
613 egl_connection_t* const cnx = &gEGLImpl;
614 return cnx->platform.eglGetFrameTimestampSupportedANDROID(dpy, surface, timestamp);
615}