diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2017-02-26 17:18:40 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2017-02-27 12:38:08 +0000 |
commit | dfc338613ef54de67f2f2b2962d08b0c5a99fcdd (patch) | |
tree | 1121a1c16f844b9169bd3eefbf822509830b86fe /src/gui/kernel/qwindow.cpp | |
parent | e39e4bfc0f49d06e1c742654d2d2f79bab245116 (diff) |
Make QPlatformSurface events work with QWindowContainer
Embeddeding a QWindow via QWidget::createWindowContainer() fails to
deliver the SurfaceAboutToBeDestroyed event. This breaks any OpenGL
or Vulkan based QWindow that releases resources upon this event, and
is particularly critical with Vulkan where the only way to do properly
ordered swapchain - surface cleanup is via this event.
In the non-embedded case close() eventually ends up in an explicit
destroy() in QWindow. In the embedded case destroy() only gets called
from ~QWindow. This then silently breaks since the subclass' reimplemented
event() virtual is not getting called anymore.
To remedy the problem, simply add an explicit destroy() to
QWindowContainer.
Task-number: QTBUG-55166
Change-Id: I1671e8f4d39f6c44e19eca7b9387f55fe3788294
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/gui/kernel/qwindow.cpp')
-rw-r--r-- | src/gui/kernel/qwindow.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 8e98958949..c94ea0922a 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -1814,6 +1814,15 @@ void QWindowPrivate::destroy() q->setVisible(false); + // Let subclasses act, typically by doing graphics resource cleaup, when + // the window, to which graphics resource may be tied, is going away. + // + // NB! This is disfunctional when destroy() is invoked from the dtor since + // a reimplemented event() will not get called in the subclasses at that + // stage. However, the typical QWindow cleanup involves either close() or + // going through QWindowContainer, both of which will do an explicit, early + // destroy(), which is good here. + QPlatformSurfaceEvent e(QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed); QGuiApplication::sendEvent(q, &e); |