Loading services/surfaceflinger/SurfaceFlinger.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -2401,8 +2401,6 @@ bool SurfaceFlinger::updateLayerSnapshots(VsyncId vsyncId, nsecs_t frameTimeNs, mLayerLifecycleManager.commitChanges(); } commitTransactions(); // enter boot animation on first buffer latch if (CC_UNLIKELY(mBootStage == BootStage::BOOTLOADER && newDataLatched)) { ALOGI("Enter boot animation"); Loading @@ -2410,6 +2408,10 @@ bool SurfaceFlinger::updateLayerSnapshots(VsyncId vsyncId, nsecs_t frameTimeNs, } } mustComposite |= (getTransactionFlags() & ~eTransactionFlushNeeded) || newDataLatched; if (mustComposite && !mLegacyFrontEndEnabled) { commitTransactions(); } return mustComposite; } Loading services/surfaceflinger/SurfaceFlinger.h +2 −0 Original line number Diff line number Diff line Loading @@ -728,8 +728,10 @@ private: compositionengine::CompositionRefreshArgs& refreshArgs, bool cursorOnly); void moveSnapshotsFromCompositionArgs(compositionengine::CompositionRefreshArgs& refreshArgs, const std::vector<std::pair<Layer*, LayerFE*>>& layers); // Return true if we must composite this frame bool updateLayerSnapshotsLegacy(VsyncId vsyncId, nsecs_t frameTimeNs, bool transactionsFlushed, bool& out) REQUIRES(kMainThreadContext); // Return true if we must composite this frame bool updateLayerSnapshots(VsyncId vsyncId, nsecs_t frameTimeNs, bool transactionsFlushed, bool& out) REQUIRES(kMainThreadContext); void updateLayerHistory(nsecs_t now); Loading services/surfaceflinger/tests/unittests/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ cc_test { "libsurfaceflinger_unittest_main.cpp", "ActiveDisplayRotationFlagsTest.cpp", "BackgroundExecutorTest.cpp", "CommitTest.cpp", "CompositionTest.cpp", "DisplayIdGeneratorTest.cpp", "DisplayTransactionTest.cpp", Loading services/surfaceflinger/tests/unittests/CommitTest.cpp 0 → 100644 +59 −0 Original line number Diff line number Diff line /* * Copyright 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #undef LOG_TAG #define LOG_TAG "CommitTest" #include <gmock/gmock.h> #include <gtest/gtest.h> #include <renderengine/mock/RenderEngine.h> #include "TestableSurfaceFlinger.h" namespace android { class CommitTest : public testing::Test { protected: CommitTest() { mFlinger.setupMockScheduler(); mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>()); mFlinger.setupRenderEngine(std::unique_ptr<renderengine::RenderEngine>(mRenderEngine)); } TestableSurfaceFlinger mFlinger; renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine(); }; namespace { TEST_F(CommitTest, noUpdatesDoesNotScheduleComposite) { bool unused; bool mustComposite = mFlinger.updateLayerSnapshots(VsyncId{1}, /*frameTimeNs=*/0, /*transactionsFlushed=*/0, unused); EXPECT_FALSE(mustComposite); } // Ensure that we handle eTransactionNeeded correctly TEST_F(CommitTest, eTransactionNeededFlagSchedulesComposite) { // update display level color matrix mFlinger.setDaltonizerType(ColorBlindnessType::Deuteranomaly); bool unused; bool mustComposite = mFlinger.updateLayerSnapshots(VsyncId{1}, /*frameTimeNs=*/0, /*transactionsFlushed=*/0, unused); EXPECT_TRUE(mustComposite); } } // namespace } // namespace android services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +9 −0 Original line number Diff line number Diff line Loading @@ -611,6 +611,15 @@ public: void releaseLegacyLayer(uint32_t sequence) { mFlinger->mLegacyLayers.erase(sequence); }; auto updateLayerHistory(nsecs_t now) { return mFlinger->updateLayerHistory(now); }; auto setDaltonizerType(ColorBlindnessType type) { mFlinger->mDaltonizer.setType(type); return mFlinger->updateColorMatrixLocked(); } auto updateLayerSnapshots(VsyncId vsyncId, nsecs_t frameTimeNs, bool transactionsFlushed, bool& out) { ftl::FakeGuard guard(kMainThreadContext); return mFlinger->updateLayerSnapshots(vsyncId, frameTimeNs, transactionsFlushed, out); } /* ------------------------------------------------------------------------ * Read-write access to private data to set up preconditions and assert * post-conditions. Loading Loading
services/surfaceflinger/SurfaceFlinger.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -2401,8 +2401,6 @@ bool SurfaceFlinger::updateLayerSnapshots(VsyncId vsyncId, nsecs_t frameTimeNs, mLayerLifecycleManager.commitChanges(); } commitTransactions(); // enter boot animation on first buffer latch if (CC_UNLIKELY(mBootStage == BootStage::BOOTLOADER && newDataLatched)) { ALOGI("Enter boot animation"); Loading @@ -2410,6 +2408,10 @@ bool SurfaceFlinger::updateLayerSnapshots(VsyncId vsyncId, nsecs_t frameTimeNs, } } mustComposite |= (getTransactionFlags() & ~eTransactionFlushNeeded) || newDataLatched; if (mustComposite && !mLegacyFrontEndEnabled) { commitTransactions(); } return mustComposite; } Loading
services/surfaceflinger/SurfaceFlinger.h +2 −0 Original line number Diff line number Diff line Loading @@ -728,8 +728,10 @@ private: compositionengine::CompositionRefreshArgs& refreshArgs, bool cursorOnly); void moveSnapshotsFromCompositionArgs(compositionengine::CompositionRefreshArgs& refreshArgs, const std::vector<std::pair<Layer*, LayerFE*>>& layers); // Return true if we must composite this frame bool updateLayerSnapshotsLegacy(VsyncId vsyncId, nsecs_t frameTimeNs, bool transactionsFlushed, bool& out) REQUIRES(kMainThreadContext); // Return true if we must composite this frame bool updateLayerSnapshots(VsyncId vsyncId, nsecs_t frameTimeNs, bool transactionsFlushed, bool& out) REQUIRES(kMainThreadContext); void updateLayerHistory(nsecs_t now); Loading
services/surfaceflinger/tests/unittests/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ cc_test { "libsurfaceflinger_unittest_main.cpp", "ActiveDisplayRotationFlagsTest.cpp", "BackgroundExecutorTest.cpp", "CommitTest.cpp", "CompositionTest.cpp", "DisplayIdGeneratorTest.cpp", "DisplayTransactionTest.cpp", Loading
services/surfaceflinger/tests/unittests/CommitTest.cpp 0 → 100644 +59 −0 Original line number Diff line number Diff line /* * Copyright 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #undef LOG_TAG #define LOG_TAG "CommitTest" #include <gmock/gmock.h> #include <gtest/gtest.h> #include <renderengine/mock/RenderEngine.h> #include "TestableSurfaceFlinger.h" namespace android { class CommitTest : public testing::Test { protected: CommitTest() { mFlinger.setupMockScheduler(); mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>()); mFlinger.setupRenderEngine(std::unique_ptr<renderengine::RenderEngine>(mRenderEngine)); } TestableSurfaceFlinger mFlinger; renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine(); }; namespace { TEST_F(CommitTest, noUpdatesDoesNotScheduleComposite) { bool unused; bool mustComposite = mFlinger.updateLayerSnapshots(VsyncId{1}, /*frameTimeNs=*/0, /*transactionsFlushed=*/0, unused); EXPECT_FALSE(mustComposite); } // Ensure that we handle eTransactionNeeded correctly TEST_F(CommitTest, eTransactionNeededFlagSchedulesComposite) { // update display level color matrix mFlinger.setDaltonizerType(ColorBlindnessType::Deuteranomaly); bool unused; bool mustComposite = mFlinger.updateLayerSnapshots(VsyncId{1}, /*frameTimeNs=*/0, /*transactionsFlushed=*/0, unused); EXPECT_TRUE(mustComposite); } } // namespace } // namespace android
services/surfaceflinger/tests/unittests/TestableSurfaceFlinger.h +9 −0 Original line number Diff line number Diff line Loading @@ -611,6 +611,15 @@ public: void releaseLegacyLayer(uint32_t sequence) { mFlinger->mLegacyLayers.erase(sequence); }; auto updateLayerHistory(nsecs_t now) { return mFlinger->updateLayerHistory(now); }; auto setDaltonizerType(ColorBlindnessType type) { mFlinger->mDaltonizer.setType(type); return mFlinger->updateColorMatrixLocked(); } auto updateLayerSnapshots(VsyncId vsyncId, nsecs_t frameTimeNs, bool transactionsFlushed, bool& out) { ftl::FakeGuard guard(kMainThreadContext); return mFlinger->updateLayerSnapshots(vsyncId, frameTimeNs, transactionsFlushed, out); } /* ------------------------------------------------------------------------ * Read-write access to private data to set up preconditions and assert * post-conditions. Loading