+ AddPerformanceMarker(PerformanceInterface::RENDER_START);
+
+ // Upload shared resources
+ mCore.PreRender(renderStatus, mForceClear, mUploadWithoutRendering);
+
+ if(!mUploadWithoutRendering)
+ {
+ // Go through each window
+ WindowContainer windows;
+ mAdaptorInterfaces.GetWindowContainerInterface(windows);
+
+ bool sceneSurfaceResized;
+
+ for(auto&& window : windows)
+ {
+ Dali::Integration::Scene scene = window->GetScene();
+ Dali::RenderSurfaceInterface* windowSurface = window->GetSurface();
+
+ if(scene && windowSurface)
+ {
+ Integration::RenderStatus windowRenderStatus;
+
+ // Get Surface Resized flag
+ sceneSurfaceResized = scene.IsSurfaceRectChanged();
+ windowSurface->SetIsResizing(sceneSurfaceResized);
+
+ // clear previous frame damaged render items rects, buffer history is tracked on surface level
+ mDamagedRects.clear();
+
+ // Collect damage rects
+ mCore.PreRender(scene, mDamagedRects);
+
+ // Render off-screen frame buffers first if any
+ mCore.RenderScene(windowRenderStatus, scene, true);
+
+ Rect<int> clippingRect; // Empty for fbo rendering
+
+ // Switch to the context of the surface, merge damaged areas for previous frames
+ windowSurface->PreRender(sceneSurfaceResized, mDamagedRects, clippingRect); // Switch GL context
+
+ // Render the surface
+ mCore.RenderScene(windowRenderStatus, scene, false, clippingRect);
+
+ // Buffer swapping now happens when the surface render target is presented.
+
+ // If surface is resized, the surface resized count is decreased.
+ if(DALI_UNLIKELY(sceneSurfaceResized))
+ {
+ SurfaceResized();
+ }
+ }
+ }
+ }
+
+ if(!mUploadWithoutRendering)
+ {
+ graphics.PostRender();
+ }
+
+ mCore.PostRender(mUploadWithoutRendering);