diff options
author | 2022-03-04 16:03:37 -0500 | |
---|---|---|
committer | 2022-03-04 17:07:23 -0500 | |
commit | bb40968256540c3b892bb9b4385dca655929bb2c (patch) | |
tree | 432f3dd39dc9603582812cc9e8ae5db0e9fdb494 | |
parent | 37ac7569c60dd6d62100aa27a90f1293307a8e1c (diff) |
Avoid caching EGL_SINGLE_BUFFER layers
Bug: 217776226
Test: pendemo test app updates
Change-Id: I6dde657aac1e260b5479d34120e6ca360e2616be
4 files changed, 34 insertions, 1 deletions
diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index 18a6baeffe..0aca24ae70 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -311,6 +311,7 @@ void BufferLayer::preparePerFrameCompositionState() { ? 0 : mBufferInfo.mBufferSlot; compositionState->acquireFence = mBufferInfo.mFence; + compositionState->frameNumber = mBufferInfo.mFrameNumber; compositionState->sidebandStreamHasFrame = false; } diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h index 8bf7f8fbfa..283fe86f43 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h @@ -166,6 +166,7 @@ struct LayerFECompositionState { int bufferSlot{BufferQueue::INVALID_BUFFER_SLOT}; sp<Fence> acquireFence = Fence::NO_FENCE; Region surfaceDamage; + uint64_t frameNumber = 0; // The handle to use for a sideband stream for this layer sp<NativeHandle> sidebandStream; diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h index 14324de7ce..5fe9476a20 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h @@ -405,6 +405,12 @@ private: : nullptr)}; }}; + // Even if the same buffer is passed to BLAST's setBuffer(), we still increment the frame + // number and need to treat it as if the buffer changed. Otherwise we break existing + // front-buffer rendering paths (such as egl's EGL_SINGLE_BUFFER). + OutputLayerState<uint64_t, LayerStateField::Buffer> mFrameNumber{ + [](auto layer) { return layer->getLayerFE().getCompositionState()->frameNumber; }}; + int64_t mFramesSinceBufferUpdate = 0; OutputLayerState<half4, LayerStateField::SolidColor> @@ -453,7 +459,7 @@ private: return hash; }}; - static const constexpr size_t kNumNonUniqueFields = 16; + static const constexpr size_t kNumNonUniqueFields = 17; std::array<StateInterface*, kNumNonUniqueFields> getNonUniqueFields() { std::array<const StateInterface*, kNumNonUniqueFields> constFields = @@ -472,6 +478,7 @@ private: &mAlpha, &mLayerMetadata, &mVisibleRegion, &mOutputDataspace, &mPixelFormat, &mColorTransform, &mCompositionType, &mSidebandStream, &mBuffer, &mSolidColor, &mBackgroundBlurRadius, &mBlurRegions, + &mFrameNumber, }; } }; diff --git a/services/surfaceflinger/CompositionEngine/tests/planner/LayerStateTest.cpp b/services/surfaceflinger/CompositionEngine/tests/planner/LayerStateTest.cpp index 0b1c2626a1..ae52ba21d7 100644 --- a/services/surfaceflinger/CompositionEngine/tests/planner/LayerStateTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/planner/LayerStateTest.cpp @@ -359,6 +359,30 @@ TEST_F(LayerStateTest, updateBuffer) { EXPECT_EQ(Flags<LayerStateField>(LayerStateField::Buffer), updates); } +TEST_F(LayerStateTest, updateBufferSingleBufferedLegacy) { + OutputLayerCompositionState outputLayerCompositionState; + LayerFECompositionState layerFECompositionState; + layerFECompositionState.buffer = new GraphicBuffer(); + setupMocksForLayer(mOutputLayer, *mLayerFE, outputLayerCompositionState, + layerFECompositionState); + mLayerState = std::make_unique<LayerState>(&mOutputLayer); + + mock::OutputLayer newOutputLayer; + sp<mock::LayerFE> newLayerFE = sp<mock::LayerFE>::make(); + LayerFECompositionState layerFECompositionStateTwo; + layerFECompositionStateTwo.buffer = new GraphicBuffer(); + setupMocksForLayer(newOutputLayer, *newLayerFE, outputLayerCompositionState, + layerFECompositionStateTwo); + + for (uint64_t i = 0; i < 10; i++) { + layerFECompositionStateTwo.frameNumber = i; + setupMocksForLayer(newOutputLayer, *newLayerFE, outputLayerCompositionState, + layerFECompositionStateTwo); + Flags<LayerStateField> updates = mLayerState->update(&newOutputLayer); + EXPECT_EQ(Flags<LayerStateField>(LayerStateField::Buffer), updates); + } +} + TEST_F(LayerStateTest, compareBuffer) { OutputLayerCompositionState outputLayerCompositionState; LayerFECompositionState layerFECompositionState; |