Merge lp:~loic.molinari/qtmir/qtmir-minimize-node-updates into lp:qtmir

Proposed by Loïc Molinari
Status: Work in progress
Proposed branch: lp:~loic.molinari/qtmir/qtmir-minimize-node-updates
Merge into: lp:qtmir
Prerequisite: lp:~loic.molinari/qtmir/multi-bufferstream-support-fixes
Diff against target: 227 lines (+86/-21)
5 files modified
src/modules/Unity/Application/mirsurface.cpp (+23/-15)
src/modules/Unity/Application/mirsurface.h (+3/-2)
src/modules/Unity/Application/mirsurfaceinterface.h (+12/-3)
src/modules/Unity/Application/mirsurfaceitem.cpp (+34/-1)
src/modules/Unity/Application/mirsurfaceitem.h (+14/-0)
To merge this branch: bzr merge lp:~loic.molinari/qtmir/qtmir-minimize-node-updates
Reviewer Review Type Date Requested Status
Unity8 CI Bot (community) continuous-integration Needs Fixing
PS Jenkins bot (community) continuous-integration Needs Fixing
Mir development team Pending
Review via email: mp+276504@code.launchpad.net

Commit message

Optimized CPU usage by removing useless node updates in updatePaintNode().

Description of the change

Optimized CPU usage by removing useless node updates in updatePaintNode().

To post a comment you must log in.
Revision history for this message
Loïc Molinari (loic.molinari) wrote :

Note that this MR requires the multi buffer stream MR [1] from RAOF (with my fixes proposal [2] applied) to be merged.

[1] https://code.launchpad.net/~raof/qtmir/multi-bufferstream-support/+merge/274517
[2] https://code.launchpad.net/~loic.molinari/qtmir/multi-bufferstream-support-fixes

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote :

FAILED: Continuous integration, rev:397
https://unity8-jenkins.ubuntu.com/job/lp-qtmir-1-ci/9/
Executed test runs:

Click here to trigger a rebuild:
https://unity8-jenkins.ubuntu.com/job/lp-qtmir-1-ci/9/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
Unity8 CI Bot (unity8-ci-bot) wrote :
review: Needs Fixing (continuous-integration)

Unmerged revisions

397. By Loïc Molinari

Minimized node updates.

396. By Loïc Molinari

Removed useless texture provider header.

395. By Loïc Molinari

Respected project style for function parameters wrapping.

394. By Loïc Molinari

Switched back to stretched fill mode.

393. By Loïc Molinari

Flattened subtree by removing transform nodes, position now directly set on geometry.

392. By Loïc Molinari

Ensured nodes are deleted when shrinking renderables.

391. By Loïc Molinari

Avoid iterating the nodes twice when there are new buffers available.

390. By Loïc Molinari

Fixed broken rendering in spread mode when AA is enabled.

389. By Loïc Molinari

Removed useless markDirty call.

388. By Loïc Molinari

Merged lp:qtmir.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/modules/Unity/Application/mirsurface.cpp'
2--- src/modules/Unity/Application/mirsurface.cpp 2015-11-03 10:20:05 +0000
3+++ src/modules/Unity/Application/mirsurface.cpp 2015-11-03 10:20:05 +0000
4@@ -713,8 +713,9 @@
5 QSGNode *MirSurface::updateSubgraph(QSGNode *root,
6 float width,
7 float height,
8- bool smooth,
9- bool antialiasing)
10+ QSGTexture::Filtering filtering,
11+ bool antialiasing,
12+ DirtyFlags flags)
13 {
14 QMutexLocker locker(&m_mutex);
15
16@@ -729,6 +730,7 @@
17
18 if (static_cast<size_t>(root->childCount()) != renderableCount) {
19 resizeSubgraph(root, renderableCount);
20+ flags = DirtyAll;
21 }
22
23 if (renderableCount > 0) {
24@@ -743,19 +745,25 @@
25 if (dirtyBuffers) {
26 node->setBuffer(renderables[i]->buffer());
27 }
28-
29- // Renderables in the RenderableList are absolutely-positioned, but we want
30- // relative positioning. This seems to be a flaw in the generate_renderables() API.
31- // Note that the geometry is always stretched for now.
32- auto const screenPosition = renderables[i]->screen_position();
33- auto const position = screenPosition.top_left - topLeft;
34- auto const size = screenPosition.size;
35- node->setGeometry(QRectF(position.dx.as_float() * sx, position.dy.as_float() * sy,
36- size.width.as_float() * sx, size.height.as_float() * sy));
37-
38- node->setFiltering(smooth ? QSGTexture::Linear : QSGTexture::Nearest);
39- node->setAntialiasing(antialiasing);
40- node->update();
41+ if (flags & DirtyGeometry) {
42+ // Renderables in the RenderableList are absolutely-positioned, but we want
43+ // relative positioning. This seems to be a flaw in the generate_renderables() API.
44+ // Note that the geometry is always stretched for now.
45+ auto const screenPosition = renderables[i]->screen_position();
46+ auto const position = screenPosition.top_left - topLeft;
47+ auto const size = screenPosition.size;
48+ node->setGeometry(QRectF(position.dx.as_float() * sx, position.dy.as_float() * sy,
49+ size.width.as_float() * sx, size.height.as_float() * sy));
50+ }
51+ if (flags & DirtyFiltering) {
52+ node->setFiltering(filtering);
53+ }
54+ if (flags & DirtyAntialiasing) {
55+ node->setAntialiasing(antialiasing);
56+ }
57+ if (flags & (DirtyGeometry | DirtyAntialiasing)) {
58+ node->update();
59+ }
60 }
61 }
62
63
64=== modified file 'src/modules/Unity/Application/mirsurface.h'
65--- src/modules/Unity/Application/mirsurface.h 2015-11-03 10:20:05 +0000
66+++ src/modules/Unity/Application/mirsurface.h 2015-11-03 10:20:05 +0000
67@@ -87,8 +87,9 @@
68 QSGNode *updateSubgraph(QSGNode *root,
69 float width,
70 float height,
71- bool smooth,
72- bool antialiasing) override;
73+ QSGTexture::Filtering filtering,
74+ bool antialiasing,
75+ DirtyFlags flags) override;
76 bool numBuffersReadyForCompositor() override;
77 // end of methods called from the rendering (scene graph) thread
78
79
80=== modified file 'src/modules/Unity/Application/mirsurfaceinterface.h'
81--- src/modules/Unity/Application/mirsurfaceinterface.h 2015-11-03 10:20:05 +0000
82+++ src/modules/Unity/Application/mirsurfaceinterface.h 2015-11-03 10:20:05 +0000
83@@ -25,6 +25,7 @@
84 // Qt
85 #include <QSharedPointer>
86 #include <QTouchEvent>
87+#include <QtQuick/QSGTexture>
88
89 class QHoverEvent;
90 class QMouseEvent;
91@@ -38,6 +39,13 @@
92 {
93 Q_OBJECT
94 public:
95+ enum DirtyFlags {
96+ DirtyFiltering = (1 << 0),
97+ DirtyAntialiasing = (1 << 1),
98+ DirtyGeometry = (1 << 2),
99+ DirtyAll = (DirtyFiltering | DirtyAntialiasing | DirtyGeometry)
100+ };
101+
102 MirSurfaceInterface(QObject *parent = nullptr) : unity::shell::application::MirSurfaceInterface(parent) {}
103 virtual ~MirSurfaceInterface() {}
104
105@@ -53,11 +61,12 @@
106 virtual void decrementViewCount() = 0;
107
108 // methods called from the rendering (scene graph) thread:
109- virtual QSGNode *updateSubgraph(QSGNode* root,
110+ virtual QSGNode *updateSubgraph(QSGNode *root,
111 float width,
112 float height,
113- bool smooth,
114- bool antialiasing) = 0;
115+ QSGTexture::Filtering filtering,
116+ bool antialiasing,
117+ DirtyFlags flags) = 0;
118 virtual bool numBuffersReadyForCompositor() = 0;
119 // end of methods called from the rendering (scene graph) thread
120
121
122=== modified file 'src/modules/Unity/Application/mirsurfaceitem.cpp'
123--- src/modules/Unity/Application/mirsurfaceitem.cpp 2015-11-03 10:20:05 +0000
124+++ src/modules/Unity/Application/mirsurfaceitem.cpp 2015-11-03 10:20:05 +0000
125@@ -49,6 +49,7 @@
126 , m_surfaceHeight(0)
127 , m_orientationAngle(nullptr)
128 , m_consumesInput(false)
129+ , m_flags(0)
130 {
131 qCDebug(QTMIR_SURFACES) << "MirSurfaceItem::MirSurfaceItem";
132
133@@ -64,6 +65,7 @@
134 connect(&m_updateMirSurfaceSizeTimer, &QTimer::timeout, this, &MirSurfaceItem::updateMirSurfaceSize);
135
136 connect(this, &QQuickItem::activeFocusChanged, this, &MirSurfaceItem::updateMirSurfaceFocus);
137+ connect(this, &QQuickItem::smoothChanged, this, &MirSurfaceItem::onSmoothChanged);
138 }
139
140 MirSurfaceItem::~MirSurfaceItem()
141@@ -132,6 +134,32 @@
142 return m_surface && m_surface->live();
143 }
144
145+void MirSurfaceItem::itemChange(ItemChange change, const ItemChangeData &data)
146+{
147+ if (change == ItemAntialiasingHasChanged) {
148+ m_flags |= DirtyAntialiasing;
149+ update();
150+ }
151+ QQuickItem::itemChange(change, data);
152+}
153+
154+void MirSurfaceItem::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
155+{
156+ if (newGeometry.width() != oldGeometry.width()
157+ || newGeometry.height() != oldGeometry.height()) {
158+ m_flags |= DirtyGeometry;
159+ update();
160+ }
161+ QQuickItem::geometryChanged(newGeometry, oldGeometry);
162+}
163+
164+void MirSurfaceItem::onSmoothChanged(bool smooth)
165+{
166+ Q_UNUSED(smooth);
167+ m_flags |= DirtyFiltering;
168+ update();
169+}
170+
171 QSGNode *MirSurfaceItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) // called by render thread
172 {
173 QMutexLocker mutexLocker(&m_mutex);
174@@ -145,7 +173,12 @@
175 QTimer::singleShot(0, this, SLOT(update()));
176 }
177
178- return m_surface->updateSubgraph(oldNode, width(), height(), smooth(), antialiasing());
179+ oldNode = m_surface->updateSubgraph(
180+ oldNode, width(), height(), smooth() ? QSGTexture::Linear : QSGTexture::Nearest,
181+ antialiasing(), static_cast<MirSurfaceInterface::DirtyFlags>(m_flags));
182+ m_flags = 0;
183+
184+ return oldNode;
185 }
186
187 void MirSurfaceItem::mousePressEvent(QMouseEvent *event)
188
189=== modified file 'src/modules/Unity/Application/mirsurfaceitem.h'
190--- src/modules/Unity/Application/mirsurfaceitem.h 2015-11-03 10:20:05 +0000
191+++ src/modules/Unity/Application/mirsurfaceitem.h 2015-11-03 10:20:05 +0000
192@@ -93,6 +93,9 @@
193
194 void touchEvent(QTouchEvent *event) override;
195
196+ void itemChange(ItemChange change, const ItemChangeData &data);
197+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
198+
199 QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *);
200
201 private Q_SLOTS:
202@@ -103,7 +106,16 @@
203
204 void onActualSurfaceSizeChanged(const QSize &size);
205
206+ void onSmoothChanged(bool smooth);
207+
208 private:
209+ enum {
210+ // Must be kept in sync with MirSurfaceInterface's dirty flags.
211+ DirtyFiltering = (1 << 0),
212+ DirtyAntialiasing = (1 << 1),
213+ DirtyGeometry = (1 << 2)
214+ };
215+
216 bool hasTouchInsideUbuntuKeyboard(const QList<QTouchEvent::TouchPoint> &touchPoints);
217 bool isMouseInsideUbuntuKeyboard(const QMouseEvent *event);
218
219@@ -146,6 +158,8 @@
220 Mir::OrientationAngle *m_orientationAngle;
221
222 bool m_consumesInput;
223+
224+ quint8 m_flags;
225 };
226
227 } // namespace qtmir

Subscribers

People subscribed via source and target branches