blob: c23fb9bd23fe19c113bf878129883727e8ffabdb [file] [log] [blame]
Vishnu Nair1506b182021-02-22 14:35:15 -08001/*
2 * Copyright (C) 2021 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
chaviwd7deef72021-10-06 11:53:40 -050017#include <gui/test/CallbackUtils.h>
Vishnu Nair1506b182021-02-22 14:35:15 -080018#include "LayerTransactionTest.h"
Vishnu Nair1506b182021-02-22 14:35:15 -080019
20using namespace std::chrono_literals;
21
22namespace android {
23
24using android::hardware::graphics::common::V1_1::BufferUsage;
25
26::testing::Environment* const binderEnv =
27 ::testing::AddGlobalTestEnvironment(new BinderEnvironment());
28
29// b/181132765 - disabled until cuttlefish failures are investigated
30class ReleaseBufferCallbackHelper {
31public:
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070032 static void function(void* callbackContext, ReleaseCallbackId callbackId,
Ady Abraham899dcdb2021-06-15 16:56:21 -070033 const sp<Fence>& releaseFence,
chaviw69058fb2021-09-27 09:37:30 -050034 std::optional<uint32_t> /*currentMaxAcquiredBufferCount*/) {
Vishnu Nair1506b182021-02-22 14:35:15 -080035 if (!callbackContext) {
36 FAIL() << "failed to get callback context";
37 }
38 ReleaseBufferCallbackHelper* helper =
39 static_cast<ReleaseBufferCallbackHelper*>(callbackContext);
40 std::lock_guard lock(helper->mMutex);
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070041 helper->mCallbackDataQueue.emplace(callbackId, releaseFence);
Vishnu Nair1506b182021-02-22 14:35:15 -080042 helper->mConditionVariable.notify_all();
43 }
44
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070045 void getCallbackData(ReleaseCallbackId* callbackId) {
Vishnu Nair1506b182021-02-22 14:35:15 -080046 std::unique_lock lock(mMutex);
47 if (mCallbackDataQueue.empty()) {
48 if (!mConditionVariable.wait_for(lock, std::chrono::seconds(3),
49 [&] { return !mCallbackDataQueue.empty(); })) {
50 FAIL() << "failed to get releaseBuffer callback";
51 }
52 }
53
54 auto callbackData = mCallbackDataQueue.front();
55 mCallbackDataQueue.pop();
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070056 *callbackId = callbackData.first;
Vishnu Nair1506b182021-02-22 14:35:15 -080057 }
58
59 void verifyNoCallbacks() {
60 // Wait to see if there are extra callbacks
61 std::this_thread::sleep_for(300ms);
62
63 std::lock_guard lock(mMutex);
chaviwd7deef72021-10-06 11:53:40 -050064 EXPECT_EQ(mCallbackDataQueue.size(), 0U) << "extra callbacks received";
Vishnu Nair1506b182021-02-22 14:35:15 -080065 mCallbackDataQueue = {};
66 }
67
68 android::ReleaseBufferCallback getCallback() {
69 return std::bind(function, static_cast<void*>(this) /* callbackContext */,
Ady Abraham899dcdb2021-06-15 16:56:21 -070070 std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
Vishnu Nair1506b182021-02-22 14:35:15 -080071 }
72
73 std::mutex mMutex;
74 std::condition_variable mConditionVariable;
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070075 std::queue<std::pair<ReleaseCallbackId, sp<Fence>>> mCallbackDataQueue;
Vishnu Nair1506b182021-02-22 14:35:15 -080076};
77
78class ReleaseBufferCallbackTest : public LayerTransactionTest {
79public:
80 virtual sp<SurfaceControl> createBufferStateLayer() {
81 return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState);
82 }
83
84 static void submitBuffer(const sp<SurfaceControl>& layer, sp<GraphicBuffer> buffer,
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070085 sp<Fence> fence, CallbackHelper& callback, const ReleaseCallbackId& id,
Vishnu Nair1506b182021-02-22 14:35:15 -080086 ReleaseBufferCallbackHelper& releaseCallback) {
87 Transaction t;
liulijuneb489f62022-10-17 22:02:14 +080088 t.setBuffer(layer, buffer, fence, id.framenumber, 0 /* producerId */,
89 releaseCallback.getCallback());
Vishnu Nair1506b182021-02-22 14:35:15 -080090 t.addTransactionCompletedCallback(callback.function, callback.getContext());
91 t.apply();
92 }
93
94 static void waitForCallback(CallbackHelper& helper, const ExpectedResult& expectedResult) {
95 CallbackData callbackData;
96 helper.getCallbackData(&callbackData);
97 expectedResult.verifyCallbackData(callbackData);
98 }
99
100 static void waitForReleaseBufferCallback(ReleaseBufferCallbackHelper& releaseCallback,
chaviw0b06a8d2021-08-06 11:49:08 -0500101 const ReleaseCallbackId& expectedReleaseBufferId) {
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700102 ReleaseCallbackId actualReleaseBufferId;
Vishnu Nair1506b182021-02-22 14:35:15 -0800103 releaseCallback.getCallbackData(&actualReleaseBufferId);
chaviw0b06a8d2021-08-06 11:49:08 -0500104 EXPECT_EQ(expectedReleaseBufferId, actualReleaseBufferId);
Vishnu Nair1506b182021-02-22 14:35:15 -0800105 releaseCallback.verifyNoCallbacks();
106 }
107 static ReleaseBufferCallbackHelper* getReleaseBufferCallbackHelper() {
108 static std::vector<ReleaseBufferCallbackHelper*> sCallbacks;
109 sCallbacks.emplace_back(new ReleaseBufferCallbackHelper());
110 return sCallbacks.back();
111 }
112
113 static sp<GraphicBuffer> getBuffer() {
Ady Abrahamd11bade2022-08-01 16:18:03 -0700114 return sp<GraphicBuffer>::make(32u, 32u, PIXEL_FORMAT_RGBA_8888, 1u,
115 BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
116 BufferUsage::COMPOSER_OVERLAY,
117 "test");
Vishnu Nair1506b182021-02-22 14:35:15 -0800118 }
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700119 static uint64_t generateFrameNumber() {
120 static uint64_t sFrameNumber = 0;
121 return ++sFrameNumber;
122 }
Vishnu Nair1506b182021-02-22 14:35:15 -0800123};
124
125TEST_F(ReleaseBufferCallbackTest, DISABLED_PresentBuffer) {
126 sp<SurfaceControl> layer = createBufferStateLayer();
127 CallbackHelper transactionCallback;
128 ReleaseBufferCallbackHelper* releaseCallback = getReleaseBufferCallbackHelper();
129
130 // If a buffer is being presented, we should not emit a release callback.
131 sp<GraphicBuffer> firstBuffer = getBuffer();
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700132 ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber());
133 submitBuffer(layer, firstBuffer, Fence::NO_FENCE, transactionCallback, firstBufferCallbackId,
134 *releaseCallback);
Vishnu Nair1506b182021-02-22 14:35:15 -0800135 ExpectedResult expected;
136 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
137 ExpectedResult::Buffer::NOT_ACQUIRED);
138 ASSERT_NO_FATAL_FAILURE(waitForCallback(transactionCallback, expected));
139 EXPECT_NO_FATAL_FAILURE(releaseCallback->verifyNoCallbacks());
140
141 // if state doesn't change, no release callbacks are expected
142 Transaction t;
143 t.addTransactionCompletedCallback(transactionCallback.function,
144 transactionCallback.getContext());
145 t.apply();
146 ASSERT_NO_FATAL_FAILURE(waitForCallback(transactionCallback, ExpectedResult()));
147 EXPECT_NO_FATAL_FAILURE(releaseCallback->verifyNoCallbacks());
148
149 // If a presented buffer is replaced, we should emit a release callback for the
150 // previously presented buffer.
151 sp<GraphicBuffer> secondBuffer = getBuffer();
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700152 ReleaseCallbackId secondBufferCallbackId(secondBuffer->getId(), generateFrameNumber());
153 submitBuffer(layer, secondBuffer, Fence::NO_FENCE, transactionCallback, secondBufferCallbackId,
154 *releaseCallback);
Vishnu Nair1506b182021-02-22 14:35:15 -0800155 expected = ExpectedResult();
156 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
157 ExpectedResult::Buffer::NOT_ACQUIRED,
158 ExpectedResult::PreviousBuffer::RELEASED);
159 ASSERT_NO_FATAL_FAILURE(waitForCallback(transactionCallback, expected));
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700160 ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));
Vishnu Nair1506b182021-02-22 14:35:15 -0800161}
162
163TEST_F(ReleaseBufferCallbackTest, DISABLED_OffScreenLayer) {
164 sp<SurfaceControl> layer = createBufferStateLayer();
165
166 CallbackHelper transactionCallback;
167 ReleaseBufferCallbackHelper* releaseCallback = getReleaseBufferCallbackHelper();
168
169 // If a buffer is being presented, we should not emit a release callback.
170 sp<GraphicBuffer> firstBuffer = getBuffer();
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700171 ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber());
172 submitBuffer(layer, firstBuffer, Fence::NO_FENCE, transactionCallback, firstBufferCallbackId,
173 *releaseCallback);
Vishnu Nair1506b182021-02-22 14:35:15 -0800174 ExpectedResult expected;
175 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
176 ExpectedResult::Buffer::NOT_ACQUIRED);
177 ASSERT_NO_FATAL_FAILURE(waitForCallback(transactionCallback, expected));
178 releaseCallback->verifyNoCallbacks();
179
180 // If a layer is parented offscreen then it should not emit a callback since sf still owns
181 // the buffer and can render it again.
182 Transaction t;
183 t.reparent(layer, nullptr);
184 t.addTransactionCompletedCallback(transactionCallback.function,
185 transactionCallback.getContext());
186 t.apply();
187 expected = ExpectedResult();
188 expected.addSurface(ExpectedResult::Transaction::NOT_PRESENTED, layer,
189 ExpectedResult::Buffer::NOT_ACQUIRED,
190 ExpectedResult::PreviousBuffer::NOT_RELEASED);
191 ASSERT_NO_FATAL_FAILURE(waitForCallback(transactionCallback, expected));
192 ASSERT_NO_FATAL_FAILURE(releaseCallback->verifyNoCallbacks());
193
194 // If a presented buffer is replaced, we should emit a release callback for the
195 // previously presented buffer.
196 sp<GraphicBuffer> secondBuffer = getBuffer();
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700197 ReleaseCallbackId secondBufferCallbackId(secondBuffer->getId(), generateFrameNumber());
198 submitBuffer(layer, secondBuffer, Fence::NO_FENCE, transactionCallback, secondBufferCallbackId,
199 *releaseCallback);
Vishnu Nair1506b182021-02-22 14:35:15 -0800200 expected = ExpectedResult();
201 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
202 ExpectedResult::Buffer::NOT_ACQUIRED,
203 ExpectedResult::PreviousBuffer::NOT_RELEASED);
204 ASSERT_NO_FATAL_FAILURE(waitForCallback(transactionCallback, expected));
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700205 ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));
Vishnu Nair1506b182021-02-22 14:35:15 -0800206
207 // If continue to submit buffer we continue to get release callbacks
208 sp<GraphicBuffer> thirdBuffer = getBuffer();
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700209 ReleaseCallbackId thirdBufferCallbackId(secondBuffer->getId(), generateFrameNumber());
210 submitBuffer(layer, thirdBuffer, Fence::NO_FENCE, transactionCallback, thirdBufferCallbackId,
211 *releaseCallback);
Vishnu Nair1506b182021-02-22 14:35:15 -0800212 expected = ExpectedResult();
213 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
214 ExpectedResult::Buffer::NOT_ACQUIRED,
215 ExpectedResult::PreviousBuffer::NOT_RELEASED);
216 ASSERT_NO_FATAL_FAILURE(waitForCallback(transactionCallback, expected));
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700217 ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, secondBufferCallbackId));
Vishnu Nair1506b182021-02-22 14:35:15 -0800218}
219
220TEST_F(ReleaseBufferCallbackTest, DISABLED_LayerLifecycle_layerdestroy) {
221 sp<SurfaceControl> layer = createBufferStateLayer();
222 CallbackHelper* transactionCallback = new CallbackHelper();
223 ReleaseBufferCallbackHelper* releaseCallback = getReleaseBufferCallbackHelper();
224
225 // If a buffer is being presented, we should not emit a release callback.
226 sp<GraphicBuffer> firstBuffer = getBuffer();
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700227 ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber());
228 submitBuffer(layer, firstBuffer, Fence::NO_FENCE, *transactionCallback, firstBufferCallbackId,
229 *releaseCallback);
Vishnu Nair1506b182021-02-22 14:35:15 -0800230 {
231 ExpectedResult expected;
232 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
233 ExpectedResult::Buffer::NOT_ACQUIRED);
234 ASSERT_NO_FATAL_FAILURE(waitForCallback(*transactionCallback, expected));
235 ASSERT_NO_FATAL_FAILURE(releaseCallback->verifyNoCallbacks());
236 }
237
238 // Destroying a currently presenting layer emits a callback.
239 Transaction t;
240 t.reparent(layer, nullptr);
241 t.apply();
242 layer = nullptr;
243
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700244 ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));
Vishnu Nair1506b182021-02-22 14:35:15 -0800245}
246
247// Destroying a never presented layer emits a callback.
248TEST_F(ReleaseBufferCallbackTest, DISABLED_LayerLifecycle_OffScreenLayerDestroy) {
249 sp<SurfaceControl> layer = createBufferStateLayer();
250
251 // make layer offscreen
252 Transaction t;
253 t.reparent(layer, nullptr);
254 t.apply();
255
256 CallbackHelper* transactionCallback = new CallbackHelper();
257 ReleaseBufferCallbackHelper* releaseCallback = getReleaseBufferCallbackHelper();
258
259 // Submitting a buffer does not emit a callback.
260 sp<GraphicBuffer> firstBuffer = getBuffer();
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700261 ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber());
262 submitBuffer(layer, firstBuffer, Fence::NO_FENCE, *transactionCallback, firstBufferCallbackId,
263 *releaseCallback);
Vishnu Nair1506b182021-02-22 14:35:15 -0800264 {
265 ExpectedResult expected;
266 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
267 ExpectedResult::Buffer::NOT_ACQUIRED);
268 ASSERT_NO_FATAL_FAILURE(waitForCallback(*transactionCallback, expected));
269 ASSERT_NO_FATAL_FAILURE(releaseCallback->verifyNoCallbacks());
270 }
271
272 // Submitting a second buffer will replace the drawing state buffer and emit a callback.
273 sp<GraphicBuffer> secondBuffer = getBuffer();
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700274 ReleaseCallbackId secondBufferCallbackId(secondBuffer->getId(), generateFrameNumber());
275 submitBuffer(layer, secondBuffer, Fence::NO_FENCE, *transactionCallback, secondBufferCallbackId,
276 *releaseCallback);
Vishnu Nair1506b182021-02-22 14:35:15 -0800277 {
278 ExpectedResult expected;
279 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
280 ExpectedResult::Buffer::NOT_ACQUIRED);
281 ASSERT_NO_FATAL_FAILURE(waitForCallback(*transactionCallback, expected));
282 ASSERT_NO_FATAL_FAILURE(
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700283 waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));
Vishnu Nair1506b182021-02-22 14:35:15 -0800284 }
285
286 // Destroying the offscreen layer emits a callback.
287 layer = nullptr;
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700288 ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, secondBufferCallbackId));
Vishnu Nair1506b182021-02-22 14:35:15 -0800289}
290
291TEST_F(ReleaseBufferCallbackTest, DISABLED_FrameDropping) {
292 sp<SurfaceControl> layer = createBufferStateLayer();
293 CallbackHelper transactionCallback;
294 ReleaseBufferCallbackHelper* releaseCallback = getReleaseBufferCallbackHelper();
295
296 // If a buffer is being presented, we should not emit a release callback.
297 sp<GraphicBuffer> firstBuffer = getBuffer();
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700298 ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber());
Vishnu Nair1506b182021-02-22 14:35:15 -0800299
300 // Try to present 100ms in the future
301 nsecs_t time = systemTime() + std::chrono::nanoseconds(100ms).count();
302
303 Transaction t;
chaviw8dd181f2022-01-05 18:36:46 -0600304 t.setBuffer(layer, firstBuffer, std::nullopt, firstBufferCallbackId.framenumber,
liulijuneb489f62022-10-17 22:02:14 +0800305 0 /* producerId */, releaseCallback->getCallback());
Vishnu Nair1506b182021-02-22 14:35:15 -0800306 t.addTransactionCompletedCallback(transactionCallback.function,
307 transactionCallback.getContext());
308 t.setDesiredPresentTime(time);
309 t.apply();
310
311 ExpectedResult expected;
312 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
313 ExpectedResult::Buffer::NOT_ACQUIRED);
314 ASSERT_NO_FATAL_FAILURE(waitForCallback(transactionCallback, expected));
315 EXPECT_NO_FATAL_FAILURE(releaseCallback->verifyNoCallbacks());
316
317 // Dropping frames in transaction queue emits a callback
318 sp<GraphicBuffer> secondBuffer = getBuffer();
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700319 ReleaseCallbackId secondBufferCallbackId(secondBuffer->getId(), generateFrameNumber());
chaviw8dd181f2022-01-05 18:36:46 -0600320 t.setBuffer(layer, secondBuffer, std::nullopt, secondBufferCallbackId.framenumber,
liulijuneb489f62022-10-17 22:02:14 +0800321 0 /* producerId */, releaseCallback->getCallback());
Vishnu Nair1506b182021-02-22 14:35:15 -0800322 t.addTransactionCompletedCallback(transactionCallback.function,
323 transactionCallback.getContext());
324 t.setDesiredPresentTime(time);
325 t.apply();
326
327 expected = ExpectedResult();
328 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
329 ExpectedResult::Buffer::NOT_ACQUIRED,
330 ExpectedResult::PreviousBuffer::RELEASED);
331 ASSERT_NO_FATAL_FAILURE(waitForCallback(transactionCallback, expected));
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700332 ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));
Vishnu Nair1506b182021-02-22 14:35:15 -0800333}
334
chaviw0b06a8d2021-08-06 11:49:08 -0500335TEST_F(ReleaseBufferCallbackTest, DISABLED_Merge_Different_Processes) {
Ady Abrahamd11bade2022-08-01 16:18:03 -0700336 sp<TransactionCompletedListener> firstCompletedListener =
337 sp<TransactionCompletedListener>::make();
338 sp<TransactionCompletedListener> secondCompletedListener =
339 sp<TransactionCompletedListener>::make();
chaviw0b06a8d2021-08-06 11:49:08 -0500340
341 CallbackHelper callback1, callback2;
342
343 TransactionCompletedListener::setInstance(firstCompletedListener);
344
345 sp<SurfaceControl> layer = createBufferStateLayer();
346 ReleaseBufferCallbackHelper* releaseCallback = getReleaseBufferCallbackHelper();
347
348 sp<GraphicBuffer> firstBuffer = getBuffer();
349 ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber());
350
351 // Send initial buffer for the layer
352 submitBuffer(layer, firstBuffer, Fence::NO_FENCE, callback1, firstBufferCallbackId,
353 *releaseCallback);
354
355 ExpectedResult expected;
356 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
357 ExpectedResult::Buffer::NOT_ACQUIRED);
358 ASSERT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
359
360 // Sent a second buffer to allow the first buffer to get released.
361 sp<GraphicBuffer> secondBuffer = getBuffer();
362 ReleaseCallbackId secondBufferCallbackId(secondBuffer->getId(), generateFrameNumber());
363
364 Transaction transaction1;
chaviwba4320c2021-09-15 15:20:53 -0500365 transaction1.setBuffer(layer, secondBuffer, std::nullopt, secondBufferCallbackId.framenumber,
liulijuneb489f62022-10-17 22:02:14 +0800366 0 /* producerId */, releaseCallback->getCallback());
chaviw0b06a8d2021-08-06 11:49:08 -0500367 transaction1.addTransactionCompletedCallback(callback1.function, callback1.getContext());
368
369 // Set a different TransactionCompletedListener to mimic a second process
370 TransactionCompletedListener::setInstance(secondCompletedListener);
371
372 // Make sure the second "process" has a callback set up.
373 Transaction transaction2;
374 transaction2.addTransactionCompletedCallback(callback2.function, callback2.getContext());
375
376 // This merging order, merge transaction1 first then transaction2, seems to ensure the listener
377 // for transaction2 is ordered first. This makes sure the wrong process is added first to the
378 // layer's vector of listeners. With the bug, only the secondCompletedListener will get the
379 // release callback id, since it's ordered first. Then firstCompletedListener would fail to get
380 // the release callback id and not invoke the release callback.
381 Transaction().merge(std::move(transaction1)).merge(std::move(transaction2)).apply();
382
383 expected = ExpectedResult();
384 expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer,
385 ExpectedResult::Buffer::NOT_ACQUIRED,
386 ExpectedResult::PreviousBuffer::RELEASED);
387 ASSERT_NO_FATAL_FAILURE(waitForCallback(callback1, expected));
388 ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));
389}
390
chaviw69058fb2021-09-27 09:37:30 -0500391TEST_F(ReleaseBufferCallbackTest, DISABLED_SetBuffer_OverwriteBuffers) {
392 sp<SurfaceControl> layer = createBufferStateLayer();
393 ReleaseBufferCallbackHelper* releaseCallback = getReleaseBufferCallbackHelper();
394
395 sp<GraphicBuffer> firstBuffer = getBuffer();
396 ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber());
397
398 // Create transaction with a buffer.
399 Transaction transaction;
400 transaction.setBuffer(layer, firstBuffer, std::nullopt, firstBufferCallbackId.framenumber,
liulijuneb489f62022-10-17 22:02:14 +0800401 0 /* producerId */, releaseCallback->getCallback());
chaviw69058fb2021-09-27 09:37:30 -0500402
403 sp<GraphicBuffer> secondBuffer = getBuffer();
404 ReleaseCallbackId secondBufferCallbackId(secondBuffer->getId(), generateFrameNumber());
405
406 // Call setBuffer on the same transaction with a different buffer.
407 transaction.setBuffer(layer, secondBuffer, std::nullopt, secondBufferCallbackId.framenumber,
liulijuneb489f62022-10-17 22:02:14 +0800408 0 /* producerId */, releaseCallback->getCallback());
chaviw69058fb2021-09-27 09:37:30 -0500409
410 ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));
411}
412
413TEST_F(ReleaseBufferCallbackTest, DISABLED_Merge_Transactions_OverwriteBuffers) {
414 sp<SurfaceControl> layer = createBufferStateLayer();
415 ReleaseBufferCallbackHelper* releaseCallback = getReleaseBufferCallbackHelper();
416
417 sp<GraphicBuffer> firstBuffer = getBuffer();
418 ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber());
419
420 // Create transaction with a buffer.
421 Transaction transaction1;
422 transaction1.setBuffer(layer, firstBuffer, std::nullopt, firstBufferCallbackId.framenumber,
liulijuneb489f62022-10-17 22:02:14 +0800423 0 /* producerId */, releaseCallback->getCallback());
chaviw69058fb2021-09-27 09:37:30 -0500424
425 sp<GraphicBuffer> secondBuffer = getBuffer();
426 ReleaseCallbackId secondBufferCallbackId(secondBuffer->getId(), generateFrameNumber());
427
428 // Create a second transaction with a new buffer for the same layer.
429 Transaction transaction2;
430 transaction2.setBuffer(layer, secondBuffer, std::nullopt, secondBufferCallbackId.framenumber,
liulijuneb489f62022-10-17 22:02:14 +0800431 0 /* producerId */, releaseCallback->getCallback());
chaviw69058fb2021-09-27 09:37:30 -0500432
433 // merge transaction1 into transaction2 so ensure we get a proper buffer release callback.
434 transaction1.merge(std::move(transaction2));
435 ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));
436}
437
438TEST_F(ReleaseBufferCallbackTest, DISABLED_MergeBuffers_Different_Processes) {
Ady Abrahamd11bade2022-08-01 16:18:03 -0700439 sp<TransactionCompletedListener> firstCompletedListener =
440 sp<TransactionCompletedListener>::make();
441 sp<TransactionCompletedListener> secondCompletedListener =
442 sp<TransactionCompletedListener>::make();
chaviw69058fb2021-09-27 09:37:30 -0500443
444 TransactionCompletedListener::setInstance(firstCompletedListener);
445
446 sp<SurfaceControl> layer = createBufferStateLayer();
447 ReleaseBufferCallbackHelper* releaseCallback = getReleaseBufferCallbackHelper();
448
449 sp<GraphicBuffer> firstBuffer = getBuffer();
450 ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber());
451
452 Transaction transaction1;
453 transaction1.setBuffer(layer, firstBuffer, std::nullopt, firstBufferCallbackId.framenumber,
liulijuneb489f62022-10-17 22:02:14 +0800454 0 /* producerId */, releaseCallback->getCallback());
chaviw69058fb2021-09-27 09:37:30 -0500455
456 // Sent a second buffer to allow the first buffer to get released.
457 sp<GraphicBuffer> secondBuffer = getBuffer();
458 ReleaseCallbackId secondBufferCallbackId(secondBuffer->getId(), generateFrameNumber());
459
460 Transaction transaction2;
461 transaction2.setBuffer(layer, secondBuffer, std::nullopt, secondBufferCallbackId.framenumber,
liulijuneb489f62022-10-17 22:02:14 +0800462 0 /* producerId */, releaseCallback->getCallback());
chaviw69058fb2021-09-27 09:37:30 -0500463
464 // Set a different TransactionCompletedListener to mimic a second process
465 TransactionCompletedListener::setInstance(secondCompletedListener);
466 Transaction().merge(std::move(transaction1)).merge(std::move(transaction2)).apply();
467
468 // Make sure we can still get the release callback even though the merge happened in a different
469 // process.
470 ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));
471}
472
chaviwd1bda4b2022-05-19 17:44:46 -0500473TEST_F(ReleaseBufferCallbackTest, SetBuffer_OverwriteBuffersWithNull) {
474 sp<SurfaceControl> layer = createBufferStateLayer();
475 ReleaseBufferCallbackHelper* releaseCallback = getReleaseBufferCallbackHelper();
476
477 sp<GraphicBuffer> firstBuffer = getBuffer();
478 ReleaseCallbackId firstBufferCallbackId(firstBuffer->getId(), generateFrameNumber());
479
480 // Create transaction with a buffer.
481 Transaction transaction;
482 transaction.setBuffer(layer, firstBuffer, std::nullopt, firstBufferCallbackId.framenumber,
liulijuneb489f62022-10-17 22:02:14 +0800483 0 /* producerId */, releaseCallback->getCallback());
chaviwd1bda4b2022-05-19 17:44:46 -0500484
485 // Call setBuffer on the same transaction with a null buffer.
liulijuneb489f62022-10-17 22:02:14 +0800486 transaction.setBuffer(layer, nullptr, std::nullopt, 0, 0 /* producerId */,
487 releaseCallback->getCallback());
chaviwd1bda4b2022-05-19 17:44:46 -0500488
489 ASSERT_NO_FATAL_FAILURE(waitForReleaseBufferCallback(*releaseCallback, firstBufferCallbackId));
490}
491
Vishnu Nair1506b182021-02-22 14:35:15 -0800492} // namespace android