136 QQuickWindowPrivate *cd = QQuickWindowPrivate::get(window);
137 if (!cd->isRenderable() || !m_windows.contains(window))
140 Q_TRACE_SCOPE(QSG_renderWindow);
142 WindowData &data =
const_cast<WindowData &>(m_windows[window]);
145 vg =
new QOpenVGContext(window);
149 cd->context->initialize(¶ms);
158 cd->deliveryAgentPrivate()->flushFrameSynchronousEvents(window);
160 if (!m_windows.contains(window))
163 QElapsedTimer renderTimer;
164 qint64 renderTime = 0, syncTime = 0, polishTime = 0;
165 bool profileFrames = QSG_OPENVG_LOG_TIME_RENDERLOOP().isDebugEnabled();
168 Q_QUICK_SG_PROFILE_START(QQuickProfiler::SceneGraphPolishFrame);
169 Q_TRACE(QSG_polishItems_entry);
174 polishTime = renderTimer.nsecsElapsed();
175 Q_TRACE(QSG_polishItems_exit);
176 Q_QUICK_SG_PROFILE_SWITCH(QQuickProfiler::SceneGraphPolishFrame,
177 QQuickProfiler::SceneGraphRenderLoopFrame,
178 QQuickProfiler::SceneGraphPolishPolish);
179 Q_TRACE(QSG_sync_entry);
181 emit window->afterAnimating();
183 cd->syncSceneGraph();
187 syncTime = renderTimer.nsecsElapsed();
188 Q_TRACE(QSG_sync_exit);
189 Q_QUICK_SG_PROFILE_RECORD(QQuickProfiler::SceneGraphRenderLoopFrame,
190 QQuickProfiler::SceneGraphRenderLoopSync);
191 Q_TRACE(QSG_render_entry);
194 vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
196 vgTranslate(0.0f, window->size().height());
199 cd->renderSceneGraph();
202 renderTime = renderTimer.nsecsElapsed();
203 Q_TRACE(QSG_render_exit);
204 Q_QUICK_SG_PROFILE_RECORD(QQuickProfiler::SceneGraphRenderLoopFrame,
205 QQuickProfiler::SceneGraphRenderLoopRender);
206 Q_TRACE(QSG_swap_entry);
209 grabContent = vg->readFramebuffer(window->size() * window->effectiveDevicePixelRatio());
213 if (alsoSwap && window->isVisible()) {
215 cd->fireFrameSwapped();
220 swapTime = renderTimer.nsecsElapsed();
221 Q_TRACE(QSG_swap_exit);
222 Q_QUICK_SG_PROFILE_END(QQuickProfiler::SceneGraphRenderLoopFrame,
223 QQuickProfiler::SceneGraphRenderLoopSwap);
225 if (QSG_OPENVG_LOG_TIME_RENDERLOOP().isDebugEnabled()) {
226 static QTime lastFrameTime = QTime::currentTime();
227 qCDebug(QSG_OPENVG_LOG_TIME_RENDERLOOP,
228 "Frame rendered with 'basic' renderloop in %dms, polish=%d, sync=%d, render=%d, swap=%d, frameDelta=%d",
229 int(swapTime / 1000000),
230 int(polishTime / 1000000),
231 int((syncTime - polishTime) / 1000000),
232 int((renderTime - syncTime) / 1000000),
233 int((swapTime - renderTime) / 10000000),
234 int(lastFrameTime.msecsTo(QTime::currentTime())));
235 lastFrameTime = QTime::currentTime();
239 if (data.updatePending)