blob: de84faa5d2e691e7a931328065cc4a3b8ed143be [file] [log] [blame]
Valerie Haud251afb2019-03-29 14:19:02 -07001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#undef LOG_TAG
18#define LOG_TAG "CompositionTest"
19
20#include <compositionengine/Display.h>
21#include <compositionengine/mock/DisplaySurface.h>
22#include <gmock/gmock.h>
23#include <gtest/gtest.h>
Vishnu Nair59f6d2d2022-10-05 16:59:56 -070024#include <gui/LayerState.h>
Valerie Haud251afb2019-03-29 14:19:02 -070025#include <gui/SurfaceComposerClient.h>
Vishnu Nair59f6d2d2022-10-05 16:59:56 -070026#include <gui/fake/BufferData.h>
Valerie Haud251afb2019-03-29 14:19:02 -070027#include <log/log.h>
ramindani4d48f902021-09-20 21:07:45 +000028#include <ui/MockFence.h>
Valerie Haud251afb2019-03-29 14:19:02 -070029#include <utils/String8.h>
Vishnu Nair59f6d2d2022-10-05 16:59:56 -070030#include <vector>
31#include <binder/Binder.h>
Dominik Laskowski068173d2021-08-11 17:22:59 -070032
Vishnu Naira61e4fb2022-10-18 18:29:37 +000033#include "FrontEnd/TransactionHandler.h"
Valerie Haud251afb2019-03-29 14:19:02 -070034#include "TestableSurfaceFlinger.h"
Valerie Haud251afb2019-03-29 14:19:02 -070035#include "mock/MockEventThread.h"
Ady Abraham8cb21882020-08-26 18:22:05 -070036#include "mock/MockVsyncController.h"
Valerie Haud251afb2019-03-29 14:19:02 -070037
38namespace android {
39
40using testing::_;
41using testing::Return;
42
43using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
Vishnu Nair1523dad2022-09-29 16:05:18 -070044constexpr nsecs_t TRANSACTION_TIMEOUT = s2ns(5);
Valerie Haud251afb2019-03-29 14:19:02 -070045class TransactionApplicationTest : public testing::Test {
46public:
47 TransactionApplicationTest() {
48 const ::testing::TestInfo* const test_info =
49 ::testing::UnitTest::GetInstance()->current_test_info();
50 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
51
Valerie Haud251afb2019-03-29 14:19:02 -070052 setupScheduler();
53 }
54
55 ~TransactionApplicationTest() {
56 const ::testing::TestInfo* const test_info =
57 ::testing::UnitTest::GetInstance()->current_test_info();
58 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
59 }
60
61 void setupScheduler() {
62 auto eventThread = std::make_unique<mock::EventThread>();
63 auto sfEventThread = std::make_unique<mock::EventThread>();
64
65 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
66 EXPECT_CALL(*eventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070067 .WillOnce(Return(sp<EventThreadConnection>::make(eventThread.get(),
68 mock::EventThread::kCallingUid,
69 ResyncCallback())));
Valerie Haud251afb2019-03-29 14:19:02 -070070
71 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
72 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070073 .WillOnce(Return(sp<EventThreadConnection>::make(sfEventThread.get(),
74 mock::EventThread::kCallingUid,
75 ResyncCallback())));
Valerie Haud251afb2019-03-29 14:19:02 -070076
Ady Abraham8cb21882020-08-26 18:22:05 -070077 EXPECT_CALL(*mVSyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
78 EXPECT_CALL(*mVSyncTracker, currentPeriod())
Marin Shalamanov045b7002021-01-07 16:56:24 +010079 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
Valerie Haud251afb2019-03-29 14:19:02 -070080
Ady Abraham3efa3942021-06-24 19:01:25 -070081 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
Ady Abraham8cb21882020-08-26 18:22:05 -070082 mFlinger.setupScheduler(std::unique_ptr<mock::VsyncController>(mVsyncController),
83 std::unique_ptr<mock::VSyncTracker>(mVSyncTracker),
Valerie Haud251afb2019-03-29 14:19:02 -070084 std::move(eventThread), std::move(sfEventThread));
Vishnu Nair59f6d2d2022-10-05 16:59:56 -070085 mFlinger.flinger()->addTransactionReadyFilters();
Valerie Haud251afb2019-03-29 14:19:02 -070086 }
87
Valerie Haud251afb2019-03-29 14:19:02 -070088 TestableSurfaceFlinger mFlinger;
89
Ady Abraham8cb21882020-08-26 18:22:05 -070090 mock::VsyncController* mVsyncController = new mock::VsyncController();
91 mock::VSyncTracker* mVSyncTracker = new mock::VSyncTracker();
Valerie Haud251afb2019-03-29 14:19:02 -070092
93 struct TransactionInfo {
94 Vector<ComposerState> states;
95 Vector<DisplayState> displays;
96 uint32_t flags = 0;
97 sp<IBinder> applyToken = IInterface::asBinder(TransactionCompletedListener::getIInstance());
98 InputWindowCommands inputWindowCommands;
Ady Abrahamf0c56492020-12-17 18:04:15 -080099 int64_t desiredPresentTime = 0;
100 bool isAutoTimestamp = true;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000101 FrameTimelineInfo frameTimelineInfo;
Valerie Haud251afb2019-03-29 14:19:02 -0700102 client_cache_t uncacheBuffer;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000103 uint64_t id = static_cast<uint64_t>(-1);
104 static_assert(0xffffffffffffffff == static_cast<uint64_t>(-1));
Valerie Haud251afb2019-03-29 14:19:02 -0700105 };
106
Vishnu Nair6b591152021-10-08 11:45:14 -0700107 void checkEqual(TransactionInfo info, TransactionState state) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000108 EXPECT_EQ(0u, info.states.size());
109 EXPECT_EQ(0u, state.states.size());
Valerie Haud251afb2019-03-29 14:19:02 -0700110
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000111 EXPECT_EQ(0u, info.displays.size());
112 EXPECT_EQ(0u, state.displays.size());
Valerie Haud251afb2019-03-29 14:19:02 -0700113 EXPECT_EQ(info.flags, state.flags);
114 EXPECT_EQ(info.desiredPresentTime, state.desiredPresentTime);
115 }
116
Patrick Williams641f7f22022-06-22 19:25:35 +0000117 void setupSingle(TransactionInfo& transaction, uint32_t flags, int64_t desiredPresentTime,
118 bool isAutoTimestamp, const FrameTimelineInfo& frameTimelineInfo) {
Valerie Haud251afb2019-03-29 14:19:02 -0700119 mTransactionNumber++;
Vishnu Nair1523dad2022-09-29 16:05:18 -0700120 transaction.flags |= flags;
Valerie Haud251afb2019-03-29 14:19:02 -0700121 transaction.desiredPresentTime = desiredPresentTime;
Ady Abrahamf0c56492020-12-17 18:04:15 -0800122 transaction.isAutoTimestamp = isAutoTimestamp;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000123 transaction.frameTimelineInfo = frameTimelineInfo;
Valerie Haud251afb2019-03-29 14:19:02 -0700124 }
125
Patrick Williams641f7f22022-06-22 19:25:35 +0000126 void NotPlacedOnTransactionQueue(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000127 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700128 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700129 TransactionInfo transaction;
Patrick Williams641f7f22022-06-22 19:25:35 +0000130 setupSingle(transaction, flags,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800131 /*desiredPresentTime*/ systemTime(), /*isAutoTimestamp*/ true,
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000132 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700133 nsecs_t applicationTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000134 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700135 transaction.displays, transaction.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700136 transaction.applyToken, transaction.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800137 transaction.desiredPresentTime, transaction.isAutoTimestamp,
138 transaction.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
139 transaction.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700140
Patrick Williams641f7f22022-06-22 19:25:35 +0000141 // If transaction is synchronous, SF applyTransactionState should time out (5s) wating for
142 // SF to commit the transaction. If this is animation, it should not time out waiting.
Valerie Haud251afb2019-03-29 14:19:02 -0700143 nsecs_t returnedTime = systemTime();
Vishnu Nair1523dad2022-09-29 16:05:18 -0700144 EXPECT_LE(returnedTime, applicationTime + TRANSACTION_TIMEOUT);
Arthur Hung58144272021-01-16 03:43:53 +0000145 // Each transaction should have been placed on the transaction queue
Vishnu Nair60d902e2022-07-20 02:55:37 +0000146 auto& transactionQueue = mFlinger.getTransactionQueue();
147 EXPECT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700148 }
149
Patrick Williams641f7f22022-06-22 19:25:35 +0000150 void PlaceOnTransactionQueue(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000151 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700152 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700153
154 // first check will see desired present time has not passed,
155 // but afterwards it will look like the desired present time has passed
156 nsecs_t time = systemTime();
Valerie Haud251afb2019-03-29 14:19:02 -0700157 TransactionInfo transaction;
Patrick Williams641f7f22022-06-22 19:25:35 +0000158 setupSingle(transaction, flags, /*desiredPresentTime*/ time + s2ns(1), false,
159 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700160 nsecs_t applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000161 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700162 transaction.displays, transaction.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700163 transaction.applyToken, transaction.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800164 transaction.desiredPresentTime, transaction.isAutoTimestamp,
165 transaction.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
166 transaction.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700167
168 nsecs_t returnedTime = systemTime();
Vishnu Nair1523dad2022-09-29 16:05:18 -0700169 EXPECT_LE(returnedTime, applicationSentTime + TRANSACTION_TIMEOUT);
Valerie Haud251afb2019-03-29 14:19:02 -0700170 // This transaction should have been placed on the transaction queue
Vishnu Nair60d902e2022-07-20 02:55:37 +0000171 auto& transactionQueue = mFlinger.getTransactionQueue();
172 EXPECT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700173 }
174
Patrick Williams641f7f22022-06-22 19:25:35 +0000175 void BlockedByPriorTransaction(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000176 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700177 nsecs_t time = systemTime();
Patrick Williams641f7f22022-06-22 19:25:35 +0000178 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(2);
179
Valerie Haud251afb2019-03-29 14:19:02 -0700180 // transaction that should go on the pending thread
181 TransactionInfo transactionA;
Patrick Williams641f7f22022-06-22 19:25:35 +0000182 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ time + s2ns(1), false,
183 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700184
185 // transaction that would not have gone on the pending thread if not
186 // blocked
187 TransactionInfo transactionB;
Patrick Williams641f7f22022-06-22 19:25:35 +0000188 setupSingle(transactionB, flags, /*desiredPresentTime*/ systemTime(),
189 /*isAutoTimestamp*/ true, FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700190
191 nsecs_t applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000192 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700193 transactionA.displays, transactionA.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700194 transactionA.applyToken, transactionA.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800195 transactionA.desiredPresentTime, transactionA.isAutoTimestamp,
196 transactionA.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
197 transactionA.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700198
199 // This thread should not have been blocked by the above transaction
200 // (5s is the timeout period that applyTransactionState waits for SF to
201 // commit the transaction)
Vishnu Nair1523dad2022-09-29 16:05:18 -0700202 EXPECT_LE(systemTime(), applicationSentTime + TRANSACTION_TIMEOUT);
Arthur Hung58144272021-01-16 03:43:53 +0000203 // transaction that would goes to pending transaciton queue.
204 mFlinger.flushTransactionQueues();
Valerie Haud251afb2019-03-29 14:19:02 -0700205
206 applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000207 mFlinger.setTransactionState(transactionB.frameTimelineInfo, transactionB.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700208 transactionB.displays, transactionB.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700209 transactionB.applyToken, transactionB.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800210 transactionB.desiredPresentTime, transactionB.isAutoTimestamp,
211 transactionB.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
212 transactionB.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700213
214 // this thread should have been blocked by the above transaction
215 // if this is an animation, this thread should be blocked for 5s
216 // in setTransactionState waiting for transactionA to flush. Otherwise,
217 // the transaction should be placed on the pending queue
Vishnu Nair1523dad2022-09-29 16:05:18 -0700218 EXPECT_LE(systemTime(), applicationSentTime + TRANSACTION_TIMEOUT);
Valerie Haud251afb2019-03-29 14:19:02 -0700219
Arthur Hung58144272021-01-16 03:43:53 +0000220 // transaction that would goes to pending transaciton queue.
221 mFlinger.flushTransactionQueues();
222
Ady Abrahame46243a2021-02-23 19:33:49 -0800223 // check that the transaction was applied.
Arthur Hung58144272021-01-16 03:43:53 +0000224 auto transactionQueue = mFlinger.getPendingTransactionQueue();
Ady Abrahame46243a2021-02-23 19:33:49 -0800225 EXPECT_EQ(0u, transactionQueue.size());
Valerie Haud251afb2019-03-29 14:19:02 -0700226 }
227
228 bool mHasListenerCallbacks = false;
229 std::vector<ListenerCallbacks> mCallbacks;
230 int mTransactionNumber = 0;
231};
232
Vishnu Nair60d902e2022-07-20 02:55:37 +0000233TEST_F(TransactionApplicationTest, AddToPendingQueue) {
234 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700235 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700236
Valerie Haud251afb2019-03-29 14:19:02 -0700237 TransactionInfo transactionA; // transaction to go on pending queue
Patrick Williams641f7f22022-06-22 19:25:35 +0000238 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ s2ns(1), false,
239 FrameTimelineInfo{});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000240 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700241 transactionA.displays, transactionA.flags, transactionA.applyToken,
242 transactionA.inputWindowCommands, transactionA.desiredPresentTime,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800243 transactionA.isAutoTimestamp, transactionA.uncacheBuffer,
244 mHasListenerCallbacks, mCallbacks, transactionA.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700245
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000246 auto& transactionQueue = mFlinger.getTransactionQueue();
Vishnu Nair60d902e2022-07-20 02:55:37 +0000247 ASSERT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700248
Vishnu Nair60d902e2022-07-20 02:55:37 +0000249 auto transactionState = transactionQueue.pop().value();
Valerie Haud251afb2019-03-29 14:19:02 -0700250 checkEqual(transactionA, transactionState);
Vishnu Nair60d902e2022-07-20 02:55:37 +0000251}
252
253TEST_F(TransactionApplicationTest, Flush_RemovesFromQueue) {
254 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
255 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
256
257 TransactionInfo transactionA; // transaction to go on pending queue
258 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ s2ns(1), false,
259 FrameTimelineInfo{});
260 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
261 transactionA.displays, transactionA.flags, transactionA.applyToken,
262 transactionA.inputWindowCommands, transactionA.desiredPresentTime,
263 transactionA.isAutoTimestamp, transactionA.uncacheBuffer,
264 mHasListenerCallbacks, mCallbacks, transactionA.id);
265
266 auto& transactionQueue = mFlinger.getTransactionQueue();
267 ASSERT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700268
269 // because flushing uses the cached expected present time, we send an empty
270 // transaction here (sending a null applyToken to fake it as from a
271 // different process) to re-query and reset the cached expected present time
272 TransactionInfo empty;
273 empty.applyToken = sp<IBinder>();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000274 mFlinger.setTransactionState(empty.frameTimelineInfo, empty.states, empty.displays, empty.flags,
275 empty.applyToken, empty.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800276 empty.desiredPresentTime, empty.isAutoTimestamp,
277 empty.uncacheBuffer, mHasListenerCallbacks, mCallbacks, empty.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700278
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000279 // flush transaction queue should flush as desiredPresentTime has
Valerie Haud251afb2019-03-29 14:19:02 -0700280 // passed
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000281 mFlinger.flushTransactionQueues();
Valerie Haud251afb2019-03-29 14:19:02 -0700282
Vishnu Nair60d902e2022-07-20 02:55:37 +0000283 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700284}
285
Valerie Haud251afb2019-03-29 14:19:02 -0700286TEST_F(TransactionApplicationTest, NotPlacedOnTransactionQueue_SyncInputWindows) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000287 NotPlacedOnTransactionQueue(/*flags*/ 0);
Valerie Haud251afb2019-03-29 14:19:02 -0700288}
289
Valerie Haud251afb2019-03-29 14:19:02 -0700290TEST_F(TransactionApplicationTest, PlaceOnTransactionQueue_SyncInputWindows) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000291 PlaceOnTransactionQueue(/*flags*/ 0);
Valerie Haud251afb2019-03-29 14:19:02 -0700292}
293
Valerie Hau09e60052019-12-15 14:51:15 -0800294TEST_F(TransactionApplicationTest, FromHandle) {
295 sp<IBinder> badHandle;
296 auto ret = mFlinger.fromHandle(badHandle);
Alec Mouri9a02eda2020-04-21 17:39:34 -0700297 EXPECT_EQ(nullptr, ret.promote().get());
Valerie Hau09e60052019-12-15 14:51:15 -0800298}
ramindani4d48f902021-09-20 21:07:45 +0000299
Ady Abraham9dada822022-02-03 10:26:59 -0800300class LatchUnsignaledTest : public TransactionApplicationTest {
301public:
302 void TearDown() override {
303 // Clear all transaction queues to release all transactions we sent
304 // in the tests. Otherwise, gmock complains about memory leaks.
Vishnu Nair60d902e2022-07-20 02:55:37 +0000305 while (!mFlinger.getTransactionQueue().isEmpty()) {
306 mFlinger.getTransactionQueue().pop();
307 }
Ady Abraham9dada822022-02-03 10:26:59 -0800308 mFlinger.getPendingTransactionQueue().clear();
Ady Abraham9dada822022-02-03 10:26:59 -0800309 mFlinger.commitTransactionsLocked(eTransactionMask);
310 mFlinger.mutableCurrentState().layersSortedByZ.clear();
311 mFlinger.mutableDrawingState().layersSortedByZ.clear();
312 }
313
314 static sp<Fence> fence(Fence::Status status) {
315 const auto fence = sp<mock::MockFence>::make();
316 EXPECT_CALL(*fence, getStatus()).WillRepeatedly(Return(status));
317 return fence;
318 }
319
320 ComposerState createComposerState(int layerId, sp<Fence> fence, uint64_t what) {
321 ComposerState state;
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700322 state.state.bufferData =
323 std::make_shared<fake::BufferData>(/* bufferId */ 123L, /* width */ 1,
324 /* height */ 2, /* pixelFormat */ 0,
325 /* outUsage */ 0);
Ady Abraham9dada822022-02-03 10:26:59 -0800326 state.state.bufferData->acquireFence = std::move(fence);
327 state.state.layerId = layerId;
328 state.state.surface =
Patrick Williams83f36b22022-09-14 17:57:35 +0000329 sp<Layer>::make(LayerCreationArgs(mFlinger.flinger(), nullptr, "TestLayer", 0, {}))
Ady Abraham9dada822022-02-03 10:26:59 -0800330 ->getHandle();
331 state.state.bufferData->flags = BufferData::BufferDataChange::fenceChanged;
332
333 state.state.what = what;
334 if (what & layer_state_t::eCropChanged) {
335 state.state.crop = Rect(1, 2, 3, 4);
336 }
337 return state;
338 }
339
340 TransactionInfo createTransactionInfo(const sp<IBinder>& applyToken,
341 const std::vector<ComposerState>& states) {
342 TransactionInfo transaction;
Vishnu Nair1523dad2022-09-29 16:05:18 -0700343 const uint32_t kFlags = 0;
Ady Abraham9dada822022-02-03 10:26:59 -0800344 const nsecs_t kDesiredPresentTime = systemTime();
345 const bool kIsAutoTimestamp = true;
346 const auto kFrameTimelineInfo = FrameTimelineInfo{};
347
Patrick Williams641f7f22022-06-22 19:25:35 +0000348 setupSingle(transaction, kFlags, kDesiredPresentTime, kIsAutoTimestamp, kFrameTimelineInfo);
Ady Abraham9dada822022-02-03 10:26:59 -0800349 transaction.applyToken = applyToken;
350 for (const auto& state : states) {
351 transaction.states.push_back(state);
352 }
353
354 return transaction;
355 }
356
357 void setTransactionStates(const std::vector<TransactionInfo>& transactions,
Ady Abraham9dada822022-02-03 10:26:59 -0800358 size_t expectedTransactionsPending) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000359 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Ady Abraham9dada822022-02-03 10:26:59 -0800360 EXPECT_EQ(0u, mFlinger.getPendingTransactionQueue().size());
361
362 for (const auto& transaction : transactions) {
363 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
364 transaction.displays, transaction.flags,
365 transaction.applyToken, transaction.inputWindowCommands,
366 transaction.desiredPresentTime,
367 transaction.isAutoTimestamp, transaction.uncacheBuffer,
368 mHasListenerCallbacks, mCallbacks, transaction.id);
369 }
370 mFlinger.flushTransactionQueues();
Vishnu Nair60d902e2022-07-20 02:55:37 +0000371 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700372 EXPECT_EQ(expectedTransactionsPending, mFlinger.getPendingTransactionCount());
Ady Abraham9dada822022-02-03 10:26:59 -0800373 }
374};
375
376class LatchUnsignaledAutoSingleLayerTest : public LatchUnsignaledTest {
377public:
378 void SetUp() override {
379 LatchUnsignaledTest::SetUp();
380 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::AutoSingleLayer;
381 }
382};
383
384TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleSignaledFromTheQueue) {
385 const sp<IBinder> kApplyToken =
386 IInterface::asBinder(TransactionCompletedListener::getIInstance());
387 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800388 const auto kExpectedTransactionsPending = 0u;
389
390 const auto signaledTransaction =
391 createTransactionInfo(kApplyToken,
392 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
393 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700394 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000395}
396
Ady Abraham9dada822022-02-03 10:26:59 -0800397TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleUnSignaledFromTheQueue) {
398 const sp<IBinder> kApplyToken =
399 IInterface::asBinder(TransactionCompletedListener::getIInstance());
400 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800401 const auto kExpectedTransactionsPending = 0u;
402
403 const auto unsignaledTransaction =
404 createTransactionInfo(kApplyToken,
405 {
406 createComposerState(kLayerId,
407 fence(Fence::Status::Unsignaled),
408 layer_state_t::eBufferChanged),
409 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700410 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000411}
412
Ady Abraham9dada822022-02-03 10:26:59 -0800413TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferCropChange) {
414 const sp<IBinder> kApplyToken =
415 IInterface::asBinder(TransactionCompletedListener::getIInstance());
416 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800417 const auto kExpectedTransactionsPending = 1u;
418
419 const auto unsignaledTransaction =
420 createTransactionInfo(kApplyToken,
421 {
422 createComposerState(kLayerId,
423 fence(Fence::Status::Unsignaled),
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700424 layer_state_t::eCropChanged |
425 layer_state_t::
426 eBufferChanged),
Ady Abraham9dada822022-02-03 10:26:59 -0800427 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700428 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000429}
430
Ady Abraham9dada822022-02-03 10:26:59 -0800431TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferChangeClubed) {
432 const sp<IBinder> kApplyToken =
433 IInterface::asBinder(TransactionCompletedListener::getIInstance());
434 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800435 const auto kExpectedTransactionsPending = 1u;
436
437 const auto unsignaledTransaction =
438 createTransactionInfo(kApplyToken,
439 {
440 createComposerState(kLayerId,
441 fence(Fence::Status::Unsignaled),
442 layer_state_t::eCropChanged |
443 layer_state_t::
444 eBufferChanged),
445 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700446 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000447}
448
Ady Abraham9dada822022-02-03 10:26:59 -0800449TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueueSameApplyTokenMultiState) {
450 const sp<IBinder> kApplyToken =
451 IInterface::asBinder(TransactionCompletedListener::getIInstance());
452 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800453 const auto kExpectedTransactionsPending = 1u;
454
455 const auto mixedTransaction =
456 createTransactionInfo(kApplyToken,
457 {
458 createComposerState(kLayerId,
459 fence(Fence::Status::Unsignaled),
460 layer_state_t::eBufferChanged),
461 createComposerState(kLayerId,
462 fence(Fence::Status::Signaled),
463 layer_state_t::eBufferChanged),
464 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700465 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000466}
467
Ady Abraham9dada822022-02-03 10:26:59 -0800468TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueue_MultipleStateTransaction) {
469 const sp<IBinder> kApplyToken =
470 IInterface::asBinder(TransactionCompletedListener::getIInstance());
471 const auto kLayerId1 = 1;
472 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800473 const auto kExpectedTransactionsPending = 1u;
474
475 const auto mixedTransaction =
476 createTransactionInfo(kApplyToken,
477 {
478 createComposerState(kLayerId1,
479 fence(Fence::Status::Unsignaled),
480 layer_state_t::eBufferChanged),
481 createComposerState(kLayerId2,
482 fence(Fence::Status::Signaled),
483 layer_state_t::eBufferChanged),
484 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700485 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000486}
487
Ady Abraham9dada822022-02-03 10:26:59 -0800488TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSignaledFromTheQueue) {
489 const sp<IBinder> kApplyToken =
490 IInterface::asBinder(TransactionCompletedListener::getIInstance());
491 const auto kLayerId1 = 1;
492 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800493 const auto kExpectedTransactionsPending = 0u;
494
495 const auto signaledTransaction =
496 createTransactionInfo(kApplyToken,
497 {
498 createComposerState(kLayerId1,
499 fence(Fence::Status::Signaled),
500 layer_state_t::eBufferChanged),
501 });
502 const auto signaledTransaction2 =
503 createTransactionInfo(kApplyToken,
504 {
505 createComposerState(kLayerId2,
506 fence(Fence::Status::Signaled),
507 layer_state_t::eBufferChanged),
508 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700509 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000510}
511
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800512TEST_F(LatchUnsignaledAutoSingleLayerTest,
513 UnsignaledNotAppliedWhenThereAreSignaled_UnsignaledFirst) {
Ady Abraham9dada822022-02-03 10:26:59 -0800514 const sp<IBinder> kApplyToken1 =
515 IInterface::asBinder(TransactionCompletedListener::getIInstance());
516 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800517 const sp<IBinder> kApplyToken3 = sp<BBinder>::make();
Ady Abraham9dada822022-02-03 10:26:59 -0800518 const auto kLayerId1 = 1;
519 const auto kLayerId2 = 2;
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800520 const auto kExpectedTransactionsPending = 1u;
521
522 const auto unsignaledTransaction =
523 createTransactionInfo(kApplyToken1,
524 {
525 createComposerState(kLayerId1,
526 fence(Fence::Status::Unsignaled),
527 layer_state_t::eBufferChanged),
528 });
529
530 const auto signaledTransaction =
531 createTransactionInfo(kApplyToken2,
532 {
533 createComposerState(kLayerId2,
534 fence(Fence::Status::Signaled),
535 layer_state_t::eBufferChanged),
536 });
537 const auto signaledTransaction2 =
538 createTransactionInfo(kApplyToken3,
539 {
540 createComposerState(kLayerId2,
541 fence(Fence::Status::Signaled),
542 layer_state_t::eBufferChanged),
543 });
544
545 setTransactionStates({unsignaledTransaction, signaledTransaction, signaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700546 kExpectedTransactionsPending);
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800547}
548
Ady Abraham9dada822022-02-03 10:26:59 -0800549TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueueSameApplyToken) {
550 const sp<IBinder> kApplyToken =
551 IInterface::asBinder(TransactionCompletedListener::getIInstance());
552 const auto kLayerId1 = 1;
553 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800554 const auto kExpectedTransactionsPending = 1u;
555
556 const auto unsignaledTransaction =
557 createTransactionInfo(kApplyToken,
558 {
559 createComposerState(kLayerId1,
560 fence(Fence::Status::Unsignaled),
561 layer_state_t::eBufferChanged),
562 });
563 const auto signaledTransaction =
564 createTransactionInfo(kApplyToken,
565 {
566 createComposerState(kLayerId2,
567 fence(Fence::Status::Signaled),
568 layer_state_t::eBufferChanged),
569 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700570 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800571 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000572}
573
Ady Abraham9dada822022-02-03 10:26:59 -0800574TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueue) {
575 const sp<IBinder> kApplyToken1 =
576 IInterface::asBinder(TransactionCompletedListener::getIInstance());
577 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
578 const auto kLayerId1 = 1;
579 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800580 const auto kExpectedTransactionsPending = 1u;
581
582 const auto unsignaledTransaction =
583 createTransactionInfo(kApplyToken1,
584 {
585 createComposerState(kLayerId1,
586 fence(Fence::Status::Unsignaled),
587 layer_state_t::eBufferChanged),
588 });
589 const auto unsignaledTransaction2 =
590 createTransactionInfo(kApplyToken2,
591 {
592 createComposerState(kLayerId2,
593 fence(Fence::Status::Unsignaled),
594 layer_state_t::eBufferChanged),
595 });
596 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700597 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000598}
599
Ady Abraham2739e832022-02-14 17:42:00 -0800600TEST_F(LatchUnsignaledAutoSingleLayerTest, DontLatchUnsignaledWhenEarlyOffset) {
601 const sp<IBinder> kApplyToken =
602 IInterface::asBinder(TransactionCompletedListener::getIInstance());
603 const auto kLayerId = 1;
Ady Abraham2739e832022-02-14 17:42:00 -0800604 const auto kExpectedTransactionsPending = 1u;
605
606 const auto unsignaledTransaction =
607 createTransactionInfo(kApplyToken,
608 {
609 createComposerState(kLayerId,
610 fence(Fence::Status::Unsignaled),
611 layer_state_t::eBufferChanged),
612 });
613
614 // Get VsyncModulator out of the default config
615 static_cast<void>(mFlinger.mutableVsyncModulator()->onRefreshRateChangeInitiated());
616
Vishnu Nair1523dad2022-09-29 16:05:18 -0700617 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
Ady Abraham2739e832022-02-14 17:42:00 -0800618}
619
Ady Abraham9dada822022-02-03 10:26:59 -0800620class LatchUnsignaledDisabledTest : public LatchUnsignaledTest {
621public:
622 void SetUp() override {
623 LatchUnsignaledTest::SetUp();
624 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Disabled;
625 }
626};
627
628TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue) {
629 const sp<IBinder> kApplyToken =
630 IInterface::asBinder(TransactionCompletedListener::getIInstance());
631 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800632 const auto kExpectedTransactionsPending = 0u;
633
634 const auto signaledTransaction =
635 createTransactionInfo(kApplyToken,
636 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
637 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700638 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000639}
640
Ady Abraham9dada822022-02-03 10:26:59 -0800641TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueue) {
642 const sp<IBinder> kApplyToken =
643 IInterface::asBinder(TransactionCompletedListener::getIInstance());
644 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800645 const auto kExpectedTransactionsPending = 1u;
646
647 const auto unsignaledTransaction =
648 createTransactionInfo(kApplyToken,
649 {
650 createComposerState(kLayerId,
651 fence(Fence::Status::Unsignaled),
652 layer_state_t::eBufferChanged),
653 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700654 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000655}
656
Ady Abraham9dada822022-02-03 10:26:59 -0800657TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueSameLayerId) {
658 const sp<IBinder> kApplyToken =
659 IInterface::asBinder(TransactionCompletedListener::getIInstance());
660 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800661 const auto kExpectedTransactionsPending = 1u;
662
663 const auto unsignaledTransaction =
664 createTransactionInfo(kApplyToken,
665 {
666 createComposerState(kLayerId,
667 fence(Fence::Status::Unsignaled),
668 layer_state_t::eBufferChanged),
669 createComposerState(kLayerId,
670 fence(Fence::Status::Unsignaled),
671 layer_state_t::eBufferChanged),
672 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700673 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000674}
675
Ady Abraham9dada822022-02-03 10:26:59 -0800676TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueDifferentLayerId) {
677 const sp<IBinder> kApplyToken =
678 IInterface::asBinder(TransactionCompletedListener::getIInstance());
679 const auto kLayerId1 = 1;
680 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800681 const auto kExpectedTransactionsPending = 1u;
682
683 const auto unsignaledTransaction =
684 createTransactionInfo(kApplyToken,
685 {
686 createComposerState(kLayerId1,
687 fence(Fence::Status::Unsignaled),
688 layer_state_t::eBufferChanged),
689 createComposerState(kLayerId2,
690 fence(Fence::Status::Unsignaled),
691 layer_state_t::eBufferChanged),
692 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700693 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000694}
695
Ady Abraham9dada822022-02-03 10:26:59 -0800696TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
697 const sp<IBinder> kApplyToken =
698 IInterface::asBinder(TransactionCompletedListener::getIInstance());
699 const auto kLayerId1 = 1;
700 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800701 const auto kExpectedTransactionsPending = 0u;
702
703 const auto signaledTransaction =
704 createTransactionInfo(kApplyToken,
705 {
706 createComposerState(kLayerId1,
707 fence(Fence::Status::Signaled),
708 layer_state_t::eBufferChanged),
709 });
710 const auto signaledTransaction2 =
711 createTransactionInfo(kApplyToken,
712 {
713 createComposerState(kLayerId2,
714 fence(Fence::Status::Signaled),
715 layer_state_t::eBufferChanged),
716 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700717 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000718}
719
Ady Abraham9dada822022-02-03 10:26:59 -0800720TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueDifferentApplyToken) {
721 const sp<IBinder> kApplyToken1 =
722 IInterface::asBinder(TransactionCompletedListener::getIInstance());
723 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
724 const auto kLayerId1 = 1;
725 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800726 const auto kExpectedTransactionsPending = 1u;
727
728 const auto unsignaledTransaction =
729 createTransactionInfo(kApplyToken1,
730 {
731 createComposerState(kLayerId1,
732 fence(Fence::Status::Unsignaled),
733 layer_state_t::eBufferChanged),
734 });
735 const auto signaledTransaction =
736 createTransactionInfo(kApplyToken2,
737 {
738 createComposerState(kLayerId2,
739 fence(Fence::Status::Signaled),
740 layer_state_t::eBufferChanged),
741 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700742 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800743 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000744}
745
Ady Abraham9dada822022-02-03 10:26:59 -0800746TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueSameApplyToken) {
747 const sp<IBinder> kApplyToken =
748 IInterface::asBinder(TransactionCompletedListener::getIInstance());
749 const auto kLayerId1 = 1;
750 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800751 const auto kExpectedTransactionsPending = 1u;
752
753 const auto signaledTransaction =
754 createTransactionInfo(kApplyToken,
755 {
756 createComposerState(kLayerId1,
757 fence(Fence::Status::Signaled),
758 layer_state_t::eBufferChanged),
759 });
760 const auto unsignaledTransaction =
761 createTransactionInfo(kApplyToken,
762 {
763 createComposerState(kLayerId2,
764 fence(Fence::Status::Unsignaled),
765 layer_state_t::eBufferChanged),
766 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700767 setTransactionStates({signaledTransaction, unsignaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800768 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000769}
770
Ady Abraham9dada822022-02-03 10:26:59 -0800771TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheUnsignaledTheQueue) {
772 const sp<IBinder> kApplyToken =
773 IInterface::asBinder(TransactionCompletedListener::getIInstance());
774 const auto kLayerId1 = 1;
775 const auto kLayerId2 = 2;
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700776 const auto kExpectedTransactionsPending = 2u;
Ady Abraham9dada822022-02-03 10:26:59 -0800777
778 const auto unsignaledTransaction =
779 createTransactionInfo(kApplyToken,
780 {
781 createComposerState(kLayerId1,
782 fence(Fence::Status::Unsignaled),
783 layer_state_t::eBufferChanged),
784 });
785 const auto unsignaledTransaction2 =
786 createTransactionInfo(kApplyToken,
787 {
788 createComposerState(kLayerId2,
789 fence(Fence::Status::Unsignaled),
790 layer_state_t::eBufferChanged),
791 });
792 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700793 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000794}
795
Ady Abraham9dada822022-02-03 10:26:59 -0800796class LatchUnsignaledAlwaysTest : public LatchUnsignaledTest {
797public:
798 void SetUp() override {
799 LatchUnsignaledTest::SetUp();
800 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Always;
801 }
802};
803
804TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue) {
805 const sp<IBinder> kApplyToken =
806 IInterface::asBinder(TransactionCompletedListener::getIInstance());
807 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800808 const auto kExpectedTransactionsPending = 0u;
809
810 const auto signaledTransaction =
811 createTransactionInfo(kApplyToken,
812 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
813 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700814 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000815}
816
Ady Abraham9dada822022-02-03 10:26:59 -0800817TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueue) {
818 const sp<IBinder> kApplyToken =
819 IInterface::asBinder(TransactionCompletedListener::getIInstance());
820 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800821 const auto kExpectedTransactionsPending = 0u;
822
823 const auto unsignaledTransaction =
824 createTransactionInfo(kApplyToken,
825 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
826 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700827 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000828}
829
Ady Abraham9dada822022-02-03 10:26:59 -0800830TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueSameLayerId) {
831 const sp<IBinder> kApplyToken =
832 IInterface::asBinder(TransactionCompletedListener::getIInstance());
833 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800834 const auto kExpectedTransactionsPending = 0u;
835
836 const auto mixedTransaction =
837 createTransactionInfo(kApplyToken,
838 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
839 layer_state_t::eBufferChanged),
840 createComposerState(kLayerId, fence(Fence::Status::Signaled),
841 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700842 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000843}
844
Ady Abraham9dada822022-02-03 10:26:59 -0800845TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentLayerId) {
846 const sp<IBinder> kApplyToken =
847 IInterface::asBinder(TransactionCompletedListener::getIInstance());
848 const auto kLayerId1 = 1;
849 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800850 const auto kExpectedTransactionsPending = 0u;
851
852 const auto mixedTransaction =
853 createTransactionInfo(kApplyToken,
854 {createComposerState(kLayerId1, fence(Fence::Status::Unsignaled),
855 layer_state_t::eBufferChanged),
856 createComposerState(kLayerId2, fence(Fence::Status::Signaled),
857 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700858 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000859}
860
Ady Abraham9dada822022-02-03 10:26:59 -0800861TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
862 const sp<IBinder> kApplyToken =
863 IInterface::asBinder(TransactionCompletedListener::getIInstance());
864 const auto kLayerId1 = 1;
865 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800866 const auto kExpectedTransactionsPending = 0u;
867
868 const auto signaledTransaction =
869 createTransactionInfo(kApplyToken,
870 {
871 createComposerState(kLayerId1,
872 fence(Fence::Status::Signaled),
873 layer_state_t::eBufferChanged),
874 });
875 const auto signaledTransaction2 =
876 createTransactionInfo(kApplyToken,
877 {
878 createComposerState(kLayerId2,
879 fence(Fence::Status::Signaled),
880 layer_state_t::eBufferChanged),
881 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700882 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000883}
884
Ady Abraham9dada822022-02-03 10:26:59 -0800885TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentApplyToken) {
886 const sp<IBinder> kApplyToken1 =
887 IInterface::asBinder(TransactionCompletedListener::getIInstance());
888 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
889 const auto kLayerId1 = 1;
890 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800891 const auto kExpectedTransactionsPending = 0u;
892
893 const auto signaledTransaction =
894 createTransactionInfo(kApplyToken1,
895 {
896 createComposerState(kLayerId1,
897 fence(Fence::Status::Signaled),
898 layer_state_t::eBufferChanged),
899 });
900 const auto unsignaledTransaction =
901 createTransactionInfo(kApplyToken2,
902 {
903 createComposerState(kLayerId2,
904 fence(Fence::Status::Unsignaled),
905 layer_state_t::eBufferChanged),
906 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700907 setTransactionStates({signaledTransaction, unsignaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800908 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000909}
910
Ady Abraham9dada822022-02-03 10:26:59 -0800911TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueueSameApplyToken) {
912 const sp<IBinder> kApplyToken =
913 IInterface::asBinder(TransactionCompletedListener::getIInstance());
914 const auto kLayerId1 = 1;
915 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800916 const auto kExpectedTransactionsPending = 0u;
917
918 const auto unsignaledTransaction =
919 createTransactionInfo(kApplyToken,
920 {
921 createComposerState(kLayerId1,
922 fence(Fence::Status::Unsignaled),
923 layer_state_t::eBufferChanged),
924 });
925 const auto signaledTransaction =
926 createTransactionInfo(kApplyToken,
927 {
928 createComposerState(kLayerId2,
929 fence(Fence::Status::Signaled),
930 layer_state_t::eBufferChanged),
931 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700932 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800933 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000934}
935
Ady Abraham9dada822022-02-03 10:26:59 -0800936TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueue) {
937 const sp<IBinder> kApplyToken1 =
938 IInterface::asBinder(TransactionCompletedListener::getIInstance());
939 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
940 const auto kLayerId1 = 1;
941 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800942 const auto kExpectedTransactionsPending = 0u;
943
944 const auto unsignaledTransaction =
945 createTransactionInfo(kApplyToken1,
946 {
947 createComposerState(kLayerId1,
948 fence(Fence::Status::Unsignaled),
949 layer_state_t::eBufferChanged),
950 });
951 const auto unsignaledTransaction2 =
952 createTransactionInfo(kApplyToken2,
953 {
954 createComposerState(kLayerId2,
955 fence(Fence::Status::Unsignaled),
956 layer_state_t::eBufferChanged),
957 });
958 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700959 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000960}
961
Ady Abraham2739e832022-02-14 17:42:00 -0800962TEST_F(LatchUnsignaledAlwaysTest, LatchUnsignaledWhenEarlyOffset) {
963 const sp<IBinder> kApplyToken =
964 IInterface::asBinder(TransactionCompletedListener::getIInstance());
965 const auto kLayerId = 1;
Ady Abraham2739e832022-02-14 17:42:00 -0800966 const auto kExpectedTransactionsPending = 0u;
967
968 const auto unsignaledTransaction =
969 createTransactionInfo(kApplyToken,
970 {
971 createComposerState(kLayerId,
972 fence(Fence::Status::Unsignaled),
973 layer_state_t::eBufferChanged),
974 });
975
976 // Get VsyncModulator out of the default config
977 static_cast<void>(mFlinger.mutableVsyncModulator()->onRefreshRateChangeInitiated());
978
Vishnu Nair1523dad2022-09-29 16:05:18 -0700979 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
Ady Abraham2739e832022-02-14 17:42:00 -0800980}
981
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700982TEST(TransactionHandlerTest, QueueTransaction) {
983 TransactionHandler handler;
984 TransactionState transaction;
985 transaction.applyToken = sp<BBinder>::make();
986 transaction.id = 42;
987 handler.queueTransaction(std::move(transaction));
988 std::vector<TransactionState> transactionsReadyToBeApplied = handler.flushTransactions();
989
990 EXPECT_EQ(transactionsReadyToBeApplied.size(), 1u);
991 EXPECT_EQ(transactionsReadyToBeApplied.front().id, 42u);
992}
993
Valerie Haud251afb2019-03-29 14:19:02 -0700994} // namespace android