aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2016-06-29 16:39:48 +0200
committerLaszlo Agocs <laszlo.agocs@qt.io>2016-07-01 11:36:56 +0000
commit023170b8276659118fd28d787597d749f80501e9 (patch)
tree4f13efe80741776135c85f853f74c3f8d1b13057 /src/plugins
parent589f92b188ff61a3b965d5d5c67d89333425cc97 (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')
-rw-r--r--src/plugins/scenegraph/d3d12/qsgd3d12renderloop.cpp21
-rw-r--r--src/plugins/scenegraph/d3d12/qsgd3d12renderloop_p.h1
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;