on xenial help sign in
fix it up
6d65217Michael Zanetti
src/DebuggingController.cpp+25−23
@@ -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>
27
27
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+
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)
30{
53{
@@ -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)) {
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#else
75#else
74 QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
76 QQuickWindowPrivate *winPriv = QQuickWindowPrivate::get(qquickWindow);
75 winPriv->customRenderMode = visualizer.toLatin1();
77 winPriv->customRenderMode = visualizer.toLatin1();
src/DebuggingController.h−3
@@ -53,8 +53,5 @@ public Q_SLOTS:
53 */
53 */
54 Q_SCRIPTABLE void SetLoggingFilterRules(const QString &filterRules);
54 Q_SCRIPTABLE void SetLoggingFilterRules(const QString &filterRules);
55
55
56−private:
57− QMutex m_renderModeMutex;
58− QHash<QQuickWindow*, QMetaObject::Connection> m_mapper;
59};
56};
60#endif // DEBUGGINGCONTROLLER_H
57#endif // DEBUGGINGCONTROLLER_H