From eb44571eab0036a9a1bcd7c423f0187abcbf7a37 Mon Sep 17 00:00:00 2001 From: Johan Klokkhammer Helsing Date: Thu, 30 Aug 2018 09:31:33 +0200 Subject: [PATCH] Fix regression in QWaylandGlContext::makeCurrent for offscreen surfaces [ChangeLog][QPA plugin] Fixed a bug where offscreen surfaces would get surfaceless EGL contexts. Fixes a regression in in bf09c7a1. The call, window->updateSurface(window->isExposed()), is problematic because offscreen textures are never exposed, and consequently, eglSurface will be EGL_NO_SURFACE, which will then create a surfaceless context in the call: eglMakeCurrent(m_eglDisplay, eglSurface, eglSurface, m_context) This reverts to the old behavior of always trying to create an EGL surface, unless the window doesn't have a valid wl_surface, in which case it doesn't make sense (which is what bf09c7a1 fixed, QTBUG-65553). Task-number: QTBUG-70242 Task-number: QTBUG-68605 Task-number: QTBUG-67601 Change-Id: I44b07bb8bf4b33c73c6379a1de8e9e5cfd220b51 Signed-off-by: Johan Helsing Signed-off-by: Madhurkiran Harikrishnan Upstream-Status: Backport --- src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp | 9 ++++++--- src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp index 5c22a83..355bf17 100644 --- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp +++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp @@ -132,13 +132,16 @@ void QWaylandEglWindow::updateSurface(bool create) m_resize = true; } - } else if (create) { - m_waylandEglWindow = wl_egl_window_create(object(), sizeWithMargins.width(), sizeWithMargins.height()); + } else if (create && wl_surface::isInitialized()) { + ::wl_surface *wlSurface = wl_surface::object(); + m_waylandEglWindow = wl_egl_window_create(wlSurface, sizeWithMargins.width(), sizeWithMargins.height()); } - if (!m_eglSurface && create) { + if (!m_eglSurface && m_waylandEglWindow && create) { EGLNativeWindowType eglw = (EGLNativeWindowType) m_waylandEglWindow; m_eglSurface = eglCreateWindowSurface(m_clientBufferIntegration->eglDisplay(), m_eglConfig, eglw, 0); + if (Q_UNLIKELY(m_eglSurface == EGL_NO_SURFACE)) + qWarning("Could not create EGL surface (EGL error 0x%x)\n", eglGetError); } } } diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp index f4dd6f4..2a9e39e 100644 --- a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp +++ b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp @@ -407,7 +407,7 @@ bool QWaylandGLContext::makeCurrent(QPlatformSurface *surface) window->createDecoration(); if (eglSurface == EGL_NO_SURFACE) { - window->updateSurface(window->isExposed()); + window->updateSurface(true); eglSurface = window->eglSurface(); } -- 2.7.4