SF: Fix lifecycle of LayerBE
Use shared_ptr to make sure that the LayerBE object pointed to
by CompositionInfo is not destroyed prior to BE processing
of CompositionInfo structure
Bug: 112259502
Test: cts -m CtsViewTestCases
SurfaceFlinger_test
vrflinger_test
Change-Id: Iac647ed3fdc8d41a8c0e00930e89734d0a84eb14
diff --git a/services/surfaceflinger/LayerBE.cpp b/services/surfaceflinger/LayerBE.cpp
index eea4ebd..b936b3f 100644
--- a/services/surfaceflinger/LayerBE.cpp
+++ b/services/surfaceflinger/LayerBE.cpp
@@ -26,10 +26,17 @@
LayerBE::LayerBE(Layer* layer, std::string layerName)
: mLayer(layer),
mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2) {
- compositionInfo.layer = this;
+ compositionInfo.layer = std::make_shared<LayerBE>(*this);
compositionInfo.layerName = layerName;
}
+LayerBE::LayerBE(const LayerBE& layer)
+ : mLayer(layer.mLayer),
+ mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2) {
+ compositionInfo.layer = layer.compositionInfo.layer;
+ compositionInfo.layerName = layer.mLayer->getName().string();
+}
+
void LayerBE::onLayerDisplayed(const sp<Fence>& releaseFence) {
mLayer->onLayerDisplayed(releaseFence);
}
diff --git a/services/surfaceflinger/LayerBE.h b/services/surfaceflinger/LayerBE.h
index 14af380..5ebc096 100644
--- a/services/surfaceflinger/LayerBE.h
+++ b/services/surfaceflinger/LayerBE.h
@@ -37,7 +37,7 @@
HWC2::Composition compositionType;
sp<GraphicBuffer> mBuffer = nullptr;
int mBufferSlot = BufferQueue::INVALID_BUFFER_SLOT;
- LayerBE* layer = nullptr;
+ std::shared_ptr<LayerBE> layer;
struct {
std::shared_ptr<HWC2::Layer> hwcLayer;
sp<Fence> fence;
@@ -83,6 +83,7 @@
friend class SurfaceFlinger;
LayerBE(Layer* layer, std::string layerName);
+ explicit LayerBE(const LayerBE& layer);
void onLayerDisplayed(const sp<Fence>& releaseFence);
Mesh& getMesh() { return mMesh; }