blob: 03c4e713a091e404b368d3406607158fe251c136 [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>(
Dominik Laskowski14956dc2023-02-22 13:43:57 -0500202 mFlinger.mutableScheduler().vsyncModulator().onRefreshRateChangeInitiated());
Dominik Laskowski1c99a002023-01-20 17:10:36 -0500203 }
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
Vishnu Nairf01a6f12023-04-03 22:34:17 +0000297 ComposerState createComposerState(int layerId, sp<Fence> fence, uint64_t what,
298 std::optional<sp<IBinder>> layerHandle = std::nullopt) {
Ady Abraham9dada822022-02-03 10:26:59 -0800299 ComposerState state;
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700300 state.state.bufferData =
301 std::make_shared<fake::BufferData>(/* bufferId */ 123L, /* width */ 1,
302 /* height */ 2, /* pixelFormat */ 0,
303 /* outUsage */ 0);
Ady Abraham9dada822022-02-03 10:26:59 -0800304 state.state.bufferData->acquireFence = std::move(fence);
305 state.state.layerId = layerId;
Vishnu Nairf01a6f12023-04-03 22:34:17 +0000306 state.state.surface = layerHandle.value_or(
Patrick Williams83f36b22022-09-14 17:57:35 +0000307 sp<Layer>::make(LayerCreationArgs(mFlinger.flinger(), nullptr, "TestLayer", 0, {}))
Vishnu Nairf01a6f12023-04-03 22:34:17 +0000308 ->getHandle());
Ady Abraham9dada822022-02-03 10:26:59 -0800309 state.state.bufferData->flags = BufferData::BufferDataChange::fenceChanged;
310
311 state.state.what = what;
312 if (what & layer_state_t::eCropChanged) {
313 state.state.crop = Rect(1, 2, 3, 4);
314 }
Vishnu Nairf01a6f12023-04-03 22:34:17 +0000315 if (what & layer_state_t::eFlagsChanged) {
316 state.state.flags = layer_state_t::eEnableBackpressure;
317 state.state.mask = layer_state_t::eEnableBackpressure;
318 }
319
Ady Abraham9dada822022-02-03 10:26:59 -0800320 return state;
321 }
322
323 TransactionInfo createTransactionInfo(const sp<IBinder>& applyToken,
324 const std::vector<ComposerState>& states) {
325 TransactionInfo transaction;
Vishnu Nair1523dad2022-09-29 16:05:18 -0700326 const uint32_t kFlags = 0;
Ady Abraham9dada822022-02-03 10:26:59 -0800327 const nsecs_t kDesiredPresentTime = systemTime();
328 const bool kIsAutoTimestamp = true;
329 const auto kFrameTimelineInfo = FrameTimelineInfo{};
330
Patrick Williams641f7f22022-06-22 19:25:35 +0000331 setupSingle(transaction, kFlags, kDesiredPresentTime, kIsAutoTimestamp, kFrameTimelineInfo);
Ady Abraham9dada822022-02-03 10:26:59 -0800332 transaction.applyToken = applyToken;
333 for (const auto& state : states) {
334 transaction.states.push_back(state);
335 }
336
337 return transaction;
338 }
339
340 void setTransactionStates(const std::vector<TransactionInfo>& transactions,
Ady Abraham9dada822022-02-03 10:26:59 -0800341 size_t expectedTransactionsPending) {
Vishnu Nair60d902e2022-07-20 02:55:37 +0000342 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Ady Abraham9dada822022-02-03 10:26:59 -0800343 EXPECT_EQ(0u, mFlinger.getPendingTransactionQueue().size());
344
Vishnu Nair40fff5c2022-11-04 02:46:28 +0000345 for (auto transaction : transactions) {
346 std::vector<ResolvedComposerState> resolvedStates;
347 resolvedStates.reserve(transaction.states.size());
348 for (auto& state : transaction.states) {
349 resolvedStates.emplace_back(std::move(state));
350 }
351
352 TransactionState transactionState(transaction.frameTimelineInfo, resolvedStates,
353 transaction.displays, transaction.flags,
354 transaction.applyToken,
355 transaction.inputWindowCommands,
356 transaction.desiredPresentTime,
Patrick Williams6c6dd3b2023-02-13 22:53:06 +0000357 transaction.isAutoTimestamp, {}, systemTime(), 0,
Vishnu Nair40fff5c2022-11-04 02:46:28 +0000358 mHasListenerCallbacks, mCallbacks, getpid(),
359 static_cast<int>(getuid()), transaction.id);
360 mFlinger.setTransactionStateInternal(transactionState);
Ady Abraham9dada822022-02-03 10:26:59 -0800361 }
362 mFlinger.flushTransactionQueues();
Vishnu Nair60d902e2022-07-20 02:55:37 +0000363 EXPECT_TRUE(mFlinger.getTransactionQueue().isEmpty());
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700364 EXPECT_EQ(expectedTransactionsPending, mFlinger.getPendingTransactionCount());
Ady Abraham9dada822022-02-03 10:26:59 -0800365 }
366};
367
368class LatchUnsignaledAutoSingleLayerTest : public LatchUnsignaledTest {
369public:
370 void SetUp() override {
371 LatchUnsignaledTest::SetUp();
372 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::AutoSingleLayer;
373 }
374};
375
376TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleSignaledFromTheQueue) {
377 const sp<IBinder> kApplyToken =
378 IInterface::asBinder(TransactionCompletedListener::getIInstance());
379 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800380 const auto kExpectedTransactionsPending = 0u;
381
382 const auto signaledTransaction =
383 createTransactionInfo(kApplyToken,
384 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
385 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700386 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000387}
388
Ady Abraham9dada822022-02-03 10:26:59 -0800389TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSingleUnSignaledFromTheQueue) {
390 const sp<IBinder> kApplyToken =
391 IInterface::asBinder(TransactionCompletedListener::getIInstance());
392 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800393 const auto kExpectedTransactionsPending = 0u;
394
395 const auto unsignaledTransaction =
396 createTransactionInfo(kApplyToken,
397 {
398 createComposerState(kLayerId,
399 fence(Fence::Status::Unsignaled),
400 layer_state_t::eBufferChanged),
401 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700402 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000403}
404
Ady Abraham9dada822022-02-03 10:26:59 -0800405TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferCropChange) {
406 const sp<IBinder> kApplyToken =
407 IInterface::asBinder(TransactionCompletedListener::getIInstance());
408 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800409 const auto kExpectedTransactionsPending = 1u;
410
411 const auto unsignaledTransaction =
412 createTransactionInfo(kApplyToken,
413 {
414 createComposerState(kLayerId,
415 fence(Fence::Status::Unsignaled),
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700416 layer_state_t::eCropChanged |
417 layer_state_t::
418 eBufferChanged),
Ady Abraham9dada822022-02-03 10:26:59 -0800419 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700420 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000421}
422
Ady Abraham9dada822022-02-03 10:26:59 -0800423TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsUnSignaledInTheQueue_NonBufferChangeClubed) {
424 const sp<IBinder> kApplyToken =
425 IInterface::asBinder(TransactionCompletedListener::getIInstance());
426 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800427 const auto kExpectedTransactionsPending = 1u;
428
429 const auto unsignaledTransaction =
430 createTransactionInfo(kApplyToken,
431 {
432 createComposerState(kLayerId,
433 fence(Fence::Status::Unsignaled),
434 layer_state_t::eCropChanged |
435 layer_state_t::
436 eBufferChanged),
437 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700438 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000439}
440
Ady Abraham9dada822022-02-03 10:26:59 -0800441TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueueSameApplyTokenMultiState) {
442 const sp<IBinder> kApplyToken =
443 IInterface::asBinder(TransactionCompletedListener::getIInstance());
444 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800445 const auto kExpectedTransactionsPending = 1u;
446
447 const auto mixedTransaction =
448 createTransactionInfo(kApplyToken,
449 {
450 createComposerState(kLayerId,
451 fence(Fence::Status::Unsignaled),
452 layer_state_t::eBufferChanged),
453 createComposerState(kLayerId,
454 fence(Fence::Status::Signaled),
455 layer_state_t::eBufferChanged),
456 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700457 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000458}
459
Ady Abraham9dada822022-02-03 10:26:59 -0800460TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsInTheQueue_MultipleStateTransaction) {
461 const sp<IBinder> kApplyToken =
462 IInterface::asBinder(TransactionCompletedListener::getIInstance());
463 const auto kLayerId1 = 1;
464 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800465 const auto kExpectedTransactionsPending = 1u;
466
467 const auto mixedTransaction =
468 createTransactionInfo(kApplyToken,
469 {
470 createComposerState(kLayerId1,
471 fence(Fence::Status::Unsignaled),
472 layer_state_t::eBufferChanged),
473 createComposerState(kLayerId2,
474 fence(Fence::Status::Signaled),
475 layer_state_t::eBufferChanged),
476 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700477 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000478}
479
Ady Abraham9dada822022-02-03 10:26:59 -0800480TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_RemovesSignaledFromTheQueue) {
481 const sp<IBinder> kApplyToken =
482 IInterface::asBinder(TransactionCompletedListener::getIInstance());
483 const auto kLayerId1 = 1;
484 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800485 const auto kExpectedTransactionsPending = 0u;
486
487 const auto signaledTransaction =
488 createTransactionInfo(kApplyToken,
489 {
490 createComposerState(kLayerId1,
491 fence(Fence::Status::Signaled),
492 layer_state_t::eBufferChanged),
493 });
494 const auto signaledTransaction2 =
495 createTransactionInfo(kApplyToken,
496 {
497 createComposerState(kLayerId2,
498 fence(Fence::Status::Signaled),
499 layer_state_t::eBufferChanged),
500 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700501 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000502}
503
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800504TEST_F(LatchUnsignaledAutoSingleLayerTest,
505 UnsignaledNotAppliedWhenThereAreSignaled_UnsignaledFirst) {
Ady Abraham9dada822022-02-03 10:26:59 -0800506 const sp<IBinder> kApplyToken1 =
507 IInterface::asBinder(TransactionCompletedListener::getIInstance());
508 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800509 const sp<IBinder> kApplyToken3 = sp<BBinder>::make();
Ady Abraham9dada822022-02-03 10:26:59 -0800510 const auto kLayerId1 = 1;
511 const auto kLayerId2 = 2;
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800512 const auto kExpectedTransactionsPending = 1u;
513
514 const auto unsignaledTransaction =
515 createTransactionInfo(kApplyToken1,
516 {
517 createComposerState(kLayerId1,
518 fence(Fence::Status::Unsignaled),
519 layer_state_t::eBufferChanged),
520 });
521
522 const auto signaledTransaction =
523 createTransactionInfo(kApplyToken2,
524 {
525 createComposerState(kLayerId2,
526 fence(Fence::Status::Signaled),
527 layer_state_t::eBufferChanged),
528 });
529 const auto signaledTransaction2 =
530 createTransactionInfo(kApplyToken3,
531 {
532 createComposerState(kLayerId2,
533 fence(Fence::Status::Signaled),
534 layer_state_t::eBufferChanged),
535 });
536
537 setTransactionStates({unsignaledTransaction, signaledTransaction, signaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700538 kExpectedTransactionsPending);
Ady Abrahame1bfaac2022-02-22 21:32:08 -0800539}
540
Ady Abraham9dada822022-02-03 10:26:59 -0800541TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueueSameApplyToken) {
542 const sp<IBinder> kApplyToken =
543 IInterface::asBinder(TransactionCompletedListener::getIInstance());
544 const auto kLayerId1 = 1;
545 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800546 const auto kExpectedTransactionsPending = 1u;
547
548 const auto unsignaledTransaction =
549 createTransactionInfo(kApplyToken,
550 {
551 createComposerState(kLayerId1,
552 fence(Fence::Status::Unsignaled),
553 layer_state_t::eBufferChanged),
554 });
555 const auto signaledTransaction =
556 createTransactionInfo(kApplyToken,
557 {
558 createComposerState(kLayerId2,
559 fence(Fence::Status::Signaled),
560 layer_state_t::eBufferChanged),
561 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700562 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800563 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000564}
565
Ady Abraham9dada822022-02-03 10:26:59 -0800566TEST_F(LatchUnsignaledAutoSingleLayerTest, Flush_KeepsTransactionInTheQueue) {
567 const sp<IBinder> kApplyToken1 =
568 IInterface::asBinder(TransactionCompletedListener::getIInstance());
569 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
570 const auto kLayerId1 = 1;
571 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800572 const auto kExpectedTransactionsPending = 1u;
573
574 const auto unsignaledTransaction =
575 createTransactionInfo(kApplyToken1,
576 {
577 createComposerState(kLayerId1,
578 fence(Fence::Status::Unsignaled),
579 layer_state_t::eBufferChanged),
580 });
581 const auto unsignaledTransaction2 =
582 createTransactionInfo(kApplyToken2,
583 {
584 createComposerState(kLayerId2,
585 fence(Fence::Status::Unsignaled),
586 layer_state_t::eBufferChanged),
587 });
588 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700589 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000590}
591
Ady Abraham2739e832022-02-14 17:42:00 -0800592TEST_F(LatchUnsignaledAutoSingleLayerTest, DontLatchUnsignaledWhenEarlyOffset) {
593 const sp<IBinder> kApplyToken =
594 IInterface::asBinder(TransactionCompletedListener::getIInstance());
595 const auto kLayerId = 1;
Ady Abraham2739e832022-02-14 17:42:00 -0800596 const auto kExpectedTransactionsPending = 1u;
597
598 const auto unsignaledTransaction =
599 createTransactionInfo(kApplyToken,
600 {
601 createComposerState(kLayerId,
602 fence(Fence::Status::Unsignaled),
603 layer_state_t::eBufferChanged),
604 });
605
Dominik Laskowski1c99a002023-01-20 17:10:36 -0500606 modulateVsync();
Vishnu Nair1523dad2022-09-29 16:05:18 -0700607 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
Ady Abraham2739e832022-02-14 17:42:00 -0800608}
609
Vishnu Nairf01a6f12023-04-03 22:34:17 +0000610TEST_F(LatchUnsignaledAutoSingleLayerTest, UnsignaledNotAppliedWhenThereAreSignaled_SignaledFirst) {
611 const sp<IBinder> kApplyToken1 =
612 IInterface::asBinder(TransactionCompletedListener::getIInstance());
613 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
614 const sp<IBinder> kApplyToken3 = sp<BBinder>::make();
615 const auto kLayerId1 = 1;
616 const auto kLayerId2 = 2;
617 const auto kExpectedTransactionsPending = 1u;
618
619 const auto signaledTransaction =
620 createTransactionInfo(kApplyToken1,
621 {
622 createComposerState(kLayerId1,
623 fence(Fence::Status::Signaled),
624 layer_state_t::eBufferChanged),
625 });
626 const auto signaledTransaction2 =
627 createTransactionInfo(kApplyToken2,
628 {
629 createComposerState(kLayerId1,
630 fence(Fence::Status::Signaled),
631 layer_state_t::eBufferChanged),
632 });
633 const auto unsignaledTransaction =
634 createTransactionInfo(kApplyToken3,
635 {
636 createComposerState(kLayerId2,
637 fence(Fence::Status::Unsignaled),
638 layer_state_t::eBufferChanged),
639 });
640
641 setTransactionStates({signaledTransaction, signaledTransaction2, unsignaledTransaction},
642 kExpectedTransactionsPending);
643}
644
Ady Abraham9dada822022-02-03 10:26:59 -0800645class LatchUnsignaledDisabledTest : public LatchUnsignaledTest {
646public:
647 void SetUp() override {
648 LatchUnsignaledTest::SetUp();
649 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Disabled;
650 }
651};
652
653TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue) {
654 const sp<IBinder> kApplyToken =
655 IInterface::asBinder(TransactionCompletedListener::getIInstance());
656 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800657 const auto kExpectedTransactionsPending = 0u;
658
659 const auto signaledTransaction =
660 createTransactionInfo(kApplyToken,
661 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
662 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700663 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000664}
665
Ady Abraham9dada822022-02-03 10:26:59 -0800666TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueue) {
667 const sp<IBinder> kApplyToken =
668 IInterface::asBinder(TransactionCompletedListener::getIInstance());
669 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800670 const auto kExpectedTransactionsPending = 1u;
671
672 const auto unsignaledTransaction =
673 createTransactionInfo(kApplyToken,
674 {
675 createComposerState(kLayerId,
676 fence(Fence::Status::Unsignaled),
677 layer_state_t::eBufferChanged),
678 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700679 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000680}
681
Ady Abraham9dada822022-02-03 10:26:59 -0800682TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueSameLayerId) {
683 const sp<IBinder> kApplyToken =
684 IInterface::asBinder(TransactionCompletedListener::getIInstance());
685 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800686 const auto kExpectedTransactionsPending = 1u;
687
688 const auto unsignaledTransaction =
689 createTransactionInfo(kApplyToken,
690 {
691 createComposerState(kLayerId,
692 fence(Fence::Status::Unsignaled),
693 layer_state_t::eBufferChanged),
694 createComposerState(kLayerId,
695 fence(Fence::Status::Unsignaled),
696 layer_state_t::eBufferChanged),
697 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700698 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000699}
700
Ady Abraham9dada822022-02-03 10:26:59 -0800701TEST_F(LatchUnsignaledDisabledTest, Flush_KeepsInTheQueueDifferentLayerId) {
702 const sp<IBinder> kApplyToken =
703 IInterface::asBinder(TransactionCompletedListener::getIInstance());
704 const auto kLayerId1 = 1;
705 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800706 const auto kExpectedTransactionsPending = 1u;
707
708 const auto unsignaledTransaction =
709 createTransactionInfo(kApplyToken,
710 {
711 createComposerState(kLayerId1,
712 fence(Fence::Status::Unsignaled),
713 layer_state_t::eBufferChanged),
714 createComposerState(kLayerId2,
715 fence(Fence::Status::Unsignaled),
716 layer_state_t::eBufferChanged),
717 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700718 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000719}
720
Ady Abraham9dada822022-02-03 10:26:59 -0800721TEST_F(LatchUnsignaledDisabledTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
722 const sp<IBinder> kApplyToken =
723 IInterface::asBinder(TransactionCompletedListener::getIInstance());
724 const auto kLayerId1 = 1;
725 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800726 const auto kExpectedTransactionsPending = 0u;
727
728 const auto signaledTransaction =
729 createTransactionInfo(kApplyToken,
730 {
731 createComposerState(kLayerId1,
732 fence(Fence::Status::Signaled),
733 layer_state_t::eBufferChanged),
734 });
735 const auto signaledTransaction2 =
736 createTransactionInfo(kApplyToken,
737 {
738 createComposerState(kLayerId2,
739 fence(Fence::Status::Signaled),
740 layer_state_t::eBufferChanged),
741 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700742 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000743}
744
Ady Abraham9dada822022-02-03 10:26:59 -0800745TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueDifferentApplyToken) {
746 const sp<IBinder> kApplyToken1 =
747 IInterface::asBinder(TransactionCompletedListener::getIInstance());
748 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
749 const auto kLayerId1 = 1;
750 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800751 const auto kExpectedTransactionsPending = 1u;
752
753 const auto unsignaledTransaction =
754 createTransactionInfo(kApplyToken1,
755 {
756 createComposerState(kLayerId1,
757 fence(Fence::Status::Unsignaled),
758 layer_state_t::eBufferChanged),
759 });
760 const auto signaledTransaction =
761 createTransactionInfo(kApplyToken2,
762 {
763 createComposerState(kLayerId2,
764 fence(Fence::Status::Signaled),
765 layer_state_t::eBufferChanged),
766 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700767 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800768 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000769}
770
Ady Abraham9dada822022-02-03 10:26:59 -0800771TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheQueueSameApplyToken) {
772 const sp<IBinder> kApplyToken =
773 IInterface::asBinder(TransactionCompletedListener::getIInstance());
774 const auto kLayerId1 = 1;
775 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800776 const auto kExpectedTransactionsPending = 1u;
777
778 const auto signaledTransaction =
779 createTransactionInfo(kApplyToken,
780 {
781 createComposerState(kLayerId1,
782 fence(Fence::Status::Signaled),
783 layer_state_t::eBufferChanged),
784 });
785 const auto unsignaledTransaction =
786 createTransactionInfo(kApplyToken,
787 {
788 createComposerState(kLayerId2,
789 fence(Fence::Status::Unsignaled),
790 layer_state_t::eBufferChanged),
791 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700792 setTransactionStates({signaledTransaction, unsignaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800793 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000794}
795
Ady Abraham9dada822022-02-03 10:26:59 -0800796TEST_F(LatchUnsignaledDisabledTest, Flush_KeepInTheUnsignaledTheQueue) {
797 const sp<IBinder> kApplyToken =
798 IInterface::asBinder(TransactionCompletedListener::getIInstance());
799 const auto kLayerId1 = 1;
800 const auto kLayerId2 = 2;
Vishnu Nair59f6d2d2022-10-05 16:59:56 -0700801 const auto kExpectedTransactionsPending = 2u;
Ady Abraham9dada822022-02-03 10:26:59 -0800802
803 const auto unsignaledTransaction =
804 createTransactionInfo(kApplyToken,
805 {
806 createComposerState(kLayerId1,
807 fence(Fence::Status::Unsignaled),
808 layer_state_t::eBufferChanged),
809 });
810 const auto unsignaledTransaction2 =
811 createTransactionInfo(kApplyToken,
812 {
813 createComposerState(kLayerId2,
814 fence(Fence::Status::Unsignaled),
815 layer_state_t::eBufferChanged),
816 });
817 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700818 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000819}
820
Ady Abraham9dada822022-02-03 10:26:59 -0800821class LatchUnsignaledAlwaysTest : public LatchUnsignaledTest {
822public:
823 void SetUp() override {
824 LatchUnsignaledTest::SetUp();
825 SurfaceFlinger::enableLatchUnsignaledConfig = LatchUnsignaledConfig::Always;
826 }
827};
828
829TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue) {
830 const sp<IBinder> kApplyToken =
831 IInterface::asBinder(TransactionCompletedListener::getIInstance());
832 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800833 const auto kExpectedTransactionsPending = 0u;
834
835 const auto signaledTransaction =
836 createTransactionInfo(kApplyToken,
837 {createComposerState(kLayerId, fence(Fence::Status::Signaled),
838 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700839 setTransactionStates({signaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000840}
841
Ady Abraham9dada822022-02-03 10:26:59 -0800842TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueue) {
843 const sp<IBinder> kApplyToken =
844 IInterface::asBinder(TransactionCompletedListener::getIInstance());
845 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800846 const auto kExpectedTransactionsPending = 0u;
847
848 const auto unsignaledTransaction =
849 createTransactionInfo(kApplyToken,
850 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
851 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700852 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000853}
854
Ady Abraham9dada822022-02-03 10:26:59 -0800855TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueSameLayerId) {
856 const sp<IBinder> kApplyToken =
857 IInterface::asBinder(TransactionCompletedListener::getIInstance());
858 const auto kLayerId = 1;
Ady Abraham9dada822022-02-03 10:26:59 -0800859 const auto kExpectedTransactionsPending = 0u;
860
861 const auto mixedTransaction =
862 createTransactionInfo(kApplyToken,
863 {createComposerState(kLayerId, fence(Fence::Status::Unsignaled),
864 layer_state_t::eBufferChanged),
865 createComposerState(kLayerId, fence(Fence::Status::Signaled),
866 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700867 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000868}
869
Ady Abraham9dada822022-02-03 10:26:59 -0800870TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentLayerId) {
871 const sp<IBinder> kApplyToken =
872 IInterface::asBinder(TransactionCompletedListener::getIInstance());
873 const auto kLayerId1 = 1;
874 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800875 const auto kExpectedTransactionsPending = 0u;
876
877 const auto mixedTransaction =
878 createTransactionInfo(kApplyToken,
879 {createComposerState(kLayerId1, fence(Fence::Status::Unsignaled),
880 layer_state_t::eBufferChanged),
881 createComposerState(kLayerId2, fence(Fence::Status::Signaled),
882 layer_state_t::eBufferChanged)});
Vishnu Nair1523dad2022-09-29 16:05:18 -0700883 setTransactionStates({mixedTransaction}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000884}
885
Ady Abraham9dada822022-02-03 10:26:59 -0800886TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesSignaledFromTheQueue_MultipleLayers) {
887 const sp<IBinder> kApplyToken =
888 IInterface::asBinder(TransactionCompletedListener::getIInstance());
889 const auto kLayerId1 = 1;
890 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800891 const auto kExpectedTransactionsPending = 0u;
892
893 const auto signaledTransaction =
894 createTransactionInfo(kApplyToken,
895 {
896 createComposerState(kLayerId1,
897 fence(Fence::Status::Signaled),
898 layer_state_t::eBufferChanged),
899 });
900 const auto signaledTransaction2 =
901 createTransactionInfo(kApplyToken,
902 {
903 createComposerState(kLayerId2,
904 fence(Fence::Status::Signaled),
905 layer_state_t::eBufferChanged),
906 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700907 setTransactionStates({signaledTransaction, signaledTransaction2}, kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000908}
909
Ady Abraham9dada822022-02-03 10:26:59 -0800910TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesFromTheQueueDifferentApplyToken) {
911 const sp<IBinder> kApplyToken1 =
912 IInterface::asBinder(TransactionCompletedListener::getIInstance());
913 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
914 const auto kLayerId1 = 1;
915 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800916 const auto kExpectedTransactionsPending = 0u;
917
918 const auto signaledTransaction =
919 createTransactionInfo(kApplyToken1,
920 {
921 createComposerState(kLayerId1,
922 fence(Fence::Status::Signaled),
923 layer_state_t::eBufferChanged),
924 });
925 const auto unsignaledTransaction =
926 createTransactionInfo(kApplyToken2,
927 {
928 createComposerState(kLayerId2,
929 fence(Fence::Status::Unsignaled),
930 layer_state_t::eBufferChanged),
931 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700932 setTransactionStates({signaledTransaction, unsignaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800933 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000934}
935
Ady Abraham9dada822022-02-03 10:26:59 -0800936TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueueSameApplyToken) {
937 const sp<IBinder> kApplyToken =
938 IInterface::asBinder(TransactionCompletedListener::getIInstance());
939 const auto kLayerId1 = 1;
940 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800941 const auto kExpectedTransactionsPending = 0u;
942
943 const auto unsignaledTransaction =
944 createTransactionInfo(kApplyToken,
945 {
946 createComposerState(kLayerId1,
947 fence(Fence::Status::Unsignaled),
948 layer_state_t::eBufferChanged),
949 });
950 const auto signaledTransaction =
951 createTransactionInfo(kApplyToken,
952 {
953 createComposerState(kLayerId2,
954 fence(Fence::Status::Signaled),
955 layer_state_t::eBufferChanged),
956 });
Vishnu Nair1523dad2022-09-29 16:05:18 -0700957 setTransactionStates({unsignaledTransaction, signaledTransaction},
Ady Abraham9dada822022-02-03 10:26:59 -0800958 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000959}
960
Ady Abraham9dada822022-02-03 10:26:59 -0800961TEST_F(LatchUnsignaledAlwaysTest, Flush_RemovesUnsignaledFromTheQueue) {
962 const sp<IBinder> kApplyToken1 =
963 IInterface::asBinder(TransactionCompletedListener::getIInstance());
964 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
965 const auto kLayerId1 = 1;
966 const auto kLayerId2 = 2;
Ady Abraham9dada822022-02-03 10:26:59 -0800967 const auto kExpectedTransactionsPending = 0u;
968
969 const auto unsignaledTransaction =
970 createTransactionInfo(kApplyToken1,
971 {
972 createComposerState(kLayerId1,
973 fence(Fence::Status::Unsignaled),
974 layer_state_t::eBufferChanged),
975 });
976 const auto unsignaledTransaction2 =
977 createTransactionInfo(kApplyToken2,
978 {
979 createComposerState(kLayerId2,
980 fence(Fence::Status::Unsignaled),
981 layer_state_t::eBufferChanged),
982 });
983 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
Vishnu Nair1523dad2022-09-29 16:05:18 -0700984 kExpectedTransactionsPending);
ramindani4d48f902021-09-20 21:07:45 +0000985}
986
Vishnu Nairf01a6f12023-04-03 22:34:17 +0000987TEST_F(LatchUnsignaledAlwaysTest, RespectsBackPressureFlag) {
988 const sp<IBinder> kApplyToken1 =
989 IInterface::asBinder(TransactionCompletedListener::getIInstance());
990 const sp<IBinder> kApplyToken2 = sp<BBinder>::make();
991 const auto kLayerId1 = 1;
992 const auto kExpectedTransactionsPending = 1u;
993 auto layer =
994 sp<Layer>::make(LayerCreationArgs(mFlinger.flinger(), nullptr, "TestLayer", 0, {}));
995 auto layerHandle = layer->getHandle();
996 const auto setBackPressureFlagTransaction =
997 createTransactionInfo(kApplyToken1,
998 {createComposerState(kLayerId1, fence(Fence::Status::Unsignaled),
999 layer_state_t::eBufferChanged |
1000 layer_state_t::eFlagsChanged,
1001 {layerHandle})});
1002 setTransactionStates({setBackPressureFlagTransaction}, 0u);
1003
1004 const auto unsignaledTransaction =
1005 createTransactionInfo(kApplyToken1,
1006 {
1007 createComposerState(kLayerId1,
1008 fence(Fence::Status::Unsignaled),
1009 layer_state_t::eBufferChanged,
1010 {layerHandle}),
1011 });
1012 const auto unsignaledTransaction2 =
1013 createTransactionInfo(kApplyToken1,
1014 {
1015 createComposerState(kLayerId1,
1016 fence(Fence::Status::Unsignaled),
1017 layer_state_t::eBufferChanged,
1018 {layerHandle}),
1019 });
1020 setTransactionStates({unsignaledTransaction, unsignaledTransaction2},
1021 kExpectedTransactionsPending);
1022}
1023
Ady Abraham2739e832022-02-14 17:42:00 -08001024TEST_F(LatchUnsignaledAlwaysTest, LatchUnsignaledWhenEarlyOffset) {
1025 const sp<IBinder> kApplyToken =
1026 IInterface::asBinder(TransactionCompletedListener::getIInstance());
1027 const auto kLayerId = 1;
Ady Abraham2739e832022-02-14 17:42:00 -08001028 const auto kExpectedTransactionsPending = 0u;
1029
1030 const auto unsignaledTransaction =
1031 createTransactionInfo(kApplyToken,
1032 {
1033 createComposerState(kLayerId,
1034 fence(Fence::Status::Unsignaled),
1035 layer_state_t::eBufferChanged),
1036 });
1037
Dominik Laskowski1c99a002023-01-20 17:10:36 -05001038 modulateVsync();
Vishnu Nair1523dad2022-09-29 16:05:18 -07001039 setTransactionStates({unsignaledTransaction}, kExpectedTransactionsPending);
Ady Abraham2739e832022-02-14 17:42:00 -08001040}
1041
Vishnu Nair59f6d2d2022-10-05 16:59:56 -07001042TEST(TransactionHandlerTest, QueueTransaction) {
1043 TransactionHandler handler;
1044 TransactionState transaction;
1045 transaction.applyToken = sp<BBinder>::make();
1046 transaction.id = 42;
1047 handler.queueTransaction(std::move(transaction));
1048 std::vector<TransactionState> transactionsReadyToBeApplied = handler.flushTransactions();
1049
1050 EXPECT_EQ(transactionsReadyToBeApplied.size(), 1u);
1051 EXPECT_EQ(transactionsReadyToBeApplied.front().id, 42u);
1052}
1053
Valerie Haud251afb2019-03-29 14:19:02 -07001054} // namespace android