From 0e1c05e6195d728aab007bc7e7a27135007c3c51 Mon Sep 17 00:00:00 2001 From: Lloyd Pique Date: Tue, 29 Jan 2019 18:42:48 -0800 Subject: SF: Refactor onPreComposition Adds LayerFE::onPreComposition call, and adjusts the existing implementation inside SurfaceFlinger to use it, in preparation to moving the loop over to CompositionEngine. Test: atest libsurfaceflinger_unittest libcompositionengine_test Bug: 121291683 Change-Id: Ibc0fb1e87d37fabba753f265e70982b5ce70f9f2 --- .../CompositionEngine/include/compositionengine/LayerFE.h | 6 ++++++ .../CompositionEngine/include/compositionengine/mock/LayerFE.h | 2 ++ services/surfaceflinger/Layer.h | 6 ------ services/surfaceflinger/SurfaceFlinger.cpp | 9 +++++++-- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h index 9f635b9a35..1f2cae9c2b 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFE.h @@ -17,6 +17,7 @@ #pragma once #include +#include namespace android { @@ -30,6 +31,11 @@ struct LayerFECompositionState; // of the front-end layer class LayerFE : public virtual RefBase { public: + // Called before composition starts. Should return true if this layer has + // pending updates which would require an extra display refresh cycle to + // process. + virtual bool onPreComposition(nsecs_t refreshStartTime) = 0; + // Latches the output-independent state. If includeGeometry is false, the // geometry state can be skipped. virtual void latchCompositionState(LayerFECompositionState&, bool includeGeometry) const = 0; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/LayerFE.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/LayerFE.h index aab18db3c9..952f702e1c 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/LayerFE.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/mock/LayerFE.h @@ -30,6 +30,8 @@ public: LayerFE(); virtual ~LayerFE(); + MOCK_METHOD1(onPreComposition, bool(nsecs_t)); + MOCK_CONST_METHOD2(latchCompositionState, void(LayerFECompositionState&, bool)); MOCK_METHOD1(onLayerDisplayed, void(const sp&)); diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index b1ce86b2dc..d5968ba11e 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -484,12 +484,6 @@ public: virtual bool shouldPresentNow(nsecs_t /*expectedPresentTime*/) const { return false; } virtual void setTransformHint(uint32_t /*orientation*/) const { } - /* - * called before composition. - * returns true if the layer has pending updates. - */ - virtual bool onPreComposition(nsecs_t refreshStartTime) = 0; - /* * called after composition. * returns true if the layer latched a new buffer this frame. diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 7230152e1a..adc19c8f81 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -1962,8 +1962,13 @@ void SurfaceFlinger::preComposition() bool needExtraInvalidate = false; mDrawingState.traverseInZOrder([&](Layer* layer) { - if (layer->onPreComposition(mRefreshStartTime)) { - needExtraInvalidate = true; + auto compositionLayer = layer->getCompositionLayer(); + if (compositionLayer) { + auto layerFE = compositionLayer->getLayerFE(); + + if (layerFE && layerFE->onPreComposition(mRefreshStartTime)) { + needExtraInvalidate = true; + } } }); -- cgit v1.2.3-59-g8ed1b