blob: 42f4406ce5e8b1c3bd7dc268e75e083bdbb5441f [file] [log] [blame]
Marissa Wallf6a73fa2018-12-10 10:41:08 -08001/*
2 * Copyright 2018 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
Marissa Wall1be5a102019-01-18 16:14:04 -080017#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
Marissa Wallf6a73fa2018-12-10 10:41:08 -080018#include <android/native_window.h>
19#include <android/surface_control.h>
Marissa Wall1be5a102019-01-18 16:14:04 -080020#include <configstore/Utils.h>
Marissa Wall1be5a102019-01-18 16:14:04 -080021#include <gui/HdrMetadata.h>
22#include <gui/ISurfaceComposer.h>
Marissa Wallf6a73fa2018-12-10 10:41:08 -080023#include <gui/Surface.h>
24#include <gui/SurfaceComposerClient.h>
25#include <gui/SurfaceControl.h>
Rachel Leeb6c93aa2022-02-22 15:48:28 -080026#include <private/android/choreographer.h>
27#include <surface_control_private.h>
Marin Shalamanov463ad8e2021-01-28 22:58:37 +010028#include <ui/DynamicDisplayInfo.h>
Marissa Wall1be5a102019-01-18 16:14:04 -080029#include <utils/Timers.h>
30
31using namespace android::hardware::configstore;
32using namespace android::hardware::configstore::V1_0;
Marissa Wallf6a73fa2018-12-10 10:41:08 -080033using namespace android;
34
35using Transaction = SurfaceComposerClient::Transaction;
36
37#define CHECK_NOT_NULL(name) \
38 LOG_ALWAYS_FATAL_IF(name == nullptr, "nullptr passed as " #name " argument");
39
40#define CHECK_VALID_RECT(name) \
41 LOG_ALWAYS_FATAL_IF(!static_cast<const Rect&>(name).isValid(), \
42 "invalid arg passed as " #name " argument");
43
John Reck2b2ba932021-07-12 21:51:09 -040044static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN));
45static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) ==
46 static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR));
47static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB));
48static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB));
49static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) ==
50 static_cast<int>(HAL_DATASPACE_DISPLAY_P3));
51static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ));
Valerie Hau5bbfd512019-01-22 17:39:43 -080052
Marissa Wallf6a73fa2018-12-10 10:41:08 -080053Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) {
54 return reinterpret_cast<Transaction*>(aSurfaceTransaction);
55}
56
57SurfaceControl* ASurfaceControl_to_SurfaceControl(ASurfaceControl* aSurfaceControl) {
58 return reinterpret_cast<SurfaceControl*>(aSurfaceControl);
59}
60
61void SurfaceControl_acquire(SurfaceControl* surfaceControl) {
62 // incStrong/decStrong token must be the same, doesn't matter what it is
63 surfaceControl->incStrong((void*)SurfaceControl_acquire);
64}
65
66void SurfaceControl_release(SurfaceControl* surfaceControl) {
67 // incStrong/decStrong token must be the same, doesn't matter what it is
68 surfaceControl->decStrong((void*)SurfaceControl_acquire);
69}
70
71ASurfaceControl* ASurfaceControl_createFromWindow(ANativeWindow* window, const char* debug_name) {
72 CHECK_NOT_NULL(window);
73 CHECK_NOT_NULL(debug_name);
74
75 sp<SurfaceComposerClient> client = new SurfaceComposerClient();
76 if (client->initCheck() != NO_ERROR) {
77 return nullptr;
78 }
79
Vishnu Nairce1a6482020-10-22 17:41:30 -070080 Surface* surface = static_cast<Surface*>(window);
81 sp<IBinder> parentHandle = surface->getSurfaceControlHandle();
82
Huihong Luo36b55bc2022-03-08 14:50:45 -080083 int32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
Vishnu Nairce1a6482020-10-22 17:41:30 -070084 sp<SurfaceControl> surfaceControl;
85 if (parentHandle) {
86 surfaceControl =
87 client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
88 // Format is only relevant for buffer queue layers.
89 PIXEL_FORMAT_UNKNOWN /* format */, flags, parentHandle);
90 } else {
Huihong Luo36b55bc2022-03-08 14:50:45 -080091 // deprecated, this should no longer be used
92 surfaceControl = nullptr;
Vishnu Nairce1a6482020-10-22 17:41:30 -070093 }
94
Marissa Wallf6a73fa2018-12-10 10:41:08 -080095 if (!surfaceControl) {
96 return nullptr;
97 }
98
99 SurfaceControl_acquire(surfaceControl.get());
100 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
101}
102
103ASurfaceControl* ASurfaceControl_create(ASurfaceControl* parent, const char* debug_name) {
104 CHECK_NOT_NULL(parent);
105 CHECK_NOT_NULL(debug_name);
106
107 SurfaceComposerClient* client = ASurfaceControl_to_SurfaceControl(parent)->getClient().get();
108
109 SurfaceControl* surfaceControlParent = ASurfaceControl_to_SurfaceControl(parent);
110
111 uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
112 sp<SurfaceControl> surfaceControl =
113 client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
114 // Format is only relevant for buffer queue layers.
115 PIXEL_FORMAT_UNKNOWN /* format */, flags,
Vishnu Nairce1a6482020-10-22 17:41:30 -0700116 surfaceControlParent->getHandle());
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800117 if (!surfaceControl) {
118 return nullptr;
119 }
120
121 SurfaceControl_acquire(surfaceControl.get());
122 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
123}
124
Huihong Luo91697e12021-01-28 15:24:19 -0800125void ASurfaceControl_acquire(ASurfaceControl* aSurfaceControl) {
126 SurfaceControl* surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800127
Huihong Luo91697e12021-01-28 15:24:19 -0800128 SurfaceControl_acquire(surfaceControl);
129}
130
131void ASurfaceControl_release(ASurfaceControl* aSurfaceControl) {
132 SurfaceControl* surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
133
134 SurfaceControl_release(surfaceControl);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800135}
136
Jorim Jaggi71db8892021-02-03 23:19:29 +0100137struct ASurfaceControlStats {
Ady Abraham62e15f02022-01-21 17:00:50 -0800138 std::variant<int64_t, sp<Fence>> acquireTimeOrFence;
Jorim Jaggi71db8892021-02-03 23:19:29 +0100139 sp<Fence> previousReleaseFence;
140 uint64_t frameNumber;
141};
142
Pablo Gamitobc9e5292021-08-23 17:12:29 +0200143void ASurfaceControl_registerSurfaceStatsListener(ASurfaceControl* control, int32_t id,
144 void* context,
145 ASurfaceControl_SurfaceStatsListener func) {
Pablo Gamito14b28ce9c2021-09-06 16:33:23 +0000146 SurfaceStatsCallback callback = [func, id](void* callback_context, nsecs_t, const sp<Fence>&,
147 const SurfaceStats& surfaceStats) {
Jorim Jaggi71db8892021-02-03 23:19:29 +0100148 ASurfaceControlStats aSurfaceControlStats;
149
Ady Abraham62e15f02022-01-21 17:00:50 -0800150 aSurfaceControlStats.acquireTimeOrFence = surfaceStats.acquireTimeOrFence;
Jorim Jaggi71db8892021-02-03 23:19:29 +0100151 aSurfaceControlStats.previousReleaseFence = surfaceStats.previousReleaseFence;
152 aSurfaceControlStats.frameNumber = surfaceStats.eventStats.frameNumber;
153
Pablo Gamito14b28ce9c2021-09-06 16:33:23 +0000154 (*func)(callback_context, id, &aSurfaceControlStats);
Jorim Jaggi71db8892021-02-03 23:19:29 +0100155 };
Pablo Gamitobc9e5292021-08-23 17:12:29 +0200156
Jorim Jaggi71db8892021-02-03 23:19:29 +0100157 TransactionCompletedListener::getInstance()->addSurfaceStatsListener(context,
158 reinterpret_cast<void*>(func), ASurfaceControl_to_SurfaceControl(control), callback);
159}
160
Jorim Jaggi71db8892021-02-03 23:19:29 +0100161void ASurfaceControl_unregisterSurfaceStatsListener(void* context,
162 ASurfaceControl_SurfaceStatsListener func) {
163 TransactionCompletedListener::getInstance()->removeSurfaceStatsListener(context,
164 reinterpret_cast<void*>(func));
165}
166
167int64_t ASurfaceControlStats_getAcquireTime(ASurfaceControlStats* stats) {
Ady Abraham62e15f02022-01-21 17:00:50 -0800168 if (const auto* fence = std::get_if<sp<Fence>>(&stats->acquireTimeOrFence)) {
169 // We got a fence instead of the acquire time due to latch unsignaled.
170 // Ideally the client could just get the acquire time dericly from
171 // the fence instead of calling this function which needs to block.
172 (*fence)->waitForever("ASurfaceControlStats_getAcquireTime");
173 return (*fence)->getSignalTime();
174 }
175
176 return std::get<int64_t>(stats->acquireTimeOrFence);
Jorim Jaggi71db8892021-02-03 23:19:29 +0100177}
178
179uint64_t ASurfaceControlStats_getFrameNumber(ASurfaceControlStats* stats) {
180 return stats->frameNumber;
181}
182
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800183ASurfaceTransaction* ASurfaceTransaction_create() {
184 Transaction* transaction = new Transaction;
185 return reinterpret_cast<ASurfaceTransaction*>(transaction);
186}
187
188void ASurfaceTransaction_delete(ASurfaceTransaction* aSurfaceTransaction) {
189 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
190 delete transaction;
191}
192
193void ASurfaceTransaction_apply(ASurfaceTransaction* aSurfaceTransaction) {
194 CHECK_NOT_NULL(aSurfaceTransaction);
195
196 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
197
198 transaction->apply();
199}
200
Marissa Wall1be5a102019-01-18 16:14:04 -0800201struct ASurfaceTransactionStats {
202 std::unordered_map<ASurfaceControl*, ASurfaceControlStats> aSurfaceControlStats;
203 int64_t latchTime;
204 sp<Fence> presentFence;
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700205 bool transactionCompleted;
Marissa Wall1be5a102019-01-18 16:14:04 -0800206};
207
208int64_t ASurfaceTransactionStats_getLatchTime(ASurfaceTransactionStats* aSurfaceTransactionStats) {
209 CHECK_NOT_NULL(aSurfaceTransactionStats);
210 return aSurfaceTransactionStats->latchTime;
211}
212
213int ASurfaceTransactionStats_getPresentFenceFd(ASurfaceTransactionStats* aSurfaceTransactionStats) {
214 CHECK_NOT_NULL(aSurfaceTransactionStats);
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700215 LOG_ALWAYS_FATAL_IF(!aSurfaceTransactionStats->transactionCompleted,
216 "ASurfaceTransactionStats queried from an incomplete transaction callback");
217
Marissa Wall1be5a102019-01-18 16:14:04 -0800218 auto& presentFence = aSurfaceTransactionStats->presentFence;
219 return (presentFence) ? presentFence->dup() : -1;
220}
221
222void ASurfaceTransactionStats_getASurfaceControls(ASurfaceTransactionStats* aSurfaceTransactionStats,
223 ASurfaceControl*** outASurfaceControls,
224 size_t* outASurfaceControlsSize) {
225 CHECK_NOT_NULL(aSurfaceTransactionStats);
226 CHECK_NOT_NULL(outASurfaceControls);
227 CHECK_NOT_NULL(outASurfaceControlsSize);
228
229 size_t size = aSurfaceTransactionStats->aSurfaceControlStats.size();
230
231 SurfaceControl** surfaceControls = new SurfaceControl*[size];
232 ASurfaceControl** aSurfaceControls = reinterpret_cast<ASurfaceControl**>(surfaceControls);
233
234 size_t i = 0;
235 for (auto& [aSurfaceControl, aSurfaceControlStats] : aSurfaceTransactionStats->aSurfaceControlStats) {
236 aSurfaceControls[i] = aSurfaceControl;
237 i++;
238 }
239
240 *outASurfaceControls = aSurfaceControls;
241 *outASurfaceControlsSize = size;
242}
243
244int64_t ASurfaceTransactionStats_getAcquireTime(ASurfaceTransactionStats* aSurfaceTransactionStats,
245 ASurfaceControl* aSurfaceControl) {
246 CHECK_NOT_NULL(aSurfaceTransactionStats);
247 CHECK_NOT_NULL(aSurfaceControl);
248
249 const auto& aSurfaceControlStats =
250 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
251 LOG_ALWAYS_FATAL_IF(
252 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
253 "ASurfaceControl not found");
254
Ady Abraham62e15f02022-01-21 17:00:50 -0800255 return ASurfaceControlStats_getAcquireTime(&aSurfaceControlStats->second);
Marissa Wall1be5a102019-01-18 16:14:04 -0800256}
257
258int ASurfaceTransactionStats_getPreviousReleaseFenceFd(
259 ASurfaceTransactionStats* aSurfaceTransactionStats, ASurfaceControl* aSurfaceControl) {
260 CHECK_NOT_NULL(aSurfaceTransactionStats);
261 CHECK_NOT_NULL(aSurfaceControl);
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700262 LOG_ALWAYS_FATAL_IF(!aSurfaceTransactionStats->transactionCompleted,
263 "ASurfaceTransactionStats queried from an incomplete transaction callback");
Marissa Wall1be5a102019-01-18 16:14:04 -0800264
265 const auto& aSurfaceControlStats =
266 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
267 LOG_ALWAYS_FATAL_IF(
268 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
269 "ASurfaceControl not found");
270
271 auto& previousReleaseFence = aSurfaceControlStats->second.previousReleaseFence;
272 return (previousReleaseFence) ? previousReleaseFence->dup() : -1;
273}
274
275void ASurfaceTransactionStats_releaseASurfaceControls(ASurfaceControl** aSurfaceControls) {
276 CHECK_NOT_NULL(aSurfaceControls);
277
278 SurfaceControl** surfaceControls = reinterpret_cast<SurfaceControl**>(aSurfaceControls);
279 delete[] surfaceControls;
280}
281
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800282void ASurfaceTransaction_setOnComplete(ASurfaceTransaction* aSurfaceTransaction, void* context,
283 ASurfaceTransaction_OnComplete func) {
284 CHECK_NOT_NULL(aSurfaceTransaction);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800285 CHECK_NOT_NULL(func);
286
287 TransactionCompletedCallbackTakesContext callback = [func](void* callback_context,
Marissa Wall1be5a102019-01-18 16:14:04 -0800288 nsecs_t latchTime,
289 const sp<Fence>& presentFence,
290 const std::vector<SurfaceControlStats>& surfaceControlStats) {
291 ASurfaceTransactionStats aSurfaceTransactionStats;
292
293 aSurfaceTransactionStats.latchTime = latchTime;
294 aSurfaceTransactionStats.presentFence = presentFence;
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700295 aSurfaceTransactionStats.transactionCompleted = true;
Marissa Wall1be5a102019-01-18 16:14:04 -0800296
297 auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
298
Ady Abraham62e15f02022-01-21 17:00:50 -0800299 for (const auto& [surfaceControl, latchTime, acquireTimeOrFence, presentFence,
300 previousReleaseFence, transformHint, frameEvents] : surfaceControlStats) {
Marissa Wall1be5a102019-01-18 16:14:04 -0800301 ASurfaceControl* aSurfaceControl = reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
Ady Abraham62e15f02022-01-21 17:00:50 -0800302 aSurfaceControlStats[aSurfaceControl].acquireTimeOrFence = acquireTimeOrFence;
Marissa Wall1be5a102019-01-18 16:14:04 -0800303 aSurfaceControlStats[aSurfaceControl].previousReleaseFence = previousReleaseFence;
304 }
305
306 (*func)(callback_context, &aSurfaceTransactionStats);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800307 };
308
309 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
310
311 transaction->addTransactionCompletedCallback(callback, context);
312}
313
Marissa Wall1be5a102019-01-18 16:14:04 -0800314void ASurfaceTransaction_reparent(ASurfaceTransaction* aSurfaceTransaction,
315 ASurfaceControl* aSurfaceControl,
316 ASurfaceControl* newParentASurfaceControl) {
317 CHECK_NOT_NULL(aSurfaceTransaction);
318 CHECK_NOT_NULL(aSurfaceControl);
319
320 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
321 sp<SurfaceControl> newParentSurfaceControl = ASurfaceControl_to_SurfaceControl(
322 newParentASurfaceControl);
Marissa Wall1be5a102019-01-18 16:14:04 -0800323 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
324
Pablo Gamito117040c2020-09-14 08:24:41 +0000325 transaction->reparent(surfaceControl, newParentSurfaceControl);
Marissa Wall1be5a102019-01-18 16:14:04 -0800326}
327
328void ASurfaceTransaction_setVisibility(ASurfaceTransaction* aSurfaceTransaction,
329 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800330 int8_t visibility) {
331 CHECK_NOT_NULL(aSurfaceTransaction);
332 CHECK_NOT_NULL(aSurfaceControl);
333
334 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
335 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
336
337 switch (visibility) {
338 case ASURFACE_TRANSACTION_VISIBILITY_SHOW:
339 transaction->show(surfaceControl);
340 break;
341 case ASURFACE_TRANSACTION_VISIBILITY_HIDE:
342 transaction->hide(surfaceControl);
343 break;
344 default:
345 LOG_ALWAYS_FATAL("invalid visibility %d", visibility);
346 }
347}
348
Marissa Wall1be5a102019-01-18 16:14:04 -0800349void ASurfaceTransaction_setZOrder(ASurfaceTransaction* aSurfaceTransaction,
350 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800351 int32_t z_order) {
352 CHECK_NOT_NULL(aSurfaceTransaction);
353 CHECK_NOT_NULL(aSurfaceControl);
354
355 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
356 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
357
358 transaction->setLayer(surfaceControl, z_order);
359}
360
Marissa Wall1be5a102019-01-18 16:14:04 -0800361void ASurfaceTransaction_setBuffer(ASurfaceTransaction* aSurfaceTransaction,
362 ASurfaceControl* aSurfaceControl,
363 AHardwareBuffer* buffer, int acquire_fence_fd) {
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800364 CHECK_NOT_NULL(aSurfaceTransaction);
365 CHECK_NOT_NULL(aSurfaceControl);
366
367 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
368 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
369
John Reck7f55b132021-09-20 14:42:29 -0400370 sp<GraphicBuffer> graphic_buffer(GraphicBuffer::fromAHardwareBuffer(buffer));
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800371
chaviw5513c612021-09-15 15:26:23 -0500372 std::optional<sp<Fence>> fence = std::nullopt;
Marissa Wall1be5a102019-01-18 16:14:04 -0800373 if (acquire_fence_fd != -1) {
chaviw5513c612021-09-15 15:26:23 -0500374 fence = new Fence(acquire_fence_fd);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800375 }
chaviw5513c612021-09-15 15:26:23 -0500376 transaction->setBuffer(surfaceControl, graphic_buffer, fence);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800377}
378
379void ASurfaceTransaction_setGeometry(ASurfaceTransaction* aSurfaceTransaction,
380 ASurfaceControl* aSurfaceControl, const ARect& source,
381 const ARect& destination, int32_t transform) {
382 CHECK_NOT_NULL(aSurfaceTransaction);
383 CHECK_NOT_NULL(aSurfaceControl);
chaviw87a07ea2021-04-29 09:04:41 -0500384 CHECK_VALID_RECT(source);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800385 CHECK_VALID_RECT(destination);
386
387 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
388 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
389
chaviw87a07ea2021-04-29 09:04:41 -0500390 Rect sourceRect = static_cast<const Rect&>(source);
391 Rect destRect = static_cast<const Rect&>(destination);
392 // Adjust the source so its top and left are not negative
393 sourceRect.left = std::max(sourceRect.left, 0);
394 sourceRect.top = std::max(sourceRect.top, 0);
395
396 if (!sourceRect.isValid()) {
397 sourceRect.makeInvalid();
398 }
chaviw9b2ac242021-04-27 15:52:09 -0500399 transaction->setBufferCrop(surfaceControl, sourceRect);
Vishnu Nair0d7aff72021-05-10 15:01:20 -0700400 transaction->setDestinationFrame(surfaceControl, destRect);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800401 transaction->setTransform(surfaceControl, transform);
Vishnu Nair1ad69542019-05-23 16:27:45 +0800402 bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
403 NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
404 transaction->setTransformToDisplayInverse(surfaceControl, transformToInverseDisplay);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800405}
406
chaviwccf3e8b2021-03-25 15:28:44 -0500407void ASurfaceTransaction_setCrop(ASurfaceTransaction* aSurfaceTransaction,
408 ASurfaceControl* aSurfaceControl, const ARect& crop) {
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500409 CHECK_NOT_NULL(aSurfaceTransaction);
410 CHECK_NOT_NULL(aSurfaceControl);
chaviwccf3e8b2021-03-25 15:28:44 -0500411 CHECK_VALID_RECT(crop);
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500412
413 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
414 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
415
chaviwccf3e8b2021-03-25 15:28:44 -0500416 transaction->setCrop(surfaceControl, static_cast<const Rect&>(crop));
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500417}
418
chaviwccf3e8b2021-03-25 15:28:44 -0500419void ASurfaceTransaction_setPosition(ASurfaceTransaction* aSurfaceTransaction,
420 ASurfaceControl* aSurfaceControl, int32_t x, int32_t y) {
421 CHECK_NOT_NULL(aSurfaceTransaction);
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500422 CHECK_NOT_NULL(aSurfaceControl);
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500423
424 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
425 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
426
chaviwccf3e8b2021-03-25 15:28:44 -0500427 transaction->setPosition(surfaceControl, x, y);
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500428}
429
chaviwccf3e8b2021-03-25 15:28:44 -0500430void ASurfaceTransaction_setBufferTransform(ASurfaceTransaction* aSurfaceTransaction,
431 ASurfaceControl* aSurfaceControl, int32_t transform) {
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500432 CHECK_NOT_NULL(aSurfaceTransaction);
433 CHECK_NOT_NULL(aSurfaceControl);
434
435 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
436 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
437
438 transaction->setTransform(surfaceControl, transform);
439 bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
440 NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
441 transaction->setTransformToDisplayInverse(surfaceControl, transformToInverseDisplay);
442}
443
chaviwccf3e8b2021-03-25 15:28:44 -0500444void ASurfaceTransaction_setScale(ASurfaceTransaction* aSurfaceTransaction,
445 ASurfaceControl* aSurfaceControl, float xScale, float yScale) {
446 CHECK_NOT_NULL(aSurfaceTransaction);
447 CHECK_NOT_NULL(aSurfaceControl);
448 LOG_ALWAYS_FATAL_IF(xScale < 0, "negative value passed in for xScale");
449 LOG_ALWAYS_FATAL_IF(yScale < 0, "negative value passed in for yScale");
450
451 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
452 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
453
454 transaction->setMatrix(surfaceControl, xScale, 0, 0, yScale);
455}
456
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800457void ASurfaceTransaction_setBufferTransparency(ASurfaceTransaction* aSurfaceTransaction,
458 ASurfaceControl* aSurfaceControl,
459 int8_t transparency) {
460 CHECK_NOT_NULL(aSurfaceTransaction);
461 CHECK_NOT_NULL(aSurfaceControl);
462
463 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
464 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
465
466 uint32_t flags = (transparency == ASURFACE_TRANSACTION_TRANSPARENCY_OPAQUE) ?
467 layer_state_t::eLayerOpaque : 0;
468 transaction->setFlags(surfaceControl, flags, layer_state_t::eLayerOpaque);
469}
470
Marissa Wall1be5a102019-01-18 16:14:04 -0800471void ASurfaceTransaction_setDamageRegion(ASurfaceTransaction* aSurfaceTransaction,
472 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800473 const ARect rects[], uint32_t count) {
474 CHECK_NOT_NULL(aSurfaceTransaction);
475 CHECK_NOT_NULL(aSurfaceControl);
476
477 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
478 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
479
480 Region region;
481 for (uint32_t i = 0; i < count; ++i) {
Marissa Wallbb9b14f2019-04-23 14:10:15 -0700482 region.orSelf(static_cast<const Rect&>(rects[i]));
483 }
484
485 // Hardware composer interprets a DamageRegion with a single Rect of {0,0,0,0} to be an
486 // undamaged region and {0,0,-1,-1} to be a fully damaged buffer. This is a confusing
487 // distinction for a public api. Instead, default both cases to be a fully damaged buffer.
488 if (count == 1 && region.getBounds().isEmpty()) {
489 transaction->setSurfaceDamageRegion(surfaceControl, Region::INVALID_REGION);
490 return;
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800491 }
492
493 transaction->setSurfaceDamageRegion(surfaceControl, region);
494}
Marissa Wall1be5a102019-01-18 16:14:04 -0800495
496void ASurfaceTransaction_setDesiredPresentTime(ASurfaceTransaction* aSurfaceTransaction,
497 int64_t desiredPresentTime) {
498 CHECK_NOT_NULL(aSurfaceTransaction);
499
500 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
501
502 transaction->setDesiredPresentTime(static_cast<nsecs_t>(desiredPresentTime));
503}
504
505void ASurfaceTransaction_setBufferAlpha(ASurfaceTransaction* aSurfaceTransaction,
506 ASurfaceControl* aSurfaceControl,
507 float alpha) {
508 CHECK_NOT_NULL(aSurfaceTransaction);
509 CHECK_NOT_NULL(aSurfaceControl);
510
511 LOG_ALWAYS_FATAL_IF(alpha < 0.0 || alpha > 1.0, "invalid alpha");
512
513 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
514 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
515
516 transaction->setAlpha(surfaceControl, alpha);
517}
518
Marissa Wall7f24f792019-02-07 14:06:04 -0800519void ASurfaceTransaction_setBufferDataSpace(ASurfaceTransaction* aSurfaceTransaction,
520 ASurfaceControl* aSurfaceControl,
521 ADataSpace aDataSpace) {
522 CHECK_NOT_NULL(aSurfaceTransaction);
523 CHECK_NOT_NULL(aSurfaceControl);
524
525 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Marissa Wall7f24f792019-02-07 14:06:04 -0800526 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
Marissa Wall7f24f792019-02-07 14:06:04 -0800527 transaction->setDataspace(surfaceControl, static_cast<ui::Dataspace>(aDataSpace));
528}
529
Marissa Wall1be5a102019-01-18 16:14:04 -0800530void ASurfaceTransaction_setHdrMetadata_smpte2086(ASurfaceTransaction* aSurfaceTransaction,
531 ASurfaceControl* aSurfaceControl,
532 struct AHdrMetadata_smpte2086* metadata) {
533 CHECK_NOT_NULL(aSurfaceTransaction);
534 CHECK_NOT_NULL(aSurfaceControl);
535
536 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
537 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
538
539 HdrMetadata hdrMetadata;
540
541 if (metadata) {
542 hdrMetadata.smpte2086.displayPrimaryRed.x = metadata->displayPrimaryRed.x;
543 hdrMetadata.smpte2086.displayPrimaryRed.y = metadata->displayPrimaryRed.y;
544 hdrMetadata.smpte2086.displayPrimaryGreen.x = metadata->displayPrimaryGreen.x;
545 hdrMetadata.smpte2086.displayPrimaryGreen.y = metadata->displayPrimaryGreen.y;
546 hdrMetadata.smpte2086.displayPrimaryBlue.x = metadata->displayPrimaryBlue.x;
547 hdrMetadata.smpte2086.displayPrimaryBlue.y = metadata->displayPrimaryBlue.y;
548 hdrMetadata.smpte2086.whitePoint.x = metadata->whitePoint.x;
549 hdrMetadata.smpte2086.whitePoint.y = metadata->whitePoint.y;
550 hdrMetadata.smpte2086.minLuminance = metadata->minLuminance;
551 hdrMetadata.smpte2086.maxLuminance = metadata->maxLuminance;
552
553 hdrMetadata.validTypes |= HdrMetadata::SMPTE2086;
554 } else {
555 hdrMetadata.validTypes &= ~HdrMetadata::SMPTE2086;
556 }
557
558 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
559}
560
561void ASurfaceTransaction_setHdrMetadata_cta861_3(ASurfaceTransaction* aSurfaceTransaction,
562 ASurfaceControl* aSurfaceControl,
563 struct AHdrMetadata_cta861_3* metadata) {
564 CHECK_NOT_NULL(aSurfaceTransaction);
565 CHECK_NOT_NULL(aSurfaceControl);
566
567 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
568 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
569
570 HdrMetadata hdrMetadata;
571
572 if (metadata) {
573 hdrMetadata.cta8613.maxContentLightLevel = metadata->maxContentLightLevel;
574 hdrMetadata.cta8613.maxFrameAverageLightLevel = metadata->maxFrameAverageLightLevel;
575
576 hdrMetadata.validTypes |= HdrMetadata::CTA861_3;
577 } else {
578 hdrMetadata.validTypes &= ~HdrMetadata::CTA861_3;
579 }
580
581 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
582}
Valerie Hau5bbfd512019-01-22 17:39:43 -0800583
584void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction,
585 ASurfaceControl* aSurfaceControl,
586 float r, float g, float b, float alpha,
587 ADataSpace dataspace) {
588 CHECK_NOT_NULL(aSurfaceTransaction);
589 CHECK_NOT_NULL(aSurfaceControl);
590
591 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Valerie Hau5bbfd512019-01-22 17:39:43 -0800592 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
593
594 half3 color;
595 color.r = r;
596 color.g = g;
597 color.b = b;
598
Marin Shalamanov511f9142021-03-16 18:03:30 +0100599 transaction->setBackgroundColor(surfaceControl, color, alpha,
600 static_cast<ui::Dataspace>(dataspace));
Valerie Hau5bbfd512019-01-22 17:39:43 -0800601}
Steven Thomas6cf051e2020-01-14 11:37:21 -0800602
603void ASurfaceTransaction_setFrameRate(ASurfaceTransaction* aSurfaceTransaction,
Steven Thomasdd7bf2f2020-01-31 18:50:02 -0800604 ASurfaceControl* aSurfaceControl, float frameRate,
605 int8_t compatibility) {
Marin Shalamanov511f9142021-03-16 18:03:30 +0100606 ASurfaceTransaction_setFrameRateWithChangeStrategy(
607 aSurfaceTransaction, aSurfaceControl, frameRate, compatibility,
608 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
Marin Shalamanov41ffa8d2020-10-13 12:35:20 +0200609}
610
Marin Shalamanov511f9142021-03-16 18:03:30 +0100611void ASurfaceTransaction_setFrameRateWithChangeStrategy(ASurfaceTransaction* aSurfaceTransaction,
612 ASurfaceControl* aSurfaceControl,
613 float frameRate, int8_t compatibility,
614 int8_t changeFrameRateStrategy) {
Steven Thomas6cf051e2020-01-14 11:37:21 -0800615 CHECK_NOT_NULL(aSurfaceTransaction);
616 CHECK_NOT_NULL(aSurfaceControl);
Steven Thomas6cf051e2020-01-14 11:37:21 -0800617 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
Steven Thomasdd7bf2f2020-01-31 18:50:02 -0800618 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Marin Shalamanov511f9142021-03-16 18:03:30 +0100619 transaction->setFrameRate(surfaceControl, frameRate, compatibility, changeFrameRateStrategy);
Steven Thomas6cf051e2020-01-14 11:37:21 -0800620}
Robert Carrf57c0162021-03-24 15:48:25 -0700621
Kriti Dang4bfeeb42022-08-11 15:15:36 +0200622void ASurfaceTransaction_clearFrameRate(ASurfaceTransaction* aSurfaceTransaction,
623 ASurfaceControl* aSurfaceControl) {
624 CHECK_NOT_NULL(aSurfaceTransaction);
625 CHECK_NOT_NULL(aSurfaceControl);
626 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
627 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
628 transaction->setFrameRate(surfaceControl, 0, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
629 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
630}
631
Robert Carrf57c0162021-03-24 15:48:25 -0700632void ASurfaceTransaction_setEnableBackPressure(ASurfaceTransaction* aSurfaceTransaction,
633 ASurfaceControl* aSurfaceControl,
634 bool enableBackpressure) {
635 CHECK_NOT_NULL(aSurfaceControl);
636 CHECK_NOT_NULL(aSurfaceTransaction);
637
638 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
639 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
640
641 const uint32_t flags = enableBackpressure ?
642 layer_state_t::eEnableBackpressure : 0;
643 transaction->setFlags(surfaceControl, flags, layer_state_t::eEnableBackpressure);
644}
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700645
646void ASurfaceTransaction_setOnCommit(ASurfaceTransaction* aSurfaceTransaction, void* context,
647 ASurfaceTransaction_OnCommit func) {
648 CHECK_NOT_NULL(aSurfaceTransaction);
649 CHECK_NOT_NULL(func);
650
651 TransactionCompletedCallbackTakesContext callback =
652 [func](void* callback_context, nsecs_t latchTime, const sp<Fence>& /* presentFence */,
653 const std::vector<SurfaceControlStats>& surfaceControlStats) {
654 ASurfaceTransactionStats aSurfaceTransactionStats;
655 aSurfaceTransactionStats.latchTime = latchTime;
656 aSurfaceTransactionStats.transactionCompleted = false;
657
658 auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
Ady Abraham62e15f02022-01-21 17:00:50 -0800659 for (const auto& [surfaceControl, latchTime, acquireTimeOrFence, presentFence,
660 previousReleaseFence, transformHint, frameEvents] :
661 surfaceControlStats) {
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700662 ASurfaceControl* aSurfaceControl =
663 reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
Ady Abraham62e15f02022-01-21 17:00:50 -0800664 aSurfaceControlStats[aSurfaceControl].acquireTimeOrFence = acquireTimeOrFence;
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700665 }
666
667 (*func)(callback_context, &aSurfaceTransactionStats);
668 };
669
670 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
671
672 transaction->addTransactionCommittedCallback(callback, context);
Pablo Gamito88660d72021-08-09 14:37:56 +0000673}
Rachel Leee1e77cc2021-10-19 16:40:41 -0700674
675void ASurfaceTransaction_setFrameTimeline(ASurfaceTransaction* aSurfaceTransaction,
Rachel Lee7e47b3d2022-01-12 14:28:26 -0800676 AVsyncId vsyncId) {
Rachel Leee1e77cc2021-10-19 16:40:41 -0700677 CHECK_NOT_NULL(aSurfaceTransaction);
Rachel Leeb6c93aa2022-02-22 15:48:28 -0800678 const auto startTime = AChoreographer_getStartTimeNanosForVsyncId(vsyncId);
Huihong Luo4fed9b42022-03-03 15:10:33 -0800679 FrameTimelineInfo ftInfo;
680 ftInfo.vsyncId = vsyncId;
681 ftInfo.startTimeNanos = startTime;
682 ASurfaceTransaction_to_Transaction(aSurfaceTransaction)->setFrameTimelineInfo(ftInfo);
Rachel Leee1e77cc2021-10-19 16:40:41 -0700683}