@@ -25,6 +25,29 @@
2525#include <private/qquickitem_p.h>
2626#include <private/qsgrenderer_p.h>
2727
28+
29+class ApplySceneGraphVisualizationJob : public QRunnable
30+{
31+public:
32+ ApplySceneGraphVisualizationJob(QQuickWindow *window, QByteArray renderMode)
33+ : m_window(window), m_renderMode(renderMode){}
34+ void run() override
35+ {
36+ qDebug() << "Setting custom render mode to:" << m_renderMode;
37+
38+ QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(m_window);
39+
40+ winPriv->customRenderMode = m_renderMode;
41+ delete winPriv->renderer;
42+ winPriv->renderer = nullptr;
43+
44+ QTimer::singleShot(10, m_window, &QQuickWindow::update); // force another frame
45+ }
46+
47+ QQuickWindow *m_window;
48+ QByteArray m_renderMode;
49+};
50+
2851DebuggingController::DebuggingController(QObject *parent):
2952 UnityDBusObject(QStringLiteral("/com/canonical/Unity8/Debugging"), QStringLiteral("com.canonical.Unity8"), true, parent)
3053{
@@ -47,29 +70,8 @@ void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
4770 // Thus the optimizations are only applied if there is no custom render mode set.
4871 // So we need to make the scenegraph recheck whether a custom render mode is set.
4972 // We do this by simply recreating the renderer.
50− QMutexLocker lock(&m_renderModeMutex);
51− QMetaObject::Connection conn;
52− conn = connect(qquickWindow, &QQuickWindow::beforeSynchronizing, this, [this, qquickWindow, pendingRenderMode]() {
53− qDebug() << "Setting curstom render mode to:" << pendingRenderMode;
54− QMutexLocker lock(&m_renderModeMutex);
55− if (!m_mapper.contains(qquickWindow)) {
56− return;
57− }
58− disconnect(m_mapper.take(qquickWindow));
59−
60− QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
61− QQuickItemPrivate *contentPriv = QQuickItemPrivate::get(qquickWindow->contentItem());
62− QSGNode *rootNode = contentPriv->itemNode();
63− while (rootNode->parent())
64− rootNode = rootNode->parent();
65−
66− winPriv->customRenderMode = pendingRenderMode;
67− delete winPriv->renderer;
68− winPriv->renderer = winPriv->context->createRenderer();
69− winPriv->renderer->setRootNode(static_cast<QSGRootNode *>(rootNode));
70− }, Qt::DirectConnection);
71− m_mapper.insert(qquickWindow, conn);
72−
73+ qquickWindow->scheduleRenderJob(new ApplySceneGraphVisualizationJob(qquickWindow, pendingRenderMode),
74+ QQuickWindow::AfterSwapStage);
7375#else
7476 QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
7577 winPriv->customRenderMode = visualizer.toLatin1();