diff options
author | Giulio Camuffo <giulio.camuffo@jollamobile.com> | 2015-05-13 23:04:18 +0300 |
---|---|---|
committer | Giulio Camuffo <giulio.camuffo@jollamobile.com> | 2015-05-14 16:40:41 +0000 |
commit | 007d73ef9e64a99e560cc932f519f8cb00121ba8 (patch) | |
tree | f917ec20817545a9ae2d3125b6db598b9f180892 /src | |
parent | 77a7900aaa790f7bb5e0105f38dbd539f04e219f (diff) | |
download | qtwayland-007d73ef9e64a99e560cc932f519f8cb00121ba8.tar.gz qtwayland-007d73ef9e64a99e560cc932f519f8cb00121ba8.tar.bz2 qtwayland-007d73ef9e64a99e560cc932f519f8cb00121ba8.zip |
Fix threaded OpenGL rendering on Mesa and possibly other EGLs
eglBindAPI's docs says "defines the current rendering API for EGL in the
thread it is called from". We were instead just calling it in the thread
the context was created in, not in the thread used for rendering.
Change-Id: Iba8ffe75a6f4f8b9d1bba59c0e7cce34499e9c48
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
Diffstat (limited to 'src')
3 files changed, 14 insertions, 4 deletions
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglclientbufferintegration.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandeglclientbufferintegration.cpp index ccacf573..8f3ce093 100644 --- a/src/hardwareintegration/client/wayland-egl/qwaylandeglclientbufferintegration.cpp +++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglclientbufferintegration.cpp @@ -45,7 +45,6 @@ QT_BEGIN_NAMESPACE namespace QtWaylandClient { static const char *qwaylandegl_threadedgl_blacklist_vendor[] = { - "Mesa Project", 0 }; diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp index a062a2f9..18ed1d61 100644 --- a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp +++ b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp @@ -260,21 +260,22 @@ QWaylandGLContext::QWaylandGLContext(EGLDisplay eglDisplay, QWaylandDisplay *dis switch (m_format.renderableType()) { case QSurfaceFormat::OpenVG: - eglBindAPI(EGL_OPENVG_API); + m_api = EGL_OPENVG_API; break; #ifdef EGL_VERSION_1_4 # if !defined(QT_OPENGL_ES_2) case QSurfaceFormat::DefaultRenderableType: # endif case QSurfaceFormat::OpenGL: - eglBindAPI(EGL_OPENGL_API); + m_api = EGL_OPENGL_API; break; #endif case QSurfaceFormat::OpenGLES: default: - eglBindAPI(EGL_OPENGL_ES_API); + m_api = EGL_OPENGL_ES_API; break; } + eglBindAPI(m_api); m_context = eglCreateContext(m_eglDisplay, m_config, m_shareEGLContext, eglContextAttrs.constData()); @@ -358,6 +359,15 @@ QWaylandGLContext::~QWaylandGLContext() bool QWaylandGLContext::makeCurrent(QPlatformSurface *surface) { + // in QWaylandGLContext() we called eglBindAPI with the correct value. However, + // eglBindAPI's documentation says: + // "eglBindAPI defines the current rendering API for EGL in the thread it is called from" + // Since makeCurrent() can be called from a different thread than the one we created the + // context in make sure to call eglBindAPI in the correct thread. + if (eglQueryAPI() != m_api) { + eglBindAPI(m_api); + } + QWaylandEglWindow *window = static_cast<QWaylandEglWindow *>(surface); EGLSurface eglSurface = window->eglSurface(); diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.h b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.h index 1c2db8aa..bc92c950 100644 --- a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.h +++ b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.h @@ -85,6 +85,7 @@ private: QSurfaceFormat m_format; DecorationsBlitter *m_blitter; bool mUseNativeDefaultFbo; + uint m_api; friend class DecorationsBlitter; }; |