diff options
Diffstat (limited to 'src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp')
-rw-r--r-- | src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp | 21 |
1 files changed, 17 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; |