79 QQuickWindowPrivate *cd = QQuickWindowPrivate::get(window);
80 if (!m_windows.contains(window))
83 WindowData &data =
const_cast<WindowData &>(m_windows[window]);
86 if (!data
.grabOnly && !cd->isRenderable())
90 if (m_backingStores[window]->size() != window->size()) {
91 m_backingStores[window]->resize(window->size());
95 QSGSoftwareRenderContext *ctx =
static_cast<QSGSoftwareRenderContext*>(cd->context);
96 ctx->initializeIfNeeded();
102 cd->deliveryAgentPrivate()->flushFrameSynchronousEvents(window);
104 if (!m_windows.contains(window))
108 Q_TRACE_SCOPE(QSG_renderWindow)
109 QElapsedTimer renderTimer;
110 qint64 renderTime = 0, syncTime = 0, polishTime = 0;
111 bool profileFrames = QSG_RASTER_LOG_TIME_RENDERLOOP().isDebugEnabled();
114 Q_QUICK_SG_PROFILE_START(QQuickProfiler::SceneGraphPolishFrame);
115 Q_TRACE(QSG_polishItems_entry);
120 polishTime = renderTimer.nsecsElapsed();
121 Q_TRACE(QSG_polishItems_exit);
122 Q_QUICK_SG_PROFILE_SWITCH(QQuickProfiler::SceneGraphPolishFrame,
123 QQuickProfiler::SceneGraphRenderLoopFrame,
124 QQuickProfiler::SceneGraphPolishPolish);
125 Q_TRACE(QSG_sync_entry);
127 emit window->afterAnimating();
129 emit window->beforeFrameBegin();
131 cd->syncSceneGraph();
135 syncTime = renderTimer.nsecsElapsed();
136 Q_TRACE(QSG_sync_exit);
137 Q_QUICK_SG_PROFILE_RECORD(QQuickProfiler::SceneGraphRenderLoopFrame,
138 QQuickProfiler::SceneGraphRenderLoopSync);
139 Q_TRACE(QSG_render_entry);
142 auto softwareRenderer =
static_cast<QSGSoftwareRenderer*>(cd->renderer);
143 if (softwareRenderer)
144 softwareRenderer->setBackingStore(m_backingStores[window]);
146 cd->renderSceneGraph();
149 renderTime = renderTimer.nsecsElapsed();
150 Q_TRACE(QSG_render_exit);
151 Q_QUICK_SG_PROFILE_RECORD(QQuickProfiler::SceneGraphRenderLoopFrame,
152 QQuickProfiler::SceneGraphRenderLoopRender);
153 Q_TRACE(QSG_swap_entry);
156 grabContent = m_backingStores[window]->handle()->toImage();
160 if (alsoSwap && window->isVisible()) {
163 m_backingStores[window]->flush(softwareRenderer->flushRegion());
165 m_backingStores[window]->flush(QRegion(QRect(QPoint(0,0), window->size())));
166 cd->fireFrameSwapped();
169 emit window->afterFrameEnd();
173 swapTime = renderTimer.nsecsElapsed();
174 Q_TRACE(QSG_swap_exit);
175 Q_QUICK_SG_PROFILE_END(QQuickProfiler::SceneGraphRenderLoopFrame,
176 QQuickProfiler::SceneGraphRenderLoopSwap);
178 if (QSG_RASTER_LOG_TIME_RENDERLOOP().isDebugEnabled()) {
179 static QTime lastFrameTime = QTime::currentTime();
180 qCDebug(QSG_RASTER_LOG_TIME_RENDERLOOP,
181 "Frame rendered with 'software' renderloop in %dms, polish=%d, sync=%d, render=%d, swap=%d, frameDelta=%d",
182 int(swapTime / 1000000),
183 int(polishTime / 1000000),
184 int((syncTime - polishTime) / 1000000),
185 int((renderTime - syncTime) / 1000000),
186 int((swapTime - renderTime) / 1000000),
187 int(lastFrameTime.msecsTo(QTime::currentTime())));
188 lastFrameTime = QTime::currentTime();
192 if (data.updatePending)