78 QQuickWindowPrivate *cd = QQuickWindowPrivate::get(window);
79 if (!m_windows.contains(window))
82 WindowData &data =
const_cast<WindowData &>(m_windows[window]);
85 if (!data
.grabOnly && !cd->isRenderable())
89 if (m_backingStores[window]->size() != window->size()) {
90 m_backingStores[window]->resize(window->size());
94 QSGSoftwareRenderContext *ctx =
static_cast<QSGSoftwareRenderContext*>(cd->context);
95 ctx->initializeIfNeeded();
101 cd->deliveryAgentPrivate()->flushFrameSynchronousEvents(window);
103 if (!m_windows.contains(window))
107 Q_TRACE_SCOPE(QSG_renderWindow)
108 QElapsedTimer renderTimer;
109 qint64 renderTime = 0, syncTime = 0, polishTime = 0;
110 bool profileFrames = QSG_RASTER_LOG_TIME_RENDERLOOP().isDebugEnabled();
113 Q_QUICK_SG_PROFILE_START(QQuickProfiler::SceneGraphPolishFrame);
114 Q_TRACE(QSG_polishItems_entry);
119 polishTime = renderTimer.nsecsElapsed();
120 Q_TRACE(QSG_polishItems_exit);
121 Q_QUICK_SG_PROFILE_SWITCH(QQuickProfiler::SceneGraphPolishFrame,
122 QQuickProfiler::SceneGraphRenderLoopFrame,
123 QQuickProfiler::SceneGraphPolishPolish);
124 Q_TRACE(QSG_sync_entry);
126 emit window->afterAnimating();
128 emit window->beforeFrameBegin();
130 cd->syncSceneGraph();
134 syncTime = renderTimer.nsecsElapsed();
135 Q_TRACE(QSG_sync_exit);
136 Q_QUICK_SG_PROFILE_RECORD(QQuickProfiler::SceneGraphRenderLoopFrame,
137 QQuickProfiler::SceneGraphRenderLoopSync);
138 Q_TRACE(QSG_render_entry);
141 auto softwareRenderer =
static_cast<QSGSoftwareRenderer*>(cd->renderer);
142 if (softwareRenderer)
143 softwareRenderer->setBackingStore(m_backingStores[window]);
145 cd->renderSceneGraph();
148 renderTime = renderTimer.nsecsElapsed();
149 Q_TRACE(QSG_render_exit);
150 Q_QUICK_SG_PROFILE_RECORD(QQuickProfiler::SceneGraphRenderLoopFrame,
151 QQuickProfiler::SceneGraphRenderLoopRender);
152 Q_TRACE(QSG_swap_entry);
155 grabContent = m_backingStores[window]->handle()->toImage();
159 if (alsoSwap && window->isVisible()) {
162 m_backingStores[window]->flush(softwareRenderer->flushRegion());
164 m_backingStores[window]->flush(QRegion(QRect(QPoint(0,0), window->size())));
165 cd->fireFrameSwapped();
168 emit window->afterFrameEnd();
172 swapTime = renderTimer.nsecsElapsed();
173 Q_TRACE(QSG_swap_exit);
174 Q_QUICK_SG_PROFILE_END(QQuickProfiler::SceneGraphRenderLoopFrame,
175 QQuickProfiler::SceneGraphRenderLoopSwap);
177 if (QSG_RASTER_LOG_TIME_RENDERLOOP().isDebugEnabled()) {
178 static QTime lastFrameTime = QTime::currentTime();
179 qCDebug(QSG_RASTER_LOG_TIME_RENDERLOOP,
180 "Frame rendered with 'software' renderloop in %dms, polish=%d, sync=%d, render=%d, swap=%d, frameDelta=%d",
181 int(swapTime / 1000000),
182 int(polishTime / 1000000),
183 int((syncTime - polishTime) / 1000000),
184 int((renderTime - syncTime) / 1000000),
185 int((swapTime - renderTime) / 1000000),
186 int(lastFrameTime.msecsTo(QTime::currentTime())));
187 lastFrameTime = QTime::currentTime();
191 if (data.updatePending)