blob: d84698f279f347b72126860081d7d42a49afb092 [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"
Vishnu Nair40fff5c2022-11-04 02:46:28 +000035#include "TransactionState.h"
Valerie Haud251afb2019-03-29 14:19:02 -070036#include "mock/MockEventThread.h"
Ady Abraham8cb21882020-08-26 18:22:05 -070037#include "mock/MockVsyncController.h"
Valerie Haud251afb2019-03-29 14:19:02 -070038
39namespace android {
40
41using testing::_;
42using testing::Return;
43
44using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
Vishnu Nairaf6d2972022-11-18 06:26:38 +000045using frontend::TransactionHandler;
46
Vishnu Nair1523dad2022-09-29 16:05:18 -070047constexpr nsecs_t TRANSACTION_TIMEOUT = s2ns(5);
Valerie Haud251afb2019-03-29 14:19:02 -070048class TransactionApplicationTest : public testing::Test {
49public:
50 TransactionApplicationTest() {
51 const ::testing::TestInfo* const test_info =
52 ::testing::UnitTest::GetInstance()->current_test_info();
53 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
54
Valerie Haud251afb2019-03-29 14:19:02 -070055 setupScheduler();
56 }
57
58 ~TransactionApplicationTest() {
59 const ::testing::TestInfo* const test_info =
60 ::testing::UnitTest::GetInstance()->current_test_info();
61 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
62 }
63
64 void setupScheduler() {
65 auto eventThread = std::make_unique<mock::EventThread>();
66 auto sfEventThread = std::make_unique<mock::EventThread>();
67
68 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
69 EXPECT_CALL(*eventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070070 .WillOnce(Return(sp<EventThreadConnection>::make(eventThread.get(),
71 mock::EventThread::kCallingUid,
72 ResyncCallback())));
Valerie Haud251afb2019-03-29 14:19:02 -070073
74 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
75 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070076 .WillOnce(Return(sp<EventThreadConnection>::make(sfEventThread.get(),
77 mock::EventThread::kCallingUid,
78 ResyncCallback())));
Valerie Haud251afb2019-03-29 14:19:02 -070079
Ady Abraham8cb21882020-08-26 18:22:05 -070080 EXPECT_CALL(*mVSyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
81 EXPECT_CALL(*mVSyncTracker, currentPeriod())
Marin Shalamanov045b7002021-01-07 16:56:24 +010082 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
Valerie Haud251afb2019-03-29 14:19:02 -070083
Ady Abraham3efa3942021-06-24 19:01:25 -070084 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
Ady Abraham8cb21882020-08-26 18:22:05 -070085 mFlinger.setupScheduler(std::unique_ptr<mock::VsyncController>(mVsyncController),
86 std::unique_ptr<mock::VSyncTracker>(mVSyncTracker),
Valerie Haud251afb2019-03-29 14:19:02 -070087 std::move(eventThread), std::move(sfEventThread));
Vishnu Nair59f6d2d2022-10-05 16:59:56 -070088 mFlinger.flinger()->addTransactionReadyFilters();
Valerie Haud251afb2019-03-29 14:19:02 -070089 }
90
Valerie Haud251afb2019-03-29 14:19:02 -070091 TestableSurfaceFlinger mFlinger;
92
Ady Abraham8cb21882020-08-26 18:22:05 -070093 mock::VsyncController* mVsyncController = new mock::VsyncController();
94 mock::VSyncTracker* mVSyncTracker = new mock::VSyncTracker();
Valerie Haud251afb2019-03-29 14:19:02 -070095
96 struct TransactionInfo {
97 Vector<ComposerState> states;
98 Vector<DisplayState> displays;
99 uint32_t flags = 0;
100 sp<IBinder> applyToken = IInterface::asBinder(TransactionCompletedListener::getIInstance());
101 InputWindowCommands inputWindowCommands;
Ady Abrahamf0c56492020-12-17 18:04:15 -0800102 int64_t desiredPresentTime = 0;
103 bool isAutoTimestamp = true;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000104 FrameTimelineInfo frameTimelineInfo;
Valerie Haud251afb2019-03-29 14:19:02 -0700105 client_cache_t uncacheBuffer;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000106 uint64_t id = static_cast<uint64_t>(-1);
107 static_assert(0xffffffffffffffff == static_cast<uint64_t>(-1));
Valerie Haud251afb2019-03-29 14:19:02 -0700108 };
109
Vishnu Nair6b591152021-10-08 11:45:14 -0700110 void checkEqual(TransactionInfo info, TransactionState state) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000111 EXPECT_EQ(0u, info.states.size());
112 EXPECT_EQ(0u, state.states.size());
Valerie Haud251afb2019-03-29 14:19:02 -0700113
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000114 EXPECT_EQ(0u, info.displays.size());
115 EXPECT_EQ(0u, state.displays.size());
Valerie Haud251afb2019-03-29 14:19:02 -0700116 EXPECT_EQ(info.flags, state.flags);
117 EXPECT_EQ(info.desiredPresentTime, state.desiredPresentTime);
118 }
119
Patrick Williams641f7f22022-06-22 19:25:35 +0000120 void setupSingle(TransactionInfo& transaction, uint32_t flags, int64_t desiredPresentTime,
121 bool isAutoTimestamp, const FrameTimelineInfo& frameTimelineInfo) {
Valerie Haud251afb2019-03-29 14:19:02 -0700122 mTransactionNumber++;
Vishnu Nair1523dad2022-09-29 16:05:18 -0700123 transaction.flags |= flags;
Valerie Haud251afb2019-03-29 14:19:02 -0700124 transaction.desiredPresentTime = desiredPresentTime;
Ady Abrahamf0c56492020-12-17 18:04:15 -0800125 transaction.isAutoTimestamp = isAutoTimestamp;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000126 transaction.frameTimelineInfo = frameTimelineInfo;
Valerie Haud251afb2019-03-29 14:19:02 -0700127 }
128
Patrick Williams641f7f22022-06-22 19:25:35 +0000129 void NotPlacedOnTransactionQueue(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000130 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700131 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700132 TransactionInfo transaction;
Patrick Williams641f7f22022-06-22 19:25:35 +0000133 setupSingle(transaction, flags,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800134 /*desiredPresentTime*/ systemTime(), /*isAutoTimestamp*/ true,
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000135 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700136 nsecs_t applicationTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000137 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700138 transaction.displays, transaction.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700139 transaction.applyToken, transaction.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800140 transaction.desiredPresentTime, transaction.isAutoTimestamp,
141 transaction.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
142 transaction.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700143
Patrick Williams641f7f22022-06-22 19:25:35 +0000144 // If transaction is synchronous, SF applyTransactionState should time out (5s) wating for
145 // SF to commit the transaction. If this is animation, it should not time out waiting.
Valerie Haud251afb2019-03-29 14:19:02 -0700146 nsecs_t returnedTime = systemTime();
Vishnu Nair1523dad2022-09-29 16:05:18 -0700147 EXPECT_LE(returnedTime, applicationTime + TRANSACTION_TIMEOUT);
Arthur Hung58144272021-01-16 03:43:53 +0000148 // Each transaction should have been placed on the transaction queue
Vishnu Nair60d902e2022-07-20 02:55:37 +0000149 auto& transactionQueue = mFlinger.getTransactionQueue();
150 EXPECT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700151 }
152
Patrick Williams641f7f22022-06-22 19:25:35 +0000153 void PlaceOnTransactionQueue(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000154 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700155 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700156
157 // first check will see desired present time has not passed,
158 // but afterwards it will look like the desired present time has passed
159 nsecs_t time = systemTime();
Valerie Haud251afb2019-03-29 14:19:02 -0700160 TransactionInfo transaction;
Patrick Williams641f7f22022-06-22 19:25:35 +0000161 setupSingle(transaction, flags, /*desiredPresentTime*/ time + s2ns(1), false,
162 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700163 nsecs_t applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000164 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700165 transaction.displays, transaction.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700166 transaction.applyToken, transaction.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800167 transaction.desiredPresentTime, transaction.isAutoTimestamp,
168 transaction.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
169 transaction.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700170
171 nsecs_t returnedTime = systemTime();
Vishnu Nair1523dad2022-09-29 16:05:18 -0700172 EXPECT_LE(returnedTime, applicationSentTime + TRANSACTION_TIMEOUT);
Valerie Haud251afb2019-03-29 14:19:02 -0700173 // This transaction should have been placed on the transaction queue
Vishnu Nair60d902e2022-07-20 02:55:37 +0000174 auto& transactionQueue = mFlinger.getTransactionQueue();
175 EXPECT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700176 }
177
Patrick Williams641f7f22022-06-22 19:25:35 +0000178 void BlockedByPriorTransaction(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000179 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700180 nsecs_t time = systemTime();
Patrick Williams641f7f22022-06-22 19:25:35 +0000181 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(2);
182
Valerie Haud251afb2019-03-29 14:19:02 -0700183 // transaction that should go on the pending thread
184 TransactionInfo transactionA;
Patrick Williams641f7f22022-06-22 19:25:35 +0000185 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ time + s2ns(1), false,
186 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700187
188 // transaction that would not have gone on the pending thread if not
189 // blocked
190 TransactionInfo transactionB;
Patrick Williams641f7f22022-06-22 19:25:35 +0000191 setupSingle(transactionB, flags, /*desiredPresentTime*/ systemTime(),
192 /*isAutoTimestamp*/ true, FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700193
194 nsecs_t applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000195 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700196 transactionA.displays, transactionA.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700197 transactionA.applyToken, transactionA.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800198 transactionA.desiredPresentTime, transactionA.isAutoTimestamp,
199 transactionA.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
200 transactionA.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700201
202 // This thread should not have been blocked by the above transaction
203 // (5s is the timeout period that applyTransactionState waits for SF to
204 // commit the transaction)
Vishnu Nair1523dad2022-09-29 16:05:18 -0700205 EXPECT_LE(systemTime(), applicationSentTime + TRANSACTION_TIMEOUT);
Arthur Hung58144272021-01-16 03:43:53 +0000206 // transaction that would goes to pending transaciton queue.
207 mFlinger.flushTransactionQueues();
Valerie Haud251afb2019-03-29 14:19:02 -0700208
209 applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000210 mFlinger.setTransactionState(transactionB.frameTimelineInfo, transactionB.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700211 transactionB.displays, transactionB.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700212 transactionB.applyToken, transactionB.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800213 transactionB.desiredPresentTime, transactionB.isAutoTimestamp,
214 transactionB.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
215 transactionB.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700216
217 // this thread should have been blocked by the above transaction
218 // if this is an animation, this thread should be blocked for 5s
219 // in setTransactionState waiting for transactionA to flush. Otherwise,
220 // the transaction should be placed on the pending queue
Vishnu Nair1523dad2022-09-29 16:05:18 -0700221 EXPECT_LE(systemTime(), applicationSentTime + TRANSACTION_TIMEOUT);
Valerie Haud251afb2019-03-29 14:19:02 -0700222
Arthur Hung58144272021-01-16 03:43:53 +0000223 // transaction that would goes to pending transaciton queue.
224 mFlinger.flushTransactionQueues();
225
Ady Abrahame46243a2021-02-23 19:33:49 -0800226 // check that the transaction was applied.
Arthur Hung58144272021-01-16 03:43:53 +0000227 auto transactionQueue = mFlinger.getPendingTransactionQueue();
Ady Abrahame46243a2021-02-23 19:33:49 -0800228 EXPECT_EQ(0u, transactionQueue.size());
Valerie Haud251afb2019-03-29 14:19:02 -0700229 }
230
231 bool mHasListenerCallbacks = false;
232 std::vector<ListenerCallbacks> mCallbacks;
233 int mTransactionNumber = 0;
234};
235
Vishnu Nair60d902e2022-07-20 02:55:37 +0000236TEST_F(TransactionApplicationTest, AddToPendingQueue) {
237 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700238 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700239
Valerie Haud251afb2019-03-29 14:19:02 -0700240 TransactionInfo transactionA; // transaction to go on pending queue
Patrick Williams641f7f22022-06-22 19:25:35 +0000241 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ s2ns(1), false,
242 FrameTimelineInfo{});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000243 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700244 transactionA.displays, transactionA.flags, transactionA.applyToken,
245 transactionA.inputWindowCommands, transactionA.desiredPresentTime,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800246 transactionA.isAutoTimestamp, transactionA.uncacheBuffer,
247 mHasListenerCallbacks, mCallbacks, transactionA.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700248
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000249 auto& transactionQueue = mFlinger.getTransactionQueue();
Vishnu Nair60d902e2022-07-20 02:55:37 +0000250 ASSERT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700251
Vishnu Nair60d902e2022-07-20 02:55:37 +0000252 auto transactionState = transactionQueue.pop().value();
Valerie Haud251afb2019-03-29 14:19:02 -0700253 checkEqual(transactionA, transactionState);
Vishnu Nair60d902e2022-07-20 02:55:37 +0000254}
255
256TEST_F(TransactionApplicationTest, Flush_RemovesFromQueue) {
257 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
258 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
259
260 TransactionInfo transactionA; // transaction to go on pending queue
261 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ s2ns(1), false,
262 FrameTimelineInfo{});
263 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
264 transactionA.displays, transactionA.flags, transactionA.applyToken,
265 transactionA.inputWindowCommands, transactionA.desiredPresentTime,
266 transactionA.isAutoTimestamp, transactionA.uncacheBuffer,
267 mHasListenerCallbacks, mCallbacks, transactionA.id);
268
269 auto& transactionQueue = mFlinger.getTransactionQueue();
270 ASSERT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700271
272 // because flushing uses the cached expected present time, we send an empty
273 // transaction here (sending a null applyToken to fake it as from a
274 // different process) to re-query and reset the cached expected present time
275 TransactionInfo empty;
276 empty.applyToken = sp<IBinder>();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000277 mFlinger.setTransactionState(empty.frameTimelineInfo, empty.states, empty.displays, empty.flags,
278 empty.applyToken, empty.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800279 empty.desiredPresentTime, empty.isAutoTimestamp,
280 empty.uncacheBuffer, mHasListenerCallbacks, mCallbacks, empty.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700281
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000282 // flush transaction queue should flush as desiredPresentTime has
Valerie Haud251afb2019-03-29 14:19:02 -0700283 // passed
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000284 mFlinger.flushTransactionQueues();
Valerie Haud251afb2019-03-29 14:19:02 -0700285
Vishnu Nair60d902e2022-07-20 02:55:37 +0000286 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700287}
288
Valerie Haud251afb2019-03-29 14:19:02 -0700289TEST_F(TransactionApplicationTest, NotPlacedOnTransactionQueue_SyncInputWindows) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000290 NotPlacedOnTransactionQueue(/*flags*/ 0);
Valerie Haud251afb2019-03-29 14:19:02 -0700291}
292
Valerie Haud251afb2019-03-29 14:19:02 -0700293TEST_F(TransactionApplicationTest, PlaceOnTransactionQueue_SyncInputWindows) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000294 PlaceOnTransactionQueue(/*flags*/ 0);
Valerie Haud251afb2019-03-29 14:19:02 -0700295}
296
Valerie Hau09e60052019-12-15 14:51:15 -0800297TEST_F(TransactionApplicationTest, FromHandle) {
298 sp<IBinder> badHandle;
299 auto ret = mFlinger.fromHandle(badHandle);
Vishnu Nair07e2a482022-10-18 19:18:16 +0000300 EXPECT_EQ(nullptr, ret.get());
Valerie Hau09e60052019-12-15 14:51:15 -0800301}
ramindani4d48f902021-09-20 21:07:45 +0000302
Ady Abraham9dada822022-02-03 10:26:59 -0800303class LatchUnsignaledTest : public TransactionApplicationTest {
304public:
305 void TearDown() override {
306 // Clear all transaction queues to release all transactions we sent
307 // in the tests. Otherwise, gmock complains about memory leaks.
Vishnu Nair60d902e2022-07-20 02:55:37 +0000308 while (!mFlinger.getTransactionQueue().isEmpty()) {
309 mFlinger.getTransactionQueue().pop();
310 }
Ady Abraham9dada822022-02-03 10:26:59 -0800311 mFlinger.getPendingTransactionQueue().clear();
Ady Abraham9dada822022-02-03 10:26:59 -0800312 mFlinger.commitTransactionsLocked(eTransactionMask);
313 mFlinger.mutableCurrentState().layersSortedByZ.clear();
314 mFlinger.mutableDrawingState().layersSortedByZ.clear();
315 }
316
317 static sp<Fence> fence(Fence::Status status) {
318 const auto fence = sp<mock::MockFence>::make();
319 EXPECT_CALL(*fence, getStatus()).WillRepeatedly(Return(status));
320 return fence;
321 }
322
323 ComposerState createComposerState(int layerId, sp<Fence> fence, uint64_t what) {
324 ComposerState state;
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700325 state.state.bufferData =
326 std::make_shared<fake::BufferData>(/* bufferId */ 123L, /* width */ 1,
327 /* height */ 2, /* pixelFormat */ 0,
328 /* outUsage */ 0);
Ady Abraham9dada822022-02-03 10:26:59 -0800329 state.state.bufferData->acquireFence = std::move(fence);
330 state.state.layerId = layerId;
331 state.state.surface =
Patrick Williams83f36b22022-09-14 17:57:35 +0000332 sp<Layer>::make(LayerCreationArgs(mFlinger.flinger(), nullptr, "TestLayer", 0, {}))
Ady Abraham9dada822022-02-03 10:26:59 -0800333 ->getHandle();
334 state.state.bufferData->flags = BufferData::BufferDataChange::fenceChanged;
335
336 state.state.what = what;
337 if (what & layer_state_t::eCropChanged) {
338 state.state.crop = Rect(1, 2, 3, 4);
339 }
340 return state;
341 }
342
343 TransactionInfo createTransactionInfo(const sp<IBinder>& applyToken,
344 const std::vector<ComposerState>& states) {
345 TransactionInfo transaction;
Vishnu Nair1523dad2022-09-29 16:05:18 -0700346 const uint32_t kFlags = 0;
Ady Abraham9dada822022-02-03 10:26:59 -0800347 const nsecs_t kDesiredPresentTime = systemTime();
348 const bool kIsAutoTimestamp = true;
349 const auto kFrameTimelineInfo = FrameTimelineInfo{};
350
Patrick Williams641f7f22022-06-22 19:25:35 +0000351 setupSingle(transaction, kFlags, kDesiredPresentTime, kIsAutoTimestamp, kFrameTimelineInfo);
Ady Abraham9dada822022-02-03 10:26:59 -0800352 transaction.applyToken = applyToken;
353 for (const auto& state : states) {
354 transaction.states.push_back(state);
355 }
356
357 return transaction;
358 }
359
360 void setTransactionStates(const std::vector<TransactionInfo>& transactions,
Ady Abraham9dada822022-02-03 10:26:59 -0800361 size_t expectedTransactionsPending) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000362 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Ady Abraham9dada822022-02-03 10:26:59 -0800363 EXPECT_EQ(0u, mFlinger.getPendingTransactionQueue().size());
364
Vishnu Nair40fff5c2022-11-04 02:46:28 +0000365 for (auto transaction : transactions) {
366 std::vector<ResolvedComposerState> resolvedStates;
367 resolvedStates.reserve(transaction.states.size());
368 for (auto& state : transaction.states) {
369 resolvedStates.emplace_back(std::move(state));
370 }
371
372 TransactionState transactionState(transaction.frameTimelineInfo, resolvedStates,
373 transaction.displays, transaction.flags,
374 transaction.applyToken,
375 transaction.inputWindowCommands,
376 transaction.desiredPresentTime,
377 transaction.isAutoTimestamp,
378 transaction.uncacheBuffer, systemTime(), 0,
379 mHasListenerCallbacks, mCallbacks, getpid(),
380 static_cast<int>(getuid()), transaction.id);
381 mFlinger.setTransactionStateInternal(transactionState);
Ady Abraham9dada822022-02-03 10:26:59 -0800382 }
383 mFlinger.flushTransactionQueues();
Vishnu Nair60d902e2022-07-20 02:55:37 +0000384 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700385 EXPECT_EQ(expectedTransactionsPending, mFlinger.getPendingTransactionCount());
Ady Abraham9dada822022-02-03 10:26:59 -0800386 }
387};
388
389class LatchUnsignaledAutoSingleLayerTest : public LatchUnsignaledTest {
390public:
391 void SetUp() override {
392 LatchUnsignaledTest::SetUp();
393 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::AutoSingleLayer;
394 }
395};
396
397TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleSignaledFromTheQueue) {
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 signaledTransaction =
404 createTransactionInfo(kApplyToken,
405 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
406 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700407 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000408}
409
Ady Abraham9dada822022-02-03 10:26:59 -0800410TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleUnSignaledFromTheQueue) {
411 const sp<IBinder> kApplyToken =
412 IInterface::asBinder(TransactionCompletedListener::getIInstance());
413 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800414 const auto kExpectedTransactionsPending = 0u;
415
416 const auto unsignaledTransaction =
417 createTransactionInfo(kApplyToken,
418 {
419 createComposerState(kLayerId,
420 fence(Fence::Status::Unsignaled),
421 layer_state_t::eBufferChanged),
422 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700423 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000424}
425
Ady Abraham9dada822022-02-03 10:26:59 -0800426TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferCropChange) {
427 const sp<IBinder> kApplyToken =
428 IInterface::asBinder(TransactionCompletedListener::getIInstance());
429 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800430 const auto kExpectedTransactionsPending = 1u;
431
432 const auto unsignaledTransaction =
433 createTransactionInfo(kApplyToken,
434 {
435 createComposerState(kLayerId,
436 fence(Fence::Status::Unsignaled),
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700437 layer_state_t::eCropChanged |
438 layer_state_t::
439 eBufferChanged),
Ady Abraham9dada822022-02-03 10:26:59 -0800440 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700441 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000442}
443
Ady Abraham9dada822022-02-03 10:26:59 -0800444TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferChangeClubed) {
445 const sp<IBinder> kApplyToken =
446 IInterface::asBinder(TransactionCompletedListener::getIInstance());
447 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800448 const auto kExpectedTransactionsPending = 1u;
449
450 const auto unsignaledTransaction =
451 createTransactionInfo(kApplyToken,
452 {
453 createComposerState(kLayerId,
454 fence(Fence::Status::Unsignaled),
455 layer_state_t::eCropChanged |
456 layer_state_t::
457 eBufferChanged),
458 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700459 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000460}
461
Ady Abraham9dada822022-02-03 10:26:59 -0800462TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueueSameApplyTokenMultiState) {
463 const sp<IBinder> kApplyToken =
464 IInterface::asBinder(TransactionCompletedListener::getIInstance());
465 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800466 const auto kExpectedTransactionsPending = 1u;
467
468 const auto mixedTransaction =
469 createTransactionInfo(kApplyToken,
470 {
471 createComposerState(kLayerId,
472 fence(Fence::Status::Unsignaled),
473 layer_state_t::eBufferChanged),
474 createComposerState(kLayerId,
475 fence(Fence::Status::Signaled),
476 layer_state_t::eBufferChanged),
477 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700478 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000479}
480
Ady Abraham9dada822022-02-03 10:26:59 -0800481TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueue_MultipleStateTransaction) {
482 const sp<IBinder> kApplyToken =
483 IInterface::asBinder(TransactionCompletedListener::getIInstance());
484 const auto kLayerId1 = 1;
485 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800486 const auto kExpectedTransactionsPending = 1u;
487
488 const auto mixedTransaction =
489 createTransactionInfo(kApplyToken,
490 {
491 createComposerState(kLayerId1,
492 fence(Fence::Status::Unsignaled),
493 layer_state_t::eBufferChanged),
494 createComposerState(kLayerId2,
495 fence(Fence::Status::Signaled),
496 layer_state_t::eBufferChanged),
497 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700498 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000499}
500
Ady Abraham9dada822022-02-03 10:26:59 -0800501TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSignaledFromTheQueue) {
502 const sp<IBinder> kApplyToken =
503 IInterface::asBinder(TransactionCompletedListener::getIInstance());
504 const auto kLayerId1 = 1;
505 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800506 const auto kExpectedTransactionsPending = 0u;
507
508 const auto signaledTransaction =
509 createTransactionInfo(kApplyToken,
510 {
511 createComposerState(kLayerId1,
512 fence(Fence::Status::Signaled),
513 layer_state_t::eBufferChanged),
514 });
515 const auto signaledTransaction2 =
516 createTransactionInfo(kApplyToken,
517 {
518 createComposerState(kLayerId2,
519 fence(Fence::Status::Signaled),
520 layer_state_t::eBufferChanged),
521 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700522 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000523}
524
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800525TEST_F(LatchUnsignaledAutoSingleLayerTest,
526 UnsignaledNotAppliedWhenThereAreSignaled_UnsignaledFirst) {
Ady Abraham9dada822022-02-03 10:26:59 -0800527 const sp<IBinder> kApplyToken1 =
528 IInterface::asBinder(TransactionCompletedListener::getIInstance());
529 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800530 const sp<IBinder> kApplyToken3 = sp<BBinder>::make();
Ady Abraham9dada822022-02-03 10:26:59 -0800531 const auto kLayerId1 = 1;
532 const auto kLayerId2 = 2;
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800533 const auto kExpectedTransactionsPending = 1u;
534
535 const auto unsignaledTransaction =
536 createTransactionInfo(kApplyToken1,
537 {
538 createComposerState(kLayerId1,
539 fence(Fence::Status::Unsignaled),
540 layer_state_t::eBufferChanged),
541 });
542
543 const auto signaledTransaction =
544 createTransactionInfo(kApplyToken2,
545 {
546 createComposerState(kLayerId2,
547 fence(Fence::Status::Signaled),
548 layer_state_t::eBufferChanged),
549 });
550 const auto signaledTransaction2 =
551 createTransactionInfo(kApplyToken3,
552 {
553 createComposerState(kLayerId2,
554 fence(Fence::Status::Signaled),
555 layer_state_t::eBufferChanged),
556 });
557
558 setTransactionStates({unsignaledTransaction, signaledTransaction, signaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700559 kExpectedTransactionsPending);
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800560}
561
Ady Abraham9dada822022-02-03 10:26:59 -0800562TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueueSameApplyToken) {
563 const sp<IBinder> kApplyToken =
564 IInterface::asBinder(TransactionCompletedListener::getIInstance());
565 const auto kLayerId1 = 1;
566 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800567 const auto kExpectedTransactionsPending = 1u;
568
569 const auto unsignaledTransaction =
570 createTransactionInfo(kApplyToken,
571 {
572 createComposerState(kLayerId1,
573 fence(Fence::Status::Unsignaled),
574 layer_state_t::eBufferChanged),
575 });
576 const auto signaledTransaction =
577 createTransactionInfo(kApplyToken,
578 {
579 createComposerState(kLayerId2,
580 fence(Fence::Status::Signaled),
581 layer_state_t::eBufferChanged),
582 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700583 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800584 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000585}
586
Ady Abraham9dada822022-02-03 10:26:59 -0800587TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueue) {
588 const sp<IBinder> kApplyToken1 =
589 IInterface::asBinder(TransactionCompletedListener::getIInstance());
590 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
591 const auto kLayerId1 = 1;
592 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800593 const auto kExpectedTransactionsPending = 1u;
594
595 const auto unsignaledTransaction =
596 createTransactionInfo(kApplyToken1,
597 {
598 createComposerState(kLayerId1,
599 fence(Fence::Status::Unsignaled),
600 layer_state_t::eBufferChanged),
601 });
602 const auto unsignaledTransaction2 =
603 createTransactionInfo(kApplyToken2,
604 {
605 createComposerState(kLayerId2,
606 fence(Fence::Status::Unsignaled),
607 layer_state_t::eBufferChanged),
608 });
609 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700610 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000611}
612
Ady Abraham2739e832022-02-14 17:42:00 -0800613TEST_F(LatchUnsignaledAutoSingleLayerTest, DontLatchUnsignaledWhenEarlyOffset) {
614 const sp<IBinder> kApplyToken =
615 IInterface::asBinder(TransactionCompletedListener::getIInstance());
616 const auto kLayerId = 1;
Ady Abraham2739e832022-02-14 17:42:00 -0800617 const auto kExpectedTransactionsPending = 1u;
618
619 const auto unsignaledTransaction =
620 createTransactionInfo(kApplyToken,
621 {
622 createComposerState(kLayerId,
623 fence(Fence::Status::Unsignaled),
624 layer_state_t::eBufferChanged),
625 });
626
627 // Get VsyncModulator out of the default config
628 static_cast<void>(mFlinger.mutableVsyncModulator()->onRefreshRateChangeInitiated());
629
Vishnu Nair1523dad2022-09-29 16:05:18 -0700630 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
Ady Abraham2739e832022-02-14 17:42:00 -0800631}
632
Ady Abraham9dada822022-02-03 10:26:59 -0800633class LatchUnsignaledDisabledTest : public LatchUnsignaledTest {
634public:
635 void SetUp() override {
636 LatchUnsignaledTest::SetUp();
637 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Disabled;
638 }
639};
640
641TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue) {
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 = 0u;
646
647 const auto signaledTransaction =
648 createTransactionInfo(kApplyToken,
649 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
650 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700651 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000652}
653
Ady Abraham9dada822022-02-03 10:26:59 -0800654TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueue) {
655 const sp<IBinder> kApplyToken =
656 IInterface::asBinder(TransactionCompletedListener::getIInstance());
657 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800658 const auto kExpectedTransactionsPending = 1u;
659
660 const auto unsignaledTransaction =
661 createTransactionInfo(kApplyToken,
662 {
663 createComposerState(kLayerId,
664 fence(Fence::Status::Unsignaled),
665 layer_state_t::eBufferChanged),
666 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700667 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000668}
669
Ady Abraham9dada822022-02-03 10:26:59 -0800670TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueSameLayerId) {
671 const sp<IBinder> kApplyToken =
672 IInterface::asBinder(TransactionCompletedListener::getIInstance());
673 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800674 const auto kExpectedTransactionsPending = 1u;
675
676 const auto unsignaledTransaction =
677 createTransactionInfo(kApplyToken,
678 {
679 createComposerState(kLayerId,
680 fence(Fence::Status::Unsignaled),
681 layer_state_t::eBufferChanged),
682 createComposerState(kLayerId,
683 fence(Fence::Status::Unsignaled),
684 layer_state_t::eBufferChanged),
685 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700686 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000687}
688
Ady Abraham9dada822022-02-03 10:26:59 -0800689TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueDifferentLayerId) {
690 const sp<IBinder> kApplyToken =
691 IInterface::asBinder(TransactionCompletedListener::getIInstance());
692 const auto kLayerId1 = 1;
693 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800694 const auto kExpectedTransactionsPending = 1u;
695
696 const auto unsignaledTransaction =
697 createTransactionInfo(kApplyToken,
698 {
699 createComposerState(kLayerId1,
700 fence(Fence::Status::Unsignaled),
701 layer_state_t::eBufferChanged),
702 createComposerState(kLayerId2,
703 fence(Fence::Status::Unsignaled),
704 layer_state_t::eBufferChanged),
705 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700706 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000707}
708
Ady Abraham9dada822022-02-03 10:26:59 -0800709TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
710 const sp<IBinder> kApplyToken =
711 IInterface::asBinder(TransactionCompletedListener::getIInstance());
712 const auto kLayerId1 = 1;
713 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800714 const auto kExpectedTransactionsPending = 0u;
715
716 const auto signaledTransaction =
717 createTransactionInfo(kApplyToken,
718 {
719 createComposerState(kLayerId1,
720 fence(Fence::Status::Signaled),
721 layer_state_t::eBufferChanged),
722 });
723 const auto signaledTransaction2 =
724 createTransactionInfo(kApplyToken,
725 {
726 createComposerState(kLayerId2,
727 fence(Fence::Status::Signaled),
728 layer_state_t::eBufferChanged),
729 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700730 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000731}
732
Ady Abraham9dada822022-02-03 10:26:59 -0800733TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueDifferentApplyToken) {
734 const sp<IBinder> kApplyToken1 =
735 IInterface::asBinder(TransactionCompletedListener::getIInstance());
736 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
737 const auto kLayerId1 = 1;
738 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800739 const auto kExpectedTransactionsPending = 1u;
740
741 const auto unsignaledTransaction =
742 createTransactionInfo(kApplyToken1,
743 {
744 createComposerState(kLayerId1,
745 fence(Fence::Status::Unsignaled),
746 layer_state_t::eBufferChanged),
747 });
748 const auto signaledTransaction =
749 createTransactionInfo(kApplyToken2,
750 {
751 createComposerState(kLayerId2,
752 fence(Fence::Status::Signaled),
753 layer_state_t::eBufferChanged),
754 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700755 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800756 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000757}
758
Ady Abraham9dada822022-02-03 10:26:59 -0800759TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueSameApplyToken) {
760 const sp<IBinder> kApplyToken =
761 IInterface::asBinder(TransactionCompletedListener::getIInstance());
762 const auto kLayerId1 = 1;
763 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800764 const auto kExpectedTransactionsPending = 1u;
765
766 const auto signaledTransaction =
767 createTransactionInfo(kApplyToken,
768 {
769 createComposerState(kLayerId1,
770 fence(Fence::Status::Signaled),
771 layer_state_t::eBufferChanged),
772 });
773 const auto unsignaledTransaction =
774 createTransactionInfo(kApplyToken,
775 {
776 createComposerState(kLayerId2,
777 fence(Fence::Status::Unsignaled),
778 layer_state_t::eBufferChanged),
779 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700780 setTransactionStates({signaledTransaction, unsignaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800781 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000782}
783
Ady Abraham9dada822022-02-03 10:26:59 -0800784TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheUnsignaledTheQueue) {
785 const sp<IBinder> kApplyToken =
786 IInterface::asBinder(TransactionCompletedListener::getIInstance());
787 const auto kLayerId1 = 1;
788 const auto kLayerId2 = 2;
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700789 const auto kExpectedTransactionsPending = 2u;
Ady Abraham9dada822022-02-03 10:26:59 -0800790
791 const auto unsignaledTransaction =
792 createTransactionInfo(kApplyToken,
793 {
794 createComposerState(kLayerId1,
795 fence(Fence::Status::Unsignaled),
796 layer_state_t::eBufferChanged),
797 });
798 const auto unsignaledTransaction2 =
799 createTransactionInfo(kApplyToken,
800 {
801 createComposerState(kLayerId2,
802 fence(Fence::Status::Unsignaled),
803 layer_state_t::eBufferChanged),
804 });
805 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700806 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000807}
808
Ady Abraham9dada822022-02-03 10:26:59 -0800809class LatchUnsignaledAlwaysTest : public LatchUnsignaledTest {
810public:
811 void SetUp() override {
812 LatchUnsignaledTest::SetUp();
813 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Always;
814 }
815};
816
817TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue) {
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 signaledTransaction =
824 createTransactionInfo(kApplyToken,
825 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
826 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700827 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000828}
829
Ady Abraham9dada822022-02-03 10:26:59 -0800830TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueue) {
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 unsignaledTransaction =
837 createTransactionInfo(kApplyToken,
838 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
839 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700840 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000841}
842
Ady Abraham9dada822022-02-03 10:26:59 -0800843TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueSameLayerId) {
844 const sp<IBinder> kApplyToken =
845 IInterface::asBinder(TransactionCompletedListener::getIInstance());
846 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800847 const auto kExpectedTransactionsPending = 0u;
848
849 const auto mixedTransaction =
850 createTransactionInfo(kApplyToken,
851 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
852 layer_state_t::eBufferChanged),
853 createComposerState(kLayerId, fence(Fence::Status::Signaled),
854 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700855 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000856}
857
Ady Abraham9dada822022-02-03 10:26:59 -0800858TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentLayerId) {
859 const sp<IBinder> kApplyToken =
860 IInterface::asBinder(TransactionCompletedListener::getIInstance());
861 const auto kLayerId1 = 1;
862 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800863 const auto kExpectedTransactionsPending = 0u;
864
865 const auto mixedTransaction =
866 createTransactionInfo(kApplyToken,
867 {createComposerState(kLayerId1, fence(Fence::Status::Unsignaled),
868 layer_state_t::eBufferChanged),
869 createComposerState(kLayerId2, fence(Fence::Status::Signaled),
870 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700871 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000872}
873
Ady Abraham9dada822022-02-03 10:26:59 -0800874TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
875 const sp<IBinder> kApplyToken =
876 IInterface::asBinder(TransactionCompletedListener::getIInstance());
877 const auto kLayerId1 = 1;
878 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800879 const auto kExpectedTransactionsPending = 0u;
880
881 const auto signaledTransaction =
882 createTransactionInfo(kApplyToken,
883 {
884 createComposerState(kLayerId1,
885 fence(Fence::Status::Signaled),
886 layer_state_t::eBufferChanged),
887 });
888 const auto signaledTransaction2 =
889 createTransactionInfo(kApplyToken,
890 {
891 createComposerState(kLayerId2,
892 fence(Fence::Status::Signaled),
893 layer_state_t::eBufferChanged),
894 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700895 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000896}
897
Ady Abraham9dada822022-02-03 10:26:59 -0800898TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentApplyToken) {
899 const sp<IBinder> kApplyToken1 =
900 IInterface::asBinder(TransactionCompletedListener::getIInstance());
901 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
902 const auto kLayerId1 = 1;
903 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800904 const auto kExpectedTransactionsPending = 0u;
905
906 const auto signaledTransaction =
907 createTransactionInfo(kApplyToken1,
908 {
909 createComposerState(kLayerId1,
910 fence(Fence::Status::Signaled),
911 layer_state_t::eBufferChanged),
912 });
913 const auto unsignaledTransaction =
914 createTransactionInfo(kApplyToken2,
915 {
916 createComposerState(kLayerId2,
917 fence(Fence::Status::Unsignaled),
918 layer_state_t::eBufferChanged),
919 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700920 setTransactionStates({signaledTransaction, unsignaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800921 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000922}
923
Ady Abraham9dada822022-02-03 10:26:59 -0800924TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueueSameApplyToken) {
925 const sp<IBinder> kApplyToken =
926 IInterface::asBinder(TransactionCompletedListener::getIInstance());
927 const auto kLayerId1 = 1;
928 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800929 const auto kExpectedTransactionsPending = 0u;
930
931 const auto unsignaledTransaction =
932 createTransactionInfo(kApplyToken,
933 {
934 createComposerState(kLayerId1,
935 fence(Fence::Status::Unsignaled),
936 layer_state_t::eBufferChanged),
937 });
938 const auto signaledTransaction =
939 createTransactionInfo(kApplyToken,
940 {
941 createComposerState(kLayerId2,
942 fence(Fence::Status::Signaled),
943 layer_state_t::eBufferChanged),
944 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700945 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800946 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000947}
948
Ady Abraham9dada822022-02-03 10:26:59 -0800949TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueue) {
950 const sp<IBinder> kApplyToken1 =
951 IInterface::asBinder(TransactionCompletedListener::getIInstance());
952 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
953 const auto kLayerId1 = 1;
954 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800955 const auto kExpectedTransactionsPending = 0u;
956
957 const auto unsignaledTransaction =
958 createTransactionInfo(kApplyToken1,
959 {
960 createComposerState(kLayerId1,
961 fence(Fence::Status::Unsignaled),
962 layer_state_t::eBufferChanged),
963 });
964 const auto unsignaledTransaction2 =
965 createTransactionInfo(kApplyToken2,
966 {
967 createComposerState(kLayerId2,
968 fence(Fence::Status::Unsignaled),
969 layer_state_t::eBufferChanged),
970 });
971 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700972 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000973}
974
Ady Abraham2739e832022-02-14 17:42:00 -0800975TEST_F(LatchUnsignaledAlwaysTest, LatchUnsignaledWhenEarlyOffset) {
976 const sp<IBinder> kApplyToken =
977 IInterface::asBinder(TransactionCompletedListener::getIInstance());
978 const auto kLayerId = 1;
Ady Abraham2739e832022-02-14 17:42:00 -0800979 const auto kExpectedTransactionsPending = 0u;
980
981 const auto unsignaledTransaction =
982 createTransactionInfo(kApplyToken,
983 {
984 createComposerState(kLayerId,
985 fence(Fence::Status::Unsignaled),
986 layer_state_t::eBufferChanged),
987 });
988
989 // Get VsyncModulator out of the default config
990 static_cast<void>(mFlinger.mutableVsyncModulator()->onRefreshRateChangeInitiated());
991
Vishnu Nair1523dad2022-09-29 16:05:18 -0700992 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
Ady Abraham2739e832022-02-14 17:42:00 -0800993}
994
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700995TEST(TransactionHandlerTest, QueueTransaction) {
996 TransactionHandler handler;
997 TransactionState transaction;
998 transaction.applyToken = sp<BBinder>::make();
999 transaction.id = 42;
1000 handler.queueTransaction(std::move(transaction));
1001 std::vector<TransactionState> transactionsReadyToBeApplied = handler.flushTransactions();
1002
1003 EXPECT_EQ(transactionsReadyToBeApplied.size(), 1u);
1004 EXPECT_EQ(transactionsReadyToBeApplied.front().id, 42u);
1005}
1006
Valerie Haud251afb2019-03-29 14:19:02 -07001007} // namespace android