@@ -28,11 +28,16 @@
2828DebuggingController::DebuggingController(QObject *parent):
2929 UnityDBusObject(QStringLiteral("/com/canonical/Unity8/Debugging"), QStringLiteral("com.canonical.Unity8"), true, parent)
3030{
31− connect(&m_mapper, SIGNAL(mapped(QObject*)), this, SLOT(applyRenderMode(QObject*)), Qt::DirectConnection);
3231}
3332
3433void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
3534{
35+ QByteArray pendingRenderMode;
36+ QStringList supportedRenderModes = {"clip", "overdraw", "changes", "batches"};
37+ if (supportedRenderModes.contains(visualizer)) {
38+ pendingRenderMode = visualizer.toLatin1();
39+ }
40+
3641 Q_FOREACH (QWindow *window, QGuiApplication::allWindows()) {
3742 QQuickWindow* qquickWindow = qobject_cast<QQuickWindow*>(window);
3843 if (qquickWindow) {
@@ -43,10 +48,28 @@ void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
4348 // So we need to make the scenegraph recheck whether a custom render mode is set.
4449 // We do this by simply recreating the renderer.
4550 QMutexLocker lock(&m_renderModeMutex);
46− m_pendingRenderMode = visualizer;
47− qDebug() << "connecting to mapper";
48− connect(qquickWindow, SIGNAL(beforeSynchronizing()), &m_mapper, SLOT(map()), Qt::DirectConnection);
49− m_mapper.setMapping(qquickWindow, qquickWindow);
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+
5073#else
5174 QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
5275 winPriv->customRenderMode = visualizer.toLatin1();
@@ -56,34 +79,6 @@ void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
5679 }
5780}
5881
59−void DebuggingController::applyRenderMode(QObject* sender) {
60− qDebug() << "applyRenderMode called" << sender;
61− QQuickWindow *qquickWindow = dynamic_cast<QQuickWindow*>(sender);
62− qDebug() << "window is" << qquickWindow;
63−
64− QMutexLocker lock(&m_renderModeMutex);
65− disconnect(qquickWindow, SIGNAL(beforeSynchronizing()), &m_mapper, SLOT(map()));
66−
67− qDebug() << "mutex locked";
68−#if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)
69− QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
70− QQuickItemPrivate *contentPriv = QQuickItemPrivate::get(qquickWindow->contentItem());
71− qDebug() << "winPriv is" << winPriv << "contentPriv is" << contentPriv;
72− QSGNode *rootNode = contentPriv->itemNode();
73− while (rootNode->parent())
74− rootNode = rootNode->parent();
75−
76− qDebug() << "rootnode is" << rootNode;
77− winPriv->customRenderMode = m_pendingRenderMode.toLatin1();
78− delete winPriv->renderer;
79− qDebug() << "renderer deleted";
80− winPriv->renderer = winPriv->context->createRenderer();
81− qDebug() << "new renderer created";
82− winPriv->renderer->setRootNode(static_cast<QSGRootNode *>(rootNode));
83− qDebug() << "setting back old rootNode. done";
84−#endif
85−}
86−
8782void DebuggingController::SetSlowAnimations(bool slowAnimations)
8883{
8984 QUnifiedTimer::instance()->setSlowModeEnabled(slowAnimations);