1 //
2 // Copyright 2016 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 // FunctionsEGL.cpp: Implements the FunctionsEGL class.
8
9 #include "libANGLE/renderer/gl/egl/FunctionsEGL.h"
10
11 #include <algorithm>
12
13 #include "common/platform.h"
14 #include "common/string_utils.h"
15 #include "libANGLE/renderer/driver_utils.h"
16 #include "libANGLE/renderer/gl/FunctionsGL.h"
17 #include "libANGLE/renderer/gl/egl/functionsegl_typedefs.h"
18
19 namespace
20 {
21
22 template <typename T>
SetPtr(T * dst,void * src)23 bool SetPtr(T *dst, void *src)
24 {
25 if (src)
26 {
27 *dst = reinterpret_cast<T>(src);
28 return true;
29 }
30 return false;
31 }
32 } // namespace
33
34 namespace rx
35 {
36
37 struct FunctionsEGL::EGLDispatchTable
38 {
EGLDispatchTablerx::FunctionsEGL::EGLDispatchTable39 EGLDispatchTable()
40 : bindAPIPtr(nullptr),
41 chooseConfigPtr(nullptr),
42 createContextPtr(nullptr),
43 createPbufferSurfacePtr(nullptr),
44 createWindowSurfacePtr(nullptr),
45 destroyContextPtr(nullptr),
46 destroySurfacePtr(nullptr),
47 getConfigAttribPtr(nullptr),
48 getConfigsPtr(nullptr),
49 getCurrentSurfacePtr(nullptr),
50 getDisplayPtr(nullptr),
51 getErrorPtr(nullptr),
52 initializePtr(nullptr),
53 makeCurrentPtr(nullptr),
54 queryStringPtr(nullptr),
55 querySurfacePtr(nullptr),
56 swapBuffersPtr(nullptr),
57 terminatePtr(nullptr),
58
59 bindTexImagePtr(nullptr),
60 releaseTexImagePtr(nullptr),
61 surfaceAttribPtr(nullptr),
62 swapIntervalPtr(nullptr),
63
64 getCurrentContextPtr(nullptr),
65
66 createImageKHRPtr(nullptr),
67 destroyImageKHRPtr(nullptr),
68
69 createSyncKHRPtr(nullptr),
70 destroySyncKHRPtr(nullptr),
71 clientWaitSyncKHRPtr(nullptr),
72 getSyncAttribKHRPtr(nullptr),
73
74 waitSyncKHRPtr(nullptr),
75
76 swapBuffersWithDamageKHRPtr(nullptr),
77
78 presentationTimeANDROIDPtr(nullptr),
79
80 setBlobCacheFuncsANDROIDPtr(nullptr),
81
82 getCompositorTimingSupportedANDROIDPtr(nullptr),
83 getCompositorTimingANDROIDPtr(nullptr),
84 getNextFrameIdANDROIDPtr(nullptr),
85 getFrameTimestampSupportedANDROIDPtr(nullptr),
86 getFrameTimestampsANDROIDPtr(nullptr),
87
88 dupNativeFenceFDANDROIDPtr(nullptr)
89 {}
90
91 // 1.0
92 PFNEGLBINDAPIPROC bindAPIPtr;
93 PFNEGLCHOOSECONFIGPROC chooseConfigPtr;
94 PFNEGLCREATECONTEXTPROC createContextPtr;
95 PFNEGLCREATEPBUFFERSURFACEPROC createPbufferSurfacePtr;
96 PFNEGLCREATEWINDOWSURFACEPROC createWindowSurfacePtr;
97 PFNEGLDESTROYCONTEXTPROC destroyContextPtr;
98 PFNEGLDESTROYSURFACEPROC destroySurfacePtr;
99 PFNEGLGETCONFIGATTRIBPROC getConfigAttribPtr;
100 PFNEGLGETCONFIGSPROC getConfigsPtr;
101 PFNEGLGETCURRENTSURFACEPROC getCurrentSurfacePtr;
102 PFNEGLGETDISPLAYPROC getDisplayPtr;
103 PFNEGLGETERRORPROC getErrorPtr;
104 PFNEGLINITIALIZEPROC initializePtr;
105 PFNEGLMAKECURRENTPROC makeCurrentPtr;
106 PFNEGLQUERYSTRINGPROC queryStringPtr;
107 PFNEGLQUERYSURFACEPROC querySurfacePtr;
108 PFNEGLSWAPBUFFERSPROC swapBuffersPtr;
109 PFNEGLTERMINATEPROC terminatePtr;
110
111 // 1.1
112 PFNEGLBINDTEXIMAGEPROC bindTexImagePtr;
113 PFNEGLRELEASETEXIMAGEPROC releaseTexImagePtr;
114 PFNEGLSURFACEATTRIBPROC surfaceAttribPtr;
115 PFNEGLSWAPINTERVALPROC swapIntervalPtr;
116
117 // 1.4
118 PFNEGLGETCURRENTCONTEXTPROC getCurrentContextPtr;
119
120 // EGL_KHR_image
121 PFNEGLCREATEIMAGEKHRPROC createImageKHRPtr;
122 PFNEGLDESTROYIMAGEKHRPROC destroyImageKHRPtr;
123
124 // EGL_KHR_fence_sync
125 PFNEGLCREATESYNCKHRPROC createSyncKHRPtr;
126 PFNEGLDESTROYSYNCKHRPROC destroySyncKHRPtr;
127 PFNEGLCLIENTWAITSYNCKHRPROC clientWaitSyncKHRPtr;
128 PFNEGLGETSYNCATTRIBKHRPROC getSyncAttribKHRPtr;
129
130 // EGL_KHR_wait_sync
131 PFNEGLWAITSYNCKHRPROC waitSyncKHRPtr;
132
133 // EGL_KHR_swap_buffers_with_damage
134 PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC swapBuffersWithDamageKHRPtr;
135
136 // EGL_ANDROID_presentation_time
137 PFNEGLPRESENTATIONTIMEANDROIDPROC presentationTimeANDROIDPtr;
138
139 // EGL_ANDROID_blob_cache
140 PFNEGLSETBLOBCACHEFUNCSANDROIDPROC setBlobCacheFuncsANDROIDPtr;
141
142 // EGL_ANDROID_get_frame_timestamps
143 PFNEGLGETCOMPOSITORTIMINGSUPPORTEDANDROIDPROC getCompositorTimingSupportedANDROIDPtr;
144 PFNEGLGETCOMPOSITORTIMINGANDROIDPROC getCompositorTimingANDROIDPtr;
145 PFNEGLGETNEXTFRAMEIDANDROIDPROC getNextFrameIdANDROIDPtr;
146 PFNEGLGETFRAMETIMESTAMPSUPPORTEDANDROIDPROC getFrameTimestampSupportedANDROIDPtr;
147 PFNEGLGETFRAMETIMESTAMPSANDROIDPROC getFrameTimestampsANDROIDPtr;
148
149 // EGL_ANDROID_native_fence_sync
150 PFNEGLDUPNATIVEFENCEFDANDROIDPROC dupNativeFenceFDANDROIDPtr;
151 };
152
FunctionsEGL()153 FunctionsEGL::FunctionsEGL()
154 : majorVersion(0), minorVersion(0), mFnPtrs(new EGLDispatchTable()), mEGLDisplay(EGL_NO_DISPLAY)
155 {}
156
~FunctionsEGL()157 FunctionsEGL::~FunctionsEGL()
158 {
159 SafeDelete(mFnPtrs);
160 }
161
initialize(EGLNativeDisplayType nativeDisplay)162 egl::Error FunctionsEGL::initialize(EGLNativeDisplayType nativeDisplay)
163 {
164 #define ANGLE_GET_PROC_OR_ERROR(MEMBER, NAME) \
165 do \
166 { \
167 if (!SetPtr(MEMBER, getProcAddress(#NAME))) \
168 { \
169 return egl::EglNotInitialized() << "Could not load EGL entry point " #NAME; \
170 } \
171 } while (0)
172
173 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->bindAPIPtr, eglBindAPI);
174 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->chooseConfigPtr, eglChooseConfig);
175 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->createContextPtr, eglCreateContext);
176 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->createPbufferSurfacePtr, eglCreatePbufferSurface);
177 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->createWindowSurfacePtr, eglCreateWindowSurface);
178 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->destroyContextPtr, eglDestroyContext);
179 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->destroySurfacePtr, eglDestroySurface);
180 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getConfigAttribPtr, eglGetConfigAttrib);
181 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getConfigsPtr, eglGetConfigs);
182 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getCurrentSurfacePtr, eglGetCurrentSurface);
183 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getDisplayPtr, eglGetDisplay);
184 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getErrorPtr, eglGetError);
185 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->initializePtr, eglInitialize);
186 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->makeCurrentPtr, eglMakeCurrent);
187 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->queryStringPtr, eglQueryString);
188 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->querySurfacePtr, eglQuerySurface);
189 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->swapBuffersPtr, eglSwapBuffers);
190 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->terminatePtr, eglTerminate);
191
192 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->bindTexImagePtr, eglBindTexImage);
193 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->releaseTexImagePtr, eglReleaseTexImage);
194 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->surfaceAttribPtr, eglSurfaceAttrib);
195 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->swapIntervalPtr, eglSwapInterval);
196
197 mEGLDisplay = mFnPtrs->getDisplayPtr(nativeDisplay);
198 if (mEGLDisplay == EGL_NO_DISPLAY)
199 {
200 return egl::EglNotInitialized() << "Failed to get system egl display";
201 }
202 if (mFnPtrs->initializePtr(mEGLDisplay, &majorVersion, &minorVersion) != EGL_TRUE)
203 {
204 return egl::Error(mFnPtrs->getErrorPtr(), "Failed to initialize system egl");
205 }
206 if (majorVersion < 1 || (majorVersion == 1 && minorVersion < 4))
207 {
208 return egl::EglNotInitialized() << "Unsupported EGL version (require at least 1.4).";
209 }
210 if (mFnPtrs->bindAPIPtr(EGL_OPENGL_ES_API) != EGL_TRUE)
211 {
212 return egl::Error(mFnPtrs->getErrorPtr(), "Failed to bind API in system egl");
213 }
214
215 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getCurrentContextPtr, eglGetCurrentContext);
216
217 const char *extensions = queryString(EGL_EXTENSIONS);
218 if (!extensions)
219 {
220 return egl::Error(mFnPtrs->getErrorPtr(), "Faild to query extensions in system egl");
221 }
222 angle::SplitStringAlongWhitespace(extensions, &mExtensions);
223
224 if (hasExtension("EGL_KHR_image_base"))
225 {
226 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->createImageKHRPtr, eglCreateImageKHR);
227 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->destroyImageKHRPtr, eglDestroyImageKHR);
228 }
229 if (hasExtension("EGL_KHR_fence_sync"))
230 {
231 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->createSyncKHRPtr, eglCreateSyncKHR);
232 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->destroySyncKHRPtr, eglDestroySyncKHR);
233 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->clientWaitSyncKHRPtr, eglClientWaitSyncKHR);
234 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getSyncAttribKHRPtr, eglGetSyncAttribKHR);
235 }
236 if (hasExtension("EGL_KHR_wait_sync"))
237 {
238 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->waitSyncKHRPtr, eglWaitSyncKHR);
239 }
240
241 if (hasExtension("EGL_KHR_swap_buffers_with_damage"))
242 {
243 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->swapBuffersWithDamageKHRPtr, eglSwapBuffersWithDamageKHR);
244 }
245
246 if (hasExtension("EGL_ANDROID_presentation_time"))
247 {
248 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->presentationTimeANDROIDPtr, eglPresentationTimeANDROID);
249 }
250
251 if (hasExtension("EGL_ANDROID_blob_cache"))
252 {
253 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->setBlobCacheFuncsANDROIDPtr, eglSetBlobCacheFuncsANDROID);
254 }
255
256 if (hasExtension("EGL_ANDROID_get_frame_timestamps"))
257 {
258 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getCompositorTimingSupportedANDROIDPtr,
259 eglGetCompositorTimingSupportedANDROID);
260 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getCompositorTimingANDROIDPtr,
261 eglGetCompositorTimingANDROID);
262 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getNextFrameIdANDROIDPtr, eglGetNextFrameIdANDROID);
263 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getFrameTimestampSupportedANDROIDPtr,
264 eglGetFrameTimestampSupportedANDROID);
265 ANGLE_GET_PROC_OR_ERROR(&mFnPtrs->getFrameTimestampsANDROIDPtr,
266 eglGetFrameTimestampsANDROID);
267 }
268
269 // The native fence sync extension is a bit complicated. It's reported as present for ChromeOS,
270 // but Android currently doesn't report this extension even when it's present, and older devices
271 // may export a useless wrapper function. See crbug.com/775707 for details. In short, if the
272 // symbol is present and we're on Android N or newer, assume that it's usable even if the
273 // extension wasn't reported.
274 if (hasExtension("EGL_ANDROID_native_fence_sync") || GetAndroidSDKVersion() >= 24)
275 {
276 // Don't error trying to load this entry point.
277 if (SetPtr(&mFnPtrs->dupNativeFenceFDANDROIDPtr,
278 getProcAddress("eglDupNativeFenceFDANDROID")) &&
279 !hasExtension("EGL_ANDROID_native_fence_sync"))
280 {
281 mExtensions.push_back("EGL_ANDROID_native_fence_sync");
282 }
283 }
284
285 #undef ANGLE_GET_PROC_OR_ERROR
286
287 return egl::NoError();
288 }
289
terminate()290 egl::Error FunctionsEGL::terminate()
291 {
292 if (mFnPtrs->terminatePtr == nullptr || mFnPtrs->terminatePtr(mEGLDisplay) == EGL_TRUE)
293 {
294 mEGLDisplay = nullptr;
295 return egl::NoError();
296 }
297 return egl::Error(mFnPtrs->getErrorPtr());
298 }
299
300 class FunctionsGLEGL : public FunctionsGL
301 {
302 public:
FunctionsGLEGL(const FunctionsEGL & egl)303 FunctionsGLEGL(const FunctionsEGL &egl) : mEGL(egl) {}
304
~FunctionsGLEGL()305 ~FunctionsGLEGL() override {}
306
307 private:
loadProcAddress(const std::string & function) const308 void *loadProcAddress(const std::string &function) const override
309 {
310 return mEGL.getProcAddress(function.c_str());
311 }
312
313 const FunctionsEGL &mEGL;
314 };
315
makeFunctionsGL(void) const316 FunctionsGL *FunctionsEGL::makeFunctionsGL(void) const
317 {
318 return new FunctionsGLEGL(*this);
319 }
320
hasExtension(const char * extension) const321 bool FunctionsEGL::hasExtension(const char *extension) const
322 {
323 return std::find(mExtensions.begin(), mExtensions.end(), extension) != mExtensions.end();
324 }
325
getDisplay() const326 EGLDisplay FunctionsEGL::getDisplay() const
327 {
328 return mEGLDisplay;
329 }
330
getError() const331 EGLint FunctionsEGL::getError() const
332 {
333 return mFnPtrs->getErrorPtr();
334 }
335
chooseConfig(EGLint const * attribList,EGLConfig * configs,EGLint configSize,EGLint * numConfig) const336 EGLBoolean FunctionsEGL::chooseConfig(EGLint const *attribList,
337 EGLConfig *configs,
338 EGLint configSize,
339 EGLint *numConfig) const
340 {
341 return mFnPtrs->chooseConfigPtr(mEGLDisplay, attribList, configs, configSize, numConfig);
342 }
343
getConfigs(EGLConfig * configs,EGLint config_size,EGLint * num_config) const344 EGLBoolean FunctionsEGL::getConfigs(EGLConfig *configs,
345 EGLint config_size,
346 EGLint *num_config) const
347 {
348 return mFnPtrs->getConfigsPtr(mEGLDisplay, configs, config_size, num_config);
349 }
350
getConfigAttrib(EGLConfig config,EGLint attribute,EGLint * value) const351 EGLBoolean FunctionsEGL::getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value) const
352 {
353 return mFnPtrs->getConfigAttribPtr(mEGLDisplay, config, attribute, value);
354 }
355
getCurrentSurface(EGLint readdraw) const356 EGLSurface FunctionsEGL::getCurrentSurface(EGLint readdraw) const
357 {
358 return mFnPtrs->getCurrentSurfacePtr(readdraw);
359 }
360
createContext(EGLConfig config,EGLContext share_context,EGLint const * attrib_list) const361 EGLContext FunctionsEGL::createContext(EGLConfig config,
362 EGLContext share_context,
363 EGLint const *attrib_list) const
364 {
365 return mFnPtrs->createContextPtr(mEGLDisplay, config, share_context, attrib_list);
366 }
367
createPbufferSurface(EGLConfig config,const EGLint * attrib_list) const368 EGLSurface FunctionsEGL::createPbufferSurface(EGLConfig config, const EGLint *attrib_list) const
369 {
370 return mFnPtrs->createPbufferSurfacePtr(mEGLDisplay, config, attrib_list);
371 }
372
createWindowSurface(EGLConfig config,EGLNativeWindowType win,const EGLint * attrib_list) const373 EGLSurface FunctionsEGL::createWindowSurface(EGLConfig config,
374 EGLNativeWindowType win,
375 const EGLint *attrib_list) const
376 {
377 return mFnPtrs->createWindowSurfacePtr(mEGLDisplay, config, win, attrib_list);
378 }
379
destroyContext(EGLContext context) const380 EGLBoolean FunctionsEGL::destroyContext(EGLContext context) const
381 {
382 return mFnPtrs->destroyContextPtr(mEGLDisplay, context);
383 }
384
destroySurface(EGLSurface surface) const385 EGLBoolean FunctionsEGL::destroySurface(EGLSurface surface) const
386 {
387 return mFnPtrs->destroySurfacePtr(mEGLDisplay, surface);
388 }
389
makeCurrent(EGLSurface surface,EGLContext context) const390 EGLBoolean FunctionsEGL::makeCurrent(EGLSurface surface, EGLContext context) const
391 {
392 return mFnPtrs->makeCurrentPtr(mEGLDisplay, surface, surface, context);
393 }
394
queryString(EGLint name) const395 char const *FunctionsEGL::queryString(EGLint name) const
396 {
397 return mFnPtrs->queryStringPtr(mEGLDisplay, name);
398 }
399
querySurface(EGLSurface surface,EGLint attribute,EGLint * value) const400 EGLBoolean FunctionsEGL::querySurface(EGLSurface surface, EGLint attribute, EGLint *value) const
401 {
402 return mFnPtrs->querySurfacePtr(mEGLDisplay, surface, attribute, value);
403 }
404
swapBuffers(EGLSurface surface) const405 EGLBoolean FunctionsEGL::swapBuffers(EGLSurface surface) const
406 {
407 return mFnPtrs->swapBuffersPtr(mEGLDisplay, surface);
408 }
409
bindTexImage(EGLSurface surface,EGLint buffer) const410 EGLBoolean FunctionsEGL::bindTexImage(EGLSurface surface, EGLint buffer) const
411 {
412 return mFnPtrs->bindTexImagePtr(mEGLDisplay, surface, buffer);
413 }
414
releaseTexImage(EGLSurface surface,EGLint buffer) const415 EGLBoolean FunctionsEGL::releaseTexImage(EGLSurface surface, EGLint buffer) const
416 {
417 return mFnPtrs->releaseTexImagePtr(mEGLDisplay, surface, buffer);
418 }
419
surfaceAttrib(EGLSurface surface,EGLint attribute,EGLint value) const420 EGLBoolean FunctionsEGL::surfaceAttrib(EGLSurface surface, EGLint attribute, EGLint value) const
421 {
422 return mFnPtrs->surfaceAttribPtr(mEGLDisplay, surface, attribute, value);
423 }
424
swapInterval(EGLint interval) const425 EGLBoolean FunctionsEGL::swapInterval(EGLint interval) const
426 {
427 return mFnPtrs->swapIntervalPtr(mEGLDisplay, interval);
428 }
429
getCurrentContext() const430 EGLContext FunctionsEGL::getCurrentContext() const
431 {
432 return mFnPtrs->getCurrentContextPtr();
433 }
434
createImageKHR(EGLContext context,EGLenum target,EGLClientBuffer buffer,const EGLint * attrib_list) const435 EGLImageKHR FunctionsEGL::createImageKHR(EGLContext context,
436 EGLenum target,
437 EGLClientBuffer buffer,
438 const EGLint *attrib_list) const
439 {
440 return mFnPtrs->createImageKHRPtr(mEGLDisplay, context, target, buffer, attrib_list);
441 }
442
destroyImageKHR(EGLImageKHR image) const443 EGLBoolean FunctionsEGL::destroyImageKHR(EGLImageKHR image) const
444 {
445 return mFnPtrs->destroyImageKHRPtr(mEGLDisplay, image);
446 }
447
createSyncKHR(EGLenum type,const EGLint * attrib_list) const448 EGLSyncKHR FunctionsEGL::createSyncKHR(EGLenum type, const EGLint *attrib_list) const
449 {
450 return mFnPtrs->createSyncKHRPtr(mEGLDisplay, type, attrib_list);
451 }
452
destroySyncKHR(EGLSyncKHR sync) const453 EGLBoolean FunctionsEGL::destroySyncKHR(EGLSyncKHR sync) const
454 {
455 return mFnPtrs->destroySyncKHRPtr(mEGLDisplay, sync);
456 }
457
clientWaitSyncKHR(EGLSyncKHR sync,EGLint flags,EGLTimeKHR timeout) const458 EGLint FunctionsEGL::clientWaitSyncKHR(EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout) const
459 {
460 return mFnPtrs->clientWaitSyncKHRPtr(mEGLDisplay, sync, flags, timeout);
461 }
462
getSyncAttribKHR(EGLSyncKHR sync,EGLint attribute,EGLint * value) const463 EGLBoolean FunctionsEGL::getSyncAttribKHR(EGLSyncKHR sync, EGLint attribute, EGLint *value) const
464 {
465 return mFnPtrs->getSyncAttribKHRPtr(mEGLDisplay, sync, attribute, value);
466 }
467
waitSyncKHR(EGLSyncKHR sync,EGLint flags) const468 EGLint FunctionsEGL::waitSyncKHR(EGLSyncKHR sync, EGLint flags) const
469 {
470 return mFnPtrs->waitSyncKHRPtr(mEGLDisplay, sync, flags);
471 }
472
swapBuffersWithDamageKHR(EGLSurface surface,const EGLint * rects,EGLint n_rects) const473 EGLBoolean FunctionsEGL::swapBuffersWithDamageKHR(EGLSurface surface,
474 const EGLint *rects,
475 EGLint n_rects) const
476 {
477 return mFnPtrs->swapBuffersWithDamageKHRPtr(mEGLDisplay, surface, rects, n_rects);
478 }
479
presentationTimeANDROID(EGLSurface surface,EGLnsecsANDROID time) const480 EGLBoolean FunctionsEGL::presentationTimeANDROID(EGLSurface surface, EGLnsecsANDROID time) const
481 {
482 return mFnPtrs->presentationTimeANDROIDPtr(mEGLDisplay, surface, time);
483 }
484
setBlobCacheFuncsANDROID(EGLSetBlobFuncANDROID set,EGLGetBlobFuncANDROID get) const485 void FunctionsEGL::setBlobCacheFuncsANDROID(EGLSetBlobFuncANDROID set,
486 EGLGetBlobFuncANDROID get) const
487 {
488 return mFnPtrs->setBlobCacheFuncsANDROIDPtr(mEGLDisplay, set, get);
489 }
490
getCompositorTimingSupportedANDROID(EGLSurface surface,EGLint name) const491 EGLBoolean FunctionsEGL::getCompositorTimingSupportedANDROID(EGLSurface surface, EGLint name) const
492 {
493 return mFnPtrs->getCompositorTimingSupportedANDROIDPtr(mEGLDisplay, surface, name);
494 }
495
getCompositorTimingANDROID(EGLSurface surface,EGLint numTimestamps,const EGLint * names,EGLnsecsANDROID * values) const496 EGLBoolean FunctionsEGL::getCompositorTimingANDROID(EGLSurface surface,
497 EGLint numTimestamps,
498 const EGLint *names,
499 EGLnsecsANDROID *values) const
500 {
501 return mFnPtrs->getCompositorTimingANDROIDPtr(mEGLDisplay, surface, numTimestamps, names,
502 values);
503 }
504
getNextFrameIdANDROID(EGLSurface surface,EGLuint64KHR * frameId) const505 EGLBoolean FunctionsEGL::getNextFrameIdANDROID(EGLSurface surface, EGLuint64KHR *frameId) const
506 {
507 return mFnPtrs->getNextFrameIdANDROIDPtr(mEGLDisplay, surface, frameId);
508 }
509
getFrameTimestampSupportedANDROID(EGLSurface surface,EGLint timestamp) const510 EGLBoolean FunctionsEGL::getFrameTimestampSupportedANDROID(EGLSurface surface,
511 EGLint timestamp) const
512 {
513 return mFnPtrs->getFrameTimestampSupportedANDROIDPtr(mEGLDisplay, surface, timestamp);
514 }
515
getFrameTimestampsANDROID(EGLSurface surface,EGLuint64KHR frameId,EGLint numTimestamps,const EGLint * timestamps,EGLnsecsANDROID * values) const516 EGLBoolean FunctionsEGL::getFrameTimestampsANDROID(EGLSurface surface,
517 EGLuint64KHR frameId,
518 EGLint numTimestamps,
519 const EGLint *timestamps,
520 EGLnsecsANDROID *values) const
521 {
522 return mFnPtrs->getFrameTimestampsANDROIDPtr(mEGLDisplay, surface, frameId, numTimestamps,
523 timestamps, values);
524 }
525
dupNativeFenceFDANDROID(EGLSync sync) const526 EGLint FunctionsEGL::dupNativeFenceFDANDROID(EGLSync sync) const
527 {
528 return mFnPtrs->dupNativeFenceFDANDROIDPtr(mEGLDisplay, sync);
529 }
530
531 } // namespace rx
532