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();