Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/qtdeclarative/src/qtdeclarative/src/quick/scenegraph/adaptations/software/qsgsoftwarethreadedrenderloop.cpp |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||||||||
2 | - | |||||||||||||||||||
3 | - | |||||||||||||||||||
4 | - | |||||||||||||||||||
5 | - | |||||||||||||||||||
6 | - | |||||||||||||||||||
7 | - | |||||||||||||||||||
8 | - | |||||||||||||||||||
9 | const QEvent::Type WM_Obscure = QEvent::Type(QEvent::User + 1); | - | ||||||||||||||||||
10 | - | |||||||||||||||||||
11 | - | |||||||||||||||||||
12 | const QEvent::Type WM_RequestSync = QEvent::Type(QEvent::User + 2); | - | ||||||||||||||||||
13 | - | |||||||||||||||||||
14 | - | |||||||||||||||||||
15 | - | |||||||||||||||||||
16 | const QEvent::Type WM_RequestRepaint = QEvent::Type(QEvent::User + 3); | - | ||||||||||||||||||
17 | - | |||||||||||||||||||
18 | - | |||||||||||||||||||
19 | - | |||||||||||||||||||
20 | const QEvent::Type WM_TryRelease = QEvent::Type(QEvent::User + 4); | - | ||||||||||||||||||
21 | - | |||||||||||||||||||
22 | - | |||||||||||||||||||
23 | const QEvent::Type WM_Grab = QEvent::Type(QEvent::User + 5); | - | ||||||||||||||||||
24 | - | |||||||||||||||||||
25 | - | |||||||||||||||||||
26 | const QEvent::Type WM_PostJob = QEvent::Type(QEvent::User + 6); | - | ||||||||||||||||||
27 | - | |||||||||||||||||||
28 | class QSGSoftwareWindowEvent : public QEvent | - | ||||||||||||||||||
29 | { | - | ||||||||||||||||||
30 | public: | - | ||||||||||||||||||
31 | QSGSoftwareWindowEvent(QQuickWindow *c, QEvent::Type type) : QEvent(type), window(c) { } never executed: end of block | 0 | ||||||||||||||||||
32 | QQuickWindow *window; | - | ||||||||||||||||||
33 | }; | - | ||||||||||||||||||
34 | - | |||||||||||||||||||
35 | class QSGSoftwareTryReleaseEvent : public QSGSoftwareWindowEvent | - | ||||||||||||||||||
36 | { | - | ||||||||||||||||||
37 | public: | - | ||||||||||||||||||
38 | QSGSoftwareTryReleaseEvent(QQuickWindow *win, bool destroy) | - | ||||||||||||||||||
39 | : QSGSoftwareWindowEvent(win, WM_TryRelease), destroying(destroy) { } never executed: end of block | 0 | ||||||||||||||||||
40 | bool destroying; | - | ||||||||||||||||||
41 | }; | - | ||||||||||||||||||
42 | - | |||||||||||||||||||
43 | class QSGSoftwareSyncEvent : public QSGSoftwareWindowEvent | - | ||||||||||||||||||
44 | { | - | ||||||||||||||||||
45 | public: | - | ||||||||||||||||||
46 | QSGSoftwareSyncEvent(QQuickWindow *c, bool inExpose, bool force) | - | ||||||||||||||||||
47 | : QSGSoftwareWindowEvent(c, WM_RequestSync) | - | ||||||||||||||||||
48 | , size(c->size()) | - | ||||||||||||||||||
49 | , dpr(c->effectiveDevicePixelRatio()) | - | ||||||||||||||||||
50 | , syncInExpose(inExpose) | - | ||||||||||||||||||
51 | , forceRenderPass(force) { } never executed: end of block | 0 | ||||||||||||||||||
52 | QSize size; | - | ||||||||||||||||||
53 | float dpr; | - | ||||||||||||||||||
54 | bool syncInExpose; | - | ||||||||||||||||||
55 | bool forceRenderPass; | - | ||||||||||||||||||
56 | }; | - | ||||||||||||||||||
57 | - | |||||||||||||||||||
58 | class QSGSoftwareGrabEvent : public QSGSoftwareWindowEvent | - | ||||||||||||||||||
59 | { | - | ||||||||||||||||||
60 | public: | - | ||||||||||||||||||
61 | QSGSoftwareGrabEvent(QQuickWindow *c, QImage *result) | - | ||||||||||||||||||
62 | : QSGSoftwareWindowEvent(c, WM_Grab), image(result) { } never executed: end of block | 0 | ||||||||||||||||||
63 | QImage *image; | - | ||||||||||||||||||
64 | }; | - | ||||||||||||||||||
65 | - | |||||||||||||||||||
66 | class QSGSoftwareJobEvent : public QSGSoftwareWindowEvent | - | ||||||||||||||||||
67 | { | - | ||||||||||||||||||
68 | public: | - | ||||||||||||||||||
69 | QSGSoftwareJobEvent(QQuickWindow *c, QRunnable *postedJob) | - | ||||||||||||||||||
70 | : QSGSoftwareWindowEvent(c, WM_PostJob), job(postedJob) { } never executed: end of block | 0 | ||||||||||||||||||
71 | ~QSGSoftwareJobEvent() { delete job; } never executed: end of block | 0 | ||||||||||||||||||
72 | QRunnable *job; | - | ||||||||||||||||||
73 | }; | - | ||||||||||||||||||
74 | - | |||||||||||||||||||
75 | class QSGSoftwareEventQueue : public QQueue<QEvent *> | - | ||||||||||||||||||
76 | { | - | ||||||||||||||||||
77 | public: | - | ||||||||||||||||||
78 | void addEvent(QEvent *e) { | - | ||||||||||||||||||
79 | mutex.lock(); | - | ||||||||||||||||||
80 | enqueue(e); | - | ||||||||||||||||||
81 | if (waiting
| 0 | ||||||||||||||||||
82 | condition.wakeOne(); never executed: condition.wakeOne(); | 0 | ||||||||||||||||||
83 | mutex.unlock(); | - | ||||||||||||||||||
84 | } never executed: end of block | 0 | ||||||||||||||||||
85 | - | |||||||||||||||||||
86 | QEvent *takeEvent(bool wait) { | - | ||||||||||||||||||
87 | mutex.lock(); | - | ||||||||||||||||||
88 | if (isEmpty()
| 0 | ||||||||||||||||||
89 | waiting = true; | - | ||||||||||||||||||
90 | condition.wait(&mutex); | - | ||||||||||||||||||
91 | waiting = false; | - | ||||||||||||||||||
92 | } never executed: end of block | 0 | ||||||||||||||||||
93 | QEvent *e = dequeue(); | - | ||||||||||||||||||
94 | mutex.unlock(); | - | ||||||||||||||||||
95 | return never executed: e;return e; never executed: return e; | 0 | ||||||||||||||||||
96 | } | - | ||||||||||||||||||
97 | - | |||||||||||||||||||
98 | bool hasMoreEvents() { | - | ||||||||||||||||||
99 | mutex.lock(); | - | ||||||||||||||||||
100 | bool has = !isEmpty(); | - | ||||||||||||||||||
101 | mutex.unlock(); | - | ||||||||||||||||||
102 | return never executed: has;return has; never executed: return has; | 0 | ||||||||||||||||||
103 | } | - | ||||||||||||||||||
104 | - | |||||||||||||||||||
105 | private: | - | ||||||||||||||||||
106 | QMutex mutex; | - | ||||||||||||||||||
107 | QWaitCondition condition; | - | ||||||||||||||||||
108 | bool waiting = false; | - | ||||||||||||||||||
109 | }; | - | ||||||||||||||||||
110 | - | |||||||||||||||||||
111 | static inline int qsgrl_animation_interval() | - | ||||||||||||||||||
112 | { | - | ||||||||||||||||||
113 | const qreal refreshRate = QGuiApplication::primaryScreen()
| 0 | ||||||||||||||||||
114 | return never executed: refreshRate < 1 ? 16 : int(1000 / refreshRate);return refreshRate < 1 ? 16 : int(1000 / refreshRate); never executed: return refreshRate < 1 ? 16 : int(1000 / refreshRate); | 0 | ||||||||||||||||||
115 | } | - | ||||||||||||||||||
116 | - | |||||||||||||||||||
117 | class QSGSoftwareRenderThread : public QThread | - | ||||||||||||||||||
118 | { | - | ||||||||||||||||||
119 | public: | - | ||||||||||||||||||
120 | #pragma GCC diagnostic push | - | ||||||||||||||||||
121 | - | |||||||||||||||||||
122 | #pragma GCC diagnostic ignored "-Wsuggest-override" | - | ||||||||||||||||||
123 | static const QMetaObject staticMetaObject; virtual const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); virtual int qt_metacall(QMetaObject::Call, int, void **); static inline QString tr(const char *s, const char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } __attribute__ ((__deprecated__)) static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } private: | - | ||||||||||||||||||
124 | #pragma GCC diagnostic ignored "-Wattributes" | - | ||||||||||||||||||
125 | __attribute__((visibility("hidden"))) static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); | - | ||||||||||||||||||
126 | #pragma GCC diagnostic pop | - | ||||||||||||||||||
127 | struct QPrivateSignal {}; | - | ||||||||||||||||||
128 | public: | - | ||||||||||||||||||
129 | QSGSoftwareRenderThread(QSGSoftwareThreadedRenderLoop *rl, QSGRenderContext *renderContext) | - | ||||||||||||||||||
130 | : renderLoop(rl) | - | ||||||||||||||||||
131 | { | - | ||||||||||||||||||
132 | rc = static_cast<QSGSoftwareRenderContext *>(renderContext); | - | ||||||||||||||||||
133 | vsyncDelta = qsgrl_animation_interval(); | - | ||||||||||||||||||
134 | } never executed: end of block | 0 | ||||||||||||||||||
135 | - | |||||||||||||||||||
136 | ~QSGSoftwareRenderThread() | - | ||||||||||||||||||
137 | { | - | ||||||||||||||||||
138 | delete rc; | - | ||||||||||||||||||
139 | } never executed: end of block | 0 | ||||||||||||||||||
140 | - | |||||||||||||||||||
141 | bool event(QEvent *e) override; | - | ||||||||||||||||||
142 | void run() override; | - | ||||||||||||||||||
143 | - | |||||||||||||||||||
144 | void syncAndRender(); | - | ||||||||||||||||||
145 | void sync(bool inExpose); | - | ||||||||||||||||||
146 | - | |||||||||||||||||||
147 | void requestRepaint() | - | ||||||||||||||||||
148 | { | - | ||||||||||||||||||
149 | if (sleeping
| 0 | ||||||||||||||||||
150 | stopEventProcessing = true; never executed: stopEventProcessing = true; | 0 | ||||||||||||||||||
151 | if (exposedWindow
| 0 | ||||||||||||||||||
152 | pendingUpdate |= RepaintRequest; never executed: pendingUpdate |= RepaintRequest; | 0 | ||||||||||||||||||
153 | } never executed: end of block | 0 | ||||||||||||||||||
154 | - | |||||||||||||||||||
155 | void processEventsAndWaitForMore(); | - | ||||||||||||||||||
156 | void processEvents(); | - | ||||||||||||||||||
157 | void postEvent(QEvent *e); | - | ||||||||||||||||||
158 | - | |||||||||||||||||||
159 | enum UpdateRequest { | - | ||||||||||||||||||
160 | SyncRequest = 0x01, | - | ||||||||||||||||||
161 | RepaintRequest = 0x02, | - | ||||||||||||||||||
162 | ExposeRequest = 0x04 | RepaintRequest | SyncRequest | - | ||||||||||||||||||
163 | }; | - | ||||||||||||||||||
164 | - | |||||||||||||||||||
165 | QSGSoftwareThreadedRenderLoop *renderLoop; | - | ||||||||||||||||||
166 | QSGSoftwareRenderContext *rc; | - | ||||||||||||||||||
167 | QAnimationDriver *rtAnim = nullptr; | - | ||||||||||||||||||
168 | volatile bool active = false; | - | ||||||||||||||||||
169 | uint pendingUpdate = 0; | - | ||||||||||||||||||
170 | bool sleeping = false; | - | ||||||||||||||||||
171 | bool syncResultedInChanges = false; | - | ||||||||||||||||||
172 | float vsyncDelta; | - | ||||||||||||||||||
173 | QMutex mutex; | - | ||||||||||||||||||
174 | QWaitCondition waitCondition; | - | ||||||||||||||||||
175 | QQuickWindow *exposedWindow = nullptr; | - | ||||||||||||||||||
176 | QBackingStore *backingStore = nullptr; | - | ||||||||||||||||||
177 | bool stopEventProcessing = false; | - | ||||||||||||||||||
178 | QSGSoftwareEventQueue eventQueue; | - | ||||||||||||||||||
179 | QElapsedTimer renderThrottleTimer; | - | ||||||||||||||||||
180 | qint64 syncTime; | - | ||||||||||||||||||
181 | qint64 renderTime; | - | ||||||||||||||||||
182 | qint64 sinceLastTime; | - | ||||||||||||||||||
183 | - | |||||||||||||||||||
184 | public : | - | ||||||||||||||||||
185 | void onSceneGraphChanged() { | - | ||||||||||||||||||
186 | syncResultedInChanges = true; | - | ||||||||||||||||||
187 | } never executed: end of block | 0 | ||||||||||||||||||
188 | }; | - | ||||||||||||||||||
189 | - | |||||||||||||||||||
190 | bool QSGSoftwareRenderThread::event(QEvent *e) | - | ||||||||||||||||||
191 | { | - | ||||||||||||||||||
192 | switch ((int)e->type()) { | - | ||||||||||||||||||
193 | - | |||||||||||||||||||
194 | case never executed: WM_Obscure:case WM_Obscure: never executed: case WM_Obscure: | 0 | ||||||||||||||||||
195 | ((!exposedWindow || exposedWindow == static_cast<QSGSoftwareWindowEvent *>(e)->window) ? static_cast<void>(0) : qt_assert("!exposedWindow || exposedWindow == static_cast<QSGSoftwareWindowEvent *>(e)->window", __FILE__, 245)); | - | ||||||||||||||||||
196 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 246, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug() << "RT - WM_Obscure" << exposedWindow; | 0 | ||||||||||||||||||
197 | mutex.lock(); | - | ||||||||||||||||||
198 | if (exposedWindow
| 0 | ||||||||||||||||||
199 | QQuickWindowPrivate::get(exposedWindow)->fireAboutToStop(); | - | ||||||||||||||||||
200 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 250, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - WM_Obscure - window removed"); | 0 | ||||||||||||||||||
201 | exposedWindow = nullptr; | - | ||||||||||||||||||
202 | delete backingStore; | - | ||||||||||||||||||
203 | backingStore = nullptr; | - | ||||||||||||||||||
204 | } never executed: end of block | 0 | ||||||||||||||||||
205 | waitCondition.wakeOne(); | - | ||||||||||||||||||
206 | mutex.unlock(); | - | ||||||||||||||||||
207 | return never executed: true;return true; never executed: return true; | 0 | ||||||||||||||||||
208 | - | |||||||||||||||||||
209 | case never executed: WM_RequestSync:case WM_RequestSync: never executed: {case WM_RequestSync: | 0 | ||||||||||||||||||
210 | QSGSoftwareSyncEvent *wme = static_cast<QSGSoftwareSyncEvent *>(e); | - | ||||||||||||||||||
211 | if (sleeping
| 0 | ||||||||||||||||||
212 | stopEventProcessing = true; never executed: stopEventProcessing = true; | 0 | ||||||||||||||||||
213 | exposedWindow = wme->window; | - | ||||||||||||||||||
214 | if (backingStore == nullptr
| 0 | ||||||||||||||||||
215 | backingStore = new QBackingStore(exposedWindow); never executed: backingStore = new QBackingStore(exposedWindow); | 0 | ||||||||||||||||||
216 | if (backingStore->size() != exposedWindow->size()
| 0 | ||||||||||||||||||
217 | backingStore->resize(exposedWindow->size()); never executed: backingStore->resize(exposedWindow->size()); | 0 | ||||||||||||||||||
218 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 268, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug() << "RT - WM_RequestSync" << exposedWindow; | 0 | ||||||||||||||||||
219 | pendingUpdate |= SyncRequest; | - | ||||||||||||||||||
220 | if (wme->syncInExpose
| 0 | ||||||||||||||||||
221 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 271, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - WM_RequestSync - triggered from expose"); | 0 | ||||||||||||||||||
222 | pendingUpdate |= ExposeRequest; | - | ||||||||||||||||||
223 | } never executed: end of block | 0 | ||||||||||||||||||
224 | if (wme->forceRenderPass
| 0 | ||||||||||||||||||
225 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 275, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - WM_RequestSync - repaint regardless"); | 0 | ||||||||||||||||||
226 | pendingUpdate |= RepaintRequest; | - | ||||||||||||||||||
227 | } never executed: end of block | 0 | ||||||||||||||||||
228 | return never executed: true;return true; never executed: return true; | 0 | ||||||||||||||||||
229 | } | - | ||||||||||||||||||
230 | - | |||||||||||||||||||
231 | case never executed: WM_TryRelease:case WM_TryRelease: never executed: {case WM_TryRelease: | 0 | ||||||||||||||||||
232 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 282, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - WM_TryRelease"); | 0 | ||||||||||||||||||
233 | mutex.lock(); | - | ||||||||||||||||||
234 | renderLoop->lockedForSync = true; | - | ||||||||||||||||||
235 | QSGSoftwareTryReleaseEvent *wme = static_cast<QSGSoftwareTryReleaseEvent *>(e); | - | ||||||||||||||||||
236 | - | |||||||||||||||||||
237 | if (!exposedWindow
| 0 | ||||||||||||||||||
238 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 288, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - WM_TryRelease - invalidating rc"); | 0 | ||||||||||||||||||
239 | if (wme->window
| 0 | ||||||||||||||||||
240 | QQuickWindowPrivate *wd = QQuickWindowPrivate::get(wme->window); | - | ||||||||||||||||||
241 | if (wme->destroying
| 0 | ||||||||||||||||||
242 | - | |||||||||||||||||||
243 | wd->cleanupNodesOnShutdown(); | - | ||||||||||||||||||
244 | } never executed: end of block | 0 | ||||||||||||||||||
245 | rc->invalidate(); | - | ||||||||||||||||||
246 | QCoreApplication::processEvents(); | - | ||||||||||||||||||
247 | QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete); | - | ||||||||||||||||||
248 | if (wme->destroying
| 0 | ||||||||||||||||||
249 | delete wd->animationController; never executed: delete wd->animationController; | 0 | ||||||||||||||||||
250 | } never executed: end of block | 0 | ||||||||||||||||||
251 | if (wme->destroying
| 0 | ||||||||||||||||||
252 | active = false; never executed: active = false; | 0 | ||||||||||||||||||
253 | if (sleeping
| 0 | ||||||||||||||||||
254 | stopEventProcessing = true; never executed: stopEventProcessing = true; | 0 | ||||||||||||||||||
255 | } never executed: else {end of block | 0 | ||||||||||||||||||
256 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 306, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - WM_TryRelease - not releasing because window is still active"); | 0 | ||||||||||||||||||
257 | } never executed: end of block | 0 | ||||||||||||||||||
258 | waitCondition.wakeOne(); | - | ||||||||||||||||||
259 | renderLoop->lockedForSync = false; | - | ||||||||||||||||||
260 | mutex.unlock(); | - | ||||||||||||||||||
261 | return never executed: true;return true; never executed: return true; | 0 | ||||||||||||||||||
262 | } | - | ||||||||||||||||||
263 | - | |||||||||||||||||||
264 | case never executed: WM_Grab:case WM_Grab: never executed: {case WM_Grab: | 0 | ||||||||||||||||||
265 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 315, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - WM_Grab"); | 0 | ||||||||||||||||||
266 | QSGSoftwareGrabEvent *wme = static_cast<QSGSoftwareGrabEvent *>(e); | - | ||||||||||||||||||
267 | ((wme->window) ? static_cast<void>(0) : qt_assert("wme->window", __FILE__, 317)); | - | ||||||||||||||||||
268 | ((wme->window == exposedWindow || !exposedWindow) ? static_cast<void>(0) : qt_assert("wme->window == exposedWindow || !exposedWindow", __FILE__, 318)); | - | ||||||||||||||||||
269 | mutex.lock(); | - | ||||||||||||||||||
270 | if (wme->window
| 0 | ||||||||||||||||||
271 | - | |||||||||||||||||||
272 | - | |||||||||||||||||||
273 | - | |||||||||||||||||||
274 | - | |||||||||||||||||||
275 | - | |||||||||||||||||||
276 | - | |||||||||||||||||||
277 | QQuickWindowPrivate *wd = QQuickWindowPrivate::get(wme->window); | - | ||||||||||||||||||
278 | auto softwareRenderer = static_cast<QSGSoftwareRenderer*>(wd->renderer); | - | ||||||||||||||||||
279 | if (softwareRenderer
| 0 | ||||||||||||||||||
280 | softwareRenderer->setBackingStore(backingStore); never executed: softwareRenderer->setBackingStore(backingStore); | 0 | ||||||||||||||||||
281 | rc->initialize(nullptr); | - | ||||||||||||||||||
282 | wd->syncSceneGraph(); | - | ||||||||||||||||||
283 | rc->endSync(); | - | ||||||||||||||||||
284 | wd->renderSceneGraph(wme->window->size()); | - | ||||||||||||||||||
285 | *wme->image = backingStore->handle()->toImage(); | - | ||||||||||||||||||
286 | } never executed: end of block | 0 | ||||||||||||||||||
287 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 337, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - WM_Grab - waking gui to handle result"); | 0 | ||||||||||||||||||
288 | waitCondition.wakeOne(); | - | ||||||||||||||||||
289 | mutex.unlock(); | - | ||||||||||||||||||
290 | return never executed: true;return true; never executed: return true; | 0 | ||||||||||||||||||
291 | } | - | ||||||||||||||||||
292 | - | |||||||||||||||||||
293 | case never executed: WM_PostJob:case WM_PostJob: never executed: {case WM_PostJob: | 0 | ||||||||||||||||||
294 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 344, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - WM_PostJob"); | 0 | ||||||||||||||||||
295 | QSGSoftwareJobEvent *wme = static_cast<QSGSoftwareJobEvent *>(e); | - | ||||||||||||||||||
296 | ((wme->window == exposedWindow) ? static_cast<void>(0) : qt_assert("wme->window == exposedWindow", __FILE__, 346)); | - | ||||||||||||||||||
297 | if (exposedWindow
| 0 | ||||||||||||||||||
298 | wme->job->run(); | - | ||||||||||||||||||
299 | delete wme->job; | - | ||||||||||||||||||
300 | wme->job = nullptr; | - | ||||||||||||||||||
301 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 351, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - WM_PostJob - job done"); | 0 | ||||||||||||||||||
302 | } never executed: end of block | 0 | ||||||||||||||||||
303 | return never executed: true;return true; never executed: return true; | 0 | ||||||||||||||||||
304 | } | - | ||||||||||||||||||
305 | - | |||||||||||||||||||
306 | case never executed: WM_RequestRepaint:case WM_RequestRepaint: never executed: case WM_RequestRepaint: | 0 | ||||||||||||||||||
307 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 357, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - WM_RequestPaint"); | 0 | ||||||||||||||||||
308 | - | |||||||||||||||||||
309 | - | |||||||||||||||||||
310 | pendingUpdate |= RepaintRequest; | - | ||||||||||||||||||
311 | break; never executed: break; | 0 | ||||||||||||||||||
312 | - | |||||||||||||||||||
313 | default never executed: :default: never executed: default: | 0 | ||||||||||||||||||
314 | break; never executed: break; | 0 | ||||||||||||||||||
315 | } | - | ||||||||||||||||||
316 | - | |||||||||||||||||||
317 | return never executed: QThread::event(e);return QThread::event(e); never executed: return QThread::event(e); | 0 | ||||||||||||||||||
318 | } | - | ||||||||||||||||||
319 | - | |||||||||||||||||||
320 | void QSGSoftwareRenderThread::postEvent(QEvent *e) | - | ||||||||||||||||||
321 | { | - | ||||||||||||||||||
322 | eventQueue.addEvent(e); | - | ||||||||||||||||||
323 | } never executed: end of block | 0 | ||||||||||||||||||
324 | - | |||||||||||||||||||
325 | void QSGSoftwareRenderThread::processEvents() | - | ||||||||||||||||||
326 | { | - | ||||||||||||||||||
327 | while (eventQueue.hasMoreEvents()
| 0 | ||||||||||||||||||
328 | QEvent *e = eventQueue.takeEvent(false); | - | ||||||||||||||||||
329 | event(e); | - | ||||||||||||||||||
330 | delete e; | - | ||||||||||||||||||
331 | } never executed: end of block | 0 | ||||||||||||||||||
332 | } never executed: end of block | 0 | ||||||||||||||||||
333 | - | |||||||||||||||||||
334 | void QSGSoftwareRenderThread::processEventsAndWaitForMore() | - | ||||||||||||||||||
335 | { | - | ||||||||||||||||||
336 | stopEventProcessing = false; | - | ||||||||||||||||||
337 | while (!stopEventProcessing
| 0 | ||||||||||||||||||
338 | QEvent *e = eventQueue.takeEvent(true); | - | ||||||||||||||||||
339 | event(e); | - | ||||||||||||||||||
340 | delete e; | - | ||||||||||||||||||
341 | } never executed: end of block | 0 | ||||||||||||||||||
342 | } never executed: end of block | 0 | ||||||||||||||||||
343 | - | |||||||||||||||||||
344 | void QSGSoftwareRenderThread::run() | - | ||||||||||||||||||
345 | { | - | ||||||||||||||||||
346 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 396, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - run()"); | 0 | ||||||||||||||||||
347 | - | |||||||||||||||||||
348 | rtAnim = rc->sceneGraphContext()->createAnimationDriver(nullptr); | - | ||||||||||||||||||
349 | rtAnim->install(); | - | ||||||||||||||||||
350 | - | |||||||||||||||||||
351 | if (QQmlDebugConnector::service<QQmlProfilerService>()
| 0 | ||||||||||||||||||
352 | QQuickProfiler::registerAnimationCallback(); never executed: QQuickProfiler::registerAnimationCallback(); | 0 | ||||||||||||||||||
353 | - | |||||||||||||||||||
354 | renderThrottleTimer.start(); | - | ||||||||||||||||||
355 | - | |||||||||||||||||||
356 | while (active
| 0 | ||||||||||||||||||
357 | if (exposedWindow
| 0 | ||||||||||||||||||
358 | syncAndRender(); never executed: syncAndRender(); | 0 | ||||||||||||||||||
359 | - | |||||||||||||||||||
360 | processEvents(); | - | ||||||||||||||||||
361 | QCoreApplication::processEvents(); | - | ||||||||||||||||||
362 | - | |||||||||||||||||||
363 | if (pendingUpdate == 0
| 0 | ||||||||||||||||||
364 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 414, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - done drawing, sleep"); | 0 | ||||||||||||||||||
365 | sleeping = true; | - | ||||||||||||||||||
366 | processEventsAndWaitForMore(); | - | ||||||||||||||||||
367 | sleeping = false; | - | ||||||||||||||||||
368 | } never executed: end of block | 0 | ||||||||||||||||||
369 | } never executed: end of block | 0 | ||||||||||||||||||
370 | - | |||||||||||||||||||
371 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 421, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - run() exiting"); | 0 | ||||||||||||||||||
372 | - | |||||||||||||||||||
373 | delete rtAnim; | - | ||||||||||||||||||
374 | rtAnim = nullptr; | - | ||||||||||||||||||
375 | - | |||||||||||||||||||
376 | rc->moveToThread(renderLoop->thread()); | - | ||||||||||||||||||
377 | moveToThread(renderLoop->thread()); | - | ||||||||||||||||||
378 | } never executed: end of block | 0 | ||||||||||||||||||
379 | - | |||||||||||||||||||
380 | void QSGSoftwareRenderThread::sync(bool inExpose) | - | ||||||||||||||||||
381 | { | - | ||||||||||||||||||
382 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 432, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - sync"); | 0 | ||||||||||||||||||
383 | - | |||||||||||||||||||
384 | mutex.lock(); | - | ||||||||||||||||||
385 | ((renderLoop->lockedForSync) ? static_cast<void>(0) : qt_assert_x("QSGD3D12RenderThread::sync()", "sync triggered with gui not locked", __FILE__, 435)); | - | ||||||||||||||||||
386 | - | |||||||||||||||||||
387 | if (exposedWindow
| 0 | ||||||||||||||||||
388 | QQuickWindowPrivate *wd = QQuickWindowPrivate::get(exposedWindow); | - | ||||||||||||||||||
389 | bool hadRenderer = wd->renderer != nullptr; | - | ||||||||||||||||||
390 | - | |||||||||||||||||||
391 | - | |||||||||||||||||||
392 | if (wd->renderer
| 0 | ||||||||||||||||||
393 | wd->renderer->clearChangedFlag(); never executed: wd->renderer->clearChangedFlag(); | 0 | ||||||||||||||||||
394 | - | |||||||||||||||||||
395 | rc->initialize(nullptr); | - | ||||||||||||||||||
396 | wd->syncSceneGraph(); | - | ||||||||||||||||||
397 | rc->endSync(); | - | ||||||||||||||||||
398 | - | |||||||||||||||||||
399 | if (!hadRenderer
| 0 | ||||||||||||||||||
400 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 450, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - created renderer"); | 0 | ||||||||||||||||||
401 | syncResultedInChanges = true; | - | ||||||||||||||||||
402 | connect(wd->renderer, &QSGRenderer::sceneGraphChanged, this, | - | ||||||||||||||||||
403 | &QSGSoftwareRenderThread::onSceneGraphChanged, Qt::DirectConnection); | - | ||||||||||||||||||
404 | } never executed: end of block | 0 | ||||||||||||||||||
405 | - | |||||||||||||||||||
406 | - | |||||||||||||||||||
407 | - | |||||||||||||||||||
408 | - | |||||||||||||||||||
409 | QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete); | - | ||||||||||||||||||
410 | } never executed: end of block | 0 | ||||||||||||||||||
411 | - | |||||||||||||||||||
412 | if (!inExpose
| 0 | ||||||||||||||||||
413 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 463, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - sync complete, waking gui"); | 0 | ||||||||||||||||||
414 | waitCondition.wakeOne(); | - | ||||||||||||||||||
415 | mutex.unlock(); | - | ||||||||||||||||||
416 | } never executed: end of block | 0 | ||||||||||||||||||
417 | } never executed: end of block | 0 | ||||||||||||||||||
418 | - | |||||||||||||||||||
419 | void QSGSoftwareRenderThread::syncAndRender() | - | ||||||||||||||||||
420 | { | - | ||||||||||||||||||
421 | if (QQuickProfiler::featuresEnabled & (1 << QQuickProfiler::ProfileSceneGraph)
never executed: else (end of block never executed: void)0;(void)0; never executed: (void)0; | 0 | ||||||||||||||||||
422 | - | |||||||||||||||||||
423 | QElapsedTimer waitTimer; | - | ||||||||||||||||||
424 | waitTimer.start(); | - | ||||||||||||||||||
425 | - | |||||||||||||||||||
426 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 476, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - syncAndRender()"); | 0 | ||||||||||||||||||
427 | - | |||||||||||||||||||
428 | syncResultedInChanges = false; | - | ||||||||||||||||||
429 | QQuickWindowPrivate *wd = QQuickWindowPrivate::get(exposedWindow); | - | ||||||||||||||||||
430 | - | |||||||||||||||||||
431 | const bool repaintRequested = (
| 0 | ||||||||||||||||||
432 | const bool syncRequested = pendingUpdate & SyncRequest; | - | ||||||||||||||||||
433 | const bool exposeRequested = (pendingUpdate & ExposeRequest) == ExposeRequest; | - | ||||||||||||||||||
434 | pendingUpdate = 0; | - | ||||||||||||||||||
435 | - | |||||||||||||||||||
436 | if (syncRequested
| 0 | ||||||||||||||||||
437 | sync(exposeRequested); never executed: sync(exposeRequested); | 0 | ||||||||||||||||||
438 | - | |||||||||||||||||||
439 | if (QQuickProfiler::featuresEnabled & (1 << QQuickProfiler::ProfileSceneGraph)
never executed: else (end of block never executed: void)0(void)0 ; never executed: (void)0 ; | 0 | ||||||||||||||||||
440 | ; never executed: (void)0 ; | 0 | ||||||||||||||||||
441 | - | |||||||||||||||||||
442 | if (!syncResultedInChanges
| 0 | ||||||||||||||||||
443 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 493, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - no changes, render aborted"); | 0 | ||||||||||||||||||
444 | int waitTime = vsyncDelta - (int) waitTimer.elapsed(); | - | ||||||||||||||||||
445 | if (waitTime > 0
| 0 | ||||||||||||||||||
446 | msleep(waitTime); never executed: msleep(waitTime); | 0 | ||||||||||||||||||
447 | return; never executed: return; | 0 | ||||||||||||||||||
448 | } | - | ||||||||||||||||||
449 | - | |||||||||||||||||||
450 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 500, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - rendering started"); | 0 | ||||||||||||||||||
451 | - | |||||||||||||||||||
452 | if (rtAnim->isRunning()
| 0 | ||||||||||||||||||
453 | wd->animationController->lock(); | - | ||||||||||||||||||
454 | rtAnim->advance(); | - | ||||||||||||||||||
455 | wd->animationController->unlock(); | - | ||||||||||||||||||
456 | } never executed: end of block | 0 | ||||||||||||||||||
457 | - | |||||||||||||||||||
458 | bool canRender = wd->renderer != nullptr; | - | ||||||||||||||||||
459 | - | |||||||||||||||||||
460 | if (canRender
| 0 | ||||||||||||||||||
461 | auto softwareRenderer = static_cast<QSGSoftwareRenderer*>(wd->renderer); | - | ||||||||||||||||||
462 | if (softwareRenderer
| 0 | ||||||||||||||||||
463 | softwareRenderer->setBackingStore(backingStore); never executed: softwareRenderer->setBackingStore(backingStore); | 0 | ||||||||||||||||||
464 | wd->renderSceneGraph(exposedWindow->size()); | - | ||||||||||||||||||
465 | - | |||||||||||||||||||
466 | if (QQuickProfiler::featuresEnabled & (1 << QQuickProfiler::ProfileSceneGraph)
never executed: else (end of block never executed: void)0(void)0 ; never executed: (void)0 ; | 0 | ||||||||||||||||||
467 | ; never executed: (void)0 ; | 0 | ||||||||||||||||||
468 | - | |||||||||||||||||||
469 | if (softwareRenderer
| 0 | ||||||||||||||||||
470 | backingStore->flush(softwareRenderer->flushRegion()); never executed: backingStore->flush(softwareRenderer->flushRegion()); | 0 | ||||||||||||||||||
471 | - | |||||||||||||||||||
472 | - | |||||||||||||||||||
473 | - | |||||||||||||||||||
474 | int blockTime = vsyncDelta - (int) renderThrottleTimer.elapsed(); | - | ||||||||||||||||||
475 | if (blockTime > 0
| 0 | ||||||||||||||||||
476 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 526, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - blocking for %d ms", blockTime); | 0 | ||||||||||||||||||
477 | msleep(blockTime); | - | ||||||||||||||||||
478 | } never executed: end of block | 0 | ||||||||||||||||||
479 | renderThrottleTimer.restart(); | - | ||||||||||||||||||
480 | - | |||||||||||||||||||
481 | wd->fireFrameSwapped(); | - | ||||||||||||||||||
482 | } never executed: else {end of block | 0 | ||||||||||||||||||
483 | if (QQuickProfiler::featuresEnabled & (1 << QQuickProfiler::ProfileSceneGraph)
never executed: else (end of block never executed: void)0(void)0 ; never executed: (void)0 ; | 0 | ||||||||||||||||||
484 | ; never executed: (void)0 ; | 0 | ||||||||||||||||||
485 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 535, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - window not ready, skipping render"); | 0 | ||||||||||||||||||
486 | } never executed: end of block | 0 | ||||||||||||||||||
487 | - | |||||||||||||||||||
488 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 538, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - rendering done"); | 0 | ||||||||||||||||||
489 | - | |||||||||||||||||||
490 | if (exposeRequested
| 0 | ||||||||||||||||||
491 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 541, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("RT - wake gui after initial expose"); | 0 | ||||||||||||||||||
492 | waitCondition.wakeOne(); | - | ||||||||||||||||||
493 | mutex.unlock(); | - | ||||||||||||||||||
494 | } never executed: end of block | 0 | ||||||||||||||||||
495 | - | |||||||||||||||||||
496 | if (QQuickProfiler::featuresEnabled & (1 << QQuickProfiler::ProfileSceneGraph)
never executed: else (end of block never executed: void)0(void)0 ; never executed: (void)0 ; | 0 | ||||||||||||||||||
497 | ; never executed: (void)0 ; | 0 | ||||||||||||||||||
498 | } | - | ||||||||||||||||||
499 | - | |||||||||||||||||||
500 | template<class T> T *windowFor(const QVector<T> &list, QQuickWindow *window) | - | ||||||||||||||||||
501 | { | - | ||||||||||||||||||
502 | for (const T &t : list) { | - | ||||||||||||||||||
503 | if (t.window == window
| 0 | ||||||||||||||||||
504 | return never executed: const_cast<T *>(&t);return const_cast<T *>(&t); never executed: return const_cast<T *>(&t); | 0 | ||||||||||||||||||
505 | } never executed: end of block | 0 | ||||||||||||||||||
506 | return never executed: nullptr;return nullptr; never executed: return nullptr; | 0 | ||||||||||||||||||
507 | } | - | ||||||||||||||||||
508 | - | |||||||||||||||||||
509 | - | |||||||||||||||||||
510 | QSGSoftwareThreadedRenderLoop::QSGSoftwareThreadedRenderLoop() | - | ||||||||||||||||||
511 | { | - | ||||||||||||||||||
512 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 562, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("software threaded render loop constructor"); | 0 | ||||||||||||||||||
513 | m_sg = new QSGSoftwareContext; | - | ||||||||||||||||||
514 | m_anim = m_sg->createAnimationDriver(this); | - | ||||||||||||||||||
515 | connect(m_anim, &QAnimationDriver::started, this, &QSGSoftwareThreadedRenderLoop::onAnimationStarted); | - | ||||||||||||||||||
516 | connect(m_anim, &QAnimationDriver::stopped, this, &QSGSoftwareThreadedRenderLoop::onAnimationStopped); | - | ||||||||||||||||||
517 | m_anim->install(); | - | ||||||||||||||||||
518 | } never executed: end of block | 0 | ||||||||||||||||||
519 | - | |||||||||||||||||||
520 | QSGSoftwareThreadedRenderLoop::~QSGSoftwareThreadedRenderLoop() | - | ||||||||||||||||||
521 | { | - | ||||||||||||||||||
522 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 572, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("software threaded render loop destructor"); | 0 | ||||||||||||||||||
523 | delete m_sg; | - | ||||||||||||||||||
524 | } never executed: end of block | 0 | ||||||||||||||||||
525 | - | |||||||||||||||||||
526 | void QSGSoftwareThreadedRenderLoop::show(QQuickWindow *window) | - | ||||||||||||||||||
527 | { | - | ||||||||||||||||||
528 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 578, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug() << "show" << window; | 0 | ||||||||||||||||||
529 | } never executed: end of block | 0 | ||||||||||||||||||
530 | - | |||||||||||||||||||
531 | void QSGSoftwareThreadedRenderLoop::hide(QQuickWindow *window) | - | ||||||||||||||||||
532 | { | - | ||||||||||||||||||
533 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 583, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug() << "hide" << window; | 0 | ||||||||||||||||||
534 | - | |||||||||||||||||||
535 | if (window->isExposed()
| 0 | ||||||||||||||||||
536 | handleObscurity(windowFor(m_windows, window)); never executed: handleObscurity(windowFor(m_windows, window)); | 0 | ||||||||||||||||||
537 | - | |||||||||||||||||||
538 | releaseResources(window); | - | ||||||||||||||||||
539 | } never executed: end of block | 0 | ||||||||||||||||||
540 | - | |||||||||||||||||||
541 | void QSGSoftwareThreadedRenderLoop::resize(QQuickWindow *window) | - | ||||||||||||||||||
542 | { | - | ||||||||||||||||||
543 | if (!window->isExposed()
| 0 | ||||||||||||||||||
544 | return; never executed: return; | 0 | ||||||||||||||||||
545 | - | |||||||||||||||||||
546 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 596, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug() << "resize" << window << window->size(); | 0 | ||||||||||||||||||
547 | } never executed: end of block | 0 | ||||||||||||||||||
548 | - | |||||||||||||||||||
549 | void QSGSoftwareThreadedRenderLoop::windowDestroyed(QQuickWindow *window) | - | ||||||||||||||||||
550 | { | - | ||||||||||||||||||
551 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 601, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug() << "window destroyed" << window; | 0 | ||||||||||||||||||
552 | - | |||||||||||||||||||
553 | WindowData *w = windowFor(m_windows, window); | - | ||||||||||||||||||
554 | if (!w
| 0 | ||||||||||||||||||
555 | return; never executed: return; | 0 | ||||||||||||||||||
556 | - | |||||||||||||||||||
557 | handleObscurity(w); | - | ||||||||||||||||||
558 | handleResourceRelease(w, true); | - | ||||||||||||||||||
559 | - | |||||||||||||||||||
560 | QSGSoftwareRenderThread *thread = w->thread; | - | ||||||||||||||||||
561 | while (thread->isRunning()
| 0 | ||||||||||||||||||
562 | QThread::yieldCurrentThread(); never executed: QThread::yieldCurrentThread(); | 0 | ||||||||||||||||||
563 | - | |||||||||||||||||||
564 | ((thread->thread() == QThread::currentThread()) ? static_cast<void>(0) : qt_assert("thread->thread() == QThread::currentThread()", __FILE__, 614)); | - | ||||||||||||||||||
565 | delete thread; | - | ||||||||||||||||||
566 | - | |||||||||||||||||||
567 | for (int i = 0; i < m_windows.size()
| 0 | ||||||||||||||||||
568 | if (m_windows.at(i).window == window
| 0 | ||||||||||||||||||
569 | m_windows.removeAt(i); | - | ||||||||||||||||||
570 | break; never executed: break; | 0 | ||||||||||||||||||
571 | } | - | ||||||||||||||||||
572 | } never executed: end of block | 0 | ||||||||||||||||||
573 | - | |||||||||||||||||||
574 | - | |||||||||||||||||||
575 | - | |||||||||||||||||||
576 | - | |||||||||||||||||||
577 | startOrStopAnimationTimer(); | - | ||||||||||||||||||
578 | } never executed: end of block | 0 | ||||||||||||||||||
579 | - | |||||||||||||||||||
580 | void QSGSoftwareThreadedRenderLoop::exposureChanged(QQuickWindow *window) | - | ||||||||||||||||||
581 | { | - | ||||||||||||||||||
582 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 632, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug() << "exposure changed" << window; | 0 | ||||||||||||||||||
583 | - | |||||||||||||||||||
584 | if (window->isExposed()
| 0 | ||||||||||||||||||
585 | handleExposure(window); | - | ||||||||||||||||||
586 | } never executed: else {end of block | 0 | ||||||||||||||||||
587 | WindowData *w = windowFor(m_windows, window); | - | ||||||||||||||||||
588 | if (w
| 0 | ||||||||||||||||||
589 | handleObscurity(w); never executed: handleObscurity(w); | 0 | ||||||||||||||||||
590 | } never executed: end of block | 0 | ||||||||||||||||||
591 | } | - | ||||||||||||||||||
592 | - | |||||||||||||||||||
593 | QImage QSGSoftwareThreadedRenderLoop::grab(QQuickWindow *window) | - | ||||||||||||||||||
594 | { | - | ||||||||||||||||||
595 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 645, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug() << "grab" << window; | 0 | ||||||||||||||||||
596 | - | |||||||||||||||||||
597 | WindowData *w = windowFor(m_windows, window); | - | ||||||||||||||||||
598 | - | |||||||||||||||||||
599 | - | |||||||||||||||||||
600 | const bool tempExpose = !w; | - | ||||||||||||||||||
601 | if (tempExpose
| 0 | ||||||||||||||||||
602 | handleExposure(window); | - | ||||||||||||||||||
603 | w = windowFor(m_windows, window); | - | ||||||||||||||||||
604 | ((w) ? static_cast<void>(0) : qt_assert("w", __FILE__, 654)); | - | ||||||||||||||||||
605 | } never executed: end of block | 0 | ||||||||||||||||||
606 | - | |||||||||||||||||||
607 | if (!w->thread->isRunning()
| 0 | ||||||||||||||||||
608 | return never executed: QImage();return QImage(); never executed: return QImage(); | 0 | ||||||||||||||||||
609 | - | |||||||||||||||||||
610 | if (!window->handle()
| 0 | ||||||||||||||||||
611 | window->create(); never executed: window->create(); | 0 | ||||||||||||||||||
612 | - | |||||||||||||||||||
613 | QQuickWindowPrivate *wd = QQuickWindowPrivate::get(window); | - | ||||||||||||||||||
614 | wd->polishItems(); | - | ||||||||||||||||||
615 | - | |||||||||||||||||||
616 | QImage result; | - | ||||||||||||||||||
617 | w->thread->mutex.lock(); | - | ||||||||||||||||||
618 | lockedForSync = true; | - | ||||||||||||||||||
619 | w->thread->postEvent(new QSGSoftwareGrabEvent(window, &result)); | - | ||||||||||||||||||
620 | w->thread->waitCondition.wait(&w->thread->mutex); | - | ||||||||||||||||||
621 | lockedForSync = false; | - | ||||||||||||||||||
622 | w->thread->mutex.unlock(); | - | ||||||||||||||||||
623 | - | |||||||||||||||||||
624 | result.setDevicePixelRatio(window->effectiveDevicePixelRatio()); | - | ||||||||||||||||||
625 | - | |||||||||||||||||||
626 | if (tempExpose
| 0 | ||||||||||||||||||
627 | handleObscurity(w); never executed: handleObscurity(w); | 0 | ||||||||||||||||||
628 | - | |||||||||||||||||||
629 | return never executed: result;return result; never executed: return result; | 0 | ||||||||||||||||||
630 | } | - | ||||||||||||||||||
631 | - | |||||||||||||||||||
632 | void QSGSoftwareThreadedRenderLoop::update(QQuickWindow *window) | - | ||||||||||||||||||
633 | { | - | ||||||||||||||||||
634 | WindowData *w = windowFor(m_windows, window); | - | ||||||||||||||||||
635 | if (!w
| 0 | ||||||||||||||||||
636 | return; never executed: return; | 0 | ||||||||||||||||||
637 | - | |||||||||||||||||||
638 | if (w->thread == QThread::currentThread()
| 0 | ||||||||||||||||||
639 | w->thread->requestRepaint(); | - | ||||||||||||||||||
640 | return; never executed: return; | 0 | ||||||||||||||||||
641 | } | - | ||||||||||||||||||
642 | - | |||||||||||||||||||
643 | - | |||||||||||||||||||
644 | - | |||||||||||||||||||
645 | w->forceRenderPass = true; | - | ||||||||||||||||||
646 | scheduleUpdate(w); | - | ||||||||||||||||||
647 | } never executed: end of block | 0 | ||||||||||||||||||
648 | - | |||||||||||||||||||
649 | void QSGSoftwareThreadedRenderLoop::maybeUpdate(QQuickWindow *window) | - | ||||||||||||||||||
650 | { | - | ||||||||||||||||||
651 | WindowData *w = windowFor(m_windows, window); | - | ||||||||||||||||||
652 | if (w
| 0 | ||||||||||||||||||
653 | scheduleUpdate(w); never executed: scheduleUpdate(w); | 0 | ||||||||||||||||||
654 | } never executed: end of block | 0 | ||||||||||||||||||
655 | - | |||||||||||||||||||
656 | void QSGSoftwareThreadedRenderLoop::handleUpdateRequest(QQuickWindow *window) | - | ||||||||||||||||||
657 | { | - | ||||||||||||||||||
658 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 708, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug() << "handleUpdateRequest" << window; | 0 | ||||||||||||||||||
659 | - | |||||||||||||||||||
660 | WindowData *w = windowFor(m_windows, window); | - | ||||||||||||||||||
661 | if (w
| 0 | ||||||||||||||||||
662 | polishAndSync(w, false); never executed: polishAndSync(w, false); | 0 | ||||||||||||||||||
663 | } never executed: end of block | 0 | ||||||||||||||||||
664 | - | |||||||||||||||||||
665 | QAnimationDriver *QSGSoftwareThreadedRenderLoop::animationDriver() const | - | ||||||||||||||||||
666 | { | - | ||||||||||||||||||
667 | return never executed: m_anim;return m_anim; never executed: return m_anim; | 0 | ||||||||||||||||||
668 | } | - | ||||||||||||||||||
669 | - | |||||||||||||||||||
670 | QSGContext *QSGSoftwareThreadedRenderLoop::sceneGraphContext() const | - | ||||||||||||||||||
671 | { | - | ||||||||||||||||||
672 | return never executed: m_sg;return m_sg; never executed: return m_sg; | 0 | ||||||||||||||||||
673 | } | - | ||||||||||||||||||
674 | - | |||||||||||||||||||
675 | QSGRenderContext *QSGSoftwareThreadedRenderLoop::createRenderContext(QSGContext *) const | - | ||||||||||||||||||
676 | { | - | ||||||||||||||||||
677 | return never executed: m_sg->createRenderContext();return m_sg->createRenderContext(); never executed: return m_sg->createRenderContext(); | 0 | ||||||||||||||||||
678 | } | - | ||||||||||||||||||
679 | - | |||||||||||||||||||
680 | void QSGSoftwareThreadedRenderLoop::releaseResources(QQuickWindow *window) | - | ||||||||||||||||||
681 | { | - | ||||||||||||||||||
682 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 732, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug() << "releaseResources" << window; | 0 | ||||||||||||||||||
683 | - | |||||||||||||||||||
684 | WindowData *w = windowFor(m_windows, window); | - | ||||||||||||||||||
685 | if (w
| 0 | ||||||||||||||||||
686 | handleResourceRelease(w, false); never executed: handleResourceRelease(w, false); | 0 | ||||||||||||||||||
687 | } never executed: end of block | 0 | ||||||||||||||||||
688 | - | |||||||||||||||||||
689 | void QSGSoftwareThreadedRenderLoop::postJob(QQuickWindow *window, QRunnable *job) | - | ||||||||||||||||||
690 | { | - | ||||||||||||||||||
691 | WindowData *w = windowFor(m_windows, window); | - | ||||||||||||||||||
692 | if (w
| 0 | ||||||||||||||||||
693 | w->thread->postEvent(new QSGSoftwareJobEvent(window, job)); never executed: w->thread->postEvent(new QSGSoftwareJobEvent(window, job)); | 0 | ||||||||||||||||||
694 | else | - | ||||||||||||||||||
695 | delete job; never executed: delete job; | 0 | ||||||||||||||||||
696 | } | - | ||||||||||||||||||
697 | - | |||||||||||||||||||
698 | QSurface::SurfaceType QSGSoftwareThreadedRenderLoop::windowSurfaceType() const | - | ||||||||||||||||||
699 | { | - | ||||||||||||||||||
700 | return never executed: QSurface::RasterSurface;return QSurface::RasterSurface; never executed: return QSurface::RasterSurface; | 0 | ||||||||||||||||||
701 | } | - | ||||||||||||||||||
702 | - | |||||||||||||||||||
703 | bool QSGSoftwareThreadedRenderLoop::interleaveIncubation() const | - | ||||||||||||||||||
704 | { | - | ||||||||||||||||||
705 | bool somethingVisible = false; | - | ||||||||||||||||||
706 | for (const WindowData &w : m_windows) { | - | ||||||||||||||||||
707 | if (w.window->isVisible()
| 0 | ||||||||||||||||||
708 | somethingVisible = true; | - | ||||||||||||||||||
709 | break; never executed: break; | 0 | ||||||||||||||||||
710 | } | - | ||||||||||||||||||
711 | } never executed: end of block | 0 | ||||||||||||||||||
712 | return never executed: somethingVisible && m_anim->isRunning();return somethingVisible && m_anim->isRunning(); never executed: return somethingVisible && m_anim->isRunning(); | 0 | ||||||||||||||||||
713 | } | - | ||||||||||||||||||
714 | - | |||||||||||||||||||
715 | int QSGSoftwareThreadedRenderLoop::flags() const | - | ||||||||||||||||||
716 | { | - | ||||||||||||||||||
717 | return never executed: SupportsGrabWithoutExpose;return SupportsGrabWithoutExpose; never executed: return SupportsGrabWithoutExpose; | 0 | ||||||||||||||||||
718 | } | - | ||||||||||||||||||
719 | - | |||||||||||||||||||
720 | bool QSGSoftwareThreadedRenderLoop::event(QEvent *e) | - | ||||||||||||||||||
721 | { | - | ||||||||||||||||||
722 | if (e->type() == QEvent::Timer
| 0 | ||||||||||||||||||
723 | QTimerEvent *te = static_cast<QTimerEvent *>(e); | - | ||||||||||||||||||
724 | if (te->timerId() == animationTimer
| 0 | ||||||||||||||||||
725 | m_anim->advance(); | - | ||||||||||||||||||
726 | timeToIncubate(); | - | ||||||||||||||||||
727 | return never executed: true;return true; never executed: return true; | 0 | ||||||||||||||||||
728 | } | - | ||||||||||||||||||
729 | } never executed: end of block | 0 | ||||||||||||||||||
730 | - | |||||||||||||||||||
731 | return never executed: QObject::event(e);return QObject::event(e); never executed: return QObject::event(e); | 0 | ||||||||||||||||||
732 | } | - | ||||||||||||||||||
733 | - | |||||||||||||||||||
734 | void QSGSoftwareThreadedRenderLoop::onAnimationStarted() | - | ||||||||||||||||||
735 | { | - | ||||||||||||||||||
736 | startOrStopAnimationTimer(); | - | ||||||||||||||||||
737 | - | |||||||||||||||||||
738 | for (const WindowData &w : qAsConst(m_windows)) | - | ||||||||||||||||||
739 | w.window->requestUpdate(); never executed: w.window->requestUpdate(); | 0 | ||||||||||||||||||
740 | } never executed: end of block | 0 | ||||||||||||||||||
741 | - | |||||||||||||||||||
742 | void QSGSoftwareThreadedRenderLoop::onAnimationStopped() | - | ||||||||||||||||||
743 | { | - | ||||||||||||||||||
744 | startOrStopAnimationTimer(); | - | ||||||||||||||||||
745 | } never executed: end of block | 0 | ||||||||||||||||||
746 | - | |||||||||||||||||||
747 | void QSGSoftwareThreadedRenderLoop::startOrStopAnimationTimer() | - | ||||||||||||||||||
748 | { | - | ||||||||||||||||||
749 | int exposedWindowCount = 0; | - | ||||||||||||||||||
750 | const WindowData *exposed = nullptr; | - | ||||||||||||||||||
751 | - | |||||||||||||||||||
752 | for (int i = 0; i < m_windows.size()
| 0 | ||||||||||||||||||
753 | const WindowData &w(m_windows[i]); | - | ||||||||||||||||||
754 | if (w.window->isVisible()
| 0 | ||||||||||||||||||
755 | ++exposedWindowCount; | - | ||||||||||||||||||
756 | exposed = &w; | - | ||||||||||||||||||
757 | } never executed: end of block | 0 | ||||||||||||||||||
758 | } never executed: end of block | 0 | ||||||||||||||||||
759 | - | |||||||||||||||||||
760 | if (animationTimer
| 0 | ||||||||||||||||||
761 | killTimer(animationTimer); | - | ||||||||||||||||||
762 | animationTimer = 0; | - | ||||||||||||||||||
763 | - | |||||||||||||||||||
764 | if (m_anim->isRunning()
| 0 | ||||||||||||||||||
765 | exposed->window->requestUpdate(); never executed: exposed->window->requestUpdate(); | 0 | ||||||||||||||||||
766 | } never executed: else if (!animationTimerend of block
| 0 | ||||||||||||||||||
767 | animationTimer = startTimer(qsgrl_animation_interval()); | - | ||||||||||||||||||
768 | } never executed: end of block | 0 | ||||||||||||||||||
769 | } never executed: end of block | 0 | ||||||||||||||||||
770 | - | |||||||||||||||||||
771 | void QSGSoftwareThreadedRenderLoop::handleExposure(QQuickWindow *window) | - | ||||||||||||||||||
772 | { | - | ||||||||||||||||||
773 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 823, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug() << "handleExposure" << window; | 0 | ||||||||||||||||||
774 | - | |||||||||||||||||||
775 | WindowData *w = windowFor(m_windows, window); | - | ||||||||||||||||||
776 | if (!w
| 0 | ||||||||||||||||||
777 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 827, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("adding window to list"); | 0 | ||||||||||||||||||
778 | WindowData win; | - | ||||||||||||||||||
779 | win.window = window; | - | ||||||||||||||||||
780 | QSGRenderContext *rc = QQuickWindowPrivate::get(window)->context; | - | ||||||||||||||||||
781 | win.thread = new QSGSoftwareRenderThread(this, rc); | - | ||||||||||||||||||
782 | win.updateDuringSync = false; | - | ||||||||||||||||||
783 | win.forceRenderPass = true; | - | ||||||||||||||||||
784 | m_windows.append(win); | - | ||||||||||||||||||
785 | w = &m_windows.last(); | - | ||||||||||||||||||
786 | } never executed: end of block | 0 | ||||||||||||||||||
787 | - | |||||||||||||||||||
788 | - | |||||||||||||||||||
789 | - | |||||||||||||||||||
790 | w->thread->exposedWindow = window; | - | ||||||||||||||||||
791 | - | |||||||||||||||||||
792 | if (w->window->size().isEmpty()
| 0 | ||||||||||||||||||
793 | || (w->window->isTopLevel()
| 0 | ||||||||||||||||||
794 | - | |||||||||||||||||||
795 | QMessageLogger(__FILE__, 845, __PRETTY_FUNCTION__).warning().noquote().nospace() << "QSGSotwareThreadedRenderLoop: expose event received for window " | - | ||||||||||||||||||
796 | << w->window << " with invalid geometry: " << w->window->geometry() | - | ||||||||||||||||||
797 | << " on " << w->window->screen(); | - | ||||||||||||||||||
798 | - | |||||||||||||||||||
799 | } never executed: end of block | 0 | ||||||||||||||||||
800 | - | |||||||||||||||||||
801 | if (!w->window->handle()
| 0 | ||||||||||||||||||
802 | w->window->create(); never executed: w->window->create(); | 0 | ||||||||||||||||||
803 | - | |||||||||||||||||||
804 | - | |||||||||||||||||||
805 | if (!w->thread->isRunning()
| 0 | ||||||||||||||||||
806 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 856, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("starting render thread"); | 0 | ||||||||||||||||||
807 | - | |||||||||||||||||||
808 | QQuickAnimatorController *controller = QQuickWindowPrivate::get(w->window)->animationController; | - | ||||||||||||||||||
809 | if (controller->thread() != w->thread
| 0 | ||||||||||||||||||
810 | controller->moveToThread(w->thread); never executed: controller->moveToThread(w->thread); | 0 | ||||||||||||||||||
811 | if (w->thread->thread() == QThread::currentThread()
| 0 | ||||||||||||||||||
812 | w->thread->rc->moveToThread(w->thread); | - | ||||||||||||||||||
813 | w->thread->moveToThread(w->thread); | - | ||||||||||||||||||
814 | } never executed: end of block | 0 | ||||||||||||||||||
815 | - | |||||||||||||||||||
816 | w->thread->active = true; | - | ||||||||||||||||||
817 | w->thread->start(); | - | ||||||||||||||||||
818 | - | |||||||||||||||||||
819 | if (!w->thread->isRunning()
| 0 | ||||||||||||||||||
820 | QMessageLogger(__FILE__, 870, __PRETTY_FUNCTION__).fatal("Render thread failed to start, aborting application."); never executed: QMessageLogger(__FILE__, 870, __PRETTY_FUNCTION__).fatal("Render thread failed to start, aborting application."); | 0 | ||||||||||||||||||
821 | } never executed: end of block | 0 | ||||||||||||||||||
822 | - | |||||||||||||||||||
823 | polishAndSync(w, true); | - | ||||||||||||||||||
824 | - | |||||||||||||||||||
825 | startOrStopAnimationTimer(); | - | ||||||||||||||||||
826 | } never executed: end of block | 0 | ||||||||||||||||||
827 | - | |||||||||||||||||||
828 | void QSGSoftwareThreadedRenderLoop::handleObscurity(QSGSoftwareThreadedRenderLoop::WindowData *w) | - | ||||||||||||||||||
829 | { | - | ||||||||||||||||||
830 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 880, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug() << "handleObscurity" << w->window; | 0 | ||||||||||||||||||
831 | - | |||||||||||||||||||
832 | if (w->thread->isRunning()
| 0 | ||||||||||||||||||
833 | w->thread->mutex.lock(); | - | ||||||||||||||||||
834 | w->thread->postEvent(new QSGSoftwareWindowEvent(w->window, WM_Obscure)); | - | ||||||||||||||||||
835 | w->thread->waitCondition.wait(&w->thread->mutex); | - | ||||||||||||||||||
836 | w->thread->mutex.unlock(); | - | ||||||||||||||||||
837 | } never executed: end of block | 0 | ||||||||||||||||||
838 | - | |||||||||||||||||||
839 | startOrStopAnimationTimer(); | - | ||||||||||||||||||
840 | } never executed: end of block | 0 | ||||||||||||||||||
841 | - | |||||||||||||||||||
842 | void QSGSoftwareThreadedRenderLoop::scheduleUpdate(QSGSoftwareThreadedRenderLoop::WindowData *w) | - | ||||||||||||||||||
843 | { | - | ||||||||||||||||||
844 | if (!QCoreApplication::instance()
| 0 | ||||||||||||||||||
845 | return; never executed: return; | 0 | ||||||||||||||||||
846 | - | |||||||||||||||||||
847 | if (!w
| 0 | ||||||||||||||||||
848 | return; never executed: return; | 0 | ||||||||||||||||||
849 | - | |||||||||||||||||||
850 | QThread *current = QThread::currentThread(); | - | ||||||||||||||||||
851 | if (current != QCoreApplication::instance()->thread()
| 0 | ||||||||||||||||||
852 | QMessageLogger(__FILE__, 902, __PRETTY_FUNCTION__).warning() << "Updates can only be scheduled from GUI thread or from QQuickItem::updatePaintNode()"; | - | ||||||||||||||||||
853 | return; never executed: return; | 0 | ||||||||||||||||||
854 | } | - | ||||||||||||||||||
855 | - | |||||||||||||||||||
856 | if (current == w->thread
| 0 | ||||||||||||||||||
857 | w->updateDuringSync = true; | - | ||||||||||||||||||
858 | return; never executed: return; | 0 | ||||||||||||||||||
859 | } | - | ||||||||||||||||||
860 | - | |||||||||||||||||||
861 | w->window->requestUpdate(); | - | ||||||||||||||||||
862 | } never executed: end of block | 0 | ||||||||||||||||||
863 | - | |||||||||||||||||||
864 | void QSGSoftwareThreadedRenderLoop::handleResourceRelease(QSGSoftwareThreadedRenderLoop::WindowData *w, bool destroying) | - | ||||||||||||||||||
865 | { | - | ||||||||||||||||||
866 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 916, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug() << "handleResourceRelease" << (destroying ? "destroying" : "hide/releaseResources") << w->window; | 0 | ||||||||||||||||||
867 | - | |||||||||||||||||||
868 | w->thread->mutex.lock(); | - | ||||||||||||||||||
869 | if (w->thread->isRunning()
| 0 | ||||||||||||||||||
870 | QQuickWindow *window = w->window; | - | ||||||||||||||||||
871 | - | |||||||||||||||||||
872 | - | |||||||||||||||||||
873 | - | |||||||||||||||||||
874 | - | |||||||||||||||||||
875 | - | |||||||||||||||||||
876 | w->thread->postEvent(new QSGSoftwareTryReleaseEvent(window, destroying)); | - | ||||||||||||||||||
877 | w->thread->waitCondition.wait(&w->thread->mutex); | - | ||||||||||||||||||
878 | - | |||||||||||||||||||
879 | - | |||||||||||||||||||
880 | - | |||||||||||||||||||
881 | - | |||||||||||||||||||
882 | - | |||||||||||||||||||
883 | - | |||||||||||||||||||
884 | - | |||||||||||||||||||
885 | if (!w->thread->active
| 0 | ||||||||||||||||||
886 | w->thread->wait(); never executed: w->thread->wait(); | 0 | ||||||||||||||||||
887 | } never executed: end of block | 0 | ||||||||||||||||||
888 | w->thread->mutex.unlock(); | - | ||||||||||||||||||
889 | } never executed: end of block | 0 | ||||||||||||||||||
890 | - | |||||||||||||||||||
891 | void QSGSoftwareThreadedRenderLoop::polishAndSync(QSGSoftwareThreadedRenderLoop::WindowData *w, bool inExpose) | - | ||||||||||||||||||
892 | { | - | ||||||||||||||||||
893 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 943, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug() << "polishAndSync" << (inExpose ? "(in expose)" : "(normal)") << w->window; | 0 | ||||||||||||||||||
894 | - | |||||||||||||||||||
895 | QQuickWindow *window = w->window; | - | ||||||||||||||||||
896 | if (!w->thread
| 0 | ||||||||||||||||||
897 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 947, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("polishAndSync - not exposed, abort"); | 0 | ||||||||||||||||||
898 | return; never executed: return; | 0 | ||||||||||||||||||
899 | } | - | ||||||||||||||||||
900 | - | |||||||||||||||||||
901 | - | |||||||||||||||||||
902 | QQuickWindowPrivate::get(window)->flushFrameSynchronousEvents(); | - | ||||||||||||||||||
903 | - | |||||||||||||||||||
904 | w = windowFor(m_windows, window); | - | ||||||||||||||||||
905 | if (!w
| 0 | ||||||||||||||||||
906 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 956, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("polishAndSync - removed after touch event flushing, abort"); | 0 | ||||||||||||||||||
907 | return; never executed: return; | 0 | ||||||||||||||||||
908 | } | - | ||||||||||||||||||
909 | - | |||||||||||||||||||
910 | if (QQuickProfiler::featuresEnabled & (1 << QQuickProfiler::ProfileSceneGraph)
never executed: else (end of block never executed: void)0;(void)0; never executed: (void)0; | 0 | ||||||||||||||||||
911 | - | |||||||||||||||||||
912 | QQuickWindowPrivate *wd = QQuickWindowPrivate::get(window); | - | ||||||||||||||||||
913 | wd->polishItems(); | - | ||||||||||||||||||
914 | - | |||||||||||||||||||
915 | if (QQuickProfiler::featuresEnabled & (1 << QQuickProfiler::ProfileSceneGraph)
never executed: else (end of block never executed: void)0(void)0 ; never executed: (void)0 ; | 0 | ||||||||||||||||||
916 | ; never executed: (void)0 ; | 0 | ||||||||||||||||||
917 | - | |||||||||||||||||||
918 | w->updateDuringSync = false; | - | ||||||||||||||||||
919 | - | |||||||||||||||||||
920 | window->afterAnimating(); | - | ||||||||||||||||||
921 | - | |||||||||||||||||||
922 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 972, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("polishAndSync - lock for sync"); | 0 | ||||||||||||||||||
923 | w->thread->mutex.lock(); | - | ||||||||||||||||||
924 | lockedForSync = true; | - | ||||||||||||||||||
925 | w->thread->postEvent(new QSGSoftwareSyncEvent(window, inExpose, w->forceRenderPass)); | - | ||||||||||||||||||
926 | w->forceRenderPass = false; | - | ||||||||||||||||||
927 | - | |||||||||||||||||||
928 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 978, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("polishAndSync - wait for sync"); | 0 | ||||||||||||||||||
929 | - | |||||||||||||||||||
930 | if (QQuickProfiler::featuresEnabled & (1 << QQuickProfiler::ProfileSceneGraph)
never executed: else (end of block never executed: void)0(void)0 ; never executed: (void)0 ; | 0 | ||||||||||||||||||
931 | ; never executed: (void)0 ; | 0 | ||||||||||||||||||
932 | w->thread->waitCondition.wait(&w->thread->mutex); | - | ||||||||||||||||||
933 | lockedForSync = false; | - | ||||||||||||||||||
934 | w->thread->mutex.unlock(); | - | ||||||||||||||||||
935 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 985, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("polishAndSync - unlock after sync"); | 0 | ||||||||||||||||||
936 | - | |||||||||||||||||||
937 | if (QQuickProfiler::featuresEnabled & (1 << QQuickProfiler::ProfileSceneGraph)
never executed: else (end of block never executed: void)0(void)0 ; never executed: (void)0 ; | 0 | ||||||||||||||||||
938 | ; never executed: (void)0 ; | 0 | ||||||||||||||||||
939 | - | |||||||||||||||||||
940 | if (!animationTimer
| 0 | ||||||||||||||||||
941 | for (bool qt_category_enabled = QSG_RASTER_LOG_RENDERLOOP().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 991, __PRETTY_FUNCTION__, QSG_RASTER_LOG_RENDERLOOP().categoryName()).debug("polishAndSync - advancing animations"); | 0 | ||||||||||||||||||
942 | m_anim->advance(); | - | ||||||||||||||||||
943 | - | |||||||||||||||||||
944 | w->window->requestUpdate(); | - | ||||||||||||||||||
945 | timeToIncubate(); | - | ||||||||||||||||||
946 | } never executed: else if (w->updateDuringSyncend of block
| 0 | ||||||||||||||||||
947 | w->window->requestUpdate(); | - | ||||||||||||||||||
948 | } never executed: end of block | 0 | ||||||||||||||||||
949 | - | |||||||||||||||||||
950 | if (QQuickProfiler::featuresEnabled & (1 << QQuickProfiler::ProfileSceneGraph)
never executed: else (end of block never executed: void)0(void)0 ; never executed: (void)0 ; | 0 | ||||||||||||||||||
951 | ; never executed: (void)0 ; | 0 | ||||||||||||||||||
952 | } | - | ||||||||||||||||||
953 | - | |||||||||||||||||||
954 | - | |||||||||||||||||||
955 | - | |||||||||||||||||||
Switch to Source code | Preprocessed file |