From c7ef21b0b83f6f215e81f3fd676137cfa820c162 Mon Sep 17 00:00:00 2001 From: Lloyd Pique Date: Tue, 29 Jan 2019 18:43:00 -0800 Subject: SF: Move/Refactor LayersNeedingFences Refactors the logic for handling layers that are being released by the current display refresh. This is in preparation for moving the logic over to CompositionEngine. Test: atest libsurfaceflinger_unittest libcompositionengine_test Bug: 121291683 Change-Id: I52725b1310ecb324e2c1367f0cbd2eddafacbc4a --- .../CompositionEngine/include/compositionengine/Output.h | 7 +++++++ .../include/compositionengine/impl/Output.h | 4 ++++ .../include/compositionengine/mock/Output.h | 4 ++++ services/surfaceflinger/CompositionEngine/src/Output.cpp | 8 ++++++++ services/surfaceflinger/DisplayDevice.cpp | 8 -------- services/surfaceflinger/DisplayDevice.h | 4 ---- services/surfaceflinger/SurfaceFlinger.cpp | 15 +++++++++------ 7 files changed, 32 insertions(+), 18 deletions(-) diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h index 591382dcd9..5b9e282276 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/Output.h @@ -46,6 +46,7 @@ struct OutputCompositionState; class Output { public: using OutputLayers = std::vector>; + using ReleasedLayers = std::vector>; virtual ~Output(); @@ -131,6 +132,12 @@ public: // Gets the ordered set of output layers for this output virtual const OutputLayers& getOutputLayersOrderedByZ() const = 0; + // Sets the new set of layers being released this frame. + virtual void setReleasedLayers(ReleasedLayers&&) = 0; + + // Takes (moves) the set of layers being released this frame. + virtual ReleasedLayers takeReleasedLayers() = 0; + protected: virtual void setDisplayColorProfile(std::unique_ptr) = 0; virtual void setRenderSurface(std::unique_ptr) = 0; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h index f245936744..20812d258b 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/Output.h @@ -72,6 +72,9 @@ public: void setOutputLayersOrderedByZ(OutputLayers&&) override; const OutputLayers& getOutputLayersOrderedByZ() const override; + void setReleasedLayers(ReleasedLayers&&) override; + ReleasedLayers takeReleasedLayers() override; + // Testing void setDisplayColorProfileForTest(std::unique_ptr); void setRenderSurfaceForTest(std::unique_ptr); @@ -93,6 +96,7 @@ private: std::unique_ptr mRenderSurface; OutputLayers mOutputLayersOrderedByZ; + ReleasedLayers mReleasedLayers; }; } // namespace impl diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h index cf82107194..924d72cb00 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/Output.h @@ -66,8 +66,12 @@ public: std::unique_ptr( std::optional, std::shared_ptr, sp)); + MOCK_METHOD1(setOutputLayersOrderedByZ, void(OutputLayers&&)); MOCK_CONST_METHOD0(getOutputLayersOrderedByZ, OutputLayers&()); + + MOCK_METHOD1(setReleasedLayers, void(ReleasedLayers&&)); + MOCK_METHOD0(takeReleasedLayers, ReleasedLayers()); }; } // namespace android::compositionengine::mock diff --git a/services/surfaceflinger/CompositionEngine/src/Output.cpp b/services/surfaceflinger/CompositionEngine/src/Output.cpp index 0725926be4..845e3c6500 100644 --- a/services/surfaceflinger/CompositionEngine/src/Output.cpp +++ b/services/surfaceflinger/CompositionEngine/src/Output.cpp @@ -242,6 +242,14 @@ const Output::OutputLayers& Output::getOutputLayersOrderedByZ() const { return mOutputLayersOrderedByZ; } +void Output::setReleasedLayers(Output::ReleasedLayers&& layers) { + mReleasedLayers = std::move(layers); +} + +Output::ReleasedLayers Output::takeReleasedLayers() { + return std::move(mReleasedLayers); +} + void Output::dirtyEntireOutput() { mState.dirtyRegion.set(mState.bounds); } diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index 4a13bfb7ae..d1365627cf 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -126,14 +126,6 @@ const Vector< sp >& DisplayDevice::getVisibleLayersSortedByZ() const { return mVisibleLayersSortedByZ; } -void DisplayDevice::setLayersNeedingFences(const Vector< sp >& layers) { - mLayersNeedingFences = layers; -} - -const Vector< sp >& DisplayDevice::getLayersNeedingFences() const { - return mLayersNeedingFences; -} - // ---------------------------------------------------------------------------- void DisplayDevice::setPowerMode(int mode) { mPowerMode = mode; diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index 0067b505e3..8bc19d4447 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -88,8 +88,6 @@ public: void setVisibleLayersSortedByZ(const Vector< sp >& layers); const Vector< sp >& getVisibleLayersSortedByZ() const; - void setLayersNeedingFences(const Vector< sp >& layers); - const Vector< sp >& getLayersNeedingFences() const; void setLayerStack(uint32_t stack); void setDisplaySize(const int newWidth, const int newHeight); @@ -182,8 +180,6 @@ private: // list of visible layers on that display Vector< sp > mVisibleLayersSortedByZ; - // list of layers needing fences - Vector< sp > mLayersNeedingFences; /* * Transaction state diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index adc19c8f81..7a9a9a7a7b 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2206,8 +2206,8 @@ void SurfaceFlinger::rebuildLayerStacks() { Region opaqueRegion; Region dirtyRegion; compositionengine::Output::OutputLayers layersSortedByZ; + compositionengine::Output::ReleasedLayers releasedLayers; Vector> deprecated_layersSortedByZ; - Vector> layersNeedingFences; const ui::Transform& tr = displayState.transform; const Rect bounds = displayState.bounds; if (displayState.isEnabled) { @@ -2255,16 +2255,16 @@ void SurfaceFlinger::rebuildLayerStacks() { layer) != mLayersWithQueuedFrames.cend(); if (hasExistingOutputLayer && hasQueuedFrames) { - layersNeedingFences.add(layer); + releasedLayers.push_back(layer); } } }); } display->setOutputLayersOrderedByZ(std::move(layersSortedByZ)); + display->setReleasedLayers(std::move(releasedLayers)); displayDevice->setVisibleLayersSortedByZ(deprecated_layersSortedByZ); - displayDevice->setLayersNeedingFences(layersNeedingFences); Region undefinedRegion{bounds}; undefinedRegion.subtractSelf(tr.transform(opaqueRegion)); @@ -2500,11 +2500,14 @@ void SurfaceFlinger::postFramebuffer(const sp& displayDevice) { // We've got a list of layers needing fences, that are disjoint with // display->getVisibleLayersSortedByZ. The best we can do is to // supply them with the present fence. - if (!displayDevice->getLayersNeedingFences().isEmpty()) { + auto releasedLayers = display->takeReleasedLayers(); + if (!releasedLayers.empty()) { sp presentFence = displayId ? getHwComposer().getPresentFence(*displayId) : Fence::NO_FENCE; - for (auto& layer : displayDevice->getLayersNeedingFences()) { - layer->getCompositionLayer()->getLayerFE()->onLayerDisplayed(presentFence); + for (auto& weakLayer : releasedLayers) { + if (auto layer = weakLayer.promote(); layer != nullptr) { + layer->onLayerDisplayed(presentFence); + } } } -- cgit v1.2.3-59-g8ed1b