Don't recreate hidden egl surfaces

QWaylandEglWindow deletes surfaces when a window changes from hidden to
visible, presumably as a result of us not having a valid wl_surface
object. By extension it doesn't make sense to create a surface whilst a
window is still hidden.

This fixes a crash where a QQuickWindow hides and then is destroyed. In
QQuickWindow destruction we have to create a valid context in order to
delete any textures/assets owned by the scene graph; as the wl_surface
has gone this causes an error in the EGL libs when we create an EGL
surface.

Task-number: QTBUG-65553
Change-Id: I9b37a86326bf2cd7737c4e839c1aa8c74cf08116
Reviewed-by: Johan Helsing <johan.helsing@qt.io>
This commit is contained in:
David Edmundson 2018-01-03 19:18:42 +00:00
parent 0483742ad9
commit dd2018f0e5

View File

@ -35,6 +35,8 @@
#include <QMimeData>
#include <QPixmap>
#include <QDrag>
#include <QWindow>
#include <QOpenGLWindow>
#include <QtTest/QtTest>
#include <QtWaylandClient/private/qwaylandintegration_p.h>
@ -112,6 +114,25 @@ public:
QPoint mousePressPos;
};
class TestGlWindow : public QOpenGLWindow
{
Q_OBJECT
public:
TestGlWindow();
protected:
void paintGL() override;
};
TestGlWindow::TestGlWindow()
{}
void TestGlWindow::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
}
class tst_WaylandClient : public QObject
{
Q_OBJECT
@ -149,6 +170,7 @@ private slots:
void dontCrashOnMultipleCommits();
void hiddenTransientParent();
void hiddenPopupParent();
void glWindow();
private:
MockCompositor *compositor;
@ -409,6 +431,21 @@ void tst_WaylandClient::hiddenPopupParent()
QTRY_VERIFY(compositor->surface());
}
void tst_WaylandClient::glWindow()
{
QSKIP("Skipping GL tests, as not supported by all CI systems: See https://bugreports.qt.io/browse/QTBUG-65802");
QScopedPointer<TestGlWindow> testWindow(new TestGlWindow);
testWindow->show();
QSharedPointer<MockSurface> surface;
QTRY_VERIFY(surface = compositor->surface());
//confirm we don't crash when we delete an already hidden GL window
//QTBUG-65553
testWindow->setVisible(false);
QTRY_VERIFY(!compositor->surface());
}
int main(int argc, char **argv)
{
setenv("XDG_RUNTIME_DIR", ".", 1);