blob: c78148faa9528a101c69259f0a0af043ea645943 [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
37namespace android {
38
39using testing::_;
40using testing::Return;
41
Vishnu Nairaf6d2972022-11-18 06:26:38 +000042using frontend::TransactionHandler;
43
Vishnu Nair1523dad2022-09-29 16:05:18 -070044constexpr nsecs_t TRANSACTION_TIMEOUT = s2ns(5);
Valerie Haud251afb2019-03-29 14:19:02 -070045class TransactionApplicationTest : public testing::Test {
46public:
47 TransactionApplicationTest() {
48 const ::testing::TestInfo* const test_info =
49 ::testing::UnitTest::GetInstance()->current_test_info();
50 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
51
Dominik Laskowskiaee9a622023-02-11 14:24:19 -050052 mFlinger.setupComposer(std::make_unique<Hwc2::mock::Composer>());
53 mFlinger.setupMockScheduler();
54 mFlinger.flinger()->addTransactionReadyFilters();
Valerie Haud251afb2019-03-29 14:19:02 -070055 }
56
57 ~TransactionApplicationTest() {
58 const ::testing::TestInfo* const test_info =
59 ::testing::UnitTest::GetInstance()->current_test_info();
60 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
61 }
62
Valerie Haud251afb2019-03-29 14:19:02 -070063 TestableSurfaceFlinger mFlinger;
64
Valerie Haud251afb2019-03-29 14:19:02 -070065 struct TransactionInfo {
66 Vector<ComposerState> states;
67 Vector<DisplayState> displays;
68 uint32_t flags = 0;
69 sp<IBinder> applyToken = IInterface::asBinder(TransactionCompletedListener::getIInstance());
70 InputWindowCommands inputWindowCommands;
Ady Abrahamf0c56492020-12-17 18:04:15 -080071 int64_t desiredPresentTime = 0;
72 bool isAutoTimestamp = true;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -100073 FrameTimelineInfo frameTimelineInfo;
Patrick Williams6c6dd3b2023-02-13 22:53:06 +000074 std::vector<client_cache_t> uncacheBuffers;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -100075 uint64_t id = static_cast<uint64_t>(-1);
76 static_assert(0xffffffffffffffff == static_cast<uint64_t>(-1));
Valerie Haud251afb2019-03-29 14:19:02 -070077 };
78
Vishnu Nair6b591152021-10-08 11:45:14 -070079 void checkEqual(TransactionInfo info, TransactionState state) {
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -100080 EXPECT_EQ(0u, info.states.size());
81 EXPECT_EQ(0u, state.states.size());
Valerie Haud251afb2019-03-29 14:19:02 -070082
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -100083 EXPECT_EQ(0u, info.displays.size());
84 EXPECT_EQ(0u, state.displays.size());
Valerie Haud251afb2019-03-29 14:19:02 -070085 EXPECT_EQ(info.flags, state.flags);
86 EXPECT_EQ(info.desiredPresentTime, state.desiredPresentTime);
87 }
88
Patrick Williams641f7f22022-06-22 19:25:35 +000089 void setupSingle(TransactionInfo& transaction, uint32_t flags, int64_t desiredPresentTime,
90 bool isAutoTimestamp, const FrameTimelineInfo& frameTimelineInfo) {
Valerie Haud251afb2019-03-29 14:19:02 -070091 mTransactionNumber++;
Vishnu Nair1523dad2022-09-29 16:05:18 -070092 transaction.flags |= flags;
Valerie Haud251afb2019-03-29 14:19:02 -070093 transaction.desiredPresentTime = desiredPresentTime;
Ady Abrahamf0c56492020-12-17 18:04:15 -080094 transaction.isAutoTimestamp = isAutoTimestamp;
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -100095 transaction.frameTimelineInfo = frameTimelineInfo;
Valerie Haud251afb2019-03-29 14:19:02 -070096 }
97
Patrick Williams641f7f22022-06-22 19:25:35 +000098 void NotPlacedOnTransactionQueue(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +000099 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700100 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700101 TransactionInfo transaction;
Patrick Williams641f7f22022-06-22 19:25:35 +0000102 setupSingle(transaction, flags,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800103 /*desiredPresentTime*/ systemTime(), /*isAutoTimestamp*/ true,
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000104 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700105 nsecs_t applicationTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000106 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700107 transaction.displays, transaction.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700108 transaction.applyToken, transaction.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800109 transaction.desiredPresentTime, transaction.isAutoTimestamp,
Patrick Williams6c6dd3b2023-02-13 22:53:06 +0000110 transaction.uncacheBuffers, mHasListenerCallbacks, mCallbacks,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800111 transaction.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700112
Patrick Williams641f7f22022-06-22 19:25:35 +0000113 // If transaction is synchronous, SF applyTransactionState should time out (5s) wating for
114 // SF to commit the transaction. If this is animation, it should not time out waiting.
Valerie Haud251afb2019-03-29 14:19:02 -0700115 nsecs_t returnedTime = systemTime();
Vishnu Nair1523dad2022-09-29 16:05:18 -0700116 EXPECT_LE(returnedTime, applicationTime + TRANSACTION_TIMEOUT);
Arthur Hung58144272021-01-16 03:43:53 +0000117 // Each transaction should have been placed on the transaction queue
Vishnu Nair60d902e2022-07-20 02:55:37 +0000118 auto& transactionQueue = mFlinger.getTransactionQueue();
119 EXPECT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700120 }
121
Patrick Williams641f7f22022-06-22 19:25:35 +0000122 void PlaceOnTransactionQueue(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000123 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700124 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700125
126 // first check will see desired present time has not passed,
127 // but afterwards it will look like the desired present time has passed
128 nsecs_t time = systemTime();
Valerie Haud251afb2019-03-29 14:19:02 -0700129 TransactionInfo transaction;
Patrick Williams641f7f22022-06-22 19:25:35 +0000130 setupSingle(transaction, flags, /*desiredPresentTime*/ time + s2ns(1), false,
131 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700132 nsecs_t applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000133 mFlinger.setTransactionState(transaction.frameTimelineInfo, transaction.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700134 transaction.displays, transaction.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700135 transaction.applyToken, transaction.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800136 transaction.desiredPresentTime, transaction.isAutoTimestamp,
Patrick Williams6c6dd3b2023-02-13 22:53:06 +0000137 transaction.uncacheBuffers, mHasListenerCallbacks, mCallbacks,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800138 transaction.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700139
140 nsecs_t returnedTime = systemTime();
Vishnu Nair1523dad2022-09-29 16:05:18 -0700141 EXPECT_LE(returnedTime, applicationSentTime + TRANSACTION_TIMEOUT);
Valerie Haud251afb2019-03-29 14:19:02 -0700142 // This transaction should have been placed on the transaction queue
Vishnu Nair60d902e2022-07-20 02:55:37 +0000143 auto& transactionQueue = mFlinger.getTransactionQueue();
144 EXPECT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700145 }
146
Patrick Williams641f7f22022-06-22 19:25:35 +0000147 void BlockedByPriorTransaction(uint32_t flags) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000148 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700149 nsecs_t time = systemTime();
Patrick Williams641f7f22022-06-22 19:25:35 +0000150 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(2);
151
Valerie Haud251afb2019-03-29 14:19:02 -0700152 // transaction that should go on the pending thread
153 TransactionInfo transactionA;
Patrick Williams641f7f22022-06-22 19:25:35 +0000154 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ time + s2ns(1), false,
155 FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700156
157 // transaction that would not have gone on the pending thread if not
158 // blocked
159 TransactionInfo transactionB;
Patrick Williams641f7f22022-06-22 19:25:35 +0000160 setupSingle(transactionB, flags, /*desiredPresentTime*/ systemTime(),
161 /*isAutoTimestamp*/ true, FrameTimelineInfo{});
Valerie Haud251afb2019-03-29 14:19:02 -0700162
163 nsecs_t applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000164 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700165 transactionA.displays, transactionA.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700166 transactionA.applyToken, transactionA.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800167 transactionA.desiredPresentTime, transactionA.isAutoTimestamp,
Patrick Williams6c6dd3b2023-02-13 22:53:06 +0000168 transactionA.uncacheBuffers, mHasListenerCallbacks, mCallbacks,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800169 transactionA.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700170
171 // This thread should not have been blocked by the above transaction
172 // (5s is the timeout period that applyTransactionState waits for SF to
173 // commit the transaction)
Vishnu Nair1523dad2022-09-29 16:05:18 -0700174 EXPECT_LE(systemTime(), applicationSentTime + TRANSACTION_TIMEOUT);
Arthur Hung58144272021-01-16 03:43:53 +0000175 // transaction that would goes to pending transaciton queue.
176 mFlinger.flushTransactionQueues();
Valerie Haud251afb2019-03-29 14:19:02 -0700177
178 applicationSentTime = systemTime();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000179 mFlinger.setTransactionState(transactionB.frameTimelineInfo, transactionB.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700180 transactionB.displays, transactionB.flags,
Valerie Haud251afb2019-03-29 14:19:02 -0700181 transactionB.applyToken, transactionB.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800182 transactionB.desiredPresentTime, transactionB.isAutoTimestamp,
Patrick Williams6c6dd3b2023-02-13 22:53:06 +0000183 transactionB.uncacheBuffers, mHasListenerCallbacks, mCallbacks,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800184 transactionB.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700185
186 // this thread should have been blocked by the above transaction
187 // if this is an animation, this thread should be blocked for 5s
188 // in setTransactionState waiting for transactionA to flush. Otherwise,
189 // the transaction should be placed on the pending queue
Vishnu Nair1523dad2022-09-29 16:05:18 -0700190 EXPECT_LE(systemTime(), applicationSentTime + TRANSACTION_TIMEOUT);
Valerie Haud251afb2019-03-29 14:19:02 -0700191
Arthur Hung58144272021-01-16 03:43:53 +0000192 // transaction that would goes to pending transaciton queue.
193 mFlinger.flushTransactionQueues();
194
Ady Abrahame46243a2021-02-23 19:33:49 -0800195 // check that the transaction was applied.
Arthur Hung58144272021-01-16 03:43:53 +0000196 auto transactionQueue = mFlinger.getPendingTransactionQueue();
Ady Abrahame46243a2021-02-23 19:33:49 -0800197 EXPECT_EQ(0u, transactionQueue.size());
Valerie Haud251afb2019-03-29 14:19:02 -0700198 }
199
Dominik Laskowski1c99a002023-01-20 17:10:36 -0500200 void modulateVsync() {
201 static_cast<void>(
202 mFlinger.mutableScheduler().mutableVsyncModulator().onRefreshRateChangeInitiated());
203 }
204
Valerie Haud251afb2019-03-29 14:19:02 -0700205 bool mHasListenerCallbacks = false;
206 std::vector<ListenerCallbacks> mCallbacks;
207 int mTransactionNumber = 0;
208};
209
Vishnu Nair60d902e2022-07-20 02:55:37 +0000210TEST_F(TransactionApplicationTest, AddToPendingQueue) {
211 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Dominik Laskowski46f3e3b2021-08-10 11:44:24 -0700212 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
Valerie Haud251afb2019-03-29 14:19:02 -0700213
Valerie Haud251afb2019-03-29 14:19:02 -0700214 TransactionInfo transactionA; // transaction to go on pending queue
Patrick Williams641f7f22022-06-22 19:25:35 +0000215 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ s2ns(1), false,
216 FrameTimelineInfo{});
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000217 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
Ady Abraham22c7b5c2020-09-22 19:33:40 -0700218 transactionA.displays, transactionA.flags, transactionA.applyToken,
219 transactionA.inputWindowCommands, transactionA.desiredPresentTime,
Patrick Williams6c6dd3b2023-02-13 22:53:06 +0000220 transactionA.isAutoTimestamp, transactionA.uncacheBuffers,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800221 mHasListenerCallbacks, mCallbacks, transactionA.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700222
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000223 auto& transactionQueue = mFlinger.getTransactionQueue();
Vishnu Nair60d902e2022-07-20 02:55:37 +0000224 ASSERT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700225
Vishnu Nair60d902e2022-07-20 02:55:37 +0000226 auto transactionState = transactionQueue.pop().value();
Valerie Haud251afb2019-03-29 14:19:02 -0700227 checkEqual(transactionA, transactionState);
Vishnu Nair60d902e2022-07-20 02:55:37 +0000228}
229
230TEST_F(TransactionApplicationTest, Flush_RemovesFromQueue) {
231 ASSERT_TRUE(mFlinger.getTransactionQueue().isEmpty());
232 EXPECT_CALL(*mFlinger.scheduler(), scheduleFrame()).Times(1);
233
234 TransactionInfo transactionA; // transaction to go on pending queue
235 setupSingle(transactionA, /*flags*/ 0, /*desiredPresentTime*/ s2ns(1), false,
236 FrameTimelineInfo{});
237 mFlinger.setTransactionState(transactionA.frameTimelineInfo, transactionA.states,
238 transactionA.displays, transactionA.flags, transactionA.applyToken,
239 transactionA.inputWindowCommands, transactionA.desiredPresentTime,
Patrick Williams6c6dd3b2023-02-13 22:53:06 +0000240 transactionA.isAutoTimestamp, transactionA.uncacheBuffers,
Vishnu Nair60d902e2022-07-20 02:55:37 +0000241 mHasListenerCallbacks, mCallbacks, transactionA.id);
242
243 auto& transactionQueue = mFlinger.getTransactionQueue();
244 ASSERT_FALSE(transactionQueue.isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700245
246 // because flushing uses the cached expected present time, we send an empty
247 // transaction here (sending a null applyToken to fake it as from a
248 // different process) to re-query and reset the cached expected present time
249 TransactionInfo empty;
250 empty.applyToken = sp<IBinder>();
Siarhei Vishniakoufc434ac2021-01-13 10:28:00 -1000251 mFlinger.setTransactionState(empty.frameTimelineInfo, empty.states, empty.displays, empty.flags,
252 empty.applyToken, empty.inputWindowCommands,
Ady Abrahamf0c56492020-12-17 18:04:15 -0800253 empty.desiredPresentTime, empty.isAutoTimestamp,
Patrick Williams6c6dd3b2023-02-13 22:53:06 +0000254 empty.uncacheBuffers, mHasListenerCallbacks, mCallbacks, empty.id);
Valerie Haud251afb2019-03-29 14:19:02 -0700255
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000256 // flush transaction queue should flush as desiredPresentTime has
Valerie Haud251afb2019-03-29 14:19:02 -0700257 // passed
Zhuoyao Zhang3d3540d2021-01-14 05:14:54 +0000258 mFlinger.flushTransactionQueues();
Valerie Haud251afb2019-03-29 14:19:02 -0700259
Vishnu Nair60d902e2022-07-20 02:55:37 +0000260 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Valerie Haud251afb2019-03-29 14:19:02 -0700261}
262
Valerie Haud251afb2019-03-29 14:19:02 -0700263TEST_F(TransactionApplicationTest, NotPlacedOnTransactionQueue_SyncInputWindows) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000264 NotPlacedOnTransactionQueue(/*flags*/ 0);
Valerie Haud251afb2019-03-29 14:19:02 -0700265}
266
Valerie Haud251afb2019-03-29 14:19:02 -0700267TEST_F(TransactionApplicationTest, PlaceOnTransactionQueue_SyncInputWindows) {
Patrick Williams641f7f22022-06-22 19:25:35 +0000268 PlaceOnTransactionQueue(/*flags*/ 0);
Valerie Haud251afb2019-03-29 14:19:02 -0700269}
270
Valerie Hau09e60052019-12-15 14:51:15 -0800271TEST_F(TransactionApplicationTest, FromHandle) {
272 sp<IBinder> badHandle;
273 auto ret = mFlinger.fromHandle(badHandle);
Vishnu Nair07e2a482022-10-18 19:18:16 +0000274 EXPECT_EQ(nullptr, ret.get());
Valerie Hau09e60052019-12-15 14:51:15 -0800275}
ramindani4d48f902021-09-20 21:07:45 +0000276
Ady Abraham9dada822022-02-03 10:26:59 -0800277class LatchUnsignaledTest : public TransactionApplicationTest {
278public:
279 void TearDown() override {
280 // Clear all transaction queues to release all transactions we sent
281 // in the tests. Otherwise, gmock complains about memory leaks.
Vishnu Nair60d902e2022-07-20 02:55:37 +0000282 while (!mFlinger.getTransactionQueue().isEmpty()) {
283 mFlinger.getTransactionQueue().pop();
284 }
Ady Abraham9dada822022-02-03 10:26:59 -0800285 mFlinger.getPendingTransactionQueue().clear();
Ady Abraham9dada822022-02-03 10:26:59 -0800286 mFlinger.commitTransactionsLocked(eTransactionMask);
287 mFlinger.mutableCurrentState().layersSortedByZ.clear();
288 mFlinger.mutableDrawingState().layersSortedByZ.clear();
289 }
290
291 static sp<Fence> fence(Fence::Status status) {
292 const auto fence = sp<mock::MockFence>::make();
293 EXPECT_CALL(*fence, getStatus()).WillRepeatedly(Return(status));
294 return fence;
295 }
296
297 ComposerState createComposerState(int layerId, sp<Fence> fence, uint64_t what) {
298 ComposerState state;
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700299 state.state.bufferData =
300 std::make_shared<fake::BufferData>(/* bufferId */ 123L, /* width */ 1,
301 /* height */ 2, /* pixelFormat */ 0,
302 /* outUsage */ 0);
Ady Abraham9dada822022-02-03 10:26:59 -0800303 state.state.bufferData->acquireFence = std::move(fence);
304 state.state.layerId = layerId;
305 state.state.surface =
Patrick Williams83f36b22022-09-14 17:57:35 +0000306 sp<Layer>::make(LayerCreationArgs(mFlinger.flinger(), nullptr, "TestLayer", 0, {}))
Ady Abraham9dada822022-02-03 10:26:59 -0800307 ->getHandle();
308 state.state.bufferData->flags = BufferData::BufferDataChange::fenceChanged;
309
310 state.state.what = what;
311 if (what & layer_state_t::eCropChanged) {
312 state.state.crop = Rect(1, 2, 3, 4);
313 }
314 return state;
315 }
316
317 TransactionInfo createTransactionInfo(const sp<IBinder>& applyToken,
318 const std::vector<ComposerState>& states) {
319 TransactionInfo transaction;
Vishnu Nair1523dad2022-09-29 16:05:18 -0700320 const uint32_t kFlags = 0;
Ady Abraham9dada822022-02-03 10:26:59 -0800321 const nsecs_t kDesiredPresentTime = systemTime();
322 const bool kIsAutoTimestamp = true;
323 const auto kFrameTimelineInfo = FrameTimelineInfo{};
324
Patrick Williams641f7f22022-06-22 19:25:35 +0000325 setupSingle(transaction, kFlags, kDesiredPresentTime, kIsAutoTimestamp, kFrameTimelineInfo);
Ady Abraham9dada822022-02-03 10:26:59 -0800326 transaction.applyToken = applyToken;
327 for (const auto& state : states) {
328 transaction.states.push_back(state);
329 }
330
331 return transaction;
332 }
333
334 void setTransactionStates(const std::vector<TransactionInfo>& transactions,
Ady Abraham9dada822022-02-03 10:26:59 -0800335 size_t expectedTransactionsPending) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000336 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Ady Abraham9dada822022-02-03 10:26:59 -0800337 EXPECT_EQ(0u, mFlinger.getPendingTransactionQueue().size());
338
Vishnu Nair40fff5c2022-11-04 02:46:28 +0000339 for (auto transaction : transactions) {
340 std::vector<ResolvedComposerState> resolvedStates;
341 resolvedStates.reserve(transaction.states.size());
342 for (auto& state : transaction.states) {
343 resolvedStates.emplace_back(std::move(state));
344 }
345
346 TransactionState transactionState(transaction.frameTimelineInfo, resolvedStates,
347 transaction.displays, transaction.flags,
348 transaction.applyToken,
349 transaction.inputWindowCommands,
350 transaction.desiredPresentTime,
Patrick Williams6c6dd3b2023-02-13 22:53:06 +0000351 transaction.isAutoTimestamp, {}, systemTime(), 0,
Vishnu Nair40fff5c2022-11-04 02:46:28 +0000352 mHasListenerCallbacks, mCallbacks, getpid(),
353 static_cast<int>(getuid()), transaction.id);
354 mFlinger.setTransactionStateInternal(transactionState);
Ady Abraham9dada822022-02-03 10:26:59 -0800355 }
356 mFlinger.flushTransactionQueues();
Vishnu Nair60d902e2022-07-20 02:55:37 +0000357 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700358 EXPECT_EQ(expectedTransactionsPending, mFlinger.getPendingTransactionCount());
Ady Abraham9dada822022-02-03 10:26:59 -0800359 }
360};
361
362class LatchUnsignaledAutoSingleLayerTest : public LatchUnsignaledTest {
363public:
364 void SetUp() override {
365 LatchUnsignaledTest::SetUp();
366 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::AutoSingleLayer;
367 }
368};
369
370TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleSignaledFromTheQueue) {
371 const sp<IBinder> kApplyToken =
372 IInterface::asBinder(TransactionCompletedListener::getIInstance());
373 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800374 const auto kExpectedTransactionsPending = 0u;
375
376 const auto signaledTransaction =
377 createTransactionInfo(kApplyToken,
378 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
379 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700380 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000381}
382
Ady Abraham9dada822022-02-03 10:26:59 -0800383TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleUnSignaledFromTheQueue) {
384 const sp<IBinder> kApplyToken =
385 IInterface::asBinder(TransactionCompletedListener::getIInstance());
386 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800387 const auto kExpectedTransactionsPending = 0u;
388
389 const auto unsignaledTransaction =
390 createTransactionInfo(kApplyToken,
391 {
392 createComposerState(kLayerId,
393 fence(Fence::Status::Unsignaled),
394 layer_state_t::eBufferChanged),
395 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700396 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000397}
398
Ady Abraham9dada822022-02-03 10:26:59 -0800399TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferCropChange) {
400 const sp<IBinder> kApplyToken =
401 IInterface::asBinder(TransactionCompletedListener::getIInstance());
402 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800403 const auto kExpectedTransactionsPending = 1u;
404
405 const auto unsignaledTransaction =
406 createTransactionInfo(kApplyToken,
407 {
408 createComposerState(kLayerId,
409 fence(Fence::Status::Unsignaled),
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700410 layer_state_t::eCropChanged |
411 layer_state_t::
412 eBufferChanged),
Ady Abraham9dada822022-02-03 10:26:59 -0800413 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700414 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000415}
416
Ady Abraham9dada822022-02-03 10:26:59 -0800417TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferChangeClubed) {
418 const sp<IBinder> kApplyToken =
419 IInterface::asBinder(TransactionCompletedListener::getIInstance());
420 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800421 const auto kExpectedTransactionsPending = 1u;
422
423 const auto unsignaledTransaction =
424 createTransactionInfo(kApplyToken,
425 {
426 createComposerState(kLayerId,
427 fence(Fence::Status::Unsignaled),
428 layer_state_t::eCropChanged |
429 layer_state_t::
430 eBufferChanged),
431 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700432 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000433}
434
Ady Abraham9dada822022-02-03 10:26:59 -0800435TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueueSameApplyTokenMultiState) {
436 const sp<IBinder> kApplyToken =
437 IInterface::asBinder(TransactionCompletedListener::getIInstance());
438 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800439 const auto kExpectedTransactionsPending = 1u;
440
441 const auto mixedTransaction =
442 createTransactionInfo(kApplyToken,
443 {
444 createComposerState(kLayerId,
445 fence(Fence::Status::Unsignaled),
446 layer_state_t::eBufferChanged),
447 createComposerState(kLayerId,
448 fence(Fence::Status::Signaled),
449 layer_state_t::eBufferChanged),
450 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700451 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000452}
453
Ady Abraham9dada822022-02-03 10:26:59 -0800454TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueue_MultipleStateTransaction) {
455 const sp<IBinder> kApplyToken =
456 IInterface::asBinder(TransactionCompletedListener::getIInstance());
457 const auto kLayerId1 = 1;
458 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800459 const auto kExpectedTransactionsPending = 1u;
460
461 const auto mixedTransaction =
462 createTransactionInfo(kApplyToken,
463 {
464 createComposerState(kLayerId1,
465 fence(Fence::Status::Unsignaled),
466 layer_state_t::eBufferChanged),
467 createComposerState(kLayerId2,
468 fence(Fence::Status::Signaled),
469 layer_state_t::eBufferChanged),
470 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700471 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000472}
473
Ady Abraham9dada822022-02-03 10:26:59 -0800474TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSignaledFromTheQueue) {
475 const sp<IBinder> kApplyToken =
476 IInterface::asBinder(TransactionCompletedListener::getIInstance());
477 const auto kLayerId1 = 1;
478 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800479 const auto kExpectedTransactionsPending = 0u;
480
481 const auto signaledTransaction =
482 createTransactionInfo(kApplyToken,
483 {
484 createComposerState(kLayerId1,
485 fence(Fence::Status::Signaled),
486 layer_state_t::eBufferChanged),
487 });
488 const auto signaledTransaction2 =
489 createTransactionInfo(kApplyToken,
490 {
491 createComposerState(kLayerId2,
492 fence(Fence::Status::Signaled),
493 layer_state_t::eBufferChanged),
494 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700495 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000496}
497
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800498TEST_F(LatchUnsignaledAutoSingleLayerTest,
499 UnsignaledNotAppliedWhenThereAreSignaled_UnsignaledFirst) {
Ady Abraham9dada822022-02-03 10:26:59 -0800500 const sp<IBinder> kApplyToken1 =
501 IInterface::asBinder(TransactionCompletedListener::getIInstance());
502 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800503 const sp<IBinder> kApplyToken3 = sp<BBinder>::make();
Ady Abraham9dada822022-02-03 10:26:59 -0800504 const auto kLayerId1 = 1;
505 const auto kLayerId2 = 2;
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800506 const auto kExpectedTransactionsPending = 1u;
507
508 const auto unsignaledTransaction =
509 createTransactionInfo(kApplyToken1,
510 {
511 createComposerState(kLayerId1,
512 fence(Fence::Status::Unsignaled),
513 layer_state_t::eBufferChanged),
514 });
515
516 const auto signaledTransaction =
517 createTransactionInfo(kApplyToken2,
518 {
519 createComposerState(kLayerId2,
520 fence(Fence::Status::Signaled),
521 layer_state_t::eBufferChanged),
522 });
523 const auto signaledTransaction2 =
524 createTransactionInfo(kApplyToken3,
525 {
526 createComposerState(kLayerId2,
527 fence(Fence::Status::Signaled),
528 layer_state_t::eBufferChanged),
529 });
530
531 setTransactionStates({unsignaledTransaction, signaledTransaction, signaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700532 kExpectedTransactionsPending);
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800533}
534
Ady Abraham9dada822022-02-03 10:26:59 -0800535TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueueSameApplyToken) {
536 const sp<IBinder> kApplyToken =
537 IInterface::asBinder(TransactionCompletedListener::getIInstance());
538 const auto kLayerId1 = 1;
539 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800540 const auto kExpectedTransactionsPending = 1u;
541
542 const auto unsignaledTransaction =
543 createTransactionInfo(kApplyToken,
544 {
545 createComposerState(kLayerId1,
546 fence(Fence::Status::Unsignaled),
547 layer_state_t::eBufferChanged),
548 });
549 const auto signaledTransaction =
550 createTransactionInfo(kApplyToken,
551 {
552 createComposerState(kLayerId2,
553 fence(Fence::Status::Signaled),
554 layer_state_t::eBufferChanged),
555 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700556 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800557 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000558}
559
Ady Abraham9dada822022-02-03 10:26:59 -0800560TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueue) {
561 const sp<IBinder> kApplyToken1 =
562 IInterface::asBinder(TransactionCompletedListener::getIInstance());
563 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
564 const auto kLayerId1 = 1;
565 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800566 const auto kExpectedTransactionsPending = 1u;
567
568 const auto unsignaledTransaction =
569 createTransactionInfo(kApplyToken1,
570 {
571 createComposerState(kLayerId1,
572 fence(Fence::Status::Unsignaled),
573 layer_state_t::eBufferChanged),
574 });
575 const auto unsignaledTransaction2 =
576 createTransactionInfo(kApplyToken2,
577 {
578 createComposerState(kLayerId2,
579 fence(Fence::Status::Unsignaled),
580 layer_state_t::eBufferChanged),
581 });
582 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700583 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000584}
585
Ady Abraham2739e832022-02-14 17:42:00 -0800586TEST_F(LatchUnsignaledAutoSingleLayerTest, DontLatchUnsignaledWhenEarlyOffset) {
587 const sp<IBinder> kApplyToken =
588 IInterface::asBinder(TransactionCompletedListener::getIInstance());
589 const auto kLayerId = 1;
Ady Abraham2739e832022-02-14 17:42:00 -0800590 const auto kExpectedTransactionsPending = 1u;
591
592 const auto unsignaledTransaction =
593 createTransactionInfo(kApplyToken,
594 {
595 createComposerState(kLayerId,
596 fence(Fence::Status::Unsignaled),
597 layer_state_t::eBufferChanged),
598 });
599
Dominik Laskowski1c99a002023-01-20 17:10:36 -0500600 modulateVsync();
Vishnu Nair1523dad2022-09-29 16:05:18 -0700601 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
Ady Abraham2739e832022-02-14 17:42:00 -0800602}
603
Ady Abraham9dada822022-02-03 10:26:59 -0800604class LatchUnsignaledDisabledTest : public LatchUnsignaledTest {
605public:
606 void SetUp() override {
607 LatchUnsignaledTest::SetUp();
608 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Disabled;
609 }
610};
611
612TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue) {
613 const sp<IBinder> kApplyToken =
614 IInterface::asBinder(TransactionCompletedListener::getIInstance());
615 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800616 const auto kExpectedTransactionsPending = 0u;
617
618 const auto signaledTransaction =
619 createTransactionInfo(kApplyToken,
620 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
621 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700622 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000623}
624
Ady Abraham9dada822022-02-03 10:26:59 -0800625TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueue) {
626 const sp<IBinder> kApplyToken =
627 IInterface::asBinder(TransactionCompletedListener::getIInstance());
628 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800629 const auto kExpectedTransactionsPending = 1u;
630
631 const auto unsignaledTransaction =
632 createTransactionInfo(kApplyToken,
633 {
634 createComposerState(kLayerId,
635 fence(Fence::Status::Unsignaled),
636 layer_state_t::eBufferChanged),
637 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700638 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000639}
640
Ady Abraham9dada822022-02-03 10:26:59 -0800641TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueSameLayerId) {
642 const sp<IBinder> kApplyToken =
643 IInterface::asBinder(TransactionCompletedListener::getIInstance());
644 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800645 const auto kExpectedTransactionsPending = 1u;
646
647 const auto unsignaledTransaction =
648 createTransactionInfo(kApplyToken,
649 {
650 createComposerState(kLayerId,
651 fence(Fence::Status::Unsignaled),
652 layer_state_t::eBufferChanged),
653 createComposerState(kLayerId,
654 fence(Fence::Status::Unsignaled),
655 layer_state_t::eBufferChanged),
656 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700657 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000658}
659
Ady Abraham9dada822022-02-03 10:26:59 -0800660TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueDifferentLayerId) {
661 const sp<IBinder> kApplyToken =
662 IInterface::asBinder(TransactionCompletedListener::getIInstance());
663 const auto kLayerId1 = 1;
664 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800665 const auto kExpectedTransactionsPending = 1u;
666
667 const auto unsignaledTransaction =
668 createTransactionInfo(kApplyToken,
669 {
670 createComposerState(kLayerId1,
671 fence(Fence::Status::Unsignaled),
672 layer_state_t::eBufferChanged),
673 createComposerState(kLayerId2,
674 fence(Fence::Status::Unsignaled),
675 layer_state_t::eBufferChanged),
676 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700677 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000678}
679
Ady Abraham9dada822022-02-03 10:26:59 -0800680TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
681 const sp<IBinder> kApplyToken =
682 IInterface::asBinder(TransactionCompletedListener::getIInstance());
683 const auto kLayerId1 = 1;
684 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800685 const auto kExpectedTransactionsPending = 0u;
686
687 const auto signaledTransaction =
688 createTransactionInfo(kApplyToken,
689 {
690 createComposerState(kLayerId1,
691 fence(Fence::Status::Signaled),
692 layer_state_t::eBufferChanged),
693 });
694 const auto signaledTransaction2 =
695 createTransactionInfo(kApplyToken,
696 {
697 createComposerState(kLayerId2,
698 fence(Fence::Status::Signaled),
699 layer_state_t::eBufferChanged),
700 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700701 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000702}
703
Ady Abraham9dada822022-02-03 10:26:59 -0800704TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueDifferentApplyToken) {
705 const sp<IBinder> kApplyToken1 =
706 IInterface::asBinder(TransactionCompletedListener::getIInstance());
707 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
708 const auto kLayerId1 = 1;
709 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800710 const auto kExpectedTransactionsPending = 1u;
711
712 const auto unsignaledTransaction =
713 createTransactionInfo(kApplyToken1,
714 {
715 createComposerState(kLayerId1,
716 fence(Fence::Status::Unsignaled),
717 layer_state_t::eBufferChanged),
718 });
719 const auto signaledTransaction =
720 createTransactionInfo(kApplyToken2,
721 {
722 createComposerState(kLayerId2,
723 fence(Fence::Status::Signaled),
724 layer_state_t::eBufferChanged),
725 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700726 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800727 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000728}
729
Ady Abraham9dada822022-02-03 10:26:59 -0800730TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueSameApplyToken) {
731 const sp<IBinder> kApplyToken =
732 IInterface::asBinder(TransactionCompletedListener::getIInstance());
733 const auto kLayerId1 = 1;
734 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800735 const auto kExpectedTransactionsPending = 1u;
736
737 const auto signaledTransaction =
738 createTransactionInfo(kApplyToken,
739 {
740 createComposerState(kLayerId1,
741 fence(Fence::Status::Signaled),
742 layer_state_t::eBufferChanged),
743 });
744 const auto unsignaledTransaction =
745 createTransactionInfo(kApplyToken,
746 {
747 createComposerState(kLayerId2,
748 fence(Fence::Status::Unsignaled),
749 layer_state_t::eBufferChanged),
750 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700751 setTransactionStates({signaledTransaction, unsignaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800752 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000753}
754
Ady Abraham9dada822022-02-03 10:26:59 -0800755TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheUnsignaledTheQueue) {
756 const sp<IBinder> kApplyToken =
757 IInterface::asBinder(TransactionCompletedListener::getIInstance());
758 const auto kLayerId1 = 1;
759 const auto kLayerId2 = 2;
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700760 const auto kExpectedTransactionsPending = 2u;
Ady Abraham9dada822022-02-03 10:26:59 -0800761
762 const auto unsignaledTransaction =
763 createTransactionInfo(kApplyToken,
764 {
765 createComposerState(kLayerId1,
766 fence(Fence::Status::Unsignaled),
767 layer_state_t::eBufferChanged),
768 });
769 const auto unsignaledTransaction2 =
770 createTransactionInfo(kApplyToken,
771 {
772 createComposerState(kLayerId2,
773 fence(Fence::Status::Unsignaled),
774 layer_state_t::eBufferChanged),
775 });
776 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700777 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000778}
779
Ady Abraham9dada822022-02-03 10:26:59 -0800780class LatchUnsignaledAlwaysTest : public LatchUnsignaledTest {
781public:
782 void SetUp() override {
783 LatchUnsignaledTest::SetUp();
784 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Always;
785 }
786};
787
788TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue) {
789 const sp<IBinder> kApplyToken =
790 IInterface::asBinder(TransactionCompletedListener::getIInstance());
791 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800792 const auto kExpectedTransactionsPending = 0u;
793
794 const auto signaledTransaction =
795 createTransactionInfo(kApplyToken,
796 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
797 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700798 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000799}
800
Ady Abraham9dada822022-02-03 10:26:59 -0800801TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueue) {
802 const sp<IBinder> kApplyToken =
803 IInterface::asBinder(TransactionCompletedListener::getIInstance());
804 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800805 const auto kExpectedTransactionsPending = 0u;
806
807 const auto unsignaledTransaction =
808 createTransactionInfo(kApplyToken,
809 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
810 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700811 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000812}
813
Ady Abraham9dada822022-02-03 10:26:59 -0800814TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueSameLayerId) {
815 const sp<IBinder> kApplyToken =
816 IInterface::asBinder(TransactionCompletedListener::getIInstance());
817 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800818 const auto kExpectedTransactionsPending = 0u;
819
820 const auto mixedTransaction =
821 createTransactionInfo(kApplyToken,
822 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
823 layer_state_t::eBufferChanged),
824 createComposerState(kLayerId, fence(Fence::Status::Signaled),
825 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700826 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000827}
828
Ady Abraham9dada822022-02-03 10:26:59 -0800829TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentLayerId) {
830 const sp<IBinder> kApplyToken =
831 IInterface::asBinder(TransactionCompletedListener::getIInstance());
832 const auto kLayerId1 = 1;
833 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800834 const auto kExpectedTransactionsPending = 0u;
835
836 const auto mixedTransaction =
837 createTransactionInfo(kApplyToken,
838 {createComposerState(kLayerId1, fence(Fence::Status::Unsignaled),
839 layer_state_t::eBufferChanged),
840 createComposerState(kLayerId2, fence(Fence::Status::Signaled),
841 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700842 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000843}
844
Ady Abraham9dada822022-02-03 10:26:59 -0800845TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
846 const sp<IBinder> kApplyToken =
847 IInterface::asBinder(TransactionCompletedListener::getIInstance());
848 const auto kLayerId1 = 1;
849 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800850 const auto kExpectedTransactionsPending = 0u;
851
852 const auto signaledTransaction =
853 createTransactionInfo(kApplyToken,
854 {
855 createComposerState(kLayerId1,
856 fence(Fence::Status::Signaled),
857 layer_state_t::eBufferChanged),
858 });
859 const auto signaledTransaction2 =
860 createTransactionInfo(kApplyToken,
861 {
862 createComposerState(kLayerId2,
863 fence(Fence::Status::Signaled),
864 layer_state_t::eBufferChanged),
865 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700866 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000867}
868
Ady Abraham9dada822022-02-03 10:26:59 -0800869TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentApplyToken) {
870 const sp<IBinder> kApplyToken1 =
871 IInterface::asBinder(TransactionCompletedListener::getIInstance());
872 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
873 const auto kLayerId1 = 1;
874 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800875 const auto kExpectedTransactionsPending = 0u;
876
877 const auto signaledTransaction =
878 createTransactionInfo(kApplyToken1,
879 {
880 createComposerState(kLayerId1,
881 fence(Fence::Status::Signaled),
882 layer_state_t::eBufferChanged),
883 });
884 const auto unsignaledTransaction =
885 createTransactionInfo(kApplyToken2,
886 {
887 createComposerState(kLayerId2,
888 fence(Fence::Status::Unsignaled),
889 layer_state_t::eBufferChanged),
890 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700891 setTransactionStates({signaledTransaction, unsignaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800892 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000893}
894
Ady Abraham9dada822022-02-03 10:26:59 -0800895TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueueSameApplyToken) {
896 const sp<IBinder> kApplyToken =
897 IInterface::asBinder(TransactionCompletedListener::getIInstance());
898 const auto kLayerId1 = 1;
899 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800900 const auto kExpectedTransactionsPending = 0u;
901
902 const auto unsignaledTransaction =
903 createTransactionInfo(kApplyToken,
904 {
905 createComposerState(kLayerId1,
906 fence(Fence::Status::Unsignaled),
907 layer_state_t::eBufferChanged),
908 });
909 const auto signaledTransaction =
910 createTransactionInfo(kApplyToken,
911 {
912 createComposerState(kLayerId2,
913 fence(Fence::Status::Signaled),
914 layer_state_t::eBufferChanged),
915 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700916 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800917 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000918}
919
Ady Abraham9dada822022-02-03 10:26:59 -0800920TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueue) {
921 const sp<IBinder> kApplyToken1 =
922 IInterface::asBinder(TransactionCompletedListener::getIInstance());
923 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
924 const auto kLayerId1 = 1;
925 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800926 const auto kExpectedTransactionsPending = 0u;
927
928 const auto unsignaledTransaction =
929 createTransactionInfo(kApplyToken1,
930 {
931 createComposerState(kLayerId1,
932 fence(Fence::Status::Unsignaled),
933 layer_state_t::eBufferChanged),
934 });
935 const auto unsignaledTransaction2 =
936 createTransactionInfo(kApplyToken2,
937 {
938 createComposerState(kLayerId2,
939 fence(Fence::Status::Unsignaled),
940 layer_state_t::eBufferChanged),
941 });
942 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700943 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000944}
945
Ady Abraham2739e832022-02-14 17:42:00 -0800946TEST_F(LatchUnsignaledAlwaysTest, LatchUnsignaledWhenEarlyOffset) {
947 const sp<IBinder> kApplyToken =
948 IInterface::asBinder(TransactionCompletedListener::getIInstance());
949 const auto kLayerId = 1;
Ady Abraham2739e832022-02-14 17:42:00 -0800950 const auto kExpectedTransactionsPending = 0u;
951
952 const auto unsignaledTransaction =
953 createTransactionInfo(kApplyToken,
954 {
955 createComposerState(kLayerId,
956 fence(Fence::Status::Unsignaled),
957 layer_state_t::eBufferChanged),
958 });
959
Dominik Laskowski1c99a002023-01-20 17:10:36 -0500960 modulateVsync();
Vishnu Nair1523dad2022-09-29 16:05:18 -0700961 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
Ady Abraham2739e832022-02-14 17:42:00 -0800962}
963
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700964TEST(TransactionHandlerTest, QueueTransaction) {
965 TransactionHandler handler;
966 TransactionState transaction;
967 transaction.applyToken = sp<BBinder>::make();
968 transaction.id = 42;
969 handler.queueTransaction(std::move(transaction));
970 std::vector<TransactionState> transactionsReadyToBeApplied = handler.flushTransactions();
971
972 EXPECT_EQ(transactionsReadyToBeApplied.size(), 1u);
973 EXPECT_EQ(transactionsReadyToBeApplied.front().id, 42u);
974}
975
Valerie Haud251afb2019-03-29 14:19:02 -0700976} // namespace android