blob: b493d113b72a3849647d8e25a9f84d1949c336db [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;
40
41class 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++;
115 transaction.flags |= flags; // ISurfaceComposer::eSynchronous;
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();
Patrick Williams641f7f22022-06-22 19:25:35 +0000139 if (flags & ISurfaceComposer::eSynchronous) {
Ady Abrahame9ebce02022-02-03 12:05:06 -0800140 EXPECT_GE(returnedTime, applicationTime + mFlinger.getAnimationTransactionTimeout());
Valerie Haud251afb2019-03-29 14:19:02 -0700141 } else {
Ady Abrahame9ebce02022-02-03 12:05:06 -0800142 EXPECT_LE(returnedTime, applicationTime + mFlinger.getAnimationTransactionTimeout());
Valerie Haud251afb2019-03-29 14:19:02 -0700143 }
Arthur Hung58144272021-01-16 03:43:53 +0000144 // Each transaction should have been placed on the transaction queue
Vishnu Nair60d902e2022-07-20 02:55:37 +0000145 auto& transactionQueue = mFlinger.getTransactionQueue();
146 EXPECT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700147 }
148
Patrick Williams641f7f22022-06-22 19:25:35 +0000149 void PlaceOnTransactionQueue(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000150 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700151 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700152
153 // first check will see desired present time has not passed,
154 // but afterwards it will look like the desired present time has passed
155 nsecs_t time = systemTime();
Valerie Haud251afb2019-03-29 14:19:02 -0700156 TransactionInfo transaction;
Patrick Williams641f7f22022-06-22 19:25:35 +0000157 setupSingle(transaction, flags, /*desiredPresentTime*/ time + s2ns(1), false,
158 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700159 nsecs_t applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000160 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700161 transaction.displays, transaction.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700162 transaction.applyToken, transaction.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800163 transaction.desiredPresentTime, transaction.isAutoTimestamp,
164 transaction.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
165 transaction.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700166
167 nsecs_t returnedTime = systemTime();
Patrick Williams641f7f22022-06-22 19:25:35 +0000168 if (flags & ISurfaceComposer::eSynchronous) {
Ady Abrahame9ebce02022-02-03 12:05:06 -0800169 EXPECT_GE(systemTime(),
170 applicationSentTime + mFlinger.getAnimationTransactionTimeout());
Ady Abrahame46243a2021-02-23 19:33:49 -0800171 } else {
Ady Abrahame9ebce02022-02-03 12:05:06 -0800172 EXPECT_LE(returnedTime,
173 applicationSentTime + mFlinger.getAnimationTransactionTimeout());
Ady Abrahame46243a2021-02-23 19:33:49 -0800174 }
Valerie Haud251afb2019-03-29 14:19:02 -0700175 // This transaction should have been placed on the transaction queue
Vishnu Nair60d902e2022-07-20 02:55:37 +0000176 auto& transactionQueue = mFlinger.getTransactionQueue();
177 EXPECT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700178 }
179
Patrick Williams641f7f22022-06-22 19:25:35 +0000180 void BlockedByPriorTransaction(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000181 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700182 nsecs_t time = systemTime();
Patrick Williams641f7f22022-06-22 19:25:35 +0000183 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(2);
184
Valerie Haud251afb2019-03-29 14:19:02 -0700185 // transaction that should go on the pending thread
186 TransactionInfo transactionA;
Patrick Williams641f7f22022-06-22 19:25:35 +0000187 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ time + s2ns(1), false,
188 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700189
190 // transaction that would not have gone on the pending thread if not
191 // blocked
192 TransactionInfo transactionB;
Patrick Williams641f7f22022-06-22 19:25:35 +0000193 setupSingle(transactionB, flags, /*desiredPresentTime*/ systemTime(),
194 /*isAutoTimestamp*/ true, FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700195
196 nsecs_t applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000197 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700198 transactionA.displays, transactionA.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700199 transactionA.applyToken, transactionA.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800200 transactionA.desiredPresentTime, transactionA.isAutoTimestamp,
201 transactionA.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
202 transactionA.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700203
204 // This thread should not have been blocked by the above transaction
205 // (5s is the timeout period that applyTransactionState waits for SF to
206 // commit the transaction)
Ady Abrahame9ebce02022-02-03 12:05:06 -0800207 EXPECT_LE(systemTime(), applicationSentTime + mFlinger.getAnimationTransactionTimeout());
Arthur Hung58144272021-01-16 03:43:53 +0000208 // transaction that would goes to pending transaciton queue.
209 mFlinger.flushTransactionQueues();
Valerie Haud251afb2019-03-29 14:19:02 -0700210
211 applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000212 mFlinger.setTransactionState(transactionB.frameTimelineInfo, transactionB.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700213 transactionB.displays, transactionB.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700214 transactionB.applyToken, transactionB.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800215 transactionB.desiredPresentTime, transactionB.isAutoTimestamp,
216 transactionB.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
217 transactionB.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700218
219 // this thread should have been blocked by the above transaction
220 // if this is an animation, this thread should be blocked for 5s
221 // in setTransactionState waiting for transactionA to flush. Otherwise,
222 // the transaction should be placed on the pending queue
Patrick Williams641f7f22022-06-22 19:25:35 +0000223 if (flags & ISurfaceComposer::eSynchronous) {
Ady Abrahame9ebce02022-02-03 12:05:06 -0800224 EXPECT_GE(systemTime(),
225 applicationSentTime + mFlinger.getAnimationTransactionTimeout());
Valerie Haud251afb2019-03-29 14:19:02 -0700226 } else {
Ady Abrahame9ebce02022-02-03 12:05:06 -0800227 EXPECT_LE(systemTime(),
228 applicationSentTime + mFlinger.getAnimationTransactionTimeout());
Valerie Haud251afb2019-03-29 14:19:02 -0700229 }
230
Arthur Hung58144272021-01-16 03:43:53 +0000231 // transaction that would goes to pending transaciton queue.
232 mFlinger.flushTransactionQueues();
233
Ady Abrahame46243a2021-02-23 19:33:49 -0800234 // check that the transaction was applied.
Arthur Hung58144272021-01-16 03:43:53 +0000235 auto transactionQueue = mFlinger.getPendingTransactionQueue();
Ady Abrahame46243a2021-02-23 19:33:49 -0800236 EXPECT_EQ(0u, transactionQueue.size());
Valerie Haud251afb2019-03-29 14:19:02 -0700237 }
238
239 bool mHasListenerCallbacks = false;
240 std::vector<ListenerCallbacks> mCallbacks;
241 int mTransactionNumber = 0;
242};
243
Vishnu Nair60d902e2022-07-20 02:55:37 +0000244TEST_F(TransactionApplicationTest, AddToPendingQueue) {
245 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700246 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700247
Valerie Haud251afb2019-03-29 14:19:02 -0700248 TransactionInfo transactionA; // transaction to go on pending queue
Patrick Williams641f7f22022-06-22 19:25:35 +0000249 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ s2ns(1), false,
250 FrameTimelineInfo{});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000251 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700252 transactionA.displays, transactionA.flags, transactionA.applyToken,
253 transactionA.inputWindowCommands, transactionA.desiredPresentTime,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800254 transactionA.isAutoTimestamp, transactionA.uncacheBuffer,
255 mHasListenerCallbacks, mCallbacks, transactionA.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700256
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000257 auto& transactionQueue = mFlinger.getTransactionQueue();
Vishnu Nair60d902e2022-07-20 02:55:37 +0000258 ASSERT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700259
Vishnu Nair60d902e2022-07-20 02:55:37 +0000260 auto transactionState = transactionQueue.pop().value();
Valerie Haud251afb2019-03-29 14:19:02 -0700261 checkEqual(transactionA, transactionState);
Vishnu Nair60d902e2022-07-20 02:55:37 +0000262}
263
264TEST_F(TransactionApplicationTest, Flush_RemovesFromQueue) {
265 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
266 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
267
268 TransactionInfo transactionA; // transaction to go on pending queue
269 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ s2ns(1), false,
270 FrameTimelineInfo{});
271 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
272 transactionA.displays, transactionA.flags, transactionA.applyToken,
273 transactionA.inputWindowCommands, transactionA.desiredPresentTime,
274 transactionA.isAutoTimestamp, transactionA.uncacheBuffer,
275 mHasListenerCallbacks, mCallbacks, transactionA.id);
276
277 auto& transactionQueue = mFlinger.getTransactionQueue();
278 ASSERT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700279
280 // because flushing uses the cached expected present time, we send an empty
281 // transaction here (sending a null applyToken to fake it as from a
282 // different process) to re-query and reset the cached expected present time
283 TransactionInfo empty;
284 empty.applyToken = sp<IBinder>();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000285 mFlinger.setTransactionState(empty.frameTimelineInfo, empty.states, empty.displays, empty.flags,
286 empty.applyToken, empty.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800287 empty.desiredPresentTime, empty.isAutoTimestamp,
288 empty.uncacheBuffer, mHasListenerCallbacks, mCallbacks, empty.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700289
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000290 // flush transaction queue should flush as desiredPresentTime has
Valerie Haud251afb2019-03-29 14:19:02 -0700291 // passed
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000292 mFlinger.flushTransactionQueues();
Valerie Haud251afb2019-03-29 14:19:02 -0700293
Vishnu Nair60d902e2022-07-20 02:55:37 +0000294 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700295}
296
297TEST_F(TransactionApplicationTest, NotPlacedOnTransactionQueue_Synchronous) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000298 NotPlacedOnTransactionQueue(ISurfaceComposer::eSynchronous);
Valerie Haud251afb2019-03-29 14:19:02 -0700299}
300
Valerie Haud251afb2019-03-29 14:19:02 -0700301TEST_F(TransactionApplicationTest, NotPlacedOnTransactionQueue_SyncInputWindows) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000302 NotPlacedOnTransactionQueue(/*flags*/ 0);
Valerie Haud251afb2019-03-29 14:19:02 -0700303}
304
305TEST_F(TransactionApplicationTest, PlaceOnTransactionQueue_Synchronous) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000306 PlaceOnTransactionQueue(ISurfaceComposer::eSynchronous);
Valerie Haud251afb2019-03-29 14:19:02 -0700307}
308
Valerie Haud251afb2019-03-29 14:19:02 -0700309TEST_F(TransactionApplicationTest, PlaceOnTransactionQueue_SyncInputWindows) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000310 PlaceOnTransactionQueue(/*flags*/ 0);
Valerie Haud251afb2019-03-29 14:19:02 -0700311}
312
313TEST_F(TransactionApplicationTest, BlockWithPriorTransaction_Synchronous) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000314 BlockedByPriorTransaction(ISurfaceComposer::eSynchronous);
Valerie Haud251afb2019-03-29 14:19:02 -0700315}
316
Valerie Hau09e60052019-12-15 14:51:15 -0800317TEST_F(TransactionApplicationTest, FromHandle) {
318 sp<IBinder> badHandle;
319 auto ret = mFlinger.fromHandle(badHandle);
Alec Mouri9a02eda2020-04-21 17:39:34 -0700320 EXPECT_EQ(nullptr, ret.promote().get());
Valerie Hau09e60052019-12-15 14:51:15 -0800321}
ramindani4d48f902021-09-20 21:07:45 +0000322
Ady Abraham9dada822022-02-03 10:26:59 -0800323class LatchUnsignaledTest : public TransactionApplicationTest {
324public:
325 void TearDown() override {
326 // Clear all transaction queues to release all transactions we sent
327 // in the tests. Otherwise, gmock complains about memory leaks.
Vishnu Nair60d902e2022-07-20 02:55:37 +0000328 while (!mFlinger.getTransactionQueue().isEmpty()) {
329 mFlinger.getTransactionQueue().pop();
330 }
Ady Abraham9dada822022-02-03 10:26:59 -0800331 mFlinger.getPendingTransactionQueue().clear();
332 mFlinger.getTransactionCommittedSignals().clear();
333 mFlinger.commitTransactionsLocked(eTransactionMask);
334 mFlinger.mutableCurrentState().layersSortedByZ.clear();
335 mFlinger.mutableDrawingState().layersSortedByZ.clear();
336 }
337
338 static sp<Fence> fence(Fence::Status status) {
339 const auto fence = sp<mock::MockFence>::make();
340 EXPECT_CALL(*fence, getStatus()).WillRepeatedly(Return(status));
341 return fence;
342 }
343
344 ComposerState createComposerState(int layerId, sp<Fence> fence, uint64_t what) {
345 ComposerState state;
346 state.state.bufferData = std::make_shared<BufferData>();
347 state.state.bufferData->acquireFence = std::move(fence);
348 state.state.layerId = layerId;
349 state.state.surface =
Patrick Williams83f36b22022-09-14 17:57:35 +0000350 sp<Layer>::make(LayerCreationArgs(mFlinger.flinger(), nullptr, "TestLayer", 0, {}))
Ady Abraham9dada822022-02-03 10:26:59 -0800351 ->getHandle();
352 state.state.bufferData->flags = BufferData::BufferDataChange::fenceChanged;
353
354 state.state.what = what;
355 if (what & layer_state_t::eCropChanged) {
356 state.state.crop = Rect(1, 2, 3, 4);
357 }
358 return state;
359 }
360
361 TransactionInfo createTransactionInfo(const sp<IBinder>& applyToken,
362 const std::vector<ComposerState>& states) {
363 TransactionInfo transaction;
364 const uint32_t kFlags = ISurfaceComposer::eSynchronous;
Ady Abraham9dada822022-02-03 10:26:59 -0800365 const nsecs_t kDesiredPresentTime = systemTime();
366 const bool kIsAutoTimestamp = true;
367 const auto kFrameTimelineInfo = FrameTimelineInfo{};
368
Patrick Williams641f7f22022-06-22 19:25:35 +0000369 setupSingle(transaction, kFlags, kDesiredPresentTime, kIsAutoTimestamp, kFrameTimelineInfo);
Ady Abraham9dada822022-02-03 10:26:59 -0800370 transaction.applyToken = applyToken;
371 for (const auto& state : states) {
372 transaction.states.push_back(state);
373 }
374
375 return transaction;
376 }
377
378 void setTransactionStates(const std::vector<TransactionInfo>& transactions,
379 size_t expectedTransactionsApplied,
380 size_t expectedTransactionsPending) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000381 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Ady Abraham9dada822022-02-03 10:26:59 -0800382 EXPECT_EQ(0u, mFlinger.getPendingTransactionQueue().size());
383
384 for (const auto& transaction : transactions) {
385 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
386 transaction.displays, transaction.flags,
387 transaction.applyToken, transaction.inputWindowCommands,
388 transaction.desiredPresentTime,
389 transaction.isAutoTimestamp, transaction.uncacheBuffer,
390 mHasListenerCallbacks, mCallbacks, transaction.id);
391 }
392 mFlinger.flushTransactionQueues();
Vishnu Nair60d902e2022-07-20 02:55:37 +0000393 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Ady Abraham9dada822022-02-03 10:26:59 -0800394 EXPECT_EQ(expectedTransactionsPending, mFlinger.getPendingTransactionQueue().size());
395 EXPECT_EQ(expectedTransactionsApplied, mFlinger.getTransactionCommittedSignals().size());
396 }
397};
398
399class LatchUnsignaledAutoSingleLayerTest : public LatchUnsignaledTest {
400public:
401 void SetUp() override {
402 LatchUnsignaledTest::SetUp();
403 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::AutoSingleLayer;
404 }
405};
406
407TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleSignaledFromTheQueue) {
408 const sp<IBinder> kApplyToken =
409 IInterface::asBinder(TransactionCompletedListener::getIInstance());
410 const auto kLayerId = 1;
411 const auto kExpectedTransactionsApplied = 1u;
412 const auto kExpectedTransactionsPending = 0u;
413
414 const auto signaledTransaction =
415 createTransactionInfo(kApplyToken,
416 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
417 layer_state_t::eBufferChanged)});
418 setTransactionStates({signaledTransaction}, kExpectedTransactionsApplied,
419 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000420}
421
Ady Abraham9dada822022-02-03 10:26:59 -0800422TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleUnSignaledFromTheQueue) {
423 const sp<IBinder> kApplyToken =
424 IInterface::asBinder(TransactionCompletedListener::getIInstance());
425 const auto kLayerId = 1;
426 const auto kExpectedTransactionsApplied = 1u;
427 const auto kExpectedTransactionsPending = 0u;
428
429 const auto unsignaledTransaction =
430 createTransactionInfo(kApplyToken,
431 {
432 createComposerState(kLayerId,
433 fence(Fence::Status::Unsignaled),
434 layer_state_t::eBufferChanged),
435 });
436 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
437 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000438}
439
Ady Abraham9dada822022-02-03 10:26:59 -0800440TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferCropChange) {
441 const sp<IBinder> kApplyToken =
442 IInterface::asBinder(TransactionCompletedListener::getIInstance());
443 const auto kLayerId = 1;
444 const auto kExpectedTransactionsApplied = 0u;
445 const auto kExpectedTransactionsPending = 1u;
446
447 const auto unsignaledTransaction =
448 createTransactionInfo(kApplyToken,
449 {
450 createComposerState(kLayerId,
451 fence(Fence::Status::Unsignaled),
452 layer_state_t::eCropChanged),
453 });
454 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
455 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000456}
457
Ady Abraham9dada822022-02-03 10:26:59 -0800458TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferChangeClubed) {
459 const sp<IBinder> kApplyToken =
460 IInterface::asBinder(TransactionCompletedListener::getIInstance());
461 const auto kLayerId = 1;
462 const auto kExpectedTransactionsApplied = 0u;
463 const auto kExpectedTransactionsPending = 1u;
464
465 const auto unsignaledTransaction =
466 createTransactionInfo(kApplyToken,
467 {
468 createComposerState(kLayerId,
469 fence(Fence::Status::Unsignaled),
470 layer_state_t::eCropChanged |
471 layer_state_t::
472 eBufferChanged),
473 });
474 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
475 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000476}
477
Ady Abraham9dada822022-02-03 10:26:59 -0800478TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueueSameApplyTokenMultiState) {
479 const sp<IBinder> kApplyToken =
480 IInterface::asBinder(TransactionCompletedListener::getIInstance());
481 const auto kLayerId = 1;
482 const auto kExpectedTransactionsApplied = 0u;
483 const auto kExpectedTransactionsPending = 1u;
484
485 const auto mixedTransaction =
486 createTransactionInfo(kApplyToken,
487 {
488 createComposerState(kLayerId,
489 fence(Fence::Status::Unsignaled),
490 layer_state_t::eBufferChanged),
491 createComposerState(kLayerId,
492 fence(Fence::Status::Signaled),
493 layer_state_t::eBufferChanged),
494 });
495 setTransactionStates({mixedTransaction}, kExpectedTransactionsApplied,
496 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000497}
498
Ady Abraham9dada822022-02-03 10:26:59 -0800499TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueue_MultipleStateTransaction) {
500 const sp<IBinder> kApplyToken =
501 IInterface::asBinder(TransactionCompletedListener::getIInstance());
502 const auto kLayerId1 = 1;
503 const auto kLayerId2 = 2;
504 const auto kExpectedTransactionsApplied = 0u;
505 const auto kExpectedTransactionsPending = 1u;
506
507 const auto mixedTransaction =
508 createTransactionInfo(kApplyToken,
509 {
510 createComposerState(kLayerId1,
511 fence(Fence::Status::Unsignaled),
512 layer_state_t::eBufferChanged),
513 createComposerState(kLayerId2,
514 fence(Fence::Status::Signaled),
515 layer_state_t::eBufferChanged),
516 });
517 setTransactionStates({mixedTransaction}, kExpectedTransactionsApplied,
518 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000519}
520
Ady Abraham9dada822022-02-03 10:26:59 -0800521TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSignaledFromTheQueue) {
522 const sp<IBinder> kApplyToken =
523 IInterface::asBinder(TransactionCompletedListener::getIInstance());
524 const auto kLayerId1 = 1;
525 const auto kLayerId2 = 2;
526 const auto kExpectedTransactionsApplied = 2u;
527 const auto kExpectedTransactionsPending = 0u;
528
529 const auto signaledTransaction =
530 createTransactionInfo(kApplyToken,
531 {
532 createComposerState(kLayerId1,
533 fence(Fence::Status::Signaled),
534 layer_state_t::eBufferChanged),
535 });
536 const auto signaledTransaction2 =
537 createTransactionInfo(kApplyToken,
538 {
539 createComposerState(kLayerId2,
540 fence(Fence::Status::Signaled),
541 layer_state_t::eBufferChanged),
542 });
543 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsApplied,
544 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000545}
546
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800547TEST_F(LatchUnsignaledAutoSingleLayerTest,
548 UnsignaledNotAppliedWhenThereAreSignaled_UnsignaledFirst) {
Ady Abraham9dada822022-02-03 10:26:59 -0800549 const sp<IBinder> kApplyToken1 =
550 IInterface::asBinder(TransactionCompletedListener::getIInstance());
551 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800552 const sp<IBinder> kApplyToken3 = sp<BBinder>::make();
Ady Abraham9dada822022-02-03 10:26:59 -0800553 const auto kLayerId1 = 1;
554 const auto kLayerId2 = 2;
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800555 const auto kExpectedTransactionsApplied = 2u;
556 const auto kExpectedTransactionsPending = 1u;
557
558 const auto unsignaledTransaction =
559 createTransactionInfo(kApplyToken1,
560 {
561 createComposerState(kLayerId1,
562 fence(Fence::Status::Unsignaled),
563 layer_state_t::eBufferChanged),
564 });
565
566 const auto signaledTransaction =
567 createTransactionInfo(kApplyToken2,
568 {
569 createComposerState(kLayerId2,
570 fence(Fence::Status::Signaled),
571 layer_state_t::eBufferChanged),
572 });
573 const auto signaledTransaction2 =
574 createTransactionInfo(kApplyToken3,
575 {
576 createComposerState(kLayerId2,
577 fence(Fence::Status::Signaled),
578 layer_state_t::eBufferChanged),
579 });
580
581 setTransactionStates({unsignaledTransaction, signaledTransaction, signaledTransaction2},
582 kExpectedTransactionsApplied, kExpectedTransactionsPending);
583}
584
585TEST_F(LatchUnsignaledAutoSingleLayerTest, UnsignaledNotAppliedWhenThereAreSignaled_SignaledFirst) {
586 const sp<IBinder> kApplyToken1 =
587 IInterface::asBinder(TransactionCompletedListener::getIInstance());
588 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
589 const sp<IBinder> kApplyToken3 = sp<BBinder>::make();
590 const auto kLayerId1 = 1;
591 const auto kLayerId2 = 2;
592 const auto kExpectedTransactionsApplied = 2u;
Ady Abraham9dada822022-02-03 10:26:59 -0800593 const auto kExpectedTransactionsPending = 1u;
594
595 const auto signaledTransaction =
596 createTransactionInfo(kApplyToken1,
597 {
598 createComposerState(kLayerId1,
599 fence(Fence::Status::Signaled),
600 layer_state_t::eBufferChanged),
601 });
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800602 const auto signaledTransaction2 =
Ady Abraham9dada822022-02-03 10:26:59 -0800603 createTransactionInfo(kApplyToken2,
604 {
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800605 createComposerState(kLayerId1,
606 fence(Fence::Status::Signaled),
607 layer_state_t::eBufferChanged),
608 });
609 const auto unsignaledTransaction =
610 createTransactionInfo(kApplyToken3,
611 {
Ady Abraham9dada822022-02-03 10:26:59 -0800612 createComposerState(kLayerId2,
613 fence(Fence::Status::Unsignaled),
614 layer_state_t::eBufferChanged),
615 });
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800616
617 setTransactionStates({signaledTransaction, signaledTransaction2, unsignaledTransaction},
618 kExpectedTransactionsApplied, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000619}
620
Ady Abraham9dada822022-02-03 10:26:59 -0800621TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueueSameApplyToken) {
622 const sp<IBinder> kApplyToken =
623 IInterface::asBinder(TransactionCompletedListener::getIInstance());
624 const auto kLayerId1 = 1;
625 const auto kLayerId2 = 2;
626 const auto kExpectedTransactionsApplied = 1u;
627 const auto kExpectedTransactionsPending = 1u;
628
629 const auto unsignaledTransaction =
630 createTransactionInfo(kApplyToken,
631 {
632 createComposerState(kLayerId1,
633 fence(Fence::Status::Unsignaled),
634 layer_state_t::eBufferChanged),
635 });
636 const auto signaledTransaction =
637 createTransactionInfo(kApplyToken,
638 {
639 createComposerState(kLayerId2,
640 fence(Fence::Status::Signaled),
641 layer_state_t::eBufferChanged),
642 });
643 setTransactionStates({unsignaledTransaction, signaledTransaction}, kExpectedTransactionsApplied,
644 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000645}
646
Ady Abraham9dada822022-02-03 10:26:59 -0800647TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueue) {
648 const sp<IBinder> kApplyToken1 =
649 IInterface::asBinder(TransactionCompletedListener::getIInstance());
650 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
651 const auto kLayerId1 = 1;
652 const auto kLayerId2 = 2;
653 const auto kExpectedTransactionsApplied = 1u;
654 const auto kExpectedTransactionsPending = 1u;
655
656 const auto unsignaledTransaction =
657 createTransactionInfo(kApplyToken1,
658 {
659 createComposerState(kLayerId1,
660 fence(Fence::Status::Unsignaled),
661 layer_state_t::eBufferChanged),
662 });
663 const auto unsignaledTransaction2 =
664 createTransactionInfo(kApplyToken2,
665 {
666 createComposerState(kLayerId2,
667 fence(Fence::Status::Unsignaled),
668 layer_state_t::eBufferChanged),
669 });
670 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
671 kExpectedTransactionsApplied, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000672}
673
Ady Abraham2739e832022-02-14 17:42:00 -0800674TEST_F(LatchUnsignaledAutoSingleLayerTest, DontLatchUnsignaledWhenEarlyOffset) {
675 const sp<IBinder> kApplyToken =
676 IInterface::asBinder(TransactionCompletedListener::getIInstance());
677 const auto kLayerId = 1;
678 const auto kExpectedTransactionsApplied = 0u;
679 const auto kExpectedTransactionsPending = 1u;
680
681 const auto unsignaledTransaction =
682 createTransactionInfo(kApplyToken,
683 {
684 createComposerState(kLayerId,
685 fence(Fence::Status::Unsignaled),
686 layer_state_t::eBufferChanged),
687 });
688
689 // Get VsyncModulator out of the default config
690 static_cast<void>(mFlinger.mutableVsyncModulator()->onRefreshRateChangeInitiated());
691
692 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
693 kExpectedTransactionsPending);
694}
695
Ady Abraham9dada822022-02-03 10:26:59 -0800696class LatchUnsignaledDisabledTest : public LatchUnsignaledTest {
697public:
698 void SetUp() override {
699 LatchUnsignaledTest::SetUp();
700 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Disabled;
701 }
702};
703
704TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue) {
705 const sp<IBinder> kApplyToken =
706 IInterface::asBinder(TransactionCompletedListener::getIInstance());
707 const auto kLayerId = 1;
708 const auto kExpectedTransactionsApplied = 1u;
709 const auto kExpectedTransactionsPending = 0u;
710
711 const auto signaledTransaction =
712 createTransactionInfo(kApplyToken,
713 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
714 layer_state_t::eBufferChanged)});
715 setTransactionStates({signaledTransaction}, kExpectedTransactionsApplied,
716 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000717}
718
Ady Abraham9dada822022-02-03 10:26:59 -0800719TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueue) {
720 const sp<IBinder> kApplyToken =
721 IInterface::asBinder(TransactionCompletedListener::getIInstance());
722 const auto kLayerId = 1;
723 const auto kExpectedTransactionsApplied = 0u;
724 const auto kExpectedTransactionsPending = 1u;
725
726 const auto unsignaledTransaction =
727 createTransactionInfo(kApplyToken,
728 {
729 createComposerState(kLayerId,
730 fence(Fence::Status::Unsignaled),
731 layer_state_t::eBufferChanged),
732 });
733 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
734 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000735}
736
Ady Abraham9dada822022-02-03 10:26:59 -0800737TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueSameLayerId) {
738 const sp<IBinder> kApplyToken =
739 IInterface::asBinder(TransactionCompletedListener::getIInstance());
740 const auto kLayerId = 1;
741 const auto kExpectedTransactionsApplied = 0u;
742 const auto kExpectedTransactionsPending = 1u;
743
744 const auto unsignaledTransaction =
745 createTransactionInfo(kApplyToken,
746 {
747 createComposerState(kLayerId,
748 fence(Fence::Status::Unsignaled),
749 layer_state_t::eBufferChanged),
750 createComposerState(kLayerId,
751 fence(Fence::Status::Unsignaled),
752 layer_state_t::eBufferChanged),
753 });
754 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
755 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000756}
757
Ady Abraham9dada822022-02-03 10:26:59 -0800758TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueDifferentLayerId) {
759 const sp<IBinder> kApplyToken =
760 IInterface::asBinder(TransactionCompletedListener::getIInstance());
761 const auto kLayerId1 = 1;
762 const auto kLayerId2 = 2;
763 const auto kExpectedTransactionsApplied = 0u;
764 const auto kExpectedTransactionsPending = 1u;
765
766 const auto unsignaledTransaction =
767 createTransactionInfo(kApplyToken,
768 {
769 createComposerState(kLayerId1,
770 fence(Fence::Status::Unsignaled),
771 layer_state_t::eBufferChanged),
772 createComposerState(kLayerId2,
773 fence(Fence::Status::Unsignaled),
774 layer_state_t::eBufferChanged),
775 });
776 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
777 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000778}
779
Ady Abraham9dada822022-02-03 10:26:59 -0800780TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
781 const sp<IBinder> kApplyToken =
782 IInterface::asBinder(TransactionCompletedListener::getIInstance());
783 const auto kLayerId1 = 1;
784 const auto kLayerId2 = 2;
785 const auto kExpectedTransactionsApplied = 2u;
786 const auto kExpectedTransactionsPending = 0u;
787
788 const auto signaledTransaction =
789 createTransactionInfo(kApplyToken,
790 {
791 createComposerState(kLayerId1,
792 fence(Fence::Status::Signaled),
793 layer_state_t::eBufferChanged),
794 });
795 const auto signaledTransaction2 =
796 createTransactionInfo(kApplyToken,
797 {
798 createComposerState(kLayerId2,
799 fence(Fence::Status::Signaled),
800 layer_state_t::eBufferChanged),
801 });
802 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsApplied,
803 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000804}
805
Ady Abraham9dada822022-02-03 10:26:59 -0800806TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueDifferentApplyToken) {
807 const sp<IBinder> kApplyToken1 =
808 IInterface::asBinder(TransactionCompletedListener::getIInstance());
809 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
810 const auto kLayerId1 = 1;
811 const auto kLayerId2 = 2;
812 const auto kExpectedTransactionsApplied = 1u;
813 const auto kExpectedTransactionsPending = 1u;
814
815 const auto unsignaledTransaction =
816 createTransactionInfo(kApplyToken1,
817 {
818 createComposerState(kLayerId1,
819 fence(Fence::Status::Unsignaled),
820 layer_state_t::eBufferChanged),
821 });
822 const auto signaledTransaction =
823 createTransactionInfo(kApplyToken2,
824 {
825 createComposerState(kLayerId2,
826 fence(Fence::Status::Signaled),
827 layer_state_t::eBufferChanged),
828 });
829 setTransactionStates({unsignaledTransaction, signaledTransaction}, kExpectedTransactionsApplied,
830 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000831}
832
Ady Abraham9dada822022-02-03 10:26:59 -0800833TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueSameApplyToken) {
834 const sp<IBinder> kApplyToken =
835 IInterface::asBinder(TransactionCompletedListener::getIInstance());
836 const auto kLayerId1 = 1;
837 const auto kLayerId2 = 2;
838 const auto kExpectedTransactionsApplied = 1u;
839 const auto kExpectedTransactionsPending = 1u;
840
841 const auto signaledTransaction =
842 createTransactionInfo(kApplyToken,
843 {
844 createComposerState(kLayerId1,
845 fence(Fence::Status::Signaled),
846 layer_state_t::eBufferChanged),
847 });
848 const auto unsignaledTransaction =
849 createTransactionInfo(kApplyToken,
850 {
851 createComposerState(kLayerId2,
852 fence(Fence::Status::Unsignaled),
853 layer_state_t::eBufferChanged),
854 });
855 setTransactionStates({signaledTransaction, unsignaledTransaction}, kExpectedTransactionsApplied,
856 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000857}
858
Ady Abraham9dada822022-02-03 10:26:59 -0800859TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheUnsignaledTheQueue) {
860 const sp<IBinder> kApplyToken =
861 IInterface::asBinder(TransactionCompletedListener::getIInstance());
862 const auto kLayerId1 = 1;
863 const auto kLayerId2 = 2;
864 const auto kExpectedTransactionsApplied = 0u;
865 const auto kExpectedTransactionsPending = 1u;
866
867 const auto unsignaledTransaction =
868 createTransactionInfo(kApplyToken,
869 {
870 createComposerState(kLayerId1,
871 fence(Fence::Status::Unsignaled),
872 layer_state_t::eBufferChanged),
873 });
874 const auto unsignaledTransaction2 =
875 createTransactionInfo(kApplyToken,
876 {
877 createComposerState(kLayerId2,
878 fence(Fence::Status::Unsignaled),
879 layer_state_t::eBufferChanged),
880 });
881 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
882 kExpectedTransactionsApplied, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000883}
884
Ady Abraham9dada822022-02-03 10:26:59 -0800885class LatchUnsignaledAlwaysTest : public LatchUnsignaledTest {
886public:
887 void SetUp() override {
888 LatchUnsignaledTest::SetUp();
889 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Always;
890 }
891};
892
893TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue) {
894 const sp<IBinder> kApplyToken =
895 IInterface::asBinder(TransactionCompletedListener::getIInstance());
896 const auto kLayerId = 1;
897 const auto kExpectedTransactionsApplied = 1u;
898 const auto kExpectedTransactionsPending = 0u;
899
900 const auto signaledTransaction =
901 createTransactionInfo(kApplyToken,
902 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
903 layer_state_t::eBufferChanged)});
904 setTransactionStates({signaledTransaction}, kExpectedTransactionsApplied,
905 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000906}
907
Ady Abraham9dada822022-02-03 10:26:59 -0800908TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueue) {
909 const sp<IBinder> kApplyToken =
910 IInterface::asBinder(TransactionCompletedListener::getIInstance());
911 const auto kLayerId = 1;
912 const auto kExpectedTransactionsApplied = 1u;
913 const auto kExpectedTransactionsPending = 0u;
914
915 const auto unsignaledTransaction =
916 createTransactionInfo(kApplyToken,
917 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
918 layer_state_t::eBufferChanged)});
919 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
920 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000921}
922
Ady Abraham9dada822022-02-03 10:26:59 -0800923TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueSameLayerId) {
924 const sp<IBinder> kApplyToken =
925 IInterface::asBinder(TransactionCompletedListener::getIInstance());
926 const auto kLayerId = 1;
927 const auto kExpectedTransactionsApplied = 1u;
928 const auto kExpectedTransactionsPending = 0u;
929
930 const auto mixedTransaction =
931 createTransactionInfo(kApplyToken,
932 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
933 layer_state_t::eBufferChanged),
934 createComposerState(kLayerId, fence(Fence::Status::Signaled),
935 layer_state_t::eBufferChanged)});
936 setTransactionStates({mixedTransaction}, kExpectedTransactionsApplied,
937 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000938}
939
Ady Abraham9dada822022-02-03 10:26:59 -0800940TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentLayerId) {
941 const sp<IBinder> kApplyToken =
942 IInterface::asBinder(TransactionCompletedListener::getIInstance());
943 const auto kLayerId1 = 1;
944 const auto kLayerId2 = 2;
945 const auto kExpectedTransactionsApplied = 1u;
946 const auto kExpectedTransactionsPending = 0u;
947
948 const auto mixedTransaction =
949 createTransactionInfo(kApplyToken,
950 {createComposerState(kLayerId1, fence(Fence::Status::Unsignaled),
951 layer_state_t::eBufferChanged),
952 createComposerState(kLayerId2, fence(Fence::Status::Signaled),
953 layer_state_t::eBufferChanged)});
954 setTransactionStates({mixedTransaction}, kExpectedTransactionsApplied,
955 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000956}
957
Ady Abraham9dada822022-02-03 10:26:59 -0800958TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
959 const sp<IBinder> kApplyToken =
960 IInterface::asBinder(TransactionCompletedListener::getIInstance());
961 const auto kLayerId1 = 1;
962 const auto kLayerId2 = 2;
963 const auto kExpectedTransactionsApplied = 2u;
964 const auto kExpectedTransactionsPending = 0u;
965
966 const auto signaledTransaction =
967 createTransactionInfo(kApplyToken,
968 {
969 createComposerState(kLayerId1,
970 fence(Fence::Status::Signaled),
971 layer_state_t::eBufferChanged),
972 });
973 const auto signaledTransaction2 =
974 createTransactionInfo(kApplyToken,
975 {
976 createComposerState(kLayerId2,
977 fence(Fence::Status::Signaled),
978 layer_state_t::eBufferChanged),
979 });
980 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsApplied,
981 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000982}
983
Ady Abraham9dada822022-02-03 10:26:59 -0800984TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentApplyToken) {
985 const sp<IBinder> kApplyToken1 =
986 IInterface::asBinder(TransactionCompletedListener::getIInstance());
987 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
988 const auto kLayerId1 = 1;
989 const auto kLayerId2 = 2;
990 const auto kExpectedTransactionsApplied = 2u;
991 const auto kExpectedTransactionsPending = 0u;
992
993 const auto signaledTransaction =
994 createTransactionInfo(kApplyToken1,
995 {
996 createComposerState(kLayerId1,
997 fence(Fence::Status::Signaled),
998 layer_state_t::eBufferChanged),
999 });
1000 const auto unsignaledTransaction =
1001 createTransactionInfo(kApplyToken2,
1002 {
1003 createComposerState(kLayerId2,
1004 fence(Fence::Status::Unsignaled),
1005 layer_state_t::eBufferChanged),
1006 });
1007 setTransactionStates({signaledTransaction, unsignaledTransaction}, kExpectedTransactionsApplied,
1008 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +00001009}
1010
Ady Abraham9dada822022-02-03 10:26:59 -08001011TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueueSameApplyToken) {
1012 const sp<IBinder> kApplyToken =
1013 IInterface::asBinder(TransactionCompletedListener::getIInstance());
1014 const auto kLayerId1 = 1;
1015 const auto kLayerId2 = 2;
1016 const auto kExpectedTransactionsApplied = 2u;
1017 const auto kExpectedTransactionsPending = 0u;
1018
1019 const auto unsignaledTransaction =
1020 createTransactionInfo(kApplyToken,
1021 {
1022 createComposerState(kLayerId1,
1023 fence(Fence::Status::Unsignaled),
1024 layer_state_t::eBufferChanged),
1025 });
1026 const auto signaledTransaction =
1027 createTransactionInfo(kApplyToken,
1028 {
1029 createComposerState(kLayerId2,
1030 fence(Fence::Status::Signaled),
1031 layer_state_t::eBufferChanged),
1032 });
1033 setTransactionStates({unsignaledTransaction, signaledTransaction}, kExpectedTransactionsApplied,
1034 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +00001035}
1036
Ady Abraham9dada822022-02-03 10:26:59 -08001037TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueue) {
1038 const sp<IBinder> kApplyToken1 =
1039 IInterface::asBinder(TransactionCompletedListener::getIInstance());
1040 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
1041 const auto kLayerId1 = 1;
1042 const auto kLayerId2 = 2;
1043 const auto kExpectedTransactionsApplied = 2u;
1044 const auto kExpectedTransactionsPending = 0u;
1045
1046 const auto unsignaledTransaction =
1047 createTransactionInfo(kApplyToken1,
1048 {
1049 createComposerState(kLayerId1,
1050 fence(Fence::Status::Unsignaled),
1051 layer_state_t::eBufferChanged),
1052 });
1053 const auto unsignaledTransaction2 =
1054 createTransactionInfo(kApplyToken2,
1055 {
1056 createComposerState(kLayerId2,
1057 fence(Fence::Status::Unsignaled),
1058 layer_state_t::eBufferChanged),
1059 });
1060 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
1061 kExpectedTransactionsApplied, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +00001062}
1063
Ady Abraham2739e832022-02-14 17:42:00 -08001064TEST_F(LatchUnsignaledAlwaysTest, LatchUnsignaledWhenEarlyOffset) {
1065 const sp<IBinder> kApplyToken =
1066 IInterface::asBinder(TransactionCompletedListener::getIInstance());
1067 const auto kLayerId = 1;
1068 const auto kExpectedTransactionsApplied = 1u;
1069 const auto kExpectedTransactionsPending = 0u;
1070
1071 const auto unsignaledTransaction =
1072 createTransactionInfo(kApplyToken,
1073 {
1074 createComposerState(kLayerId,
1075 fence(Fence::Status::Unsignaled),
1076 layer_state_t::eBufferChanged),
1077 });
1078
1079 // Get VsyncModulator out of the default config
1080 static_cast<void>(mFlinger.mutableVsyncModulator()->onRefreshRateChangeInitiated());
1081
1082 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
1083 kExpectedTransactionsPending);
1084}
1085
Valerie Haud251afb2019-03-29 14:19:02 -07001086} // namespace android