on xenial help sign in
fix it up
commit6d65217dd8c36deedd5fc080e581a2287e9f56cb authorMichael Zanetti <michael.zanetti@canonical.com> dateWed 14 Dec 2016, 18:06 (10 years ago) parent969b985
2 files changed+25−26
src/DebuggingController.cpp+25−23 src/DebuggingController.h−3
src/DebuggingController.cpp+25−23
@@ -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();
src/DebuggingController.h−3
@@ -53,8 +53,5 @@ public Q_SLOTS:
5353 */
5454 Q_SCRIPTABLE void SetLoggingFilterRules(const QString &filterRules);
5555
56−private:
57− QMutex m_renderModeMutex;
58− QHash<QQuickWindow*, QMetaObject::Connection> m_mapper;
5956};
6057#endif // DEBUGGINGCONTROLLER_H