@@ -28,11 +28,16 @@
28DebuggingController::DebuggingController(QObject *parent):
28DebuggingController::DebuggingController(QObject *parent):
29 UnityDBusObject(QStringLiteral("/com/canonical/Unity8/Debugging"), QStringLiteral("com.canonical.Unity8"), true, parent)
29 UnityDBusObject(QStringLiteral("/com/canonical/Unity8/Debugging"), QStringLiteral("com.canonical.Unity8"), true, parent)
31− connect(&m_mapper, SIGNAL(mapped(QObject*)), this, SLOT(applyRenderMode(QObject*)), Qt::DirectConnection);
34void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
33void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
35+ QByteArray pendingRenderMode;
36+ QStringList supportedRenderModes = {"clip", "overdraw", "changes", "batches"};
37+ if (supportedRenderModes.contains(visualizer)) {
38+ pendingRenderMode = visualizer.toLatin1();
36 Q_FOREACH (QWindow *window, QGuiApplication::allWindows()) {
41 Q_FOREACH (QWindow *window, QGuiApplication::allWindows()) {
37 QQuickWindow* qquickWindow = qobject_cast<QQuickWindow*>(window);
42 QQuickWindow* qquickWindow = qobject_cast<QQuickWindow*>(window);
38 if (qquickWindow) {
43 if (qquickWindow) {
@@ -43,10 +48,28 @@ void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
43 // So we need to make the scenegraph recheck whether a custom render mode is set.
48 // So we need to make the scenegraph recheck whether a custom render mode is set.
44 // We do this by simply recreating the renderer.
49 // We do this by simply recreating the renderer.
45 QMutexLocker lock(&m_renderModeMutex);
50 QMutexLocker lock(&m_renderModeMutex);
46− m_pendingRenderMode = visualizer;
51+ QMetaObject::Connection conn;
47− qDebug() << "connecting to mapper";
52+ conn = connect(qquickWindow, &QQuickWindow::beforeSynchronizing, this, [this, qquickWindow, pendingRenderMode]() {
48− connect(qquickWindow, SIGNAL(beforeSynchronizing()), &m_mapper, SLOT(map()), Qt::DirectConnection);
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);
49− m_mapper.setMapping(qquickWindow, qquickWindow);
71+ m_mapper.insert(qquickWindow, conn);
51 QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
74 QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
52 winPriv->customRenderMode = visualizer.toLatin1();
75 winPriv->customRenderMode = visualizer.toLatin1();
@@ -56,34 +79,6 @@ void DebuggingController::SetSceneGraphVisualizer(const QString &visualizer)
59−void DebuggingController::applyRenderMode(QObject* sender) {
60− qDebug() << "applyRenderMode called" << sender;
61− QQuickWindow *qquickWindow = dynamic_cast<QQuickWindow*>(sender);
62− qDebug() << "window is" << qquickWindow;
64− QMutexLocker lock(&m_renderModeMutex);
65− disconnect(qquickWindow, SIGNAL(beforeSynchronizing()), &m_mapper, SLOT(map()));
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();
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";
87void DebuggingController::SetSlowAnimations(bool slowAnimations)
82void DebuggingController::SetSlowAnimations(bool slowAnimations)
89 QUnifiedTimer::instance()->setSlowModeEnabled(slowAnimations);
84 QUnifiedTimer::instance()->setSlowModeEnabled(slowAnimations);