@@ -25,6 +25,29 @@
25#include <private/qquickitem_p.h>
25#include <private/qquickitem_p.h>
26#include <private/qsgrenderer_p.h>
26#include <private/qsgrenderer_p.h>
29+class ApplySceneGraphVisualizationJob : public QRunnable
32+ ApplySceneGraphVisualizationJob(QQuickWindow *window, QByteArray renderMode)
33+ : m_window(window), m_renderMode(renderMode){}
36+ qDebug() << "Setting custom render mode to:" << m_renderMode;
38+ QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(m_window);
40+ winPriv->customRenderMode = m_renderMode;
41+ delete winPriv->renderer;
42+ winPriv->renderer = nullptr;
44+ QTimer::singleShot(10, m_window, &QQuickWindow::update); // force another frame
47+ QQuickWindow *m_window;
48+ QByteArray m_renderMode;
28DebuggingController::DebuggingController(QObject *parent):
51DebuggingController::DebuggingController(QObject *parent):
29 UnityDBusObject(QStringLiteral("/com/canonical/Unity8/Debugging"), QStringLiteral("com.canonical.Unity8"), true, parent)
52 UnityDBusObject(QStringLiteral("/com/canonical/Unity8/Debugging"), QStringLiteral("com.canonical.Unity8"), true, parent)
@@ -47,29 +70,8 @@ void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
47 // Thus the optimizations are only applied if there is no custom render mode set.
70 // Thus the optimizations are only applied if there is no custom render mode set.
48 // So we need to make the scenegraph recheck whether a custom render mode is set.
71 // So we need to make the scenegraph recheck whether a custom render mode is set.
49 // We do this by simply recreating the renderer.
72 // We do this by simply recreating the renderer.
50− QMutexLocker lock(&m_renderModeMutex);
73+ qquickWindow->scheduleRenderJob(new ApplySceneGraphVisualizationJob(qquickWindow, pendingRenderMode),
51− QMetaObject::Connection conn;
74+ QQuickWindow::AfterSwapStage);
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)) {
58− disconnect(m_mapper.take(qquickWindow));
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();
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);
74 QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
76 QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
75 winPriv->customRenderMode = visualizer.toLatin1();
77 winPriv->customRenderMode = visualizer.toLatin1();