diff options
-rw-r--r-- | src/core/core_module.pro | 2 | ||||
-rw-r--r-- | src/core/delegated_frame_node.cpp | 27 |
2 files changed, 22 insertions, 7 deletions
diff --git a/src/core/core_module.pro b/src/core/core_module.pro index ef9721a11..7aad0de92 100644 --- a/src/core/core_module.pro +++ b/src/core/core_module.pro @@ -19,3 +19,5 @@ load(qt_module) # Using -Wl,-Bsymbolic-functions seems to confuse the dynamic linker # and doesn't let Chromium get access to libc symbols through dlsym. CONFIG -= bsymbolic_functions + +contains(QT_CONFIG, egl): CONFIG += egl diff --git a/src/core/delegated_frame_node.cpp b/src/core/delegated_frame_node.cpp index 6573c99a5..173e2d4c8 100644 --- a/src/core/delegated_frame_node.cpp +++ b/src/core/delegated_frame_node.cpp @@ -213,6 +213,15 @@ static QSGNode *buildLayerChain(QSGNode *chainParent, const cc::SharedQuadState return layerChain; } +#if !defined(QT_NO_EGL) +static bool hasEGLExtension(EGLDisplay display, const char *name) +{ + QList<QByteArray> extensions = QByteArray(reinterpret_cast<const char *>( + eglQueryString(display, EGL_EXTENSIONS))).split(' '); + return extensions.contains(name); +} +#endif + static void waitAndDeleteChromiumSync(FenceSync *sync) { // Chromium uses its own GL bindings and stores in in thread local storage. @@ -229,16 +238,20 @@ static void waitAndDeleteChromiumSync(FenceSync *sync) static PFNEGLDESTROYSYNCKHRPROC eglDestroySyncKHR = 0; if (!resolved) { - QOpenGLContext *context = QOpenGLContext::currentContext(); - eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC)context->getProcAddress("eglClientWaitSyncKHR"); - eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC)context->getProcAddress("eglDestroySyncKHR"); + if (hasEGLExtension(sync->egl.display, "EGL_KHR_reusable_sync")) { + QOpenGLContext *context = QOpenGLContext::currentContext(); + eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC)context->getProcAddress("eglClientWaitSyncKHR"); + eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC)context->getProcAddress("eglDestroySyncKHR"); + } resolved = true; } - // FIXME: Use the less wasteful eglWaitSyncKHR once we have a device that supports EGL_KHR_wait_sync. - eglClientWaitSyncKHR(sync->egl.display, sync->egl.sync, 0, EGL_FOREVER_KHR); - eglDestroySyncKHR(sync->egl.display, sync->egl.sync); - sync->reset(); + if (eglClientWaitSyncKHR && eglDestroySyncKHR) { + // FIXME: Use the less wasteful eglWaitSyncKHR once we have a device that supports EGL_KHR_wait_sync. + eglClientWaitSyncKHR(sync->egl.display, sync->egl.sync, 0, EGL_FOREVER_KHR); + eglDestroySyncKHR(sync->egl.display, sync->egl.sync); + sync->reset(); + } } #endif break; |