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:
parent
0483742ad9
commit
dd2018f0e5
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user