diff options
author | 2022-04-25 20:26:30 +0000 | |
---|---|---|
committer | 2022-04-25 20:26:30 +0000 | |
commit | f18ac6cac6c38bfaf02068fe167d3936c70469bf (patch) | |
tree | 0fa79ef4c9910d19cf16698191781ac6b4deaf48 | |
parent | a7b691bfde0aa66e485ab6fbacb99ca862a65632 (diff) | |
parent | 30fd9b9919ae4fbf32d5820c615039dc1a2881d3 (diff) |
Merge "Send transaction callbacks even when no BSL" into tm-dev
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 12 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 4 | ||||
-rw-r--r-- | services/surfaceflinger/tests/LayerCallback_test.cpp | 121 |
3 files changed, 119 insertions, 18 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index d8a5601b8a..3a92ca49a2 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -2664,6 +2664,18 @@ void Layer::cloneDrawingState(const Layer* from) { mDrawingState.callbackHandles = {}; } +bool Layer::setTransactionCompletedListeners(const std::vector<sp<CallbackHandle>>& handles) { + if (handles.empty()) { + return false; + } + + for (const auto& handle : handles) { + mFlinger->getTransactionCallbackInvoker().registerUnpresentedCallbackHandle(handle); + } + + return true; +} + // --------------------------------------------------------------------------- std::ostream& operator<<(std::ostream& stream, const Layer::FrameRate& rate) { diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 565a6ff726..ecea74413c 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -431,9 +431,7 @@ public: virtual bool setApi(int32_t /*api*/) { return false; }; virtual bool setSidebandStream(const sp<NativeHandle>& /*sidebandStream*/) { return false; }; virtual bool setTransactionCompletedListeners( - const std::vector<sp<CallbackHandle>>& /*handles*/) { - return false; - }; + const std::vector<sp<CallbackHandle>>& /*handles*/); virtual bool addFrameEvent(const sp<Fence>& /*acquireFence*/, nsecs_t /*postedTime*/, nsecs_t /*requestedPresentTime*/) { return false; diff --git a/services/surfaceflinger/tests/LayerCallback_test.cpp b/services/surfaceflinger/tests/LayerCallback_test.cpp index 8a2305b365..219db8c148 100644 --- a/services/surfaceflinger/tests/LayerCallback_test.cpp +++ b/services/surfaceflinger/tests/LayerCallback_test.cpp @@ -55,24 +55,34 @@ public: return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState); } + static int fillBuffer(Transaction& transaction, const sp<SurfaceControl>& layer, + bool setBuffer = true, bool setBackgroundColor = false) { + sp<GraphicBuffer> buffer; + sp<Fence> fence; + if (setBuffer) { + int err = getBuffer(&buffer, &fence); + if (err != NO_ERROR) { + return err; + } + + transaction.setBuffer(layer, buffer, fence); + } + + if (setBackgroundColor) { + transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f, + ui::Dataspace::UNKNOWN); + } + + return NO_ERROR; + } + static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper, const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true, bool setBackgroundColor = false) { if (layer) { - sp<GraphicBuffer> buffer; - sp<Fence> fence; - if (setBuffer) { - int err = getBuffer(&buffer, &fence); - if (err != NO_ERROR) { - return err; - } - - transaction.setBuffer(layer, buffer, fence); - } - - if (setBackgroundColor) { - transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f, - ui::Dataspace::UNKNOWN); + int err = fillBuffer(transaction, layer, setBuffer, setBackgroundColor); + if (err != NO_ERROR) { + return err; } } @@ -1115,7 +1125,7 @@ TEST_F(LayerCallbackTest, CommitCallbackOffscreenLayer) { Transaction transaction; CallbackHelper callback; int err = fillTransaction(transaction, &callback, layer, true); - err |= fillTransaction(transaction, &callback, offscreenLayer, true); + err |= fillBuffer(transaction, offscreenLayer); if (err) { GTEST_SUCCEED() << "test not supported"; return; @@ -1129,5 +1139,86 @@ TEST_F(LayerCallbackTest, CommitCallbackOffscreenLayer) { committedSc.insert(layer); committedSc.insert(offscreenLayer); EXPECT_NO_FATAL_FAILURE(waitForCommitCallback(callback, committedSc)); + + ExpectedResult expected; + expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer); + expected.addSurface(ExpectedResult::Transaction::PRESENTED, offscreenLayer); + EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true)); } + +TEST_F(LayerCallbackTest, TransactionCommittedCallback_BSL) { + sp<SurfaceControl> layer; + ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer()); + + Transaction transaction; + CallbackHelper callback; + int err = fillTransaction(transaction, &callback, layer, true); + if (err) { + GTEST_SUCCEED() << "test not supported"; + return; + } + transaction.addTransactionCommittedCallback(callback.function, callback.getContext()).apply(); + std::unordered_set<sp<SurfaceControl>, SCHash> committedSc; + committedSc.insert(layer); + EXPECT_NO_FATAL_FAILURE(waitForCommitCallback(callback, committedSc)); + ExpectedResult expected; + expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer); + EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true)); +} + +TEST_F(LayerCallbackTest, TransactionCommittedCallback_EffectLayer) { + sp<SurfaceControl> layer; + ASSERT_NO_FATAL_FAILURE(layer = createColorLayer("ColorLayer", Color::RED)); + + Transaction transaction; + CallbackHelper callback; + int err = fillTransaction(transaction, &callback); + if (err) { + GTEST_SUCCEED() << "test not supported"; + return; + } + transaction.addTransactionCommittedCallback(callback.function, callback.getContext()).apply(); + std::unordered_set<sp<SurfaceControl>, SCHash> committedSc; + EXPECT_NO_FATAL_FAILURE(waitForCommitCallback(callback, committedSc)); + + ExpectedResult expected; + EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true)); +} + +TEST_F(LayerCallbackTest, TransactionCommittedCallback_ContainerLayer) { + sp<SurfaceControl> layer; + ASSERT_NO_FATAL_FAILURE(layer = createLayer(mClient, "Container Layer", 0, 0, + ISurfaceComposerClient::eFXSurfaceContainer)); + + Transaction transaction; + CallbackHelper callback; + int err = fillTransaction(transaction, &callback); + if (err) { + GTEST_SUCCEED() << "test not supported"; + return; + } + transaction.addTransactionCommittedCallback(callback.function, callback.getContext()).apply(); + std::unordered_set<sp<SurfaceControl>, SCHash> committedSc; + EXPECT_NO_FATAL_FAILURE(waitForCommitCallback(callback, committedSc)); + + ExpectedResult expected; + EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true)); +} + +TEST_F(LayerCallbackTest, TransactionCommittedCallback_NoLayer) { + Transaction transaction; + CallbackHelper callback; + int err = fillTransaction(transaction, &callback); + if (err) { + GTEST_SUCCEED() << "test not supported"; + return; + } + transaction.addTransactionCommittedCallback(callback.function, callback.getContext()).apply(); + std::unordered_set<sp<SurfaceControl>, SCHash> committedSc; + EXPECT_NO_FATAL_FAILURE(waitForCommitCallback(callback, committedSc)); + + ExpectedResult expected; + EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true)); +} + } // namespace android |