SF: Restructure OutputLayer creation to remove displayId argument
The existing code was explicitly passing the displayId when creating an
OutputLayer, so that a HWC2::Layer could be created if applicable.
This patch makes a quick adjustment to the code so that the
compositionengine::Display instance overrides the base createOutputLayer
logic to create the HWC2::Layer, as it knows the displayId itself.
This is a minor cleanup prior to moving computeVisibleLayers to the
Output class.
Test: atest libsurfaceflinger_unittest libcompositionengine_test
Test: go/wm-smoke
Bug: 121291683
Change-Id: Ic7224ba445084b833b8c344436397372b2153d42
diff --git a/services/surfaceflinger/CompositionEngine/src/Display.cpp b/services/surfaceflinger/CompositionEngine/src/Display.cpp
index 000a294..49727df 100644
--- a/services/surfaceflinger/CompositionEngine/src/Display.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/Display.cpp
@@ -19,6 +19,7 @@
#include <compositionengine/CompositionRefreshArgs.h>
#include <compositionengine/DisplayCreationArgs.h>
#include <compositionengine/DisplaySurface.h>
+#include <compositionengine/LayerFE.h>
#include <compositionengine/impl/Display.h>
#include <compositionengine/impl/DisplayColorProfile.h>
#include <compositionengine/impl/DumpHelpers.h>
@@ -133,6 +134,30 @@
std::move(args)));
}
+std::unique_ptr<compositionengine::OutputLayer> Display::createOutputLayer(
+ const std::shared_ptr<compositionengine::Layer>& layer,
+ const sp<compositionengine::LayerFE>& layerFE) const {
+ auto result = Output::createOutputLayer(layer, layerFE);
+
+ if (result && mId) {
+ auto& hwc = getCompositionEngine().getHwComposer();
+ auto displayId = *mId;
+ // Note: For the moment we ensure it is safe to take a reference to the
+ // HWComposer implementation by destroying all the OutputLayers (and
+ // hence the HWC2::Layers they own) before setting a new HWComposer. See
+ // for example SurfaceFlinger::updateVrFlinger().
+ // TODO(b/121291683): Make this safer.
+ auto hwcLayer = std::shared_ptr<HWC2::Layer>(hwc.createLayer(displayId),
+ [&hwc, displayId](HWC2::Layer* layer) {
+ hwc.destroyLayer(displayId, layer);
+ });
+ ALOGE_IF(!hwcLayer, "Failed to create a HWC layer for a HWC supported display %s",
+ getName().c_str());
+ result->setHwcLayer(std::move(hwcLayer));
+ }
+ return result;
+}
+
void Display::chooseCompositionStrategy() {
ATRACE_CALL();
ALOGV(__FUNCTION__);
diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp
index 4dfdeba..cb04e95 100644
--- a/services/surfaceflinger/CompositionEngine/src/Output.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp
@@ -230,14 +230,20 @@
}
std::unique_ptr<compositionengine::OutputLayer> Output::getOrCreateOutputLayer(
- std::optional<DisplayId> displayId, std::shared_ptr<compositionengine::Layer> layer,
- sp<compositionengine::LayerFE> layerFE) {
+ std::shared_ptr<compositionengine::Layer> layer, sp<compositionengine::LayerFE> layerFE) {
for (auto& outputLayer : mOutputLayersOrderedByZ) {
if (outputLayer && &outputLayer->getLayer() == layer.get()) {
return std::move(outputLayer);
}
}
- return createOutputLayer(mCompositionEngine, displayId, *this, layer, layerFE);
+
+ return createOutputLayer(layer, layerFE);
+}
+
+std::unique_ptr<compositionengine::OutputLayer> Output::createOutputLayer(
+ const std::shared_ptr<compositionengine::Layer>& layer,
+ const sp<compositionengine::LayerFE>& layerFE) const {
+ return impl::createOutputLayer(*this, layer, layerFE);
}
void Output::setOutputLayersOrderedByZ(OutputLayers&& layers) {
diff --git a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
index 3a0ebf8..4eb256f 100644
--- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
+++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp
@@ -15,7 +15,6 @@
*/
#include <android-base/stringprintf.h>
-#include <compositionengine/CompositionEngine.h>
#include <compositionengine/DisplayColorProfile.h>
#include <compositionengine/Layer.h>
#include <compositionengine/LayerFE.h>
@@ -46,31 +45,24 @@
} // namespace
std::unique_ptr<compositionengine::OutputLayer> createOutputLayer(
- const CompositionEngine& compositionEngine, std::optional<DisplayId> displayId,
- const compositionengine::Output& output, std::shared_ptr<compositionengine::Layer> layer,
- sp<compositionengine::LayerFE> layerFE) {
- auto result = std::make_unique<OutputLayer>(output, layer, layerFE);
- result->initialize(compositionEngine, displayId);
- return result;
+ const compositionengine::Output& output,
+ const std::shared_ptr<compositionengine::Layer>& layer,
+ const sp<compositionengine::LayerFE>& layerFE) {
+ return std::make_unique<OutputLayer>(output, layer, layerFE);
}
-OutputLayer::OutputLayer(const Output& output, std::shared_ptr<Layer> layer, sp<LayerFE> layerFE)
+OutputLayer::OutputLayer(const Output& output, const std::shared_ptr<Layer>& layer,
+ const sp<LayerFE>& layerFE)
: mOutput(output), mLayer(layer), mLayerFE(layerFE) {}
OutputLayer::~OutputLayer() = default;
-void OutputLayer::initialize(const CompositionEngine& compositionEngine,
- std::optional<DisplayId> displayId) {
- if (!displayId) {
- return;
+void OutputLayer::setHwcLayer(std::shared_ptr<HWC2::Layer> hwcLayer) {
+ if (hwcLayer) {
+ mState.hwc.emplace(hwcLayer);
+ } else {
+ mState.hwc.reset();
}
-
- auto& hwc = compositionEngine.getHwComposer();
-
- mState.hwc.emplace(std::shared_ptr<HWC2::Layer>(hwc.createLayer(*displayId),
- [&hwc, displayId](HWC2::Layer* layer) {
- hwc.destroyLayer(*displayId, layer);
- }));
}
const compositionengine::Output& OutputLayer::getOutput() const {