diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2016-06-29 16:39:48 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2016-07-01 11:36:56 +0000 |
commit | 023170b8276659118fd28d787597d749f80501e9 (patch) | |
tree | 4f13efe80741776135c85f853f74c3f8d1b13057 /src/plugins/scenegraph/d3d12 | |
parent | 589f92b188ff61a3b965d5d5c67d89333425cc97 (diff) |
D3D12: Fix expose handling
to avoid unnecessary rendering attempts when closing windows containing
certain Quick Controls (1).
Basically this introduces a condition that is there in the threaded loop's
polishAndSync but was missing from renderWindow. When the window is not
"exposed" either normally or via grab(), it should just return.
Change-Id: I42602e33ba144a1c56586a4b92fa088e85099d0d
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'src/plugins/scenegraph/d3d12')
-rw-r--r-- | src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp | 21 | ||||
-rw-r--r-- | src/plugins/scenegraph/d3d12/qsgd3d12renderloop_p.h | 1 |
2 files changed, 18 insertions, 4 deletions
diff --git a/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp b/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp index 4684e7243f..d845b65c28 100644 --- a/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp +++ b/src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp @@ -84,13 +84,17 @@ void QSGD3D12RenderLoop::hide(QQuickWindow *window) void QSGD3D12RenderLoop::resize(QQuickWindow *window) { - if (!window->isExposed() || window->size().isEmpty()) + if (!m_windows.contains(window) || window->size().isEmpty()) return; if (Q_UNLIKELY(debug_loop())) qDebug() << "resize" << window; - WindowData &data(m_windows[window]); + const WindowData &data(m_windows[window]); + + if (!data.exposed) + return; + if (data.engine) data.engine->setWindowSize(window->size(), window->effectiveDevicePixelRatio()); } @@ -131,6 +135,7 @@ void QSGD3D12RenderLoop::windowDestroyed(QQuickWindow *window) void QSGD3D12RenderLoop::exposeWindow(QQuickWindow *window) { WindowData data; + data.exposed = true; data.engine = new QSGD3D12Engine; data.rc = static_cast<QSGD3D12RenderContext *>(QQuickWindowPrivate::get(window)->context); data.rc->setEngine(data.engine); @@ -147,6 +152,7 @@ void QSGD3D12RenderLoop::exposeWindow(QQuickWindow *window) void QSGD3D12RenderLoop::obscureWindow(QQuickWindow *window) { + m_windows[window].exposed = false; QQuickWindowPrivate *wd = QQuickWindowPrivate::get(window); wd->fireAboutToStop(); } @@ -154,12 +160,14 @@ void QSGD3D12RenderLoop::obscureWindow(QQuickWindow *window) void QSGD3D12RenderLoop::exposureChanged(QQuickWindow *window) { if (Q_UNLIKELY(debug_loop())) - qDebug() << "exposure changed" << window; + qDebug() << "exposure changed" << window << window->isExposed(); if (window->isExposed()) { if (!m_windows.contains(window)) exposeWindow(window); - m_windows[window].updatePending = true; + WindowData &data(m_windows[window]); + data.exposed = true; + data.updatePending = true; renderWindow(window); } else if (m_windows.contains(window)) { obscureWindow(window); @@ -252,6 +260,11 @@ void QSGD3D12RenderLoop::renderWindow(QQuickWindow *window) return; WindowData &data(m_windows[window]); + if (!data.exposed) { // not the same as window->isExposed(), when grabbing invisible windows for instance + if (Q_UNLIKELY(debug_loop())) + qDebug("renderWindow - not exposed, abort"); + return; + } const bool needsSwap = data.updatePending; data.updatePending = false; diff --git a/src/plugins/scenegraph/d3d12/qsgd3d12renderloop_p.h b/src/plugins/scenegraph/d3d12/qsgd3d12renderloop_p.h index 3cd0fa0043..2f2ebbef33 100644 --- a/src/plugins/scenegraph/d3d12/qsgd3d12renderloop_p.h +++ b/src/plugins/scenegraph/d3d12/qsgd3d12renderloop_p.h @@ -102,6 +102,7 @@ private: QSGD3D12Engine *engine = nullptr; bool updatePending = false; bool grabOnly = false; + bool exposed = false; }; QHash<QQuickWindow *, WindowData> m_windows; |