From 023170b8276659118fd28d787597d749f80501e9 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Wed, 29 Jun 2016 16:39:48 +0200 Subject: 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 --- src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp | 21 +++++++++++++++++---- 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(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 m_windows; -- cgit v1.2.3