blob: b4030b3617d8f32001d83e23572e17ef72b08289 [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
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -080017
Valerie Haud251afb2019-03-29 14:19:02 -070018#undef LOG_TAG
19#define LOG_TAG "CompositionTest"
20
21#include <compositionengine/Display.h>
22#include <compositionengine/mock/DisplaySurface.h>
23#include <gmock/gmock.h>
24#include <gtest/gtest.h>
25#include <gui/SurfaceComposerClient.h>
26#include <log/log.h>
ramindani4d48f902021-09-20 21:07:45 +000027#include <ui/MockFence.h>
Valerie Haud251afb2019-03-29 14:19:02 -070028#include <utils/String8.h>
Dominik Laskowski068173d2021-08-11 17:22:59 -070029
Valerie Haud251afb2019-03-29 14:19:02 -070030#include "TestableSurfaceFlinger.h"
Valerie Haud251afb2019-03-29 14:19:02 -070031#include "mock/MockEventThread.h"
Ady Abraham8cb21882020-08-26 18:22:05 -070032#include "mock/MockVsyncController.h"
Valerie Haud251afb2019-03-29 14:19:02 -070033
34namespace android {
35
36using testing::_;
37using testing::Return;
38
39using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
Vishnu Nair1523dad2022-09-29 16:05:18 -070040constexpr nsecs_t TRANSACTION_TIMEOUT = s2ns(5);
Valerie Haud251afb2019-03-29 14:19:02 -070041class TransactionApplicationTest : public testing::Test {
42public:
43 TransactionApplicationTest() {
44 const ::testing::TestInfo* const test_info =
45 ::testing::UnitTest::GetInstance()->current_test_info();
46 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
47
Valerie Haud251afb2019-03-29 14:19:02 -070048 setupScheduler();
49 }
50
51 ~TransactionApplicationTest() {
52 const ::testing::TestInfo* const test_info =
53 ::testing::UnitTest::GetInstance()->current_test_info();
54 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
55 }
56
57 void setupScheduler() {
58 auto eventThread = std::make_unique<mock::EventThread>();
59 auto sfEventThread = std::make_unique<mock::EventThread>();
60
61 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
62 EXPECT_CALL(*eventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070063 .WillOnce(Return(sp<EventThreadConnection>::make(eventThread.get(),
64 mock::EventThread::kCallingUid,
65 ResyncCallback())));
Valerie Haud251afb2019-03-29 14:19:02 -070066
67 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
68 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070069 .WillOnce(Return(sp<EventThreadConnection>::make(sfEventThread.get(),
70 mock::EventThread::kCallingUid,
71 ResyncCallback())));
Valerie Haud251afb2019-03-29 14:19:02 -070072
Ady Abraham8cb21882020-08-26 18:22:05 -070073 EXPECT_CALL(*mVSyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
74 EXPECT_CALL(*mVSyncTracker, currentPeriod())
Marin Shalamanov045b7002021-01-07 16:56:24 +010075 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
Valerie Haud251afb2019-03-29 14:19:02 -070076
Ady Abraham3efa3942021-06-24 19:01:25 -070077 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
Ady Abraham8cb21882020-08-26 18:22:05 -070078 mFlinger.setupScheduler(std::unique_ptr<mock::VsyncController>(mVsyncController),
79 std::unique_ptr<mock::VSyncTracker>(mVSyncTracker),
Valerie Haud251afb2019-03-29 14:19:02 -070080 std::move(eventThread), std::move(sfEventThread));
81 }
82
Valerie Haud251afb2019-03-29 14:19:02 -070083 TestableSurfaceFlinger mFlinger;
84
Ady Abraham8cb21882020-08-26 18:22:05 -070085 mock::VsyncController* mVsyncController = new mock::VsyncController();
86 mock::VSyncTracker* mVSyncTracker = new mock::VSyncTracker();
Valerie Haud251afb2019-03-29 14:19:02 -070087
88 struct TransactionInfo {
89 Vector<ComposerState> states;
90 Vector<DisplayState> displays;
91 uint32_t flags = 0;
92 sp<IBinder> applyToken = IInterface::asBinder(TransactionCompletedListener::getIInstance());
93 InputWindowCommands inputWindowCommands;
Ady Abrahamf0c56492020-12-17 18:04:15 -080094 int64_t desiredPresentTime = 0;
95 bool isAutoTimestamp = true;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -100096 FrameTimelineInfo frameTimelineInfo;
Valerie Haud251afb2019-03-29 14:19:02 -070097 client_cache_t uncacheBuffer;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -100098 uint64_t id = static_cast<uint64_t>(-1);
99 static_assert(0xffffffffffffffff == static_cast<uint64_t>(-1));
Valerie Haud251afb2019-03-29 14:19:02 -0700100 };
101
Vishnu Nair6b591152021-10-08 11:45:14 -0700102 void checkEqual(TransactionInfo info, TransactionState state) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000103 EXPECT_EQ(0u, info.states.size());
104 EXPECT_EQ(0u, state.states.size());
Valerie Haud251afb2019-03-29 14:19:02 -0700105
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000106 EXPECT_EQ(0u, info.displays.size());
107 EXPECT_EQ(0u, state.displays.size());
Valerie Haud251afb2019-03-29 14:19:02 -0700108 EXPECT_EQ(info.flags, state.flags);
109 EXPECT_EQ(info.desiredPresentTime, state.desiredPresentTime);
110 }
111
Patrick Williams641f7f22022-06-22 19:25:35 +0000112 void setupSingle(TransactionInfo& transaction, uint32_t flags, int64_t desiredPresentTime,
113 bool isAutoTimestamp, const FrameTimelineInfo& frameTimelineInfo) {
Valerie Haud251afb2019-03-29 14:19:02 -0700114 mTransactionNumber++;
Vishnu Nair1523dad2022-09-29 16:05:18 -0700115 transaction.flags |= flags;
Valerie Haud251afb2019-03-29 14:19:02 -0700116 transaction.desiredPresentTime = desiredPresentTime;
Ady Abrahamf0c56492020-12-17 18:04:15 -0800117 transaction.isAutoTimestamp = isAutoTimestamp;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000118 transaction.frameTimelineInfo = frameTimelineInfo;
Valerie Haud251afb2019-03-29 14:19:02 -0700119 }
120
Patrick Williams641f7f22022-06-22 19:25:35 +0000121 void NotPlacedOnTransactionQueue(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000122 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700123 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700124 TransactionInfo transaction;
Patrick Williams641f7f22022-06-22 19:25:35 +0000125 setupSingle(transaction, flags,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800126 /*desiredPresentTime*/ systemTime(), /*isAutoTimestamp*/ true,
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000127 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700128 nsecs_t applicationTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000129 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700130 transaction.displays, transaction.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700131 transaction.applyToken, transaction.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800132 transaction.desiredPresentTime, transaction.isAutoTimestamp,
133 transaction.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
134 transaction.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700135
Patrick Williams641f7f22022-06-22 19:25:35 +0000136 // If transaction is synchronous, SF applyTransactionState should time out (5s) wating for
137 // SF to commit the transaction. If this is animation, it should not time out waiting.
Valerie Haud251afb2019-03-29 14:19:02 -0700138 nsecs_t returnedTime = systemTime();
Vishnu Nair1523dad2022-09-29 16:05:18 -0700139 EXPECT_LE(returnedTime, applicationTime + TRANSACTION_TIMEOUT);
Arthur Hung58144272021-01-16 03:43:53 +0000140 // Each transaction should have been placed on the transaction queue
Vishnu Nair60d902e2022-07-20 02:55:37 +0000141 auto& transactionQueue = mFlinger.getTransactionQueue();
142 EXPECT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700143 }
144
Patrick Williams641f7f22022-06-22 19:25:35 +0000145 void PlaceOnTransactionQueue(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000146 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700147 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700148
149 // first check will see desired present time has not passed,
150 // but afterwards it will look like the desired present time has passed
151 nsecs_t time = systemTime();
Valerie Haud251afb2019-03-29 14:19:02 -0700152 TransactionInfo transaction;
Patrick Williams641f7f22022-06-22 19:25:35 +0000153 setupSingle(transaction, flags, /*desiredPresentTime*/ time + s2ns(1), false,
154 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700155 nsecs_t applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000156 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700157 transaction.displays, transaction.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700158 transaction.applyToken, transaction.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800159 transaction.desiredPresentTime, transaction.isAutoTimestamp,
160 transaction.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
161 transaction.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700162
163 nsecs_t returnedTime = systemTime();
Vishnu Nair1523dad2022-09-29 16:05:18 -0700164 EXPECT_LE(returnedTime, applicationSentTime + TRANSACTION_TIMEOUT);
Valerie Haud251afb2019-03-29 14:19:02 -0700165 // This transaction should have been placed on the transaction queue
Vishnu Nair60d902e2022-07-20 02:55:37 +0000166 auto& transactionQueue = mFlinger.getTransactionQueue();
167 EXPECT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700168 }
169
Patrick Williams641f7f22022-06-22 19:25:35 +0000170 void BlockedByPriorTransaction(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000171 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700172 nsecs_t time = systemTime();
Patrick Williams641f7f22022-06-22 19:25:35 +0000173 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(2);
174
Valerie Haud251afb2019-03-29 14:19:02 -0700175 // transaction that should go on the pending thread
176 TransactionInfo transactionA;
Patrick Williams641f7f22022-06-22 19:25:35 +0000177 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ time + s2ns(1), false,
178 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700179
180 // transaction that would not have gone on the pending thread if not
181 // blocked
182 TransactionInfo transactionB;
Patrick Williams641f7f22022-06-22 19:25:35 +0000183 setupSingle(transactionB, flags, /*desiredPresentTime*/ systemTime(),
184 /*isAutoTimestamp*/ true, FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700185
186 nsecs_t applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000187 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700188 transactionA.displays, transactionA.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700189 transactionA.applyToken, transactionA.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800190 transactionA.desiredPresentTime, transactionA.isAutoTimestamp,
191 transactionA.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
192 transactionA.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700193
194 // This thread should not have been blocked by the above transaction
195 // (5s is the timeout period that applyTransactionState waits for SF to
196 // commit the transaction)
Vishnu Nair1523dad2022-09-29 16:05:18 -0700197 EXPECT_LE(systemTime(), applicationSentTime + TRANSACTION_TIMEOUT);
Arthur Hung58144272021-01-16 03:43:53 +0000198 // transaction that would goes to pending transaciton queue.
199 mFlinger.flushTransactionQueues();
Valerie Haud251afb2019-03-29 14:19:02 -0700200
201 applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000202 mFlinger.setTransactionState(transactionB.frameTimelineInfo, transactionB.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700203 transactionB.displays, transactionB.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700204 transactionB.applyToken, transactionB.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800205 transactionB.desiredPresentTime, transactionB.isAutoTimestamp,
206 transactionB.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
207 transactionB.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700208
209 // this thread should have been blocked by the above transaction
210 // if this is an animation, this thread should be blocked for 5s
211 // in setTransactionState waiting for transactionA to flush. Otherwise,
212 // the transaction should be placed on the pending queue
Vishnu Nair1523dad2022-09-29 16:05:18 -0700213 EXPECT_LE(systemTime(), applicationSentTime + TRANSACTION_TIMEOUT);
Valerie Haud251afb2019-03-29 14:19:02 -0700214
Arthur Hung58144272021-01-16 03:43:53 +0000215 // transaction that would goes to pending transaciton queue.
216 mFlinger.flushTransactionQueues();
217
Ady Abrahame46243a2021-02-23 19:33:49 -0800218 // check that the transaction was applied.
Arthur Hung58144272021-01-16 03:43:53 +0000219 auto transactionQueue = mFlinger.getPendingTransactionQueue();
Ady Abrahame46243a2021-02-23 19:33:49 -0800220 EXPECT_EQ(0u, transactionQueue.size());
Valerie Haud251afb2019-03-29 14:19:02 -0700221 }
222
223 bool mHasListenerCallbacks = false;
224 std::vector<ListenerCallbacks> mCallbacks;
225 int mTransactionNumber = 0;
226};
227
Vishnu Nair60d902e2022-07-20 02:55:37 +0000228TEST_F(TransactionApplicationTest, AddToPendingQueue) {
229 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700230 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700231
Valerie Haud251afb2019-03-29 14:19:02 -0700232 TransactionInfo transactionA; // transaction to go on pending queue
Patrick Williams641f7f22022-06-22 19:25:35 +0000233 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ s2ns(1), false,
234 FrameTimelineInfo{});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000235 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700236 transactionA.displays, transactionA.flags, transactionA.applyToken,
237 transactionA.inputWindowCommands, transactionA.desiredPresentTime,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800238 transactionA.isAutoTimestamp, transactionA.uncacheBuffer,
239 mHasListenerCallbacks, mCallbacks, transactionA.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700240
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000241 auto& transactionQueue = mFlinger.getTransactionQueue();
Vishnu Nair60d902e2022-07-20 02:55:37 +0000242 ASSERT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700243
Vishnu Nair60d902e2022-07-20 02:55:37 +0000244 auto transactionState = transactionQueue.pop().value();
Valerie Haud251afb2019-03-29 14:19:02 -0700245 checkEqual(transactionA, transactionState);
Vishnu Nair60d902e2022-07-20 02:55:37 +0000246}
247
248TEST_F(TransactionApplicationTest, Flush_RemovesFromQueue) {
249 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
250 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
251
252 TransactionInfo transactionA; // transaction to go on pending queue
253 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ s2ns(1), false,
254 FrameTimelineInfo{});
255 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
256 transactionA.displays, transactionA.flags, transactionA.applyToken,
257 transactionA.inputWindowCommands, transactionA.desiredPresentTime,
258 transactionA.isAutoTimestamp, transactionA.uncacheBuffer,
259 mHasListenerCallbacks, mCallbacks, transactionA.id);
260
261 auto& transactionQueue = mFlinger.getTransactionQueue();
262 ASSERT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700263
264 // because flushing uses the cached expected present time, we send an empty
265 // transaction here (sending a null applyToken to fake it as from a
266 // different process) to re-query and reset the cached expected present time
267 TransactionInfo empty;
268 empty.applyToken = sp<IBinder>();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000269 mFlinger.setTransactionState(empty.frameTimelineInfo, empty.states, empty.displays, empty.flags,
270 empty.applyToken, empty.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800271 empty.desiredPresentTime, empty.isAutoTimestamp,
272 empty.uncacheBuffer, mHasListenerCallbacks, mCallbacks, empty.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700273
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000274 // flush transaction queue should flush as desiredPresentTime has
Valerie Haud251afb2019-03-29 14:19:02 -0700275 // passed
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000276 mFlinger.flushTransactionQueues();
Valerie Haud251afb2019-03-29 14:19:02 -0700277
Vishnu Nair60d902e2022-07-20 02:55:37 +0000278 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700279}
280
Valerie Haud251afb2019-03-29 14:19:02 -0700281TEST_F(TransactionApplicationTest, NotPlacedOnTransactionQueue_SyncInputWindows) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000282 NotPlacedOnTransactionQueue(/*flags*/ 0);
Valerie Haud251afb2019-03-29 14:19:02 -0700283}
284
Valerie Haud251afb2019-03-29 14:19:02 -0700285TEST_F(TransactionApplicationTest, PlaceOnTransactionQueue_SyncInputWindows) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000286 PlaceOnTransactionQueue(/*flags*/ 0);
Valerie Haud251afb2019-03-29 14:19:02 -0700287}
288
Valerie Hau09e60052019-12-15 14:51:15 -0800289TEST_F(TransactionApplicationTest, FromHandle) {
290 sp<IBinder> badHandle;
291 auto ret = mFlinger.fromHandle(badHandle);
Alec Mouri9a02eda2020-04-21 17:39:34 -0700292 EXPECT_EQ(nullptr, ret.promote().get());
Valerie Hau09e60052019-12-15 14:51:15 -0800293}
ramindani4d48f902021-09-20 21:07:45 +0000294
Ady Abraham9dada822022-02-03 10:26:59 -0800295class LatchUnsignaledTest : public TransactionApplicationTest {
296public:
297 void TearDown() override {
298 // Clear all transaction queues to release all transactions we sent
299 // in the tests. Otherwise, gmock complains about memory leaks.
Vishnu Nair60d902e2022-07-20 02:55:37 +0000300 while (!mFlinger.getTransactionQueue().isEmpty()) {
301 mFlinger.getTransactionQueue().pop();
302 }
Ady Abraham9dada822022-02-03 10:26:59 -0800303 mFlinger.getPendingTransactionQueue().clear();
Ady Abraham9dada822022-02-03 10:26:59 -0800304 mFlinger.commitTransactionsLocked(eTransactionMask);
305 mFlinger.mutableCurrentState().layersSortedByZ.clear();
306 mFlinger.mutableDrawingState().layersSortedByZ.clear();
307 }
308
309 static sp<Fence> fence(Fence::Status status) {
310 const auto fence = sp<mock::MockFence>::make();
311 EXPECT_CALL(*fence, getStatus()).WillRepeatedly(Return(status));
312 return fence;
313 }
314
315 ComposerState createComposerState(int layerId, sp<Fence> fence, uint64_t what) {
316 ComposerState state;
317 state.state.bufferData = std::make_shared<BufferData>();
318 state.state.bufferData->acquireFence = std::move(fence);
319 state.state.layerId = layerId;
320 state.state.surface =
Patrick Williams83f36b22022-09-14 17:57:35 +0000321 sp<Layer>::make(LayerCreationArgs(mFlinger.flinger(), nullptr, "TestLayer", 0, {}))
Ady Abraham9dada822022-02-03 10:26:59 -0800322 ->getHandle();
323 state.state.bufferData->flags = BufferData::BufferDataChange::fenceChanged;
324
325 state.state.what = what;
326 if (what & layer_state_t::eCropChanged) {
327 state.state.crop = Rect(1, 2, 3, 4);
328 }
329 return state;
330 }
331
332 TransactionInfo createTransactionInfo(const sp<IBinder>& applyToken,
333 const std::vector<ComposerState>& states) {
334 TransactionInfo transaction;
Vishnu Nair1523dad2022-09-29 16:05:18 -0700335 const uint32_t kFlags = 0;
Ady Abraham9dada822022-02-03 10:26:59 -0800336 const nsecs_t kDesiredPresentTime = systemTime();
337 const bool kIsAutoTimestamp = true;
338 const auto kFrameTimelineInfo = FrameTimelineInfo{};
339
Patrick Williams641f7f22022-06-22 19:25:35 +0000340 setupSingle(transaction, kFlags, kDesiredPresentTime, kIsAutoTimestamp, kFrameTimelineInfo);
Ady Abraham9dada822022-02-03 10:26:59 -0800341 transaction.applyToken = applyToken;
342 for (const auto& state : states) {
343 transaction.states.push_back(state);
344 }
345
346 return transaction;
347 }
348
349 void setTransactionStates(const std::vector<TransactionInfo>& transactions,
Ady Abraham9dada822022-02-03 10:26:59 -0800350 size_t expectedTransactionsPending) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000351 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Ady Abraham9dada822022-02-03 10:26:59 -0800352 EXPECT_EQ(0u, mFlinger.getPendingTransactionQueue().size());
353
354 for (const auto& transaction : transactions) {
355 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
356 transaction.displays, transaction.flags,
357 transaction.applyToken, transaction.inputWindowCommands,
358 transaction.desiredPresentTime,
359 transaction.isAutoTimestamp, transaction.uncacheBuffer,
360 mHasListenerCallbacks, mCallbacks, transaction.id);
361 }
362 mFlinger.flushTransactionQueues();
Vishnu Nair60d902e2022-07-20 02:55:37 +0000363 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Ady Abraham9dada822022-02-03 10:26:59 -0800364 EXPECT_EQ(expectedTransactionsPending, mFlinger.getPendingTransactionQueue().size());
Ady Abraham9dada822022-02-03 10:26:59 -0800365 }
366};
367
368class LatchUnsignaledAutoSingleLayerTest : public LatchUnsignaledTest {
369public:
370 void SetUp() override {
371 LatchUnsignaledTest::SetUp();
372 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::AutoSingleLayer;
373 }
374};
375
376TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleSignaledFromTheQueue) {
377 const sp<IBinder> kApplyToken =
378 IInterface::asBinder(TransactionCompletedListener::getIInstance());
379 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800380 const auto kExpectedTransactionsPending = 0u;
381
382 const auto signaledTransaction =
383 createTransactionInfo(kApplyToken,
384 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
385 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700386 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000387}
388
Ady Abraham9dada822022-02-03 10:26:59 -0800389TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleUnSignaledFromTheQueue) {
390 const sp<IBinder> kApplyToken =
391 IInterface::asBinder(TransactionCompletedListener::getIInstance());
392 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800393 const auto kExpectedTransactionsPending = 0u;
394
395 const auto unsignaledTransaction =
396 createTransactionInfo(kApplyToken,
397 {
398 createComposerState(kLayerId,
399 fence(Fence::Status::Unsignaled),
400 layer_state_t::eBufferChanged),
401 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700402 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000403}
404
Ady Abraham9dada822022-02-03 10:26:59 -0800405TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferCropChange) {
406 const sp<IBinder> kApplyToken =
407 IInterface::asBinder(TransactionCompletedListener::getIInstance());
408 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800409 const auto kExpectedTransactionsPending = 1u;
410
411 const auto unsignaledTransaction =
412 createTransactionInfo(kApplyToken,
413 {
414 createComposerState(kLayerId,
415 fence(Fence::Status::Unsignaled),
416 layer_state_t::eCropChanged),
417 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700418 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000419}
420
Ady Abraham9dada822022-02-03 10:26:59 -0800421TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferChangeClubed) {
422 const sp<IBinder> kApplyToken =
423 IInterface::asBinder(TransactionCompletedListener::getIInstance());
424 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800425 const auto kExpectedTransactionsPending = 1u;
426
427 const auto unsignaledTransaction =
428 createTransactionInfo(kApplyToken,
429 {
430 createComposerState(kLayerId,
431 fence(Fence::Status::Unsignaled),
432 layer_state_t::eCropChanged |
433 layer_state_t::
434 eBufferChanged),
435 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700436 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000437}
438
Ady Abraham9dada822022-02-03 10:26:59 -0800439TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueueSameApplyTokenMultiState) {
440 const sp<IBinder> kApplyToken =
441 IInterface::asBinder(TransactionCompletedListener::getIInstance());
442 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800443 const auto kExpectedTransactionsPending = 1u;
444
445 const auto mixedTransaction =
446 createTransactionInfo(kApplyToken,
447 {
448 createComposerState(kLayerId,
449 fence(Fence::Status::Unsignaled),
450 layer_state_t::eBufferChanged),
451 createComposerState(kLayerId,
452 fence(Fence::Status::Signaled),
453 layer_state_t::eBufferChanged),
454 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700455 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000456}
457
Ady Abraham9dada822022-02-03 10:26:59 -0800458TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueue_MultipleStateTransaction) {
459 const sp<IBinder> kApplyToken =
460 IInterface::asBinder(TransactionCompletedListener::getIInstance());
461 const auto kLayerId1 = 1;
462 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800463 const auto kExpectedTransactionsPending = 1u;
464
465 const auto mixedTransaction =
466 createTransactionInfo(kApplyToken,
467 {
468 createComposerState(kLayerId1,
469 fence(Fence::Status::Unsignaled),
470 layer_state_t::eBufferChanged),
471 createComposerState(kLayerId2,
472 fence(Fence::Status::Signaled),
473 layer_state_t::eBufferChanged),
474 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700475 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000476}
477
Ady Abraham9dada822022-02-03 10:26:59 -0800478TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSignaledFromTheQueue) {
479 const sp<IBinder> kApplyToken =
480 IInterface::asBinder(TransactionCompletedListener::getIInstance());
481 const auto kLayerId1 = 1;
482 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800483 const auto kExpectedTransactionsPending = 0u;
484
485 const auto signaledTransaction =
486 createTransactionInfo(kApplyToken,
487 {
488 createComposerState(kLayerId1,
489 fence(Fence::Status::Signaled),
490 layer_state_t::eBufferChanged),
491 });
492 const auto signaledTransaction2 =
493 createTransactionInfo(kApplyToken,
494 {
495 createComposerState(kLayerId2,
496 fence(Fence::Status::Signaled),
497 layer_state_t::eBufferChanged),
498 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700499 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000500}
501
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800502TEST_F(LatchUnsignaledAutoSingleLayerTest,
503 UnsignaledNotAppliedWhenThereAreSignaled_UnsignaledFirst) {
Ady Abraham9dada822022-02-03 10:26:59 -0800504 const sp<IBinder> kApplyToken1 =
505 IInterface::asBinder(TransactionCompletedListener::getIInstance());
506 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800507 const sp<IBinder> kApplyToken3 = sp<BBinder>::make();
Ady Abraham9dada822022-02-03 10:26:59 -0800508 const auto kLayerId1 = 1;
509 const auto kLayerId2 = 2;
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800510 const auto kExpectedTransactionsPending = 1u;
511
512 const auto unsignaledTransaction =
513 createTransactionInfo(kApplyToken1,
514 {
515 createComposerState(kLayerId1,
516 fence(Fence::Status::Unsignaled),
517 layer_state_t::eBufferChanged),
518 });
519
520 const auto signaledTransaction =
521 createTransactionInfo(kApplyToken2,
522 {
523 createComposerState(kLayerId2,
524 fence(Fence::Status::Signaled),
525 layer_state_t::eBufferChanged),
526 });
527 const auto signaledTransaction2 =
528 createTransactionInfo(kApplyToken3,
529 {
530 createComposerState(kLayerId2,
531 fence(Fence::Status::Signaled),
532 layer_state_t::eBufferChanged),
533 });
534
535 setTransactionStates({unsignaledTransaction, signaledTransaction, signaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700536 kExpectedTransactionsPending);
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800537}
538
539TEST_F(LatchUnsignaledAutoSingleLayerTest, UnsignaledNotAppliedWhenThereAreSignaled_SignaledFirst) {
540 const sp<IBinder> kApplyToken1 =
541 IInterface::asBinder(TransactionCompletedListener::getIInstance());
542 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
543 const sp<IBinder> kApplyToken3 = sp<BBinder>::make();
544 const auto kLayerId1 = 1;
545 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800546 const auto kExpectedTransactionsPending = 1u;
547
548 const auto signaledTransaction =
549 createTransactionInfo(kApplyToken1,
550 {
551 createComposerState(kLayerId1,
552 fence(Fence::Status::Signaled),
553 layer_state_t::eBufferChanged),
554 });
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800555 const auto signaledTransaction2 =
Ady Abraham9dada822022-02-03 10:26:59 -0800556 createTransactionInfo(kApplyToken2,
557 {
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800558 createComposerState(kLayerId1,
559 fence(Fence::Status::Signaled),
560 layer_state_t::eBufferChanged),
561 });
562 const auto unsignaledTransaction =
563 createTransactionInfo(kApplyToken3,
564 {
Ady Abraham9dada822022-02-03 10:26:59 -0800565 createComposerState(kLayerId2,
566 fence(Fence::Status::Unsignaled),
567 layer_state_t::eBufferChanged),
568 });
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800569
570 setTransactionStates({signaledTransaction, signaledTransaction2, unsignaledTransaction},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700571 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000572}
573
Ady Abraham9dada822022-02-03 10:26:59 -0800574TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueueSameApplyToken) {
575 const sp<IBinder> kApplyToken =
576 IInterface::asBinder(TransactionCompletedListener::getIInstance());
577 const auto kLayerId1 = 1;
578 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800579 const auto kExpectedTransactionsPending = 1u;
580
581 const auto unsignaledTransaction =
582 createTransactionInfo(kApplyToken,
583 {
584 createComposerState(kLayerId1,
585 fence(Fence::Status::Unsignaled),
586 layer_state_t::eBufferChanged),
587 });
588 const auto signaledTransaction =
589 createTransactionInfo(kApplyToken,
590 {
591 createComposerState(kLayerId2,
592 fence(Fence::Status::Signaled),
593 layer_state_t::eBufferChanged),
594 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700595 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800596 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000597}
598
Ady Abraham9dada822022-02-03 10:26:59 -0800599TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueue) {
600 const sp<IBinder> kApplyToken1 =
601 IInterface::asBinder(TransactionCompletedListener::getIInstance());
602 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
603 const auto kLayerId1 = 1;
604 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800605 const auto kExpectedTransactionsPending = 1u;
606
607 const auto unsignaledTransaction =
608 createTransactionInfo(kApplyToken1,
609 {
610 createComposerState(kLayerId1,
611 fence(Fence::Status::Unsignaled),
612 layer_state_t::eBufferChanged),
613 });
614 const auto unsignaledTransaction2 =
615 createTransactionInfo(kApplyToken2,
616 {
617 createComposerState(kLayerId2,
618 fence(Fence::Status::Unsignaled),
619 layer_state_t::eBufferChanged),
620 });
621 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700622 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000623}
624
Ady Abraham2739e832022-02-14 17:42:00 -0800625TEST_F(LatchUnsignaledAutoSingleLayerTest, DontLatchUnsignaledWhenEarlyOffset) {
626 const sp<IBinder> kApplyToken =
627 IInterface::asBinder(TransactionCompletedListener::getIInstance());
628 const auto kLayerId = 1;
Ady Abraham2739e832022-02-14 17:42:00 -0800629 const auto kExpectedTransactionsPending = 1u;
630
631 const auto unsignaledTransaction =
632 createTransactionInfo(kApplyToken,
633 {
634 createComposerState(kLayerId,
635 fence(Fence::Status::Unsignaled),
636 layer_state_t::eBufferChanged),
637 });
638
639 // Get VsyncModulator out of the default config
640 static_cast<void>(mFlinger.mutableVsyncModulator()->onRefreshRateChangeInitiated());
641
Vishnu Nair1523dad2022-09-29 16:05:18 -0700642 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
Ady Abraham2739e832022-02-14 17:42:00 -0800643}
644
Ady Abraham9dada822022-02-03 10:26:59 -0800645class LatchUnsignaledDisabledTest : public LatchUnsignaledTest {
646public:
647 void SetUp() override {
648 LatchUnsignaledTest::SetUp();
649 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Disabled;
650 }
651};
652
653TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue) {
654 const sp<IBinder> kApplyToken =
655 IInterface::asBinder(TransactionCompletedListener::getIInstance());
656 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800657 const auto kExpectedTransactionsPending = 0u;
658
659 const auto signaledTransaction =
660 createTransactionInfo(kApplyToken,
661 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
662 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700663 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000664}
665
Ady Abraham9dada822022-02-03 10:26:59 -0800666TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueue) {
667 const sp<IBinder> kApplyToken =
668 IInterface::asBinder(TransactionCompletedListener::getIInstance());
669 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800670 const auto kExpectedTransactionsPending = 1u;
671
672 const auto unsignaledTransaction =
673 createTransactionInfo(kApplyToken,
674 {
675 createComposerState(kLayerId,
676 fence(Fence::Status::Unsignaled),
677 layer_state_t::eBufferChanged),
678 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700679 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000680}
681
Ady Abraham9dada822022-02-03 10:26:59 -0800682TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueSameLayerId) {
683 const sp<IBinder> kApplyToken =
684 IInterface::asBinder(TransactionCompletedListener::getIInstance());
685 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800686 const auto kExpectedTransactionsPending = 1u;
687
688 const auto unsignaledTransaction =
689 createTransactionInfo(kApplyToken,
690 {
691 createComposerState(kLayerId,
692 fence(Fence::Status::Unsignaled),
693 layer_state_t::eBufferChanged),
694 createComposerState(kLayerId,
695 fence(Fence::Status::Unsignaled),
696 layer_state_t::eBufferChanged),
697 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700698 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000699}
700
Ady Abraham9dada822022-02-03 10:26:59 -0800701TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueDifferentLayerId) {
702 const sp<IBinder> kApplyToken =
703 IInterface::asBinder(TransactionCompletedListener::getIInstance());
704 const auto kLayerId1 = 1;
705 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800706 const auto kExpectedTransactionsPending = 1u;
707
708 const auto unsignaledTransaction =
709 createTransactionInfo(kApplyToken,
710 {
711 createComposerState(kLayerId1,
712 fence(Fence::Status::Unsignaled),
713 layer_state_t::eBufferChanged),
714 createComposerState(kLayerId2,
715 fence(Fence::Status::Unsignaled),
716 layer_state_t::eBufferChanged),
717 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700718 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000719}
720
Ady Abraham9dada822022-02-03 10:26:59 -0800721TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
722 const sp<IBinder> kApplyToken =
723 IInterface::asBinder(TransactionCompletedListener::getIInstance());
724 const auto kLayerId1 = 1;
725 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800726 const auto kExpectedTransactionsPending = 0u;
727
728 const auto signaledTransaction =
729 createTransactionInfo(kApplyToken,
730 {
731 createComposerState(kLayerId1,
732 fence(Fence::Status::Signaled),
733 layer_state_t::eBufferChanged),
734 });
735 const auto signaledTransaction2 =
736 createTransactionInfo(kApplyToken,
737 {
738 createComposerState(kLayerId2,
739 fence(Fence::Status::Signaled),
740 layer_state_t::eBufferChanged),
741 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700742 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000743}
744
Ady Abraham9dada822022-02-03 10:26:59 -0800745TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueDifferentApplyToken) {
746 const sp<IBinder> kApplyToken1 =
747 IInterface::asBinder(TransactionCompletedListener::getIInstance());
748 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
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 unsignaledTransaction =
754 createTransactionInfo(kApplyToken1,
755 {
756 createComposerState(kLayerId1,
757 fence(Fence::Status::Unsignaled),
758 layer_state_t::eBufferChanged),
759 });
760 const auto signaledTransaction =
761 createTransactionInfo(kApplyToken2,
762 {
763 createComposerState(kLayerId2,
764 fence(Fence::Status::Signaled),
765 layer_state_t::eBufferChanged),
766 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700767 setTransactionStates({unsignaledTransaction, signaledTransaction},
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_KeepInTheQueueSameApplyToken) {
772 const sp<IBinder> kApplyToken =
773 IInterface::asBinder(TransactionCompletedListener::getIInstance());
774 const auto kLayerId1 = 1;
775 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800776 const auto kExpectedTransactionsPending = 1u;
777
778 const auto signaledTransaction =
779 createTransactionInfo(kApplyToken,
780 {
781 createComposerState(kLayerId1,
782 fence(Fence::Status::Signaled),
783 layer_state_t::eBufferChanged),
784 });
785 const auto unsignaledTransaction =
786 createTransactionInfo(kApplyToken,
787 {
788 createComposerState(kLayerId2,
789 fence(Fence::Status::Unsignaled),
790 layer_state_t::eBufferChanged),
791 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700792 setTransactionStates({signaledTransaction, unsignaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800793 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000794}
795
Ady Abraham9dada822022-02-03 10:26:59 -0800796TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheUnsignaledTheQueue) {
797 const sp<IBinder> kApplyToken =
798 IInterface::asBinder(TransactionCompletedListener::getIInstance());
799 const auto kLayerId1 = 1;
800 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800801 const auto kExpectedTransactionsPending = 1u;
802
803 const auto unsignaledTransaction =
804 createTransactionInfo(kApplyToken,
805 {
806 createComposerState(kLayerId1,
807 fence(Fence::Status::Unsignaled),
808 layer_state_t::eBufferChanged),
809 });
810 const auto unsignaledTransaction2 =
811 createTransactionInfo(kApplyToken,
812 {
813 createComposerState(kLayerId2,
814 fence(Fence::Status::Unsignaled),
815 layer_state_t::eBufferChanged),
816 });
817 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700818 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000819}
820
Ady Abraham9dada822022-02-03 10:26:59 -0800821class LatchUnsignaledAlwaysTest : public LatchUnsignaledTest {
822public:
823 void SetUp() override {
824 LatchUnsignaledTest::SetUp();
825 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Always;
826 }
827};
828
829TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue) {
830 const sp<IBinder> kApplyToken =
831 IInterface::asBinder(TransactionCompletedListener::getIInstance());
832 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800833 const auto kExpectedTransactionsPending = 0u;
834
835 const auto signaledTransaction =
836 createTransactionInfo(kApplyToken,
837 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
838 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700839 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000840}
841
Ady Abraham9dada822022-02-03 10:26:59 -0800842TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueue) {
843 const sp<IBinder> kApplyToken =
844 IInterface::asBinder(TransactionCompletedListener::getIInstance());
845 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800846 const auto kExpectedTransactionsPending = 0u;
847
848 const auto unsignaledTransaction =
849 createTransactionInfo(kApplyToken,
850 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
851 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700852 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000853}
854
Ady Abraham9dada822022-02-03 10:26:59 -0800855TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueSameLayerId) {
856 const sp<IBinder> kApplyToken =
857 IInterface::asBinder(TransactionCompletedListener::getIInstance());
858 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800859 const auto kExpectedTransactionsPending = 0u;
860
861 const auto mixedTransaction =
862 createTransactionInfo(kApplyToken,
863 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
864 layer_state_t::eBufferChanged),
865 createComposerState(kLayerId, fence(Fence::Status::Signaled),
866 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700867 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000868}
869
Ady Abraham9dada822022-02-03 10:26:59 -0800870TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentLayerId) {
871 const sp<IBinder> kApplyToken =
872 IInterface::asBinder(TransactionCompletedListener::getIInstance());
873 const auto kLayerId1 = 1;
874 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800875 const auto kExpectedTransactionsPending = 0u;
876
877 const auto mixedTransaction =
878 createTransactionInfo(kApplyToken,
879 {createComposerState(kLayerId1, fence(Fence::Status::Unsignaled),
880 layer_state_t::eBufferChanged),
881 createComposerState(kLayerId2, fence(Fence::Status::Signaled),
882 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700883 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000884}
885
Ady Abraham9dada822022-02-03 10:26:59 -0800886TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
887 const sp<IBinder> kApplyToken =
888 IInterface::asBinder(TransactionCompletedListener::getIInstance());
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(kApplyToken,
895 {
896 createComposerState(kLayerId1,
897 fence(Fence::Status::Signaled),
898 layer_state_t::eBufferChanged),
899 });
900 const auto signaledTransaction2 =
901 createTransactionInfo(kApplyToken,
902 {
903 createComposerState(kLayerId2,
904 fence(Fence::Status::Signaled),
905 layer_state_t::eBufferChanged),
906 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700907 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000908}
909
Ady Abraham9dada822022-02-03 10:26:59 -0800910TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentApplyToken) {
911 const sp<IBinder> kApplyToken1 =
912 IInterface::asBinder(TransactionCompletedListener::getIInstance());
913 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
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 signaledTransaction =
919 createTransactionInfo(kApplyToken1,
920 {
921 createComposerState(kLayerId1,
922 fence(Fence::Status::Signaled),
923 layer_state_t::eBufferChanged),
924 });
925 const auto unsignaledTransaction =
926 createTransactionInfo(kApplyToken2,
927 {
928 createComposerState(kLayerId2,
929 fence(Fence::Status::Unsignaled),
930 layer_state_t::eBufferChanged),
931 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700932 setTransactionStates({signaledTransaction, unsignaledTransaction},
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_RemovesUnsignaledFromTheQueueSameApplyToken) {
937 const sp<IBinder> kApplyToken =
938 IInterface::asBinder(TransactionCompletedListener::getIInstance());
939 const auto kLayerId1 = 1;
940 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800941 const auto kExpectedTransactionsPending = 0u;
942
943 const auto unsignaledTransaction =
944 createTransactionInfo(kApplyToken,
945 {
946 createComposerState(kLayerId1,
947 fence(Fence::Status::Unsignaled),
948 layer_state_t::eBufferChanged),
949 });
950 const auto signaledTransaction =
951 createTransactionInfo(kApplyToken,
952 {
953 createComposerState(kLayerId2,
954 fence(Fence::Status::Signaled),
955 layer_state_t::eBufferChanged),
956 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700957 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800958 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000959}
960
Ady Abraham9dada822022-02-03 10:26:59 -0800961TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueue) {
962 const sp<IBinder> kApplyToken1 =
963 IInterface::asBinder(TransactionCompletedListener::getIInstance());
964 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
965 const auto kLayerId1 = 1;
966 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800967 const auto kExpectedTransactionsPending = 0u;
968
969 const auto unsignaledTransaction =
970 createTransactionInfo(kApplyToken1,
971 {
972 createComposerState(kLayerId1,
973 fence(Fence::Status::Unsignaled),
974 layer_state_t::eBufferChanged),
975 });
976 const auto unsignaledTransaction2 =
977 createTransactionInfo(kApplyToken2,
978 {
979 createComposerState(kLayerId2,
980 fence(Fence::Status::Unsignaled),
981 layer_state_t::eBufferChanged),
982 });
983 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700984 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000985}
986
Ady Abraham2739e832022-02-14 17:42:00 -0800987TEST_F(LatchUnsignaledAlwaysTest, LatchUnsignaledWhenEarlyOffset) {
988 const sp<IBinder> kApplyToken =
989 IInterface::asBinder(TransactionCompletedListener::getIInstance());
990 const auto kLayerId = 1;
Ady Abraham2739e832022-02-14 17:42:00 -0800991 const auto kExpectedTransactionsPending = 0u;
992
993 const auto unsignaledTransaction =
994 createTransactionInfo(kApplyToken,
995 {
996 createComposerState(kLayerId,
997 fence(Fence::Status::Unsignaled),
998 layer_state_t::eBufferChanged),
999 });
1000
1001 // Get VsyncModulator out of the default config
1002 static_cast<void>(mFlinger.mutableVsyncModulator()->onRefreshRateChangeInitiated());
1003
Vishnu Nair1523dad2022-09-29 16:05:18 -07001004 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
Ady Abraham2739e832022-02-14 17:42:00 -08001005}
1006
Valerie Haud251afb2019-03-29 14:19:02 -07001007} // namespace android