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/include/compositionengine/CompositionEngine.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionEngine.h
index 298aff5..a8e05cb 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionEngine.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/CompositionEngine.h
@@ -58,6 +58,9 @@
     virtual bool needsAnotherUpdate() const = 0;
     virtual nsecs_t getLastFrameRefreshTimestamp() const = 0;
 
+    // Presents the indicated outputs
+    virtual void present(CompositionRefreshArgs&) = 0;
+
     // Updates the cursor position for the indicated outputs.
     virtual void updateCursorAsync(CompositionRefreshArgs&) = 0;
 
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h
index 82cde4b..e71e972 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h
@@ -159,34 +159,22 @@
     // Takes (moves) the set of layers being released this frame.
     virtual ReleasedLayers takeReleasedLayers() = 0;
 
+    // Presents the output, finalizing all composition details
+    virtual void present(const compositionengine::CompositionRefreshArgs&) = 0;
+
     // Updates the color mode used on this output
     virtual void updateColorProfile(const CompositionRefreshArgs&) = 0;
 
-    // Signals that a frame is beginning on the output
-    virtual void beginFrame() = 0;
-
-    // Prepares a frame for display
-    virtual void prepareFrame() = 0;
-
-    // Performs any debug related screen flashing due to the update
-    virtual void devOptRepaintFlash(const CompositionRefreshArgs&) = 0;
-
-    // Finishes the current frame on the output, performing client composition
-    // and ensuring the content is displayed.
-    virtual void finishFrame(const CompositionRefreshArgs&) = 0;
-
-    // Performs client composition as needed for layers on the output. The
-    // output fence is set to a fence to signal when client composition is
-    // finished.
-    // Returns std::nullopt if client composition cannot be performed.
-    virtual std::optional<base::unique_fd> composeSurfaces(const Region&) = 0;
-
-    // Posts the new frame, and sets release fences.
-    virtual void postFramebuffer() = 0;
-
 protected:
     virtual void setDisplayColorProfile(std::unique_ptr<DisplayColorProfile>) = 0;
     virtual void setRenderSurface(std::unique_ptr<RenderSurface>) = 0;
+
+    virtual void beginFrame() = 0;
+    virtual void prepareFrame() = 0;
+    virtual void devOptRepaintFlash(const compositionengine::CompositionRefreshArgs&) = 0;
+    virtual void finishFrame(const compositionengine::CompositionRefreshArgs&) = 0;
+    virtual std::optional<base::unique_fd> composeSurfaces(const Region&) = 0;
+    virtual void postFramebuffer() = 0;
     virtual void chooseCompositionStrategy() = 0;
     virtual bool getSkipColorTransform() const = 0;
     virtual FrameFences presentAndGetFrameFences() = 0;
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/CompositionEngine.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/CompositionEngine.h
index 982a376..d476b85 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/CompositionEngine.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/CompositionEngine.h
@@ -39,6 +39,8 @@
     bool needsAnotherUpdate() const override;
     nsecs_t getLastFrameRefreshTimestamp() const override;
 
+    void present(CompositionRefreshArgs&) override;
+
     void updateCursorAsync(CompositionRefreshArgs&) override;
 
     void preComposition(CompositionRefreshArgs&) override;
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h
index 904edc7..22bad24 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h
@@ -75,6 +75,8 @@
     void setReleasedLayers(ReleasedLayers&&) override;
     ReleasedLayers takeReleasedLayers() override;
 
+    void present(const compositionengine::CompositionRefreshArgs&) override;
+
     void updateColorProfile(const compositionengine::CompositionRefreshArgs&) override;
 
     void beginFrame() override;
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/CompositionEngine.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/CompositionEngine.h
index 6450b22..5a5c36a 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/CompositionEngine.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/CompositionEngine.h
@@ -44,6 +44,7 @@
     MOCK_CONST_METHOD0(needsAnotherUpdate, bool());
     MOCK_CONST_METHOD0(getLastFrameRefreshTimestamp, nsecs_t());
 
+    MOCK_METHOD1(present, void(CompositionRefreshArgs&));
     MOCK_METHOD1(updateCursorAsync, void(CompositionRefreshArgs&));
     MOCK_METHOD1(preComposition, void(CompositionRefreshArgs&));
 };
diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h
index 44cd5e9..feca929 100644
--- a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h
+++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h
@@ -74,9 +74,12 @@
     MOCK_METHOD1(setReleasedLayers, void(ReleasedLayers&&));
     MOCK_METHOD0(takeReleasedLayers, ReleasedLayers());
 
+    MOCK_METHOD1(present, void(const compositionengine::CompositionRefreshArgs&));
+
     MOCK_METHOD1(updateColorProfile, void(const compositionengine::CompositionRefreshArgs&));
 
     MOCK_METHOD0(beginFrame, void());
+
     MOCK_METHOD0(prepareFrame, void());
     MOCK_METHOD0(chooseCompositionStrategy, void());
 
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));
 }
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 8760bb0..e0d1609 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -1802,14 +1802,7 @@
     mCompositionEngine->preComposition(refreshArgs);
     rebuildLayerStacks();
     calculateWorkingSet(refreshArgs);
-    for (const auto& [token, displayDevice] : mDisplays) {
-        auto display = displayDevice->getCompositionDisplay();
-        display->beginFrame();
-        display->prepareFrame();
-        display->devOptRepaintFlash(refreshArgs);
-        display->finishFrame(refreshArgs);
-        display->postFramebuffer();
-    }
+    mCompositionEngine->present(refreshArgs);
 
     postFrame();
     postComposition();