OpenCoverage

qsgwindowsrenderloop.cpp

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/qtdeclarative/src/qtdeclarative/src/quick/scenegraph/qsgwindowsrenderloop.cpp
Source codeSwitch to Preprocessed file
LineSourceCount
1/****************************************************************************-
2**-
3** Copyright (C) 2016 The Qt Company Ltd.-
4** Contact: https://www.qt.io/licensing/-
5**-
6** This file is part of the QtQuick module of the Qt Toolkit.-
7**-
8** $QT_BEGIN_LICENSE:LGPL$-
9** Commercial License Usage-
10** Licensees holding valid commercial Qt licenses may use this file in-
11** accordance with the commercial license agreement provided with the-
12** Software or, alternatively, in accordance with the terms contained in-
13** a written agreement between you and The Qt Company. For licensing terms-
14** and conditions see https://www.qt.io/terms-conditions. For further-
15** information use the contact form at https://www.qt.io/contact-us.-
16**-
17** GNU Lesser General Public License Usage-
18** Alternatively, this file may be used under the terms of the GNU Lesser-
19** General Public License version 3 as published by the Free Software-
20** Foundation and appearing in the file LICENSE.LGPL3 included in the-
21** packaging of this file. Please review the following information to-
22** ensure the GNU Lesser General Public License version 3 requirements-
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.-
24**-
25** GNU General Public License Usage-
26** Alternatively, this file may be used under the terms of the GNU-
27** General Public License version 2.0 or (at your option) the GNU General-
28** Public license version 3 or any later version approved by the KDE Free-
29** Qt Foundation. The licenses are as published by the Free Software-
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3-
31** included in the packaging of this file. Please review the following-
32** information to ensure the GNU General Public License requirements will-
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and-
34** https://www.gnu.org/licenses/gpl-3.0.html.-
35**-
36** $QT_END_LICENSE$-
37**-
38****************************************************************************/-
39-
40#include "qsgwindowsrenderloop_p.h"-
41#include <QtCore/QCoreApplication>-
42#include <QtCore/QLibraryInfo>-
43#include <QtCore/QThread>-
44-
45#include <QtGui/QScreen>-
46#include <QtGui/QGuiApplication>-
47#include <QtGui/QOffscreenSurface>-
48-
49#include <QtQuick/private/qsgcontext_p.h>-
50#include <QtQuick/private/qquickwindow_p.h>-
51#include <QtQuick/private/qsgrenderer_p.h>-
52#include <QtQuick/private/qsgdefaultrendercontext_p.h>-
53-
54#include <QtQuick/QQuickWindow>-
55-
56#include <private/qquickprofiler_p.h>-
57#include <private/qquickanimatorcontroller_p.h>-
58-
59#if QT_CONFIG(quick_shadereffect) && QT_CONFIG(opengl)-
60#include <private/qquickopenglshadereffectnode_p.h>-
61#endif-
62-
63QT_BEGIN_NAMESPACE-
64-
65extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha);-
66-
67#define RLDEBUG(x) qCDebug(QSG_LOG_RENDERLOOP, x)-
68-
69static QElapsedTimer qsg_render_timer;-
70#define QSG_LOG_TIME_SAMPLE(sampleName) \-
71 qint64 sampleName = 0; \-
72 if (QSG_LOG_TIME_RENDERLOOP().isDebugEnabled()) \-
73 sampleName = qsg_render_timer.nsecsElapsed(); \-
74-
75#define QSG_RENDER_TIMING_SAMPLE(frameType, sampleName, position) \-
76 QSG_LOG_TIME_SAMPLE(sampleName) \-
77 Q_QUICK_SG_PROFILE_RECORD(frameType, position);-
78-
79-
80QSGWindowsRenderLoop::QSGWindowsRenderLoop()-
81 : m_gl(nullptr)-
82 , m_sg(QSGContext::createDefaultContext())-
83 , m_updateTimer(0)-
84 , m_animationTimer(0)-
85{-
86 m_rc = static_cast<QSGDefaultRenderContext *>(m_sg->createRenderContext());-
87-
88 m_vsyncDelta = 1000 / QGuiApplication::primaryScreen()->refreshRate();-
89 if (m_vsyncDelta <= 0)
m_vsyncDelta <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
90 m_vsyncDelta = 16;
never executed: m_vsyncDelta = 16;
0
91-
92 RLDEBUG("Windows Render Loop created");
never executed: QMessageLogger(__FILE__, 92, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("Windows Render Loop created");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
93-
94 m_animationDriver = m_sg->createAnimationDriver(m_sg);-
95 connect(m_animationDriver, SIGNAL(started()), this, SLOT(started()));-
96 connect(m_animationDriver, SIGNAL(stopped()), this, SLOT(stopped()));-
97 m_animationDriver->install();-
98-
99 qsg_render_timer.start();-
100}
never executed: end of block
0
101-
102QSGWindowsRenderLoop::~QSGWindowsRenderLoop()-
103{-
104 delete m_rc;-
105 delete m_sg;-
106}
never executed: end of block
0
107-
108bool QSGWindowsRenderLoop::interleaveIncubation() const-
109{-
110 return m_animationDriver->isRunning() && anyoneShowing();
never executed: return m_animationDriver->isRunning() && anyoneShowing();
0
111}-
112-
113QSGWindowsRenderLoop::WindowData *QSGWindowsRenderLoop::windowData(QQuickWindow *window)-
114{-
115 for (int i=0; i<m_windows.size(); ++i) {
i<m_windows.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
116 WindowData &wd = m_windows[i];-
117 if (wd.window == window)
wd.window == windowDescription
TRUEnever evaluated
FALSEnever evaluated
0
118 return &wd;
never executed: return &wd;
0
119 }
never executed: end of block
0
120 return nullptr;
never executed: return nullptr;
0
121}-
122-
123void QSGWindowsRenderLoop::maybePostUpdateTimer()-
124{-
125 if (!m_updateTimer) {
!m_updateTimerDescription
TRUEnever evaluated
FALSEnever evaluated
0
126 RLDEBUG(" - posting event");
never executed: QMessageLogger(__FILE__, 126, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - posting event");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
127 m_updateTimer = startTimer(m_vsyncDelta / 3);-
128 }
never executed: end of block
0
129}
never executed: end of block
0
130-
131/*-
132 * If no windows are showing, start ticking animations using a timer,-
133 * otherwise, start rendering-
134 */-
135void QSGWindowsRenderLoop::started()-
136{-
137 RLDEBUG("Animations started...");
never executed: QMessageLogger(__FILE__, 137, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("Animations started...");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
138 if (!anyoneShowing()) {
!anyoneShowing()Description
TRUEnever evaluated
FALSEnever evaluated
0
139 if (m_animationTimer == 0) {
m_animationTimer == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
140 RLDEBUG(" - starting non-visual animation timer");
never executed: QMessageLogger(__FILE__, 140, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - starting non-visual animation timer");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
141 m_animationTimer = startTimer(m_vsyncDelta);-
142 }
never executed: end of block
0
143 } else {
never executed: end of block
0
144 maybePostUpdateTimer();-
145 }
never executed: end of block
0
146}-
147-
148void QSGWindowsRenderLoop::stopped()-
149{-
150 RLDEBUG("Animations stopped...");
never executed: QMessageLogger(__FILE__, 150, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("Animations stopped...");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
151 if (m_animationTimer) {
m_animationTimerDescription
TRUEnever evaluated
FALSEnever evaluated
0
152 RLDEBUG(" - stopping non-visual animation timer");
never executed: QMessageLogger(__FILE__, 152, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - stopping non-visual animation timer");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
153 killTimer(m_animationTimer);-
154 m_animationTimer = 0;-
155 }
never executed: end of block
0
156}
never executed: end of block
0
157-
158void QSGWindowsRenderLoop::show(QQuickWindow *window)-
159{-
160 RLDEBUG("show");
never executed: QMessageLogger(__FILE__, 160, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("show");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
161 if (windowData(window) != nullptr)
windowData(window) != nullptrDescription
TRUEnever evaluated
FALSEnever evaluated
0
162 return;
never executed: return;
0
163-
164 // This happens before the platform window is shown, but after-
165 // it is created. Creating the GL context takes a lot of time-
166 // (hundreds of milliseconds) and will prevent us from rendering-
167 // the first frame in time for the initial show on screen.-
168 // By preparing the GL context here, it is feasible (if the app-
169 // is quick enough) to have a perfect first frame.-
170 if (!m_gl) {
!m_glDescription
TRUEnever evaluated
FALSEnever evaluated
0
171 RLDEBUG(" - creating GL context");
never executed: QMessageLogger(__FILE__, 171, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - creating GL context");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
172 m_gl = new QOpenGLContext();-
173 m_gl->setFormat(window->requestedFormat());-
174 m_gl->setScreen(window->screen());-
175 if (qt_gl_global_share_context())
qt_gl_global_share_context()Description
TRUEnever evaluated
FALSEnever evaluated
0
176 m_gl->setShareContext(qt_gl_global_share_context());
never executed: m_gl->setShareContext(qt_gl_global_share_context());
0
177 bool created = m_gl->create();-
178 if (!created) {
!createdDescription
TRUEnever evaluated
FALSEnever evaluated
0
179 const bool isEs = m_gl->isOpenGLES();-
180 delete m_gl;-
181 m_gl = nullptr;-
182 handleContextCreationFailure(window, isEs);-
183 return;
never executed: return;
0
184 }-
185-
186 QQuickWindowPrivate::get(window)->fireOpenGLContextCreated(m_gl);-
187-
188 RLDEBUG(" - making current");
never executed: QMessageLogger(__FILE__, 188, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - making current");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
189 bool current = m_gl->makeCurrent(window);-
190 RLDEBUG(" - initializing SG");
never executed: QMessageLogger(__FILE__, 190, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - initializing SG");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
191 if (current)
currentDescription
TRUEnever evaluated
FALSEnever evaluated
0
192 m_rc->initialize(m_gl);
never executed: m_rc->initialize(m_gl);
0
193 }
never executed: end of block
0
194-
195 WindowData data;-
196 data.window = window;-
197 data.pendingUpdate = false;-
198 m_windows << data;-
199-
200 RLDEBUG(" - done with show");
never executed: QMessageLogger(__FILE__, 200, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - done with show");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
201}
never executed: end of block
0
202-
203void QSGWindowsRenderLoop::hide(QQuickWindow *window)-
204{-
205 RLDEBUG("hide");
never executed: QMessageLogger(__FILE__, 205, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("hide");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
206 // The expose event is queued while hide is sent synchronously, so-
207 // the value might not be updated yet. (plus that the windows plugin-
208 // sends exposed=true when it goes to hidden, so it is doubly broken)-
209 // The check is made here, after the removal from m_windows, so-
210 // anyoneShowing will report the right value.-
211 if (window->isExposed())
window->isExposed()Description
TRUEnever evaluated
FALSEnever evaluated
0
212 handleObscurity();
never executed: handleObscurity();
0
213 if (!m_gl)
!m_glDescription
TRUEnever evaluated
FALSEnever evaluated
0
214 return;
never executed: return;
0
215 QQuickWindowPrivate::get(window)->fireAboutToStop();-
216}
never executed: end of block
0
217-
218void QSGWindowsRenderLoop::windowDestroyed(QQuickWindow *window)-
219{-
220 RLDEBUG("windowDestroyed");
never executed: QMessageLogger(__FILE__, 220, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("windowDestroyed");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
221 for (int i=0; i<m_windows.size(); ++i) {
i<m_windows.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
222 if (m_windows.at(i).window == window) {
m_windows.at(i...ndow == windowDescription
TRUEnever evaluated
FALSEnever evaluated
0
223 m_windows.removeAt(i);-
224 break;
never executed: break;
0
225 }-
226 }
never executed: end of block
0
227-
228 hide(window);-
229-
230 QQuickWindowPrivate *d = QQuickWindowPrivate::get(window);-
231-
232 bool current = false;-
233 QScopedPointer<QOffscreenSurface> offscreenSurface;-
234 if (m_gl) {
m_glDescription
TRUEnever evaluated
FALSEnever evaluated
0
235 QSurface *surface = window;-
236 // There may be no platform window if the window got closed.-
237 if (!window->handle()) {
!window->handle()Description
TRUEnever evaluated
FALSEnever evaluated
0
238 offscreenSurface.reset(new QOffscreenSurface);-
239 offscreenSurface->setFormat(m_gl->format());-
240 offscreenSurface->create();-
241 surface = offscreenSurface.data();-
242 }
never executed: end of block
0
243 current = m_gl->makeCurrent(surface);-
244 }
never executed: end of block
0
245 if (Q_UNLIKELY(!current))
__builtin_expe...rrent), false)Description
TRUEnever evaluated
FALSEnever evaluated
0
246 RLDEBUG("cleanup without an OpenGL context");
never executed: QMessageLogger(__FILE__, 246, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("cleanup without an OpenGL context");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
247-
248#if QT_CONFIG(quick_shadereffect) && QT_CONFIG(opengl)-
249 QQuickOpenGLShaderEffectMaterial::cleanupMaterialCache();-
250#endif-
251-
252 d->cleanupNodesOnShutdown();-
253 if (m_windows.size() == 0) {
m_windows.size() == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
254 d->context->invalidate();-
255 delete m_gl;-
256 m_gl = nullptr;-
257 } else if (m_gl && current) {
never executed: end of block
m_glDescription
TRUEnever evaluated
FALSEnever evaluated
currentDescription
TRUEnever evaluated
FALSEnever evaluated
0
258 m_gl->doneCurrent();-
259 }
never executed: end of block
0
260-
261 delete d->animationController;-
262}
never executed: end of block
0
263-
264bool QSGWindowsRenderLoop::anyoneShowing() const-
265{-
266 for (const WindowData &wd : qAsConst(m_windows))-
267 if (wd.window->isVisible() && wd.window->isExposed() && wd.window->size().isValid())
wd.window->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
wd.window->isExposed()Description
TRUEnever evaluated
FALSEnever evaluated
wd.window->size().isValid()Description
TRUEnever evaluated
FALSEnever evaluated
0
268 return true;
never executed: return true;
0
269 return false;
never executed: return false;
0
270}-
271-
272void QSGWindowsRenderLoop::exposureChanged(QQuickWindow *window)-
273{-
274-
275 if (windowData(window) == nullptr)
windowData(window) == nullptrDescription
TRUEnever evaluated
FALSEnever evaluated
0
276 return;
never executed: return;
0
277-
278 if (window->isExposed() && window->isVisible()) {
window->isExposed()Description
TRUEnever evaluated
FALSEnever evaluated
window->isVisible()Description
TRUEnever evaluated
FALSEnever evaluated
0
279-
280 // Stop non-visual animation timer as we now have a window rendering-
281 if (m_animationTimer && anyoneShowing()) {
m_animationTimerDescription
TRUEnever evaluated
FALSEnever evaluated
anyoneShowing()Description
TRUEnever evaluated
FALSEnever evaluated
0
282 RLDEBUG(" - stopping non-visual animation timer");
never executed: QMessageLogger(__FILE__, 282, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - stopping non-visual animation timer");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
283 killTimer(m_animationTimer);-
284 m_animationTimer = 0;-
285 }
never executed: end of block
0
286-
287 RLDEBUG("exposureChanged - exposed");
never executed: QMessageLogger(__FILE__, 287, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("exposureChanged - exposed");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
288 WindowData *wd = windowData(window);-
289 wd->pendingUpdate = true;-
290-
291 // If we have a pending timer and we get an expose, we need to stop it.-
292 // Otherwise we get two frames and two animation ticks in the same time-interval.-
293 if (m_updateTimer) {
m_updateTimerDescription
TRUEnever evaluated
FALSEnever evaluated
0
294 RLDEBUG(" - killing pending update timer");
never executed: QMessageLogger(__FILE__, 294, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - killing pending update timer");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
295 killTimer(m_updateTimer);-
296 m_updateTimer = 0;-
297 }
never executed: end of block
0
298 render();-
299 } else {
never executed: end of block
0
300 handleObscurity();-
301 }
never executed: end of block
0
302}-
303-
304void QSGWindowsRenderLoop::handleObscurity()-
305{-
306 RLDEBUG("handleObscurity");
never executed: QMessageLogger(__FILE__, 306, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("handleObscurity");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
307 // Potentially start the non-visual animation timer if nobody is rendering-
308 if (m_animationDriver->isRunning() && !anyoneShowing() && !m_animationTimer) {
m_animationDriver->isRunning()Description
TRUEnever evaluated
FALSEnever evaluated
!anyoneShowing()Description
TRUEnever evaluated
FALSEnever evaluated
!m_animationTimerDescription
TRUEnever evaluated
FALSEnever evaluated
0
309 RLDEBUG(" - starting non-visual animation timer");
never executed: QMessageLogger(__FILE__, 309, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - starting non-visual animation timer");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
310 m_animationTimer = startTimer(m_vsyncDelta);-
311 }
never executed: end of block
0
312}
never executed: end of block
0
313-
314QImage QSGWindowsRenderLoop::grab(QQuickWindow *window)-
315{-
316 RLDEBUG("grab");
never executed: QMessageLogger(__FILE__, 316, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("grab");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
317 if (!m_gl)
!m_glDescription
TRUEnever evaluated
FALSEnever evaluated
0
318 return QImage();
never executed: return QImage();
0
319-
320 m_gl->makeCurrent(window);-
321-
322 QQuickWindowPrivate *d = QQuickWindowPrivate::get(window);-
323 d->polishItems();-
324 d->syncSceneGraph();-
325 d->renderSceneGraph(window->size());-
326-
327 bool alpha = window->format().alphaBufferSize() > 0 && window->color().alpha() != 255;
window->format...fferSize() > 0Description
TRUEnever evaluated
FALSEnever evaluated
window->color().alpha() != 255Description
TRUEnever evaluated
FALSEnever evaluated
0
328 QImage image = qt_gl_read_framebuffer(window->size() * window->effectiveDevicePixelRatio(), alpha, alpha);-
329 image.setDevicePixelRatio(window->effectiveDevicePixelRatio());-
330 return image;
never executed: return image;
0
331}-
332-
333void QSGWindowsRenderLoop::update(QQuickWindow *window)-
334{-
335 RLDEBUG("update");
never executed: QMessageLogger(__FILE__, 335, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("update");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
336 maybeUpdate(window);-
337}
never executed: end of block
0
338-
339void QSGWindowsRenderLoop::maybeUpdate(QQuickWindow *window)-
340{-
341 RLDEBUG("maybeUpdate");
never executed: QMessageLogger(__FILE__, 341, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("maybeUpdate");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
342-
343 WindowData *wd = windowData(window);-
344 if (!wd || !anyoneShowing())
!wdDescription
TRUEnever evaluated
FALSEnever evaluated
!anyoneShowing()Description
TRUEnever evaluated
FALSEnever evaluated
0
345 return;
never executed: return;
0
346-
347 wd->pendingUpdate = true;-
348 maybePostUpdateTimer();-
349}
never executed: end of block
0
350-
351QSGRenderContext *QSGWindowsRenderLoop::createRenderContext(QSGContext *) const-
352{-
353 return m_rc;
never executed: return m_rc;
0
354}-
355-
356bool QSGWindowsRenderLoop::event(QEvent *event)-
357{-
358 switch (event->type()) {-
359 case QEvent::Timer: {
never executed: case QEvent::Timer:
0
360 QTimerEvent *te = static_cast<QTimerEvent *>(event);-
361 if (te->timerId() == m_animationTimer) {
te->timerId() ...animationTimerDescription
TRUEnever evaluated
FALSEnever evaluated
0
362 RLDEBUG("event : animation tick while nothing is showing");
never executed: QMessageLogger(__FILE__, 362, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("event : animation tick while nothing is showing");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
363 m_animationDriver->advance();-
364 } else if (te->timerId() == m_updateTimer) {
never executed: end of block
te->timerId() == m_updateTimerDescription
TRUEnever evaluated
FALSEnever evaluated
0
365 RLDEBUG("event : update");
never executed: QMessageLogger(__FILE__, 365, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("event : update");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
366 killTimer(m_updateTimer);-
367 m_updateTimer = 0;-
368 render();-
369 }
never executed: end of block
0
370 return true; }
never executed: return true;
0
371 default:
never executed: default:
0
372 break;
never executed: break;
0
373 }-
374-
375 return QObject::event(event);
never executed: return QObject::event(event);
0
376}-
377-
378/*-
379 * Go through all windows we control and render them in turn.-
380 * Then tick animations if active.-
381 */-
382void QSGWindowsRenderLoop::render()-
383{-
384 RLDEBUG("render");
never executed: QMessageLogger(__FILE__, 384, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("render");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
385 bool rendered = false;-
386 for (const WindowData &wd : qAsConst(m_windows)) {-
387 if (wd.pendingUpdate) {
wd.pendingUpdateDescription
TRUEnever evaluated
FALSEnever evaluated
0
388 const_cast<WindowData &>(wd).pendingUpdate = false;-
389 renderWindow(wd.window);-
390 rendered = true;-
391 }
never executed: end of block
0
392 }
never executed: end of block
0
393-
394 if (!rendered) {
!renderedDescription
TRUEnever evaluated
FALSEnever evaluated
0
395 RLDEBUG("no changes, sleep");
never executed: QMessageLogger(__FILE__, 395, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("no changes, sleep");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
396 QThread::msleep(m_vsyncDelta);-
397 }
never executed: end of block
0
398-
399 if (m_animationDriver->isRunning()) {
m_animationDriver->isRunning()Description
TRUEnever evaluated
FALSEnever evaluated
0
400 RLDEBUG("advancing animations");
never executed: QMessageLogger(__FILE__, 400, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("advancing animations");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
401 QSG_LOG_TIME_SAMPLE(time_start);
never executed: time_start = qsg_render_timer.nsecsElapsed();
QSG_LOG_TIME_R...DebugEnabled()Description
TRUEnever evaluated
FALSEnever evaluated
0
402 Q_QUICK_SG_PROFILE_START(QQuickProfiler::SceneGraphWindowsAnimations);
never executed: end of block
never executed: (void)0;
QQuickProfiler...ileSceneGraph)Description
TRUEnever evaluated
FALSEnever evaluated
0
403 m_animationDriver->advance();-
404 RLDEBUG("animations advanced");
never executed: QMessageLogger(__FILE__, 404, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("animations advanced");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
405-
406 qCDebug(QSG_LOG_TIME_RENDERLOOP,
never executed: QMessageLogger( __FILE__ , 408 , __PRETTY_FUNCTION__, QSG_LOG_TIME_RENDERLOOP().categoryName()).debug("animations ticked in %dms", int((qsg_render_timer.nsecsElapsed() - time_start)/1000000)) ;
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
407 "animations ticked in %dms",
never executed: QMessageLogger( __FILE__ , 408 , __PRETTY_FUNCTION__, QSG_LOG_TIME_RENDERLOOP().categoryName()).debug("animations ticked in %dms", int((qsg_render_timer.nsecsElapsed() - time_start)/1000000)) ;
0
408 int((qsg_render_timer.nsecsElapsed() - time_start)/1000000));
never executed: QMessageLogger( __FILE__ , 408 , __PRETTY_FUNCTION__, QSG_LOG_TIME_RENDERLOOP().categoryName()).debug("animations ticked in %dms", int((qsg_render_timer.nsecsElapsed() - time_start)/1000000)) ;
0
409-
410 Q_QUICK_SG_PROFILE_END(QQuickProfiler::SceneGraphWindowsAnimations, 1);
never executed: end of block
never executed: (void)0;
QQuickProfiler...ileSceneGraph)Description
TRUEnever evaluated
FALSEnever evaluated
0
411-
412 // It is not given that animations triggered another maybeUpdate()-
413 // and thus another render pass, so to keep things running,-
414 // make sure there is another frame pending.-
415 maybePostUpdateTimer();-
416-
417 emit timeToIncubate();-
418 }
never executed: end of block
0
419}
never executed: end of block
0
420-
421/*-
422 * Render the contents of this window. First polish, then sync, render-
423 * then finally swap.-
424 *-
425 * Note: This render function does not implement aborting-
426 * the render call when sync step results in no scene graph changes,-
427 * like the threaded renderer does.-
428 */-
429void QSGWindowsRenderLoop::renderWindow(QQuickWindow *window)-
430{-
431 RLDEBUG("renderWindow");
never executed: QMessageLogger(__FILE__, 431, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("renderWindow");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
432 QQuickWindowPrivate *d = QQuickWindowPrivate::get(window);-
433-
434 if (!d->isRenderable())
!d->isRenderable()Description
TRUEnever evaluated
FALSEnever evaluated
0
435 return;
never executed: return;
0
436-
437 if (!m_gl->makeCurrent(window)) {
!m_gl->makeCurrent(window)Description
TRUEnever evaluated
FALSEnever evaluated
0
438 // Check for context loss.-
439 if (!m_gl->isValid()) {
!m_gl->isValid()Description
TRUEnever evaluated
FALSEnever evaluated
0
440 d->cleanupNodesOnShutdown();-
441 m_rc->invalidate();-
442 if (m_gl->create() && m_gl->makeCurrent(window))
m_gl->create()Description
TRUEnever evaluated
FALSEnever evaluated
m_gl->makeCurrent(window)Description
TRUEnever evaluated
FALSEnever evaluated
0
443 m_rc->initialize(m_gl);
never executed: m_rc->initialize(m_gl);
0
444 else-
445 return;
never executed: return;
0
446 }-
447 }
never executed: end of block
0
448-
449 bool lastDirtyWindow = true;-
450 for (int i=0; i<m_windows.size(); ++i) {
i<m_windows.size()Description
TRUEnever evaluated
FALSEnever evaluated
0
451 if ( m_windows[i].pendingUpdate) {
m_windows[i].pendingUpdateDescription
TRUEnever evaluated
FALSEnever evaluated
0
452 lastDirtyWindow = false;-
453 break;
never executed: break;
0
454 }-
455 }
never executed: end of block
0
456-
457 d->flushFrameSynchronousEvents();-
458 // Event delivery or processing has caused the window to stop rendering.-
459 if (!windowData(window))
!windowData(window)Description
TRUEnever evaluated
FALSEnever evaluated
0
460 return;
never executed: return;
0
461-
462 QSG_LOG_TIME_SAMPLE(time_start);
never executed: time_start = qsg_render_timer.nsecsElapsed();
QSG_LOG_TIME_R...DebugEnabled()Description
TRUEnever evaluated
FALSEnever evaluated
0
463 Q_QUICK_SG_PROFILE_START(QQuickProfiler::SceneGraphPolishFrame);
never executed: end of block
never executed: (void)0;
QQuickProfiler...ileSceneGraph)Description
TRUEnever evaluated
FALSEnever evaluated
0
464-
465 RLDEBUG(" - polishing");
never executed: QMessageLogger(__FILE__, 465, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - polishing");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
466 d->polishItems();-
467 QSG_LOG_TIME_SAMPLE(time_polished);
never executed: time_polished = qsg_render_timer.nsecsElapsed();
QSG_LOG_TIME_R...DebugEnabled()Description
TRUEnever evaluated
FALSEnever evaluated
0
468 Q_QUICK_SG_PROFILE_SWITCH(QQuickProfiler::SceneGraphPolishFrame,
never executed: end of block
never executed: (void)0 ;
QQuickProfiler...ileSceneGraph)Description
TRUEnever evaluated
FALSEnever evaluated
0
469 QQuickProfiler::SceneGraphRenderLoopFrame,
never executed: (void)0 ;
0
470 QQuickProfiler::SceneGraphPolishPolish);
never executed: (void)0 ;
0
471-
472 emit window->afterAnimating();-
473-
474 RLDEBUG(" - syncing");
never executed: QMessageLogger(__FILE__, 474, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - syncing");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
475 d->syncSceneGraph();-
476 if (lastDirtyWindow)
lastDirtyWindowDescription
TRUEnever evaluated
FALSEnever evaluated
0
477 m_rc->endSync();
never executed: m_rc->endSync();
0
478 QSG_RENDER_TIMING_SAMPLE(QQuickProfiler::SceneGraphRenderLoopFrame, time_synced,
never executed: time_synced = qsg_render_timer.nsecsElapsed();
never executed: end of block
never executed: (void)0;
QSG_LOG_TIME_R...DebugEnabled()Description
TRUEnever evaluated
FALSEnever evaluated
QQuickProfiler...ileSceneGraph)Description
TRUEnever evaluated
FALSEnever evaluated
0
479 QQuickProfiler::SceneGraphRenderLoopSync);-
480-
481 RLDEBUG(" - rendering");
never executed: QMessageLogger(__FILE__, 481, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - rendering");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
482 d->renderSceneGraph(window->size());-
483 QSG_RENDER_TIMING_SAMPLE(QQuickProfiler::SceneGraphRenderLoopFrame, time_rendered,
never executed: time_rendered = qsg_render_timer.nsecsElapsed();
never executed: end of block
never executed: (void)0;
QSG_LOG_TIME_R...DebugEnabled()Description
TRUEnever evaluated
FALSEnever evaluated
QQuickProfiler...ileSceneGraph)Description
TRUEnever evaluated
FALSEnever evaluated
0
484 QQuickProfiler::SceneGraphRenderLoopRender);-
485-
486 RLDEBUG(" - swapping");
never executed: QMessageLogger(__FILE__, 486, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - swapping");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
487 if (!d->customRenderStage || !d->customRenderStage->swap())
!d->customRenderStageDescription
TRUEnever evaluated
FALSEnever evaluated
!d->customRenderStage->swap()Description
TRUEnever evaluated
FALSEnever evaluated
0
488 m_gl->swapBuffers(window);
never executed: m_gl->swapBuffers(window);
0
489 QSG_RENDER_TIMING_SAMPLE(QQuickProfiler::SceneGraphRenderLoopFrame, time_swapped,
never executed: time_swapped = qsg_render_timer.nsecsElapsed();
never executed: end of block
never executed: (void)0;
QSG_LOG_TIME_R...DebugEnabled()Description
TRUEnever evaluated
FALSEnever evaluated
QQuickProfiler...ileSceneGraph)Description
TRUEnever evaluated
FALSEnever evaluated
0
490 QQuickProfiler::SceneGraphRenderLoopSwap);-
491-
492 RLDEBUG(" - frameDone");
never executed: QMessageLogger(__FILE__, 492, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug(" - frameDone");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
493 d->fireFrameSwapped();-
494-
495 qCDebug(QSG_LOG_TIME_RENDERLOOP()).nospace()
never executed: QMessageLogger(__FILE__, 495, __PRETTY_FUNCTION__, QSG_LOG_TIME_RENDERLOOP()().categoryName()).debug().nospace() << "Frame rendered with 'windows' renderloop in: " << (time_swapped - time_start) / 1000000 << "ms" << ", polish=" << (time_polished - time_start) / 1000000 << ", sync=" << (time_synced - time_polished) / 1000000 << ", render=" << (time_rendered - time_synced) / 1000000 << ", swap=" << (time_swapped - time_rendered) / 1000000 << " - " << window;
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
496 << "Frame rendered with 'windows' renderloop in: " << (time_swapped - time_start) / 1000000 << "ms"
never executed: QMessageLogger(__FILE__, 495, __PRETTY_FUNCTION__, QSG_LOG_TIME_RENDERLOOP()().categoryName()).debug().nospace() << "Frame rendered with 'windows' renderloop in: " << (time_swapped - time_start) / 1000000 << "ms" << ", polish=" << (time_polished - time_start) / 1000000 << ", sync=" << (time_synced - time_polished) / 1000000 << ", render=" << (time_rendered - time_synced) / 1000000 << ", swap=" << (time_swapped - time_rendered) / 1000000 << " - " << window;
0
497 << ", polish=" << (time_polished - time_start) / 1000000
never executed: QMessageLogger(__FILE__, 495, __PRETTY_FUNCTION__, QSG_LOG_TIME_RENDERLOOP()().categoryName()).debug().nospace() << "Frame rendered with 'windows' renderloop in: " << (time_swapped - time_start) / 1000000 << "ms" << ", polish=" << (time_polished - time_start) / 1000000 << ", sync=" << (time_synced - time_polished) / 1000000 << ", render=" << (time_rendered - time_synced) / 1000000 << ", swap=" << (time_swapped - time_rendered) / 1000000 << " - " << window;
0
498 << ", sync=" << (time_synced - time_polished) / 1000000
never executed: QMessageLogger(__FILE__, 495, __PRETTY_FUNCTION__, QSG_LOG_TIME_RENDERLOOP()().categoryName()).debug().nospace() << "Frame rendered with 'windows' renderloop in: " << (time_swapped - time_start) / 1000000 << "ms" << ", polish=" << (time_polished - time_start) / 1000000 << ", sync=" << (time_synced - time_polished) / 1000000 << ", render=" << (time_rendered - time_synced) / 1000000 << ", swap=" << (time_swapped - time_rendered) / 1000000 << " - " << window;
0
499 << ", render=" << (time_rendered - time_synced) / 1000000
never executed: QMessageLogger(__FILE__, 495, __PRETTY_FUNCTION__, QSG_LOG_TIME_RENDERLOOP()().categoryName()).debug().nospace() << "Frame rendered with 'windows' renderloop in: " << (time_swapped - time_start) / 1000000 << "ms" << ", polish=" << (time_polished - time_start) / 1000000 << ", sync=" << (time_synced - time_polished) / 1000000 << ", render=" << (time_rendered - time_synced) / 1000000 << ", swap=" << (time_swapped - time_rendered) / 1000000 << " - " << window;
0
500 << ", swap=" << (time_swapped - time_rendered) / 1000000
never executed: QMessageLogger(__FILE__, 495, __PRETTY_FUNCTION__, QSG_LOG_TIME_RENDERLOOP()().categoryName()).debug().nospace() << "Frame rendered with 'windows' renderloop in: " << (time_swapped - time_start) / 1000000 << "ms" << ", polish=" << (time_polished - time_start) / 1000000 << ", sync=" << (time_synced - time_polished) / 1000000 << ", render=" << (time_rendered - time_synced) / 1000000 << ", swap=" << (time_swapped - time_rendered) / 1000000 << " - " << window;
0
501 << " - " << window;
never executed: QMessageLogger(__FILE__, 495, __PRETTY_FUNCTION__, QSG_LOG_TIME_RENDERLOOP()().categoryName()).debug().nospace() << "Frame rendered with 'windows' renderloop in: " << (time_swapped - time_start) / 1000000 << "ms" << ", polish=" << (time_polished - time_start) / 1000000 << ", sync=" << (time_synced - time_polished) / 1000000 << ", render=" << (time_rendered - time_synced) / 1000000 << ", swap=" << (time_swapped - time_rendered) / 1000000 << " - " << window;
0
502-
503 Q_QUICK_SG_PROFILE_REPORT(QQuickProfiler::SceneGraphRenderLoopFrame,
never executed: end of block
never executed: (void)0 ;
QQuickProfiler...ileSceneGraph)Description
TRUEnever evaluated
FALSEnever evaluated
0
504 QQuickProfiler::SceneGraphRenderLoopSwap);
never executed: (void)0 ;
0
505}-
506-
507void QSGWindowsRenderLoop::releaseResources(QQuickWindow *w)-
508{-
509 // No full invalidation of the rendercontext, just clear some caches.-
510 RLDEBUG("releaseResources");
never executed: QMessageLogger(__FILE__, 510, __PRETTY_FUNCTION__, QSG_LOG_RENDERLOOP().categoryName()).debug("releaseResources");
qt_category_enabledDescription
TRUEnever evaluated
FALSEnever evaluated
0
511 QQuickWindowPrivate *d = QQuickWindowPrivate::get(w);-
512 if (d->renderer)
d->rendererDescription
TRUEnever evaluated
FALSEnever evaluated
0
513 d->renderer->releaseCachedResources();
never executed: d->renderer->releaseCachedResources();
0
514}
never executed: end of block
0
515-
516QT_END_NAMESPACE-
517-
518#include "moc_qsgwindowsrenderloop_p.cpp"-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.0