blob: efb9e0c5ba28179320615fc45f880c926ee47144 [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 =
350 sp<BufferStateLayer>::make(
351 LayerCreationArgs(mFlinger.flinger(), nullptr, "TestLayer", 0, {}))
352 ->getHandle();
353 state.state.bufferData->flags = BufferData::BufferDataChange::fenceChanged;
354
355 state.state.what = what;
356 if (what & layer_state_t::eCropChanged) {
357 state.state.crop = Rect(1, 2, 3, 4);
358 }
359 return state;
360 }
361
362 TransactionInfo createTransactionInfo(const sp<IBinder>& applyToken,
363 const std::vector<ComposerState>& states) {
364 TransactionInfo transaction;
365 const uint32_t kFlags = ISurfaceComposer::eSynchronous;
Ady Abraham9dada822022-02-03 10:26:59 -0800366 const nsecs_t kDesiredPresentTime = systemTime();
367 const bool kIsAutoTimestamp = true;
368 const auto kFrameTimelineInfo = FrameTimelineInfo{};
369
Patrick Williams641f7f22022-06-22 19:25:35 +0000370 setupSingle(transaction, kFlags, kDesiredPresentTime, kIsAutoTimestamp, kFrameTimelineInfo);
Ady Abraham9dada822022-02-03 10:26:59 -0800371 transaction.applyToken = applyToken;
372 for (const auto& state : states) {
373 transaction.states.push_back(state);
374 }
375
376 return transaction;
377 }
378
379 void setTransactionStates(const std::vector<TransactionInfo>& transactions,
380 size_t expectedTransactionsApplied,
381 size_t expectedTransactionsPending) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000382 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Ady Abraham9dada822022-02-03 10:26:59 -0800383 EXPECT_EQ(0u, mFlinger.getPendingTransactionQueue().size());
384
385 for (const auto& transaction : transactions) {
386 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
387 transaction.displays, transaction.flags,
388 transaction.applyToken, transaction.inputWindowCommands,
389 transaction.desiredPresentTime,
390 transaction.isAutoTimestamp, transaction.uncacheBuffer,
391 mHasListenerCallbacks, mCallbacks, transaction.id);
392 }
393 mFlinger.flushTransactionQueues();
Vishnu Nair60d902e2022-07-20 02:55:37 +0000394 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Ady Abraham9dada822022-02-03 10:26:59 -0800395 EXPECT_EQ(expectedTransactionsPending, mFlinger.getPendingTransactionQueue().size());
396 EXPECT_EQ(expectedTransactionsApplied, mFlinger.getTransactionCommittedSignals().size());
397 }
398};
399
400class LatchUnsignaledAutoSingleLayerTest : public LatchUnsignaledTest {
401public:
402 void SetUp() override {
403 LatchUnsignaledTest::SetUp();
404 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::AutoSingleLayer;
405 }
406};
407
408TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleSignaledFromTheQueue) {
409 const sp<IBinder> kApplyToken =
410 IInterface::asBinder(TransactionCompletedListener::getIInstance());
411 const auto kLayerId = 1;
412 const auto kExpectedTransactionsApplied = 1u;
413 const auto kExpectedTransactionsPending = 0u;
414
415 const auto signaledTransaction =
416 createTransactionInfo(kApplyToken,
417 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
418 layer_state_t::eBufferChanged)});
419 setTransactionStates({signaledTransaction}, kExpectedTransactionsApplied,
420 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000421}
422
Ady Abraham9dada822022-02-03 10:26:59 -0800423TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleUnSignaledFromTheQueue) {
424 const sp<IBinder> kApplyToken =
425 IInterface::asBinder(TransactionCompletedListener::getIInstance());
426 const auto kLayerId = 1;
427 const auto kExpectedTransactionsApplied = 1u;
428 const auto kExpectedTransactionsPending = 0u;
429
430 const auto unsignaledTransaction =
431 createTransactionInfo(kApplyToken,
432 {
433 createComposerState(kLayerId,
434 fence(Fence::Status::Unsignaled),
435 layer_state_t::eBufferChanged),
436 });
437 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
438 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000439}
440
Ady Abraham9dada822022-02-03 10:26:59 -0800441TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferCropChange) {
442 const sp<IBinder> kApplyToken =
443 IInterface::asBinder(TransactionCompletedListener::getIInstance());
444 const auto kLayerId = 1;
445 const auto kExpectedTransactionsApplied = 0u;
446 const auto kExpectedTransactionsPending = 1u;
447
448 const auto unsignaledTransaction =
449 createTransactionInfo(kApplyToken,
450 {
451 createComposerState(kLayerId,
452 fence(Fence::Status::Unsignaled),
453 layer_state_t::eCropChanged),
454 });
455 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
456 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000457}
458
Ady Abraham9dada822022-02-03 10:26:59 -0800459TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferChangeClubed) {
460 const sp<IBinder> kApplyToken =
461 IInterface::asBinder(TransactionCompletedListener::getIInstance());
462 const auto kLayerId = 1;
463 const auto kExpectedTransactionsApplied = 0u;
464 const auto kExpectedTransactionsPending = 1u;
465
466 const auto unsignaledTransaction =
467 createTransactionInfo(kApplyToken,
468 {
469 createComposerState(kLayerId,
470 fence(Fence::Status::Unsignaled),
471 layer_state_t::eCropChanged |
472 layer_state_t::
473 eBufferChanged),
474 });
475 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
476 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000477}
478
Ady Abraham9dada822022-02-03 10:26:59 -0800479TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueueSameApplyTokenMultiState) {
480 const sp<IBinder> kApplyToken =
481 IInterface::asBinder(TransactionCompletedListener::getIInstance());
482 const auto kLayerId = 1;
483 const auto kExpectedTransactionsApplied = 0u;
484 const auto kExpectedTransactionsPending = 1u;
485
486 const auto mixedTransaction =
487 createTransactionInfo(kApplyToken,
488 {
489 createComposerState(kLayerId,
490 fence(Fence::Status::Unsignaled),
491 layer_state_t::eBufferChanged),
492 createComposerState(kLayerId,
493 fence(Fence::Status::Signaled),
494 layer_state_t::eBufferChanged),
495 });
496 setTransactionStates({mixedTransaction}, kExpectedTransactionsApplied,
497 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000498}
499
Ady Abraham9dada822022-02-03 10:26:59 -0800500TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueue_MultipleStateTransaction) {
501 const sp<IBinder> kApplyToken =
502 IInterface::asBinder(TransactionCompletedListener::getIInstance());
503 const auto kLayerId1 = 1;
504 const auto kLayerId2 = 2;
505 const auto kExpectedTransactionsApplied = 0u;
506 const auto kExpectedTransactionsPending = 1u;
507
508 const auto mixedTransaction =
509 createTransactionInfo(kApplyToken,
510 {
511 createComposerState(kLayerId1,
512 fence(Fence::Status::Unsignaled),
513 layer_state_t::eBufferChanged),
514 createComposerState(kLayerId2,
515 fence(Fence::Status::Signaled),
516 layer_state_t::eBufferChanged),
517 });
518 setTransactionStates({mixedTransaction}, kExpectedTransactionsApplied,
519 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000520}
521
Ady Abraham9dada822022-02-03 10:26:59 -0800522TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSignaledFromTheQueue) {
523 const sp<IBinder> kApplyToken =
524 IInterface::asBinder(TransactionCompletedListener::getIInstance());
525 const auto kLayerId1 = 1;
526 const auto kLayerId2 = 2;
527 const auto kExpectedTransactionsApplied = 2u;
528 const auto kExpectedTransactionsPending = 0u;
529
530 const auto signaledTransaction =
531 createTransactionInfo(kApplyToken,
532 {
533 createComposerState(kLayerId1,
534 fence(Fence::Status::Signaled),
535 layer_state_t::eBufferChanged),
536 });
537 const auto signaledTransaction2 =
538 createTransactionInfo(kApplyToken,
539 {
540 createComposerState(kLayerId2,
541 fence(Fence::Status::Signaled),
542 layer_state_t::eBufferChanged),
543 });
544 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsApplied,
545 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000546}
547
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800548TEST_F(LatchUnsignaledAutoSingleLayerTest,
549 UnsignaledNotAppliedWhenThereAreSignaled_UnsignaledFirst) {
Ady Abraham9dada822022-02-03 10:26:59 -0800550 const sp<IBinder> kApplyToken1 =
551 IInterface::asBinder(TransactionCompletedListener::getIInstance());
552 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800553 const sp<IBinder> kApplyToken3 = sp<BBinder>::make();
Ady Abraham9dada822022-02-03 10:26:59 -0800554 const auto kLayerId1 = 1;
555 const auto kLayerId2 = 2;
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800556 const auto kExpectedTransactionsApplied = 2u;
557 const auto kExpectedTransactionsPending = 1u;
558
559 const auto unsignaledTransaction =
560 createTransactionInfo(kApplyToken1,
561 {
562 createComposerState(kLayerId1,
563 fence(Fence::Status::Unsignaled),
564 layer_state_t::eBufferChanged),
565 });
566
567 const auto signaledTransaction =
568 createTransactionInfo(kApplyToken2,
569 {
570 createComposerState(kLayerId2,
571 fence(Fence::Status::Signaled),
572 layer_state_t::eBufferChanged),
573 });
574 const auto signaledTransaction2 =
575 createTransactionInfo(kApplyToken3,
576 {
577 createComposerState(kLayerId2,
578 fence(Fence::Status::Signaled),
579 layer_state_t::eBufferChanged),
580 });
581
582 setTransactionStates({unsignaledTransaction, signaledTransaction, signaledTransaction2},
583 kExpectedTransactionsApplied, kExpectedTransactionsPending);
584}
585
586TEST_F(LatchUnsignaledAutoSingleLayerTest, UnsignaledNotAppliedWhenThereAreSignaled_SignaledFirst) {
587 const sp<IBinder> kApplyToken1 =
588 IInterface::asBinder(TransactionCompletedListener::getIInstance());
589 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
590 const sp<IBinder> kApplyToken3 = sp<BBinder>::make();
591 const auto kLayerId1 = 1;
592 const auto kLayerId2 = 2;
593 const auto kExpectedTransactionsApplied = 2u;
Ady Abraham9dada822022-02-03 10:26:59 -0800594 const auto kExpectedTransactionsPending = 1u;
595
596 const auto signaledTransaction =
597 createTransactionInfo(kApplyToken1,
598 {
599 createComposerState(kLayerId1,
600 fence(Fence::Status::Signaled),
601 layer_state_t::eBufferChanged),
602 });
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800603 const auto signaledTransaction2 =
Ady Abraham9dada822022-02-03 10:26:59 -0800604 createTransactionInfo(kApplyToken2,
605 {
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800606 createComposerState(kLayerId1,
607 fence(Fence::Status::Signaled),
608 layer_state_t::eBufferChanged),
609 });
610 const auto unsignaledTransaction =
611 createTransactionInfo(kApplyToken3,
612 {
Ady Abraham9dada822022-02-03 10:26:59 -0800613 createComposerState(kLayerId2,
614 fence(Fence::Status::Unsignaled),
615 layer_state_t::eBufferChanged),
616 });
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800617
618 setTransactionStates({signaledTransaction, signaledTransaction2, unsignaledTransaction},
619 kExpectedTransactionsApplied, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000620}
621
Ady Abraham9dada822022-02-03 10:26:59 -0800622TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueueSameApplyToken) {
623 const sp<IBinder> kApplyToken =
624 IInterface::asBinder(TransactionCompletedListener::getIInstance());
625 const auto kLayerId1 = 1;
626 const auto kLayerId2 = 2;
627 const auto kExpectedTransactionsApplied = 1u;
628 const auto kExpectedTransactionsPending = 1u;
629
630 const auto unsignaledTransaction =
631 createTransactionInfo(kApplyToken,
632 {
633 createComposerState(kLayerId1,
634 fence(Fence::Status::Unsignaled),
635 layer_state_t::eBufferChanged),
636 });
637 const auto signaledTransaction =
638 createTransactionInfo(kApplyToken,
639 {
640 createComposerState(kLayerId2,
641 fence(Fence::Status::Signaled),
642 layer_state_t::eBufferChanged),
643 });
644 setTransactionStates({unsignaledTransaction, signaledTransaction}, kExpectedTransactionsApplied,
645 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000646}
647
Ady Abraham9dada822022-02-03 10:26:59 -0800648TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueue) {
649 const sp<IBinder> kApplyToken1 =
650 IInterface::asBinder(TransactionCompletedListener::getIInstance());
651 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
652 const auto kLayerId1 = 1;
653 const auto kLayerId2 = 2;
654 const auto kExpectedTransactionsApplied = 1u;
655 const auto kExpectedTransactionsPending = 1u;
656
657 const auto unsignaledTransaction =
658 createTransactionInfo(kApplyToken1,
659 {
660 createComposerState(kLayerId1,
661 fence(Fence::Status::Unsignaled),
662 layer_state_t::eBufferChanged),
663 });
664 const auto unsignaledTransaction2 =
665 createTransactionInfo(kApplyToken2,
666 {
667 createComposerState(kLayerId2,
668 fence(Fence::Status::Unsignaled),
669 layer_state_t::eBufferChanged),
670 });
671 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
672 kExpectedTransactionsApplied, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000673}
674
Ady Abraham2739e832022-02-14 17:42:00 -0800675TEST_F(LatchUnsignaledAutoSingleLayerTest, DontLatchUnsignaledWhenEarlyOffset) {
676 const sp<IBinder> kApplyToken =
677 IInterface::asBinder(TransactionCompletedListener::getIInstance());
678 const auto kLayerId = 1;
679 const auto kExpectedTransactionsApplied = 0u;
680 const auto kExpectedTransactionsPending = 1u;
681
682 const auto unsignaledTransaction =
683 createTransactionInfo(kApplyToken,
684 {
685 createComposerState(kLayerId,
686 fence(Fence::Status::Unsignaled),
687 layer_state_t::eBufferChanged),
688 });
689
690 // Get VsyncModulator out of the default config
691 static_cast<void>(mFlinger.mutableVsyncModulator()->onRefreshRateChangeInitiated());
692
693 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
694 kExpectedTransactionsPending);
695}
696
Ady Abraham9dada822022-02-03 10:26:59 -0800697class LatchUnsignaledDisabledTest : public LatchUnsignaledTest {
698public:
699 void SetUp() override {
700 LatchUnsignaledTest::SetUp();
701 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Disabled;
702 }
703};
704
705TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue) {
706 const sp<IBinder> kApplyToken =
707 IInterface::asBinder(TransactionCompletedListener::getIInstance());
708 const auto kLayerId = 1;
709 const auto kExpectedTransactionsApplied = 1u;
710 const auto kExpectedTransactionsPending = 0u;
711
712 const auto signaledTransaction =
713 createTransactionInfo(kApplyToken,
714 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
715 layer_state_t::eBufferChanged)});
716 setTransactionStates({signaledTransaction}, kExpectedTransactionsApplied,
717 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000718}
719
Ady Abraham9dada822022-02-03 10:26:59 -0800720TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueue) {
721 const sp<IBinder> kApplyToken =
722 IInterface::asBinder(TransactionCompletedListener::getIInstance());
723 const auto kLayerId = 1;
724 const auto kExpectedTransactionsApplied = 0u;
725 const auto kExpectedTransactionsPending = 1u;
726
727 const auto unsignaledTransaction =
728 createTransactionInfo(kApplyToken,
729 {
730 createComposerState(kLayerId,
731 fence(Fence::Status::Unsignaled),
732 layer_state_t::eBufferChanged),
733 });
734 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
735 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000736}
737
Ady Abraham9dada822022-02-03 10:26:59 -0800738TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueSameLayerId) {
739 const sp<IBinder> kApplyToken =
740 IInterface::asBinder(TransactionCompletedListener::getIInstance());
741 const auto kLayerId = 1;
742 const auto kExpectedTransactionsApplied = 0u;
743 const auto kExpectedTransactionsPending = 1u;
744
745 const auto unsignaledTransaction =
746 createTransactionInfo(kApplyToken,
747 {
748 createComposerState(kLayerId,
749 fence(Fence::Status::Unsignaled),
750 layer_state_t::eBufferChanged),
751 createComposerState(kLayerId,
752 fence(Fence::Status::Unsignaled),
753 layer_state_t::eBufferChanged),
754 });
755 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
756 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000757}
758
Ady Abraham9dada822022-02-03 10:26:59 -0800759TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueDifferentLayerId) {
760 const sp<IBinder> kApplyToken =
761 IInterface::asBinder(TransactionCompletedListener::getIInstance());
762 const auto kLayerId1 = 1;
763 const auto kLayerId2 = 2;
764 const auto kExpectedTransactionsApplied = 0u;
765 const auto kExpectedTransactionsPending = 1u;
766
767 const auto unsignaledTransaction =
768 createTransactionInfo(kApplyToken,
769 {
770 createComposerState(kLayerId1,
771 fence(Fence::Status::Unsignaled),
772 layer_state_t::eBufferChanged),
773 createComposerState(kLayerId2,
774 fence(Fence::Status::Unsignaled),
775 layer_state_t::eBufferChanged),
776 });
777 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
778 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000779}
780
Ady Abraham9dada822022-02-03 10:26:59 -0800781TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
782 const sp<IBinder> kApplyToken =
783 IInterface::asBinder(TransactionCompletedListener::getIInstance());
784 const auto kLayerId1 = 1;
785 const auto kLayerId2 = 2;
786 const auto kExpectedTransactionsApplied = 2u;
787 const auto kExpectedTransactionsPending = 0u;
788
789 const auto signaledTransaction =
790 createTransactionInfo(kApplyToken,
791 {
792 createComposerState(kLayerId1,
793 fence(Fence::Status::Signaled),
794 layer_state_t::eBufferChanged),
795 });
796 const auto signaledTransaction2 =
797 createTransactionInfo(kApplyToken,
798 {
799 createComposerState(kLayerId2,
800 fence(Fence::Status::Signaled),
801 layer_state_t::eBufferChanged),
802 });
803 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsApplied,
804 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000805}
806
Ady Abraham9dada822022-02-03 10:26:59 -0800807TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueDifferentApplyToken) {
808 const sp<IBinder> kApplyToken1 =
809 IInterface::asBinder(TransactionCompletedListener::getIInstance());
810 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
811 const auto kLayerId1 = 1;
812 const auto kLayerId2 = 2;
813 const auto kExpectedTransactionsApplied = 1u;
814 const auto kExpectedTransactionsPending = 1u;
815
816 const auto unsignaledTransaction =
817 createTransactionInfo(kApplyToken1,
818 {
819 createComposerState(kLayerId1,
820 fence(Fence::Status::Unsignaled),
821 layer_state_t::eBufferChanged),
822 });
823 const auto signaledTransaction =
824 createTransactionInfo(kApplyToken2,
825 {
826 createComposerState(kLayerId2,
827 fence(Fence::Status::Signaled),
828 layer_state_t::eBufferChanged),
829 });
830 setTransactionStates({unsignaledTransaction, signaledTransaction}, kExpectedTransactionsApplied,
831 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000832}
833
Ady Abraham9dada822022-02-03 10:26:59 -0800834TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueSameApplyToken) {
835 const sp<IBinder> kApplyToken =
836 IInterface::asBinder(TransactionCompletedListener::getIInstance());
837 const auto kLayerId1 = 1;
838 const auto kLayerId2 = 2;
839 const auto kExpectedTransactionsApplied = 1u;
840 const auto kExpectedTransactionsPending = 1u;
841
842 const auto signaledTransaction =
843 createTransactionInfo(kApplyToken,
844 {
845 createComposerState(kLayerId1,
846 fence(Fence::Status::Signaled),
847 layer_state_t::eBufferChanged),
848 });
849 const auto unsignaledTransaction =
850 createTransactionInfo(kApplyToken,
851 {
852 createComposerState(kLayerId2,
853 fence(Fence::Status::Unsignaled),
854 layer_state_t::eBufferChanged),
855 });
856 setTransactionStates({signaledTransaction, unsignaledTransaction}, kExpectedTransactionsApplied,
857 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000858}
859
Ady Abraham9dada822022-02-03 10:26:59 -0800860TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheUnsignaledTheQueue) {
861 const sp<IBinder> kApplyToken =
862 IInterface::asBinder(TransactionCompletedListener::getIInstance());
863 const auto kLayerId1 = 1;
864 const auto kLayerId2 = 2;
865 const auto kExpectedTransactionsApplied = 0u;
866 const auto kExpectedTransactionsPending = 1u;
867
868 const auto unsignaledTransaction =
869 createTransactionInfo(kApplyToken,
870 {
871 createComposerState(kLayerId1,
872 fence(Fence::Status::Unsignaled),
873 layer_state_t::eBufferChanged),
874 });
875 const auto unsignaledTransaction2 =
876 createTransactionInfo(kApplyToken,
877 {
878 createComposerState(kLayerId2,
879 fence(Fence::Status::Unsignaled),
880 layer_state_t::eBufferChanged),
881 });
882 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
883 kExpectedTransactionsApplied, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000884}
885
Ady Abraham9dada822022-02-03 10:26:59 -0800886class LatchUnsignaledAlwaysTest : public LatchUnsignaledTest {
887public:
888 void SetUp() override {
889 LatchUnsignaledTest::SetUp();
890 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Always;
891 }
892};
893
894TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue) {
895 const sp<IBinder> kApplyToken =
896 IInterface::asBinder(TransactionCompletedListener::getIInstance());
897 const auto kLayerId = 1;
898 const auto kExpectedTransactionsApplied = 1u;
899 const auto kExpectedTransactionsPending = 0u;
900
901 const auto signaledTransaction =
902 createTransactionInfo(kApplyToken,
903 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
904 layer_state_t::eBufferChanged)});
905 setTransactionStates({signaledTransaction}, kExpectedTransactionsApplied,
906 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000907}
908
Ady Abraham9dada822022-02-03 10:26:59 -0800909TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueue) {
910 const sp<IBinder> kApplyToken =
911 IInterface::asBinder(TransactionCompletedListener::getIInstance());
912 const auto kLayerId = 1;
913 const auto kExpectedTransactionsApplied = 1u;
914 const auto kExpectedTransactionsPending = 0u;
915
916 const auto unsignaledTransaction =
917 createTransactionInfo(kApplyToken,
918 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
919 layer_state_t::eBufferChanged)});
920 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
921 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000922}
923
Ady Abraham9dada822022-02-03 10:26:59 -0800924TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueSameLayerId) {
925 const sp<IBinder> kApplyToken =
926 IInterface::asBinder(TransactionCompletedListener::getIInstance());
927 const auto kLayerId = 1;
928 const auto kExpectedTransactionsApplied = 1u;
929 const auto kExpectedTransactionsPending = 0u;
930
931 const auto mixedTransaction =
932 createTransactionInfo(kApplyToken,
933 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
934 layer_state_t::eBufferChanged),
935 createComposerState(kLayerId, fence(Fence::Status::Signaled),
936 layer_state_t::eBufferChanged)});
937 setTransactionStates({mixedTransaction}, kExpectedTransactionsApplied,
938 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000939}
940
Ady Abraham9dada822022-02-03 10:26:59 -0800941TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentLayerId) {
942 const sp<IBinder> kApplyToken =
943 IInterface::asBinder(TransactionCompletedListener::getIInstance());
944 const auto kLayerId1 = 1;
945 const auto kLayerId2 = 2;
946 const auto kExpectedTransactionsApplied = 1u;
947 const auto kExpectedTransactionsPending = 0u;
948
949 const auto mixedTransaction =
950 createTransactionInfo(kApplyToken,
951 {createComposerState(kLayerId1, fence(Fence::Status::Unsignaled),
952 layer_state_t::eBufferChanged),
953 createComposerState(kLayerId2, fence(Fence::Status::Signaled),
954 layer_state_t::eBufferChanged)});
955 setTransactionStates({mixedTransaction}, kExpectedTransactionsApplied,
956 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000957}
958
Ady Abraham9dada822022-02-03 10:26:59 -0800959TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
960 const sp<IBinder> kApplyToken =
961 IInterface::asBinder(TransactionCompletedListener::getIInstance());
962 const auto kLayerId1 = 1;
963 const auto kLayerId2 = 2;
964 const auto kExpectedTransactionsApplied = 2u;
965 const auto kExpectedTransactionsPending = 0u;
966
967 const auto signaledTransaction =
968 createTransactionInfo(kApplyToken,
969 {
970 createComposerState(kLayerId1,
971 fence(Fence::Status::Signaled),
972 layer_state_t::eBufferChanged),
973 });
974 const auto signaledTransaction2 =
975 createTransactionInfo(kApplyToken,
976 {
977 createComposerState(kLayerId2,
978 fence(Fence::Status::Signaled),
979 layer_state_t::eBufferChanged),
980 });
981 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsApplied,
982 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000983}
984
Ady Abraham9dada822022-02-03 10:26:59 -0800985TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentApplyToken) {
986 const sp<IBinder> kApplyToken1 =
987 IInterface::asBinder(TransactionCompletedListener::getIInstance());
988 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
989 const auto kLayerId1 = 1;
990 const auto kLayerId2 = 2;
991 const auto kExpectedTransactionsApplied = 2u;
992 const auto kExpectedTransactionsPending = 0u;
993
994 const auto signaledTransaction =
995 createTransactionInfo(kApplyToken1,
996 {
997 createComposerState(kLayerId1,
998 fence(Fence::Status::Signaled),
999 layer_state_t::eBufferChanged),
1000 });
1001 const auto unsignaledTransaction =
1002 createTransactionInfo(kApplyToken2,
1003 {
1004 createComposerState(kLayerId2,
1005 fence(Fence::Status::Unsignaled),
1006 layer_state_t::eBufferChanged),
1007 });
1008 setTransactionStates({signaledTransaction, unsignaledTransaction}, kExpectedTransactionsApplied,
1009 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +00001010}
1011
Ady Abraham9dada822022-02-03 10:26:59 -08001012TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueueSameApplyToken) {
1013 const sp<IBinder> kApplyToken =
1014 IInterface::asBinder(TransactionCompletedListener::getIInstance());
1015 const auto kLayerId1 = 1;
1016 const auto kLayerId2 = 2;
1017 const auto kExpectedTransactionsApplied = 2u;
1018 const auto kExpectedTransactionsPending = 0u;
1019
1020 const auto unsignaledTransaction =
1021 createTransactionInfo(kApplyToken,
1022 {
1023 createComposerState(kLayerId1,
1024 fence(Fence::Status::Unsignaled),
1025 layer_state_t::eBufferChanged),
1026 });
1027 const auto signaledTransaction =
1028 createTransactionInfo(kApplyToken,
1029 {
1030 createComposerState(kLayerId2,
1031 fence(Fence::Status::Signaled),
1032 layer_state_t::eBufferChanged),
1033 });
1034 setTransactionStates({unsignaledTransaction, signaledTransaction}, kExpectedTransactionsApplied,
1035 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +00001036}
1037
Ady Abraham9dada822022-02-03 10:26:59 -08001038TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueue) {
1039 const sp<IBinder> kApplyToken1 =
1040 IInterface::asBinder(TransactionCompletedListener::getIInstance());
1041 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
1042 const auto kLayerId1 = 1;
1043 const auto kLayerId2 = 2;
1044 const auto kExpectedTransactionsApplied = 2u;
1045 const auto kExpectedTransactionsPending = 0u;
1046
1047 const auto unsignaledTransaction =
1048 createTransactionInfo(kApplyToken1,
1049 {
1050 createComposerState(kLayerId1,
1051 fence(Fence::Status::Unsignaled),
1052 layer_state_t::eBufferChanged),
1053 });
1054 const auto unsignaledTransaction2 =
1055 createTransactionInfo(kApplyToken2,
1056 {
1057 createComposerState(kLayerId2,
1058 fence(Fence::Status::Unsignaled),
1059 layer_state_t::eBufferChanged),
1060 });
1061 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
1062 kExpectedTransactionsApplied, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +00001063}
1064
Ady Abraham2739e832022-02-14 17:42:00 -08001065TEST_F(LatchUnsignaledAlwaysTest, LatchUnsignaledWhenEarlyOffset) {
1066 const sp<IBinder> kApplyToken =
1067 IInterface::asBinder(TransactionCompletedListener::getIInstance());
1068 const auto kLayerId = 1;
1069 const auto kExpectedTransactionsApplied = 1u;
1070 const auto kExpectedTransactionsPending = 0u;
1071
1072 const auto unsignaledTransaction =
1073 createTransactionInfo(kApplyToken,
1074 {
1075 createComposerState(kLayerId,
1076 fence(Fence::Status::Unsignaled),
1077 layer_state_t::eBufferChanged),
1078 });
1079
1080 // Get VsyncModulator out of the default config
1081 static_cast<void>(mFlinger.mutableVsyncModulator()->onRefreshRateChangeInitiated());
1082
1083 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsApplied,
1084 kExpectedTransactionsPending);
1085}
1086
Valerie Haud251afb2019-03-29 14:19:02 -07001087} // namespace android