SF: Move/refactor presentation loop to CompositionEngine

This introduces CompositionEngine::present(), which will be the entry
point for performing all composition related work.

Test: atest libsurfaceflinger_unittest libcompositionengine_test
Bug: 121291683
Change-Id: I5980da7fd471ad0920f6737698c214ed5ee07c60
diff --git a/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp b/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp
index 8bc3a34..6ed50aa 100644
--- a/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp
@@ -71,6 +71,12 @@
     return mRefreshStartTime;
 }
 
+void CompositionEngine::present(CompositionRefreshArgs& args) {
+    for (const auto& output : args.outputs) {
+        output->present(args);
+    }
+}
+
 void CompositionEngine::updateCursorAsync(CompositionRefreshArgs& args) {
     std::unordered_map<compositionengine::LayerFE*, compositionengine::LayerFECompositionState*>
             uniqueVisibleLayers;
diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp
index cc7e453..635e450 100644
--- a/services/surfaceflinger/CompositionEngine/src/Output.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp
@@ -260,6 +260,14 @@
     return std::move(mReleasedLayers);
 }
 
+void Output::present(const compositionengine::CompositionRefreshArgs& refreshArgs) {
+    beginFrame();
+    prepareFrame();
+    devOptRepaintFlash(refreshArgs);
+    finishFrame(refreshArgs);
+    postFramebuffer();
+}
+
 void Output::updateColorProfile(const compositionengine::CompositionRefreshArgs& refreshArgs) {
     setColorProfile(pickColorProfile(refreshArgs));
 }