blob: 488d4a9c5849b64613568cb598e7e2f6cd68172e [file] [log] [blame]
Valerie Haud251afb2019-03-29 14:19:02 -07001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#undef LOG_TAG
18#define LOG_TAG "CompositionTest"
19
20#include <compositionengine/Display.h>
21#include <compositionengine/mock/DisplaySurface.h>
22#include <gmock/gmock.h>
23#include <gtest/gtest.h>
Vishnu Nair59f6d2d2022-10-05 16:59:56 -070024#include <gui/LayerState.h>
Valerie Haud251afb2019-03-29 14:19:02 -070025#include <gui/SurfaceComposerClient.h>
Vishnu Nair59f6d2d2022-10-05 16:59:56 -070026#include <gui/fake/BufferData.h>
Valerie Haud251afb2019-03-29 14:19:02 -070027#include <log/log.h>
ramindani4d48f902021-09-20 21:07:45 +000028#include <ui/MockFence.h>
Valerie Haud251afb2019-03-29 14:19:02 -070029#include <utils/String8.h>
Vishnu Nair59f6d2d2022-10-05 16:59:56 -070030#include <vector>
31#include <binder/Binder.h>
Dominik Laskowski068173d2021-08-11 17:22:59 -070032
Vishnu Naira61e4fb2022-10-18 18:29:37 +000033#include "FrontEnd/TransactionHandler.h"
Valerie Haud251afb2019-03-29 14:19:02 -070034#include "TestableSurfaceFlinger.h"
Vishnu Nair40fff5c2022-11-04 02:46:28 +000035#include "TransactionState.h"
Valerie Haud251afb2019-03-29 14:19:02 -070036#include "mock/MockEventThread.h"
Ady Abraham8cb21882020-08-26 18:22:05 -070037#include "mock/MockVsyncController.h"
Valerie Haud251afb2019-03-29 14:19:02 -070038
39namespace android {
40
41using testing::_;
42using testing::Return;
43
44using FakeHwcDisplayInjector = TestableSurfaceFlinger::FakeHwcDisplayInjector;
Vishnu Nair1523dad2022-09-29 16:05:18 -070045constexpr nsecs_t TRANSACTION_TIMEOUT = s2ns(5);
Valerie Haud251afb2019-03-29 14:19:02 -070046class TransactionApplicationTest : public testing::Test {
47public:
48 TransactionApplicationTest() {
49 const ::testing::TestInfo* const test_info =
50 ::testing::UnitTest::GetInstance()->current_test_info();
51 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
52
Valerie Haud251afb2019-03-29 14:19:02 -070053 setupScheduler();
54 }
55
56 ~TransactionApplicationTest() {
57 const ::testing::TestInfo* const test_info =
58 ::testing::UnitTest::GetInstance()->current_test_info();
59 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
60 }
61
62 void setupScheduler() {
63 auto eventThread = std::make_unique<mock::EventThread>();
64 auto sfEventThread = std::make_unique<mock::EventThread>();
65
66 EXPECT_CALL(*eventThread, registerDisplayEventConnection(_));
67 EXPECT_CALL(*eventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070068 .WillOnce(Return(sp<EventThreadConnection>::make(eventThread.get(),
69 mock::EventThread::kCallingUid,
70 ResyncCallback())));
Valerie Haud251afb2019-03-29 14:19:02 -070071
72 EXPECT_CALL(*sfEventThread, registerDisplayEventConnection(_));
73 EXPECT_CALL(*sfEventThread, createEventConnection(_, _))
Ady Abrahamd11bade2022-08-01 16:18:03 -070074 .WillOnce(Return(sp<EventThreadConnection>::make(sfEventThread.get(),
75 mock::EventThread::kCallingUid,
76 ResyncCallback())));
Valerie Haud251afb2019-03-29 14:19:02 -070077
Ady Abraham8cb21882020-08-26 18:22:05 -070078 EXPECT_CALL(*mVSyncTracker, nextAnticipatedVSyncTimeFrom(_)).WillRepeatedly(Return(0));
79 EXPECT_CALL(*mVSyncTracker, currentPeriod())
Marin Shalamanov045b7002021-01-07 16:56:24 +010080 .WillRepeatedly(Return(FakeHwcDisplayInjector::DEFAULT_VSYNC_PERIOD));
Valerie Haud251afb2019-03-29 14:19:02 -070081
Ady Abraham3efa3942021-06-24 19:01:25 -070082 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
Ady Abraham8cb21882020-08-26 18:22:05 -070083 mFlinger.setupScheduler(std::unique_ptr<mock::VsyncController>(mVsyncController),
84 std::unique_ptr<mock::VSyncTracker>(mVSyncTracker),
Valerie Haud251afb2019-03-29 14:19:02 -070085 std::move(eventThread), std::move(sfEventThread));
Vishnu Nair59f6d2d2022-10-05 16:59:56 -070086 mFlinger.flinger()->addTransactionReadyFilters();
Valerie Haud251afb2019-03-29 14:19:02 -070087 }
88
Valerie Haud251afb2019-03-29 14:19:02 -070089 TestableSurfaceFlinger mFlinger;
90
Ady Abraham8cb21882020-08-26 18:22:05 -070091 mock::VsyncController* mVsyncController = new mock::VsyncController();
92 mock::VSyncTracker* mVSyncTracker = new mock::VSyncTracker();
Valerie Haud251afb2019-03-29 14:19:02 -070093
94 struct TransactionInfo {
95 Vector<ComposerState> states;
96 Vector<DisplayState> displays;
97 uint32_t flags = 0;
98 sp<IBinder> applyToken = IInterface::asBinder(TransactionCompletedListener::getIInstance());
99 InputWindowCommands inputWindowCommands;
Ady Abrahamf0c56492020-12-17 18:04:15 -0800100 int64_t desiredPresentTime = 0;
101 bool isAutoTimestamp = true;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000102 FrameTimelineInfo frameTimelineInfo;
Valerie Haud251afb2019-03-29 14:19:02 -0700103 client_cache_t uncacheBuffer;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000104 uint64_t id = static_cast<uint64_t>(-1);
105 static_assert(0xffffffffffffffff == static_cast<uint64_t>(-1));
Valerie Haud251afb2019-03-29 14:19:02 -0700106 };
107
Vishnu Nair6b591152021-10-08 11:45:14 -0700108 void checkEqual(TransactionInfo info, TransactionState state) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000109 EXPECT_EQ(0u, info.states.size());
110 EXPECT_EQ(0u, state.states.size());
Valerie Haud251afb2019-03-29 14:19:02 -0700111
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000112 EXPECT_EQ(0u, info.displays.size());
113 EXPECT_EQ(0u, state.displays.size());
Valerie Haud251afb2019-03-29 14:19:02 -0700114 EXPECT_EQ(info.flags, state.flags);
115 EXPECT_EQ(info.desiredPresentTime, state.desiredPresentTime);
116 }
117
Patrick Williams641f7f22022-06-22 19:25:35 +0000118 void setupSingle(TransactionInfo& transaction, uint32_t flags, int64_t desiredPresentTime,
119 bool isAutoTimestamp, const FrameTimelineInfo& frameTimelineInfo) {
Valerie Haud251afb2019-03-29 14:19:02 -0700120 mTransactionNumber++;
Vishnu Nair1523dad2022-09-29 16:05:18 -0700121 transaction.flags |= flags;
Valerie Haud251afb2019-03-29 14:19:02 -0700122 transaction.desiredPresentTime = desiredPresentTime;
Ady Abrahamf0c56492020-12-17 18:04:15 -0800123 transaction.isAutoTimestamp = isAutoTimestamp;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000124 transaction.frameTimelineInfo = frameTimelineInfo;
Valerie Haud251afb2019-03-29 14:19:02 -0700125 }
126
Patrick Williams641f7f22022-06-22 19:25:35 +0000127 void NotPlacedOnTransactionQueue(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000128 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700129 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700130 TransactionInfo transaction;
Patrick Williams641f7f22022-06-22 19:25:35 +0000131 setupSingle(transaction, flags,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800132 /*desiredPresentTime*/ systemTime(), /*isAutoTimestamp*/ true,
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000133 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700134 nsecs_t applicationTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000135 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700136 transaction.displays, transaction.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700137 transaction.applyToken, transaction.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800138 transaction.desiredPresentTime, transaction.isAutoTimestamp,
139 transaction.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
140 transaction.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700141
Patrick Williams641f7f22022-06-22 19:25:35 +0000142 // If transaction is synchronous, SF applyTransactionState should time out (5s) wating for
143 // SF to commit the transaction. If this is animation, it should not time out waiting.
Valerie Haud251afb2019-03-29 14:19:02 -0700144 nsecs_t returnedTime = systemTime();
Vishnu Nair1523dad2022-09-29 16:05:18 -0700145 EXPECT_LE(returnedTime, applicationTime + TRANSACTION_TIMEOUT);
Arthur Hung58144272021-01-16 03:43:53 +0000146 // Each transaction should have been placed on the transaction queue
Vishnu Nair60d902e2022-07-20 02:55:37 +0000147 auto& transactionQueue = mFlinger.getTransactionQueue();
148 EXPECT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700149 }
150
Patrick Williams641f7f22022-06-22 19:25:35 +0000151 void PlaceOnTransactionQueue(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000152 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700153 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700154
155 // first check will see desired present time has not passed,
156 // but afterwards it will look like the desired present time has passed
157 nsecs_t time = systemTime();
Valerie Haud251afb2019-03-29 14:19:02 -0700158 TransactionInfo transaction;
Patrick Williams641f7f22022-06-22 19:25:35 +0000159 setupSingle(transaction, flags, /*desiredPresentTime*/ time + s2ns(1), false,
160 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700161 nsecs_t applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000162 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700163 transaction.displays, transaction.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700164 transaction.applyToken, transaction.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800165 transaction.desiredPresentTime, transaction.isAutoTimestamp,
166 transaction.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
167 transaction.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700168
169 nsecs_t returnedTime = systemTime();
Vishnu Nair1523dad2022-09-29 16:05:18 -0700170 EXPECT_LE(returnedTime, applicationSentTime + TRANSACTION_TIMEOUT);
Valerie Haud251afb2019-03-29 14:19:02 -0700171 // This transaction should have been placed on the transaction queue
Vishnu Nair60d902e2022-07-20 02:55:37 +0000172 auto& transactionQueue = mFlinger.getTransactionQueue();
173 EXPECT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700174 }
175
Patrick Williams641f7f22022-06-22 19:25:35 +0000176 void BlockedByPriorTransaction(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000177 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700178 nsecs_t time = systemTime();
Patrick Williams641f7f22022-06-22 19:25:35 +0000179 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(2);
180
Valerie Haud251afb2019-03-29 14:19:02 -0700181 // transaction that should go on the pending thread
182 TransactionInfo transactionA;
Patrick Williams641f7f22022-06-22 19:25:35 +0000183 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ time + s2ns(1), false,
184 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700185
186 // transaction that would not have gone on the pending thread if not
187 // blocked
188 TransactionInfo transactionB;
Patrick Williams641f7f22022-06-22 19:25:35 +0000189 setupSingle(transactionB, flags, /*desiredPresentTime*/ systemTime(),
190 /*isAutoTimestamp*/ true, FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700191
192 nsecs_t applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000193 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700194 transactionA.displays, transactionA.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700195 transactionA.applyToken, transactionA.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800196 transactionA.desiredPresentTime, transactionA.isAutoTimestamp,
197 transactionA.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
198 transactionA.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700199
200 // This thread should not have been blocked by the above transaction
201 // (5s is the timeout period that applyTransactionState waits for SF to
202 // commit the transaction)
Vishnu Nair1523dad2022-09-29 16:05:18 -0700203 EXPECT_LE(systemTime(), applicationSentTime + TRANSACTION_TIMEOUT);
Arthur Hung58144272021-01-16 03:43:53 +0000204 // transaction that would goes to pending transaciton queue.
205 mFlinger.flushTransactionQueues();
Valerie Haud251afb2019-03-29 14:19:02 -0700206
207 applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000208 mFlinger.setTransactionState(transactionB.frameTimelineInfo, transactionB.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700209 transactionB.displays, transactionB.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700210 transactionB.applyToken, transactionB.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800211 transactionB.desiredPresentTime, transactionB.isAutoTimestamp,
212 transactionB.uncacheBuffer, mHasListenerCallbacks, mCallbacks,
213 transactionB.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700214
215 // this thread should have been blocked by the above transaction
216 // if this is an animation, this thread should be blocked for 5s
217 // in setTransactionState waiting for transactionA to flush. Otherwise,
218 // the transaction should be placed on the pending queue
Vishnu Nair1523dad2022-09-29 16:05:18 -0700219 EXPECT_LE(systemTime(), applicationSentTime + TRANSACTION_TIMEOUT);
Valerie Haud251afb2019-03-29 14:19:02 -0700220
Arthur Hung58144272021-01-16 03:43:53 +0000221 // transaction that would goes to pending transaciton queue.
222 mFlinger.flushTransactionQueues();
223
Ady Abrahame46243a2021-02-23 19:33:49 -0800224 // check that the transaction was applied.
Arthur Hung58144272021-01-16 03:43:53 +0000225 auto transactionQueue = mFlinger.getPendingTransactionQueue();
Ady Abrahame46243a2021-02-23 19:33:49 -0800226 EXPECT_EQ(0u, transactionQueue.size());
Valerie Haud251afb2019-03-29 14:19:02 -0700227 }
228
229 bool mHasListenerCallbacks = false;
230 std::vector<ListenerCallbacks> mCallbacks;
231 int mTransactionNumber = 0;
232};
233
Vishnu Nair60d902e2022-07-20 02:55:37 +0000234TEST_F(TransactionApplicationTest, AddToPendingQueue) {
235 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700236 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700237
Valerie Haud251afb2019-03-29 14:19:02 -0700238 TransactionInfo transactionA; // transaction to go on pending queue
Patrick Williams641f7f22022-06-22 19:25:35 +0000239 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ s2ns(1), false,
240 FrameTimelineInfo{});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000241 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700242 transactionA.displays, transactionA.flags, transactionA.applyToken,
243 transactionA.inputWindowCommands, transactionA.desiredPresentTime,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800244 transactionA.isAutoTimestamp, transactionA.uncacheBuffer,
245 mHasListenerCallbacks, mCallbacks, transactionA.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700246
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000247 auto& transactionQueue = mFlinger.getTransactionQueue();
Vishnu Nair60d902e2022-07-20 02:55:37 +0000248 ASSERT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700249
Vishnu Nair60d902e2022-07-20 02:55:37 +0000250 auto transactionState = transactionQueue.pop().value();
Valerie Haud251afb2019-03-29 14:19:02 -0700251 checkEqual(transactionA, transactionState);
Vishnu Nair60d902e2022-07-20 02:55:37 +0000252}
253
254TEST_F(TransactionApplicationTest, Flush_RemovesFromQueue) {
255 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
256 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
257
258 TransactionInfo transactionA; // transaction to go on pending queue
259 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ s2ns(1), false,
260 FrameTimelineInfo{});
261 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
262 transactionA.displays, transactionA.flags, transactionA.applyToken,
263 transactionA.inputWindowCommands, transactionA.desiredPresentTime,
264 transactionA.isAutoTimestamp, transactionA.uncacheBuffer,
265 mHasListenerCallbacks, mCallbacks, transactionA.id);
266
267 auto& transactionQueue = mFlinger.getTransactionQueue();
268 ASSERT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700269
270 // because flushing uses the cached expected present time, we send an empty
271 // transaction here (sending a null applyToken to fake it as from a
272 // different process) to re-query and reset the cached expected present time
273 TransactionInfo empty;
274 empty.applyToken = sp<IBinder>();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000275 mFlinger.setTransactionState(empty.frameTimelineInfo, empty.states, empty.displays, empty.flags,
276 empty.applyToken, empty.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800277 empty.desiredPresentTime, empty.isAutoTimestamp,
278 empty.uncacheBuffer, mHasListenerCallbacks, mCallbacks, empty.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700279
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000280 // flush transaction queue should flush as desiredPresentTime has
Valerie Haud251afb2019-03-29 14:19:02 -0700281 // passed
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000282 mFlinger.flushTransactionQueues();
Valerie Haud251afb2019-03-29 14:19:02 -0700283
Vishnu Nair60d902e2022-07-20 02:55:37 +0000284 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700285}
286
Valerie Haud251afb2019-03-29 14:19:02 -0700287TEST_F(TransactionApplicationTest, NotPlacedOnTransactionQueue_SyncInputWindows) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000288 NotPlacedOnTransactionQueue(/*flags*/ 0);
Valerie Haud251afb2019-03-29 14:19:02 -0700289}
290
Valerie Haud251afb2019-03-29 14:19:02 -0700291TEST_F(TransactionApplicationTest, PlaceOnTransactionQueue_SyncInputWindows) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000292 PlaceOnTransactionQueue(/*flags*/ 0);
Valerie Haud251afb2019-03-29 14:19:02 -0700293}
294
Valerie Hau09e60052019-12-15 14:51:15 -0800295TEST_F(TransactionApplicationTest, FromHandle) {
296 sp<IBinder> badHandle;
297 auto ret = mFlinger.fromHandle(badHandle);
Vishnu Nair07e2a482022-10-18 19:18:16 +0000298 EXPECT_EQ(nullptr, ret.get());
Valerie Hau09e60052019-12-15 14:51:15 -0800299}
ramindani4d48f902021-09-20 21:07:45 +0000300
Ady Abraham9dada822022-02-03 10:26:59 -0800301class LatchUnsignaledTest : public TransactionApplicationTest {
302public:
303 void TearDown() override {
304 // Clear all transaction queues to release all transactions we sent
305 // in the tests. Otherwise, gmock complains about memory leaks.
Vishnu Nair60d902e2022-07-20 02:55:37 +0000306 while (!mFlinger.getTransactionQueue().isEmpty()) {
307 mFlinger.getTransactionQueue().pop();
308 }
Ady Abraham9dada822022-02-03 10:26:59 -0800309 mFlinger.getPendingTransactionQueue().clear();
Ady Abraham9dada822022-02-03 10:26:59 -0800310 mFlinger.commitTransactionsLocked(eTransactionMask);
311 mFlinger.mutableCurrentState().layersSortedByZ.clear();
312 mFlinger.mutableDrawingState().layersSortedByZ.clear();
313 }
314
315 static sp<Fence> fence(Fence::Status status) {
316 const auto fence = sp<mock::MockFence>::make();
317 EXPECT_CALL(*fence, getStatus()).WillRepeatedly(Return(status));
318 return fence;
319 }
320
321 ComposerState createComposerState(int layerId, sp<Fence> fence, uint64_t what) {
322 ComposerState state;
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700323 state.state.bufferData =
324 std::make_shared<fake::BufferData>(/* bufferId */ 123L, /* width */ 1,
325 /* height */ 2, /* pixelFormat */ 0,
326 /* outUsage */ 0);
Ady Abraham9dada822022-02-03 10:26:59 -0800327 state.state.bufferData->acquireFence = std::move(fence);
328 state.state.layerId = layerId;
329 state.state.surface =
Patrick Williams83f36b22022-09-14 17:57:35 +0000330 sp<Layer>::make(LayerCreationArgs(mFlinger.flinger(), nullptr, "TestLayer", 0, {}))
Ady Abraham9dada822022-02-03 10:26:59 -0800331 ->getHandle();
332 state.state.bufferData->flags = BufferData::BufferDataChange::fenceChanged;
333
334 state.state.what = what;
335 if (what & layer_state_t::eCropChanged) {
336 state.state.crop = Rect(1, 2, 3, 4);
337 }
338 return state;
339 }
340
341 TransactionInfo createTransactionInfo(const sp<IBinder>& applyToken,
342 const std::vector<ComposerState>& states) {
343 TransactionInfo transaction;
Vishnu Nair1523dad2022-09-29 16:05:18 -0700344 const uint32_t kFlags = 0;
Ady Abraham9dada822022-02-03 10:26:59 -0800345 const nsecs_t kDesiredPresentTime = systemTime();
346 const bool kIsAutoTimestamp = true;
347 const auto kFrameTimelineInfo = FrameTimelineInfo{};
348
Patrick Williams641f7f22022-06-22 19:25:35 +0000349 setupSingle(transaction, kFlags, kDesiredPresentTime, kIsAutoTimestamp, kFrameTimelineInfo);
Ady Abraham9dada822022-02-03 10:26:59 -0800350 transaction.applyToken = applyToken;
351 for (const auto& state : states) {
352 transaction.states.push_back(state);
353 }
354
355 return transaction;
356 }
357
358 void setTransactionStates(const std::vector<TransactionInfo>& transactions,
Ady Abraham9dada822022-02-03 10:26:59 -0800359 size_t expectedTransactionsPending) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000360 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Ady Abraham9dada822022-02-03 10:26:59 -0800361 EXPECT_EQ(0u, mFlinger.getPendingTransactionQueue().size());
362
Vishnu Nair40fff5c2022-11-04 02:46:28 +0000363 for (auto transaction : transactions) {
364 std::vector<ResolvedComposerState> resolvedStates;
365 resolvedStates.reserve(transaction.states.size());
366 for (auto& state : transaction.states) {
367 resolvedStates.emplace_back(std::move(state));
368 }
369
370 TransactionState transactionState(transaction.frameTimelineInfo, resolvedStates,
371 transaction.displays, transaction.flags,
372 transaction.applyToken,
373 transaction.inputWindowCommands,
374 transaction.desiredPresentTime,
375 transaction.isAutoTimestamp,
376 transaction.uncacheBuffer, systemTime(), 0,
377 mHasListenerCallbacks, mCallbacks, getpid(),
378 static_cast<int>(getuid()), transaction.id);
379 mFlinger.setTransactionStateInternal(transactionState);
Ady Abraham9dada822022-02-03 10:26:59 -0800380 }
381 mFlinger.flushTransactionQueues();
Vishnu Nair60d902e2022-07-20 02:55:37 +0000382 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700383 EXPECT_EQ(expectedTransactionsPending, mFlinger.getPendingTransactionCount());
Ady Abraham9dada822022-02-03 10:26:59 -0800384 }
385};
386
387class LatchUnsignaledAutoSingleLayerTest : public LatchUnsignaledTest {
388public:
389 void SetUp() override {
390 LatchUnsignaledTest::SetUp();
391 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::AutoSingleLayer;
392 }
393};
394
395TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleSignaledFromTheQueue) {
396 const sp<IBinder> kApplyToken =
397 IInterface::asBinder(TransactionCompletedListener::getIInstance());
398 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800399 const auto kExpectedTransactionsPending = 0u;
400
401 const auto signaledTransaction =
402 createTransactionInfo(kApplyToken,
403 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
404 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700405 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000406}
407
Ady Abraham9dada822022-02-03 10:26:59 -0800408TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleUnSignaledFromTheQueue) {
409 const sp<IBinder> kApplyToken =
410 IInterface::asBinder(TransactionCompletedListener::getIInstance());
411 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800412 const auto kExpectedTransactionsPending = 0u;
413
414 const auto unsignaledTransaction =
415 createTransactionInfo(kApplyToken,
416 {
417 createComposerState(kLayerId,
418 fence(Fence::Status::Unsignaled),
419 layer_state_t::eBufferChanged),
420 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700421 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000422}
423
Ady Abraham9dada822022-02-03 10:26:59 -0800424TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferCropChange) {
425 const sp<IBinder> kApplyToken =
426 IInterface::asBinder(TransactionCompletedListener::getIInstance());
427 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800428 const auto kExpectedTransactionsPending = 1u;
429
430 const auto unsignaledTransaction =
431 createTransactionInfo(kApplyToken,
432 {
433 createComposerState(kLayerId,
434 fence(Fence::Status::Unsignaled),
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700435 layer_state_t::eCropChanged |
436 layer_state_t::
437 eBufferChanged),
Ady Abraham9dada822022-02-03 10:26:59 -0800438 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700439 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000440}
441
Ady Abraham9dada822022-02-03 10:26:59 -0800442TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferChangeClubed) {
443 const sp<IBinder> kApplyToken =
444 IInterface::asBinder(TransactionCompletedListener::getIInstance());
445 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800446 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 layer_state_t::
455 eBufferChanged),
456 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700457 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000458}
459
Ady Abraham9dada822022-02-03 10:26:59 -0800460TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueueSameApplyTokenMultiState) {
461 const sp<IBinder> kApplyToken =
462 IInterface::asBinder(TransactionCompletedListener::getIInstance());
463 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800464 const auto kExpectedTransactionsPending = 1u;
465
466 const auto mixedTransaction =
467 createTransactionInfo(kApplyToken,
468 {
469 createComposerState(kLayerId,
470 fence(Fence::Status::Unsignaled),
471 layer_state_t::eBufferChanged),
472 createComposerState(kLayerId,
473 fence(Fence::Status::Signaled),
474 layer_state_t::eBufferChanged),
475 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700476 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000477}
478
Ady Abraham9dada822022-02-03 10:26:59 -0800479TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueue_MultipleStateTransaction) {
480 const sp<IBinder> kApplyToken =
481 IInterface::asBinder(TransactionCompletedListener::getIInstance());
482 const auto kLayerId1 = 1;
483 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800484 const auto kExpectedTransactionsPending = 1u;
485
486 const auto mixedTransaction =
487 createTransactionInfo(kApplyToken,
488 {
489 createComposerState(kLayerId1,
490 fence(Fence::Status::Unsignaled),
491 layer_state_t::eBufferChanged),
492 createComposerState(kLayerId2,
493 fence(Fence::Status::Signaled),
494 layer_state_t::eBufferChanged),
495 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700496 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000497}
498
Ady Abraham9dada822022-02-03 10:26:59 -0800499TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSignaledFromTheQueue) {
500 const sp<IBinder> kApplyToken =
501 IInterface::asBinder(TransactionCompletedListener::getIInstance());
502 const auto kLayerId1 = 1;
503 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800504 const auto kExpectedTransactionsPending = 0u;
505
506 const auto signaledTransaction =
507 createTransactionInfo(kApplyToken,
508 {
509 createComposerState(kLayerId1,
510 fence(Fence::Status::Signaled),
511 layer_state_t::eBufferChanged),
512 });
513 const auto signaledTransaction2 =
514 createTransactionInfo(kApplyToken,
515 {
516 createComposerState(kLayerId2,
517 fence(Fence::Status::Signaled),
518 layer_state_t::eBufferChanged),
519 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700520 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000521}
522
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800523TEST_F(LatchUnsignaledAutoSingleLayerTest,
524 UnsignaledNotAppliedWhenThereAreSignaled_UnsignaledFirst) {
Ady Abraham9dada822022-02-03 10:26:59 -0800525 const sp<IBinder> kApplyToken1 =
526 IInterface::asBinder(TransactionCompletedListener::getIInstance());
527 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800528 const sp<IBinder> kApplyToken3 = sp<BBinder>::make();
Ady Abraham9dada822022-02-03 10:26:59 -0800529 const auto kLayerId1 = 1;
530 const auto kLayerId2 = 2;
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800531 const auto kExpectedTransactionsPending = 1u;
532
533 const auto unsignaledTransaction =
534 createTransactionInfo(kApplyToken1,
535 {
536 createComposerState(kLayerId1,
537 fence(Fence::Status::Unsignaled),
538 layer_state_t::eBufferChanged),
539 });
540
541 const auto signaledTransaction =
542 createTransactionInfo(kApplyToken2,
543 {
544 createComposerState(kLayerId2,
545 fence(Fence::Status::Signaled),
546 layer_state_t::eBufferChanged),
547 });
548 const auto signaledTransaction2 =
549 createTransactionInfo(kApplyToken3,
550 {
551 createComposerState(kLayerId2,
552 fence(Fence::Status::Signaled),
553 layer_state_t::eBufferChanged),
554 });
555
556 setTransactionStates({unsignaledTransaction, signaledTransaction, signaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700557 kExpectedTransactionsPending);
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800558}
559
Ady Abraham9dada822022-02-03 10:26:59 -0800560TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueueSameApplyToken) {
561 const sp<IBinder> kApplyToken =
562 IInterface::asBinder(TransactionCompletedListener::getIInstance());
563 const auto kLayerId1 = 1;
564 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800565 const auto kExpectedTransactionsPending = 1u;
566
567 const auto unsignaledTransaction =
568 createTransactionInfo(kApplyToken,
569 {
570 createComposerState(kLayerId1,
571 fence(Fence::Status::Unsignaled),
572 layer_state_t::eBufferChanged),
573 });
574 const auto signaledTransaction =
575 createTransactionInfo(kApplyToken,
576 {
577 createComposerState(kLayerId2,
578 fence(Fence::Status::Signaled),
579 layer_state_t::eBufferChanged),
580 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700581 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800582 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000583}
584
Ady Abraham9dada822022-02-03 10:26:59 -0800585TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueue) {
586 const sp<IBinder> kApplyToken1 =
587 IInterface::asBinder(TransactionCompletedListener::getIInstance());
588 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
589 const auto kLayerId1 = 1;
590 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800591 const auto kExpectedTransactionsPending = 1u;
592
593 const auto unsignaledTransaction =
594 createTransactionInfo(kApplyToken1,
595 {
596 createComposerState(kLayerId1,
597 fence(Fence::Status::Unsignaled),
598 layer_state_t::eBufferChanged),
599 });
600 const auto unsignaledTransaction2 =
601 createTransactionInfo(kApplyToken2,
602 {
603 createComposerState(kLayerId2,
604 fence(Fence::Status::Unsignaled),
605 layer_state_t::eBufferChanged),
606 });
607 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700608 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000609}
610
Ady Abraham2739e832022-02-14 17:42:00 -0800611TEST_F(LatchUnsignaledAutoSingleLayerTest, DontLatchUnsignaledWhenEarlyOffset) {
612 const sp<IBinder> kApplyToken =
613 IInterface::asBinder(TransactionCompletedListener::getIInstance());
614 const auto kLayerId = 1;
Ady Abraham2739e832022-02-14 17:42:00 -0800615 const auto kExpectedTransactionsPending = 1u;
616
617 const auto unsignaledTransaction =
618 createTransactionInfo(kApplyToken,
619 {
620 createComposerState(kLayerId,
621 fence(Fence::Status::Unsignaled),
622 layer_state_t::eBufferChanged),
623 });
624
625 // Get VsyncModulator out of the default config
626 static_cast<void>(mFlinger.mutableVsyncModulator()->onRefreshRateChangeInitiated());
627
Vishnu Nair1523dad2022-09-29 16:05:18 -0700628 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
Ady Abraham2739e832022-02-14 17:42:00 -0800629}
630
Ady Abraham9dada822022-02-03 10:26:59 -0800631class LatchUnsignaledDisabledTest : public LatchUnsignaledTest {
632public:
633 void SetUp() override {
634 LatchUnsignaledTest::SetUp();
635 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Disabled;
636 }
637};
638
639TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue) {
640 const sp<IBinder> kApplyToken =
641 IInterface::asBinder(TransactionCompletedListener::getIInstance());
642 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800643 const auto kExpectedTransactionsPending = 0u;
644
645 const auto signaledTransaction =
646 createTransactionInfo(kApplyToken,
647 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
648 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700649 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000650}
651
Ady Abraham9dada822022-02-03 10:26:59 -0800652TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueue) {
653 const sp<IBinder> kApplyToken =
654 IInterface::asBinder(TransactionCompletedListener::getIInstance());
655 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800656 const auto kExpectedTransactionsPending = 1u;
657
658 const auto unsignaledTransaction =
659 createTransactionInfo(kApplyToken,
660 {
661 createComposerState(kLayerId,
662 fence(Fence::Status::Unsignaled),
663 layer_state_t::eBufferChanged),
664 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700665 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000666}
667
Ady Abraham9dada822022-02-03 10:26:59 -0800668TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueSameLayerId) {
669 const sp<IBinder> kApplyToken =
670 IInterface::asBinder(TransactionCompletedListener::getIInstance());
671 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800672 const auto kExpectedTransactionsPending = 1u;
673
674 const auto unsignaledTransaction =
675 createTransactionInfo(kApplyToken,
676 {
677 createComposerState(kLayerId,
678 fence(Fence::Status::Unsignaled),
679 layer_state_t::eBufferChanged),
680 createComposerState(kLayerId,
681 fence(Fence::Status::Unsignaled),
682 layer_state_t::eBufferChanged),
683 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700684 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000685}
686
Ady Abraham9dada822022-02-03 10:26:59 -0800687TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueDifferentLayerId) {
688 const sp<IBinder> kApplyToken =
689 IInterface::asBinder(TransactionCompletedListener::getIInstance());
690 const auto kLayerId1 = 1;
691 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800692 const auto kExpectedTransactionsPending = 1u;
693
694 const auto unsignaledTransaction =
695 createTransactionInfo(kApplyToken,
696 {
697 createComposerState(kLayerId1,
698 fence(Fence::Status::Unsignaled),
699 layer_state_t::eBufferChanged),
700 createComposerState(kLayerId2,
701 fence(Fence::Status::Unsignaled),
702 layer_state_t::eBufferChanged),
703 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700704 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000705}
706
Ady Abraham9dada822022-02-03 10:26:59 -0800707TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
708 const sp<IBinder> kApplyToken =
709 IInterface::asBinder(TransactionCompletedListener::getIInstance());
710 const auto kLayerId1 = 1;
711 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800712 const auto kExpectedTransactionsPending = 0u;
713
714 const auto signaledTransaction =
715 createTransactionInfo(kApplyToken,
716 {
717 createComposerState(kLayerId1,
718 fence(Fence::Status::Signaled),
719 layer_state_t::eBufferChanged),
720 });
721 const auto signaledTransaction2 =
722 createTransactionInfo(kApplyToken,
723 {
724 createComposerState(kLayerId2,
725 fence(Fence::Status::Signaled),
726 layer_state_t::eBufferChanged),
727 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700728 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000729}
730
Ady Abraham9dada822022-02-03 10:26:59 -0800731TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueDifferentApplyToken) {
732 const sp<IBinder> kApplyToken1 =
733 IInterface::asBinder(TransactionCompletedListener::getIInstance());
734 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
735 const auto kLayerId1 = 1;
736 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800737 const auto kExpectedTransactionsPending = 1u;
738
739 const auto unsignaledTransaction =
740 createTransactionInfo(kApplyToken1,
741 {
742 createComposerState(kLayerId1,
743 fence(Fence::Status::Unsignaled),
744 layer_state_t::eBufferChanged),
745 });
746 const auto signaledTransaction =
747 createTransactionInfo(kApplyToken2,
748 {
749 createComposerState(kLayerId2,
750 fence(Fence::Status::Signaled),
751 layer_state_t::eBufferChanged),
752 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700753 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800754 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000755}
756
Ady Abraham9dada822022-02-03 10:26:59 -0800757TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueSameApplyToken) {
758 const sp<IBinder> kApplyToken =
759 IInterface::asBinder(TransactionCompletedListener::getIInstance());
760 const auto kLayerId1 = 1;
761 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800762 const auto kExpectedTransactionsPending = 1u;
763
764 const auto signaledTransaction =
765 createTransactionInfo(kApplyToken,
766 {
767 createComposerState(kLayerId1,
768 fence(Fence::Status::Signaled),
769 layer_state_t::eBufferChanged),
770 });
771 const auto unsignaledTransaction =
772 createTransactionInfo(kApplyToken,
773 {
774 createComposerState(kLayerId2,
775 fence(Fence::Status::Unsignaled),
776 layer_state_t::eBufferChanged),
777 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700778 setTransactionStates({signaledTransaction, unsignaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800779 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000780}
781
Ady Abraham9dada822022-02-03 10:26:59 -0800782TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheUnsignaledTheQueue) {
783 const sp<IBinder> kApplyToken =
784 IInterface::asBinder(TransactionCompletedListener::getIInstance());
785 const auto kLayerId1 = 1;
786 const auto kLayerId2 = 2;
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700787 const auto kExpectedTransactionsPending = 2u;
Ady Abraham9dada822022-02-03 10:26:59 -0800788
789 const auto unsignaledTransaction =
790 createTransactionInfo(kApplyToken,
791 {
792 createComposerState(kLayerId1,
793 fence(Fence::Status::Unsignaled),
794 layer_state_t::eBufferChanged),
795 });
796 const auto unsignaledTransaction2 =
797 createTransactionInfo(kApplyToken,
798 {
799 createComposerState(kLayerId2,
800 fence(Fence::Status::Unsignaled),
801 layer_state_t::eBufferChanged),
802 });
803 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700804 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000805}
806
Ady Abraham9dada822022-02-03 10:26:59 -0800807class LatchUnsignaledAlwaysTest : public LatchUnsignaledTest {
808public:
809 void SetUp() override {
810 LatchUnsignaledTest::SetUp();
811 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Always;
812 }
813};
814
815TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue) {
816 const sp<IBinder> kApplyToken =
817 IInterface::asBinder(TransactionCompletedListener::getIInstance());
818 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800819 const auto kExpectedTransactionsPending = 0u;
820
821 const auto signaledTransaction =
822 createTransactionInfo(kApplyToken,
823 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
824 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700825 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000826}
827
Ady Abraham9dada822022-02-03 10:26:59 -0800828TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueue) {
829 const sp<IBinder> kApplyToken =
830 IInterface::asBinder(TransactionCompletedListener::getIInstance());
831 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800832 const auto kExpectedTransactionsPending = 0u;
833
834 const auto unsignaledTransaction =
835 createTransactionInfo(kApplyToken,
836 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
837 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700838 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000839}
840
Ady Abraham9dada822022-02-03 10:26:59 -0800841TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueSameLayerId) {
842 const sp<IBinder> kApplyToken =
843 IInterface::asBinder(TransactionCompletedListener::getIInstance());
844 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800845 const auto kExpectedTransactionsPending = 0u;
846
847 const auto mixedTransaction =
848 createTransactionInfo(kApplyToken,
849 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
850 layer_state_t::eBufferChanged),
851 createComposerState(kLayerId, fence(Fence::Status::Signaled),
852 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700853 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000854}
855
Ady Abraham9dada822022-02-03 10:26:59 -0800856TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentLayerId) {
857 const sp<IBinder> kApplyToken =
858 IInterface::asBinder(TransactionCompletedListener::getIInstance());
859 const auto kLayerId1 = 1;
860 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800861 const auto kExpectedTransactionsPending = 0u;
862
863 const auto mixedTransaction =
864 createTransactionInfo(kApplyToken,
865 {createComposerState(kLayerId1, fence(Fence::Status::Unsignaled),
866 layer_state_t::eBufferChanged),
867 createComposerState(kLayerId2, fence(Fence::Status::Signaled),
868 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700869 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000870}
871
Ady Abraham9dada822022-02-03 10:26:59 -0800872TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
873 const sp<IBinder> kApplyToken =
874 IInterface::asBinder(TransactionCompletedListener::getIInstance());
875 const auto kLayerId1 = 1;
876 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800877 const auto kExpectedTransactionsPending = 0u;
878
879 const auto signaledTransaction =
880 createTransactionInfo(kApplyToken,
881 {
882 createComposerState(kLayerId1,
883 fence(Fence::Status::Signaled),
884 layer_state_t::eBufferChanged),
885 });
886 const auto signaledTransaction2 =
887 createTransactionInfo(kApplyToken,
888 {
889 createComposerState(kLayerId2,
890 fence(Fence::Status::Signaled),
891 layer_state_t::eBufferChanged),
892 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700893 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000894}
895
Ady Abraham9dada822022-02-03 10:26:59 -0800896TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentApplyToken) {
897 const sp<IBinder> kApplyToken1 =
898 IInterface::asBinder(TransactionCompletedListener::getIInstance());
899 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
900 const auto kLayerId1 = 1;
901 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800902 const auto kExpectedTransactionsPending = 0u;
903
904 const auto signaledTransaction =
905 createTransactionInfo(kApplyToken1,
906 {
907 createComposerState(kLayerId1,
908 fence(Fence::Status::Signaled),
909 layer_state_t::eBufferChanged),
910 });
911 const auto unsignaledTransaction =
912 createTransactionInfo(kApplyToken2,
913 {
914 createComposerState(kLayerId2,
915 fence(Fence::Status::Unsignaled),
916 layer_state_t::eBufferChanged),
917 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700918 setTransactionStates({signaledTransaction, unsignaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800919 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000920}
921
Ady Abraham9dada822022-02-03 10:26:59 -0800922TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueueSameApplyToken) {
923 const sp<IBinder> kApplyToken =
924 IInterface::asBinder(TransactionCompletedListener::getIInstance());
925 const auto kLayerId1 = 1;
926 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800927 const auto kExpectedTransactionsPending = 0u;
928
929 const auto unsignaledTransaction =
930 createTransactionInfo(kApplyToken,
931 {
932 createComposerState(kLayerId1,
933 fence(Fence::Status::Unsignaled),
934 layer_state_t::eBufferChanged),
935 });
936 const auto signaledTransaction =
937 createTransactionInfo(kApplyToken,
938 {
939 createComposerState(kLayerId2,
940 fence(Fence::Status::Signaled),
941 layer_state_t::eBufferChanged),
942 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700943 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800944 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000945}
946
Ady Abraham9dada822022-02-03 10:26:59 -0800947TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueue) {
948 const sp<IBinder> kApplyToken1 =
949 IInterface::asBinder(TransactionCompletedListener::getIInstance());
950 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
951 const auto kLayerId1 = 1;
952 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800953 const auto kExpectedTransactionsPending = 0u;
954
955 const auto unsignaledTransaction =
956 createTransactionInfo(kApplyToken1,
957 {
958 createComposerState(kLayerId1,
959 fence(Fence::Status::Unsignaled),
960 layer_state_t::eBufferChanged),
961 });
962 const auto unsignaledTransaction2 =
963 createTransactionInfo(kApplyToken2,
964 {
965 createComposerState(kLayerId2,
966 fence(Fence::Status::Unsignaled),
967 layer_state_t::eBufferChanged),
968 });
969 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700970 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000971}
972
Ady Abraham2739e832022-02-14 17:42:00 -0800973TEST_F(LatchUnsignaledAlwaysTest, LatchUnsignaledWhenEarlyOffset) {
974 const sp<IBinder> kApplyToken =
975 IInterface::asBinder(TransactionCompletedListener::getIInstance());
976 const auto kLayerId = 1;
Ady Abraham2739e832022-02-14 17:42:00 -0800977 const auto kExpectedTransactionsPending = 0u;
978
979 const auto unsignaledTransaction =
980 createTransactionInfo(kApplyToken,
981 {
982 createComposerState(kLayerId,
983 fence(Fence::Status::Unsignaled),
984 layer_state_t::eBufferChanged),
985 });
986
987 // Get VsyncModulator out of the default config
988 static_cast<void>(mFlinger.mutableVsyncModulator()->onRefreshRateChangeInitiated());
989
Vishnu Nair1523dad2022-09-29 16:05:18 -0700990 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
Ady Abraham2739e832022-02-14 17:42:00 -0800991}
992
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700993TEST(TransactionHandlerTest, QueueTransaction) {
994 TransactionHandler handler;
995 TransactionState transaction;
996 transaction.applyToken = sp<BBinder>::make();
997 transaction.id = 42;
998 handler.queueTransaction(std::move(transaction));
999 std::vector<TransactionState> transactionsReadyToBeApplied = handler.flushTransactions();
1000
1001 EXPECT_EQ(transactionsReadyToBeApplied.size(), 1u);
1002 EXPECT_EQ(transactionsReadyToBeApplied.front().id, 42u);
1003}
1004
Valerie Haud251afb2019-03-29 14:19:02 -07001005} // namespace android