Loading services/surfaceflinger/BufferLayer.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -311,6 +311,7 @@ void BufferLayer::preparePerFrameCompositionState() { ? 0 : mBufferInfo.mBufferSlot; compositionState->acquireFence = mBufferInfo.mFence; compositionState->frameNumber = mBufferInfo.mFrameNumber; compositionState->sidebandStreamHasFrame = false; } Loading services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h +8 −1 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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 = Loading @@ -472,6 +478,7 @@ private: &mAlpha, &mLayerMetadata, &mVisibleRegion, &mOutputDataspace, &mPixelFormat, &mColorTransform, &mCompositionType, &mSidebandStream, &mBuffer, &mSolidColor, &mBackgroundBlurRadius, &mBlurRegions, &mFrameNumber, }; } }; Loading services/surfaceflinger/CompositionEngine/tests/planner/LayerStateTest.cpp +24 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
services/surfaceflinger/BufferLayer.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -311,6 +311,7 @@ void BufferLayer::preparePerFrameCompositionState() { ? 0 : mBufferInfo.mBufferSlot; compositionState->acquireFence = mBufferInfo.mFence; compositionState->frameNumber = mBufferInfo.mFrameNumber; compositionState->sidebandStreamHasFrame = false; } Loading
services/surfaceflinger/CompositionEngine/include/compositionengine/LayerFECompositionState.h +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
services/surfaceflinger/CompositionEngine/include/compositionengine/impl/planner/LayerState.h +8 −1 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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 = Loading @@ -472,6 +478,7 @@ private: &mAlpha, &mLayerMetadata, &mVisibleRegion, &mOutputDataspace, &mPixelFormat, &mColorTransform, &mCompositionType, &mSidebandStream, &mBuffer, &mSolidColor, &mBackgroundBlurRadius, &mBlurRegions, &mFrameNumber, }; } }; Loading
services/surfaceflinger/CompositionEngine/tests/planner/LayerStateTest.cpp +24 −0 Original line number Diff line number Diff line Loading @@ -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; Loading