blob: 4fc336458c5dbddd2edf76d5a55cda2c3717a1ac [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>
Jorim Jaggi71db8892021-02-03 23:19:29 +010020#include <surface_control_private.h>
Marissa Wallf6a73fa2018-12-10 10:41:08 -080021
Marissa Wall1be5a102019-01-18 16:14:04 -080022#include <configstore/Utils.h>
23
24#include <gui/HdrMetadata.h>
25#include <gui/ISurfaceComposer.h>
Marissa Wallf6a73fa2018-12-10 10:41:08 -080026#include <gui/Surface.h>
27#include <gui/SurfaceComposerClient.h>
28#include <gui/SurfaceControl.h>
29
Marin Shalamanov463ad8e2021-01-28 22:58:37 +010030#include <ui/DynamicDisplayInfo.h>
Marissa Wall1be5a102019-01-18 16:14:04 -080031
32#include <utils/Timers.h>
33
34using namespace android::hardware::configstore;
35using namespace android::hardware::configstore::V1_0;
Marissa Wallf6a73fa2018-12-10 10:41:08 -080036using namespace android;
37
38using Transaction = SurfaceComposerClient::Transaction;
39
40#define CHECK_NOT_NULL(name) \
41 LOG_ALWAYS_FATAL_IF(name == nullptr, "nullptr passed as " #name " argument");
42
43#define CHECK_VALID_RECT(name) \
44 LOG_ALWAYS_FATAL_IF(!static_cast<const Rect&>(name).isValid(), \
45 "invalid arg passed as " #name " argument");
46
John Reck2b2ba932021-07-12 21:51:09 -040047static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN));
48static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) ==
49 static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR));
50static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB));
51static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB));
52static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) ==
53 static_cast<int>(HAL_DATASPACE_DISPLAY_P3));
54static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ));
Valerie Hau5bbfd512019-01-22 17:39:43 -080055
Marissa Wallf6a73fa2018-12-10 10:41:08 -080056Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) {
57 return reinterpret_cast<Transaction*>(aSurfaceTransaction);
58}
59
60SurfaceControl* ASurfaceControl_to_SurfaceControl(ASurfaceControl* aSurfaceControl) {
61 return reinterpret_cast<SurfaceControl*>(aSurfaceControl);
62}
63
64void SurfaceControl_acquire(SurfaceControl* surfaceControl) {
65 // incStrong/decStrong token must be the same, doesn't matter what it is
66 surfaceControl->incStrong((void*)SurfaceControl_acquire);
67}
68
69void SurfaceControl_release(SurfaceControl* surfaceControl) {
70 // incStrong/decStrong token must be the same, doesn't matter what it is
71 surfaceControl->decStrong((void*)SurfaceControl_acquire);
72}
73
74ASurfaceControl* ASurfaceControl_createFromWindow(ANativeWindow* window, const char* debug_name) {
75 CHECK_NOT_NULL(window);
76 CHECK_NOT_NULL(debug_name);
77
78 sp<SurfaceComposerClient> client = new SurfaceComposerClient();
79 if (client->initCheck() != NO_ERROR) {
80 return nullptr;
81 }
82
Vishnu Nairce1a6482020-10-22 17:41:30 -070083 Surface* surface = static_cast<Surface*>(window);
84 sp<IBinder> parentHandle = surface->getSurfaceControlHandle();
85
Marissa Wallf6a73fa2018-12-10 10:41:08 -080086 uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
Vishnu Nairce1a6482020-10-22 17:41:30 -070087 sp<SurfaceControl> surfaceControl;
88 if (parentHandle) {
89 surfaceControl =
90 client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
91 // Format is only relevant for buffer queue layers.
92 PIXEL_FORMAT_UNKNOWN /* format */, flags, parentHandle);
93 } else {
94 surfaceControl =
95 client->createWithSurfaceParent(String8(debug_name), 0 /* width */, 0 /* height */,
96 // Format is only relevant for buffer queue layers.
97 PIXEL_FORMAT_UNKNOWN /* format */, flags,
98 static_cast<Surface*>(window));
99 }
100
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800101 if (!surfaceControl) {
102 return nullptr;
103 }
104
105 SurfaceControl_acquire(surfaceControl.get());
106 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
107}
108
109ASurfaceControl* ASurfaceControl_create(ASurfaceControl* parent, const char* debug_name) {
110 CHECK_NOT_NULL(parent);
111 CHECK_NOT_NULL(debug_name);
112
113 SurfaceComposerClient* client = ASurfaceControl_to_SurfaceControl(parent)->getClient().get();
114
115 SurfaceControl* surfaceControlParent = ASurfaceControl_to_SurfaceControl(parent);
116
117 uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
118 sp<SurfaceControl> surfaceControl =
119 client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
120 // Format is only relevant for buffer queue layers.
121 PIXEL_FORMAT_UNKNOWN /* format */, flags,
Vishnu Nairce1a6482020-10-22 17:41:30 -0700122 surfaceControlParent->getHandle());
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800123 if (!surfaceControl) {
124 return nullptr;
125 }
126
127 SurfaceControl_acquire(surfaceControl.get());
128 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
129}
130
Huihong Luo91697e12021-01-28 15:24:19 -0800131void ASurfaceControl_acquire(ASurfaceControl* aSurfaceControl) {
132 SurfaceControl* surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800133
Huihong Luo91697e12021-01-28 15:24:19 -0800134 SurfaceControl_acquire(surfaceControl);
135}
136
137void ASurfaceControl_release(ASurfaceControl* aSurfaceControl) {
138 SurfaceControl* surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
139
140 SurfaceControl_release(surfaceControl);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800141}
142
Jorim Jaggi71db8892021-02-03 23:19:29 +0100143struct ASurfaceControlStats {
Ady Abraham62e15f02022-01-21 17:00:50 -0800144 std::variant<int64_t, sp<Fence>> acquireTimeOrFence;
Jorim Jaggi71db8892021-02-03 23:19:29 +0100145 sp<Fence> previousReleaseFence;
146 uint64_t frameNumber;
147};
148
Pablo Gamitobc9e5292021-08-23 17:12:29 +0200149void ASurfaceControl_registerSurfaceStatsListener(ASurfaceControl* control, int32_t id,
150 void* context,
151 ASurfaceControl_SurfaceStatsListener func) {
Pablo Gamito14b28ce9c2021-09-06 16:33:23 +0000152 SurfaceStatsCallback callback = [func, id](void* callback_context, nsecs_t, const sp<Fence>&,
153 const SurfaceStats& surfaceStats) {
Jorim Jaggi71db8892021-02-03 23:19:29 +0100154 ASurfaceControlStats aSurfaceControlStats;
155
Ady Abraham62e15f02022-01-21 17:00:50 -0800156 aSurfaceControlStats.acquireTimeOrFence = surfaceStats.acquireTimeOrFence;
Jorim Jaggi71db8892021-02-03 23:19:29 +0100157 aSurfaceControlStats.previousReleaseFence = surfaceStats.previousReleaseFence;
158 aSurfaceControlStats.frameNumber = surfaceStats.eventStats.frameNumber;
159
Pablo Gamito14b28ce9c2021-09-06 16:33:23 +0000160 (*func)(callback_context, id, &aSurfaceControlStats);
Jorim Jaggi71db8892021-02-03 23:19:29 +0100161 };
Pablo Gamitobc9e5292021-08-23 17:12:29 +0200162
Jorim Jaggi71db8892021-02-03 23:19:29 +0100163 TransactionCompletedListener::getInstance()->addSurfaceStatsListener(context,
164 reinterpret_cast<void*>(func), ASurfaceControl_to_SurfaceControl(control), callback);
165}
166
Jorim Jaggi71db8892021-02-03 23:19:29 +0100167void ASurfaceControl_unregisterSurfaceStatsListener(void* context,
168 ASurfaceControl_SurfaceStatsListener func) {
169 TransactionCompletedListener::getInstance()->removeSurfaceStatsListener(context,
170 reinterpret_cast<void*>(func));
171}
172
173int64_t ASurfaceControlStats_getAcquireTime(ASurfaceControlStats* stats) {
Ady Abraham62e15f02022-01-21 17:00:50 -0800174 if (const auto* fence = std::get_if<sp<Fence>>(&stats->acquireTimeOrFence)) {
175 // We got a fence instead of the acquire time due to latch unsignaled.
176 // Ideally the client could just get the acquire time dericly from
177 // the fence instead of calling this function which needs to block.
178 (*fence)->waitForever("ASurfaceControlStats_getAcquireTime");
179 return (*fence)->getSignalTime();
180 }
181
182 return std::get<int64_t>(stats->acquireTimeOrFence);
Jorim Jaggi71db8892021-02-03 23:19:29 +0100183}
184
185uint64_t ASurfaceControlStats_getFrameNumber(ASurfaceControlStats* stats) {
186 return stats->frameNumber;
187}
188
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800189ASurfaceTransaction* ASurfaceTransaction_create() {
190 Transaction* transaction = new Transaction;
191 return reinterpret_cast<ASurfaceTransaction*>(transaction);
192}
193
194void ASurfaceTransaction_delete(ASurfaceTransaction* aSurfaceTransaction) {
195 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
196 delete transaction;
197}
198
199void ASurfaceTransaction_apply(ASurfaceTransaction* aSurfaceTransaction) {
200 CHECK_NOT_NULL(aSurfaceTransaction);
201
202 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
203
204 transaction->apply();
205}
206
Marissa Wall1be5a102019-01-18 16:14:04 -0800207struct ASurfaceTransactionStats {
208 std::unordered_map<ASurfaceControl*, ASurfaceControlStats> aSurfaceControlStats;
209 int64_t latchTime;
210 sp<Fence> presentFence;
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700211 bool transactionCompleted;
Marissa Wall1be5a102019-01-18 16:14:04 -0800212};
213
214int64_t ASurfaceTransactionStats_getLatchTime(ASurfaceTransactionStats* aSurfaceTransactionStats) {
215 CHECK_NOT_NULL(aSurfaceTransactionStats);
216 return aSurfaceTransactionStats->latchTime;
217}
218
219int ASurfaceTransactionStats_getPresentFenceFd(ASurfaceTransactionStats* aSurfaceTransactionStats) {
220 CHECK_NOT_NULL(aSurfaceTransactionStats);
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700221 LOG_ALWAYS_FATAL_IF(!aSurfaceTransactionStats->transactionCompleted,
222 "ASurfaceTransactionStats queried from an incomplete transaction callback");
223
Marissa Wall1be5a102019-01-18 16:14:04 -0800224 auto& presentFence = aSurfaceTransactionStats->presentFence;
225 return (presentFence) ? presentFence->dup() : -1;
226}
227
228void ASurfaceTransactionStats_getASurfaceControls(ASurfaceTransactionStats* aSurfaceTransactionStats,
229 ASurfaceControl*** outASurfaceControls,
230 size_t* outASurfaceControlsSize) {
231 CHECK_NOT_NULL(aSurfaceTransactionStats);
232 CHECK_NOT_NULL(outASurfaceControls);
233 CHECK_NOT_NULL(outASurfaceControlsSize);
234
235 size_t size = aSurfaceTransactionStats->aSurfaceControlStats.size();
236
237 SurfaceControl** surfaceControls = new SurfaceControl*[size];
238 ASurfaceControl** aSurfaceControls = reinterpret_cast<ASurfaceControl**>(surfaceControls);
239
240 size_t i = 0;
241 for (auto& [aSurfaceControl, aSurfaceControlStats] : aSurfaceTransactionStats->aSurfaceControlStats) {
242 aSurfaceControls[i] = aSurfaceControl;
243 i++;
244 }
245
246 *outASurfaceControls = aSurfaceControls;
247 *outASurfaceControlsSize = size;
248}
249
250int64_t ASurfaceTransactionStats_getAcquireTime(ASurfaceTransactionStats* aSurfaceTransactionStats,
251 ASurfaceControl* aSurfaceControl) {
252 CHECK_NOT_NULL(aSurfaceTransactionStats);
253 CHECK_NOT_NULL(aSurfaceControl);
254
255 const auto& aSurfaceControlStats =
256 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
257 LOG_ALWAYS_FATAL_IF(
258 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
259 "ASurfaceControl not found");
260
Ady Abraham62e15f02022-01-21 17:00:50 -0800261 return ASurfaceControlStats_getAcquireTime(&aSurfaceControlStats->second);
Marissa Wall1be5a102019-01-18 16:14:04 -0800262}
263
264int ASurfaceTransactionStats_getPreviousReleaseFenceFd(
265 ASurfaceTransactionStats* aSurfaceTransactionStats, ASurfaceControl* aSurfaceControl) {
266 CHECK_NOT_NULL(aSurfaceTransactionStats);
267 CHECK_NOT_NULL(aSurfaceControl);
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700268 LOG_ALWAYS_FATAL_IF(!aSurfaceTransactionStats->transactionCompleted,
269 "ASurfaceTransactionStats queried from an incomplete transaction callback");
Marissa Wall1be5a102019-01-18 16:14:04 -0800270
271 const auto& aSurfaceControlStats =
272 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
273 LOG_ALWAYS_FATAL_IF(
274 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
275 "ASurfaceControl not found");
276
277 auto& previousReleaseFence = aSurfaceControlStats->second.previousReleaseFence;
278 return (previousReleaseFence) ? previousReleaseFence->dup() : -1;
279}
280
281void ASurfaceTransactionStats_releaseASurfaceControls(ASurfaceControl** aSurfaceControls) {
282 CHECK_NOT_NULL(aSurfaceControls);
283
284 SurfaceControl** surfaceControls = reinterpret_cast<SurfaceControl**>(aSurfaceControls);
285 delete[] surfaceControls;
286}
287
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800288void ASurfaceTransaction_setOnComplete(ASurfaceTransaction* aSurfaceTransaction, void* context,
289 ASurfaceTransaction_OnComplete func) {
290 CHECK_NOT_NULL(aSurfaceTransaction);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800291 CHECK_NOT_NULL(func);
292
293 TransactionCompletedCallbackTakesContext callback = [func](void* callback_context,
Marissa Wall1be5a102019-01-18 16:14:04 -0800294 nsecs_t latchTime,
295 const sp<Fence>& presentFence,
296 const std::vector<SurfaceControlStats>& surfaceControlStats) {
297 ASurfaceTransactionStats aSurfaceTransactionStats;
298
299 aSurfaceTransactionStats.latchTime = latchTime;
300 aSurfaceTransactionStats.presentFence = presentFence;
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700301 aSurfaceTransactionStats.transactionCompleted = true;
Marissa Wall1be5a102019-01-18 16:14:04 -0800302
303 auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
304
Ady Abraham62e15f02022-01-21 17:00:50 -0800305 for (const auto& [surfaceControl, latchTime, acquireTimeOrFence, presentFence,
306 previousReleaseFence, transformHint, frameEvents] : surfaceControlStats) {
Marissa Wall1be5a102019-01-18 16:14:04 -0800307 ASurfaceControl* aSurfaceControl = reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
Ady Abraham62e15f02022-01-21 17:00:50 -0800308 aSurfaceControlStats[aSurfaceControl].acquireTimeOrFence = acquireTimeOrFence;
Marissa Wall1be5a102019-01-18 16:14:04 -0800309 aSurfaceControlStats[aSurfaceControl].previousReleaseFence = previousReleaseFence;
310 }
311
312 (*func)(callback_context, &aSurfaceTransactionStats);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800313 };
314
315 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
316
317 transaction->addTransactionCompletedCallback(callback, context);
318}
319
Marissa Wall1be5a102019-01-18 16:14:04 -0800320void ASurfaceTransaction_reparent(ASurfaceTransaction* aSurfaceTransaction,
321 ASurfaceControl* aSurfaceControl,
322 ASurfaceControl* newParentASurfaceControl) {
323 CHECK_NOT_NULL(aSurfaceTransaction);
324 CHECK_NOT_NULL(aSurfaceControl);
325
326 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
327 sp<SurfaceControl> newParentSurfaceControl = ASurfaceControl_to_SurfaceControl(
328 newParentASurfaceControl);
Marissa Wall1be5a102019-01-18 16:14:04 -0800329 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
330
Pablo Gamito117040c2020-09-14 08:24:41 +0000331 transaction->reparent(surfaceControl, newParentSurfaceControl);
Marissa Wall1be5a102019-01-18 16:14:04 -0800332}
333
334void ASurfaceTransaction_setVisibility(ASurfaceTransaction* aSurfaceTransaction,
335 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800336 int8_t visibility) {
337 CHECK_NOT_NULL(aSurfaceTransaction);
338 CHECK_NOT_NULL(aSurfaceControl);
339
340 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
341 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
342
343 switch (visibility) {
344 case ASURFACE_TRANSACTION_VISIBILITY_SHOW:
345 transaction->show(surfaceControl);
346 break;
347 case ASURFACE_TRANSACTION_VISIBILITY_HIDE:
348 transaction->hide(surfaceControl);
349 break;
350 default:
351 LOG_ALWAYS_FATAL("invalid visibility %d", visibility);
352 }
353}
354
Marissa Wall1be5a102019-01-18 16:14:04 -0800355void ASurfaceTransaction_setZOrder(ASurfaceTransaction* aSurfaceTransaction,
356 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800357 int32_t z_order) {
358 CHECK_NOT_NULL(aSurfaceTransaction);
359 CHECK_NOT_NULL(aSurfaceControl);
360
361 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
362 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
363
364 transaction->setLayer(surfaceControl, z_order);
365}
366
Marissa Wall1be5a102019-01-18 16:14:04 -0800367void ASurfaceTransaction_setBuffer(ASurfaceTransaction* aSurfaceTransaction,
368 ASurfaceControl* aSurfaceControl,
369 AHardwareBuffer* buffer, int acquire_fence_fd) {
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800370 CHECK_NOT_NULL(aSurfaceTransaction);
371 CHECK_NOT_NULL(aSurfaceControl);
372
373 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
374 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
375
John Reck7f55b132021-09-20 14:42:29 -0400376 sp<GraphicBuffer> graphic_buffer(GraphicBuffer::fromAHardwareBuffer(buffer));
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800377
chaviw5513c612021-09-15 15:26:23 -0500378 std::optional<sp<Fence>> fence = std::nullopt;
Marissa Wall1be5a102019-01-18 16:14:04 -0800379 if (acquire_fence_fd != -1) {
chaviw5513c612021-09-15 15:26:23 -0500380 fence = new Fence(acquire_fence_fd);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800381 }
chaviw5513c612021-09-15 15:26:23 -0500382 transaction->setBuffer(surfaceControl, graphic_buffer, fence);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800383}
384
385void ASurfaceTransaction_setGeometry(ASurfaceTransaction* aSurfaceTransaction,
386 ASurfaceControl* aSurfaceControl, const ARect& source,
387 const ARect& destination, int32_t transform) {
388 CHECK_NOT_NULL(aSurfaceTransaction);
389 CHECK_NOT_NULL(aSurfaceControl);
chaviw87a07ea2021-04-29 09:04:41 -0500390 CHECK_VALID_RECT(source);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800391 CHECK_VALID_RECT(destination);
392
393 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
394 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
395
chaviw87a07ea2021-04-29 09:04:41 -0500396 Rect sourceRect = static_cast<const Rect&>(source);
397 Rect destRect = static_cast<const Rect&>(destination);
398 // Adjust the source so its top and left are not negative
399 sourceRect.left = std::max(sourceRect.left, 0);
400 sourceRect.top = std::max(sourceRect.top, 0);
401
402 if (!sourceRect.isValid()) {
403 sourceRect.makeInvalid();
404 }
chaviw9b2ac242021-04-27 15:52:09 -0500405 transaction->setBufferCrop(surfaceControl, sourceRect);
Vishnu Nair0d7aff72021-05-10 15:01:20 -0700406 transaction->setDestinationFrame(surfaceControl, destRect);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800407 transaction->setTransform(surfaceControl, transform);
Vishnu Nair1ad69542019-05-23 16:27:45 +0800408 bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
409 NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
410 transaction->setTransformToDisplayInverse(surfaceControl, transformToInverseDisplay);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800411}
412
chaviwccf3e8b2021-03-25 15:28:44 -0500413void ASurfaceTransaction_setCrop(ASurfaceTransaction* aSurfaceTransaction,
414 ASurfaceControl* aSurfaceControl, const ARect& crop) {
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500415 CHECK_NOT_NULL(aSurfaceTransaction);
416 CHECK_NOT_NULL(aSurfaceControl);
chaviwccf3e8b2021-03-25 15:28:44 -0500417 CHECK_VALID_RECT(crop);
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500418
419 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
420 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
421
chaviwccf3e8b2021-03-25 15:28:44 -0500422 transaction->setCrop(surfaceControl, static_cast<const Rect&>(crop));
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500423}
424
chaviwccf3e8b2021-03-25 15:28:44 -0500425void ASurfaceTransaction_setPosition(ASurfaceTransaction* aSurfaceTransaction,
426 ASurfaceControl* aSurfaceControl, int32_t x, int32_t y) {
427 CHECK_NOT_NULL(aSurfaceTransaction);
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500428 CHECK_NOT_NULL(aSurfaceControl);
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500429
430 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
431 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
432
chaviwccf3e8b2021-03-25 15:28:44 -0500433 transaction->setPosition(surfaceControl, x, y);
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500434}
435
chaviwccf3e8b2021-03-25 15:28:44 -0500436void ASurfaceTransaction_setBufferTransform(ASurfaceTransaction* aSurfaceTransaction,
437 ASurfaceControl* aSurfaceControl, int32_t transform) {
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500438 CHECK_NOT_NULL(aSurfaceTransaction);
439 CHECK_NOT_NULL(aSurfaceControl);
440
441 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
442 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
443
444 transaction->setTransform(surfaceControl, transform);
445 bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
446 NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
447 transaction->setTransformToDisplayInverse(surfaceControl, transformToInverseDisplay);
448}
449
chaviwccf3e8b2021-03-25 15:28:44 -0500450void ASurfaceTransaction_setScale(ASurfaceTransaction* aSurfaceTransaction,
451 ASurfaceControl* aSurfaceControl, float xScale, float yScale) {
452 CHECK_NOT_NULL(aSurfaceTransaction);
453 CHECK_NOT_NULL(aSurfaceControl);
454 LOG_ALWAYS_FATAL_IF(xScale < 0, "negative value passed in for xScale");
455 LOG_ALWAYS_FATAL_IF(yScale < 0, "negative value passed in for yScale");
456
457 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
458 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
459
460 transaction->setMatrix(surfaceControl, xScale, 0, 0, yScale);
461}
462
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800463void ASurfaceTransaction_setBufferTransparency(ASurfaceTransaction* aSurfaceTransaction,
464 ASurfaceControl* aSurfaceControl,
465 int8_t transparency) {
466 CHECK_NOT_NULL(aSurfaceTransaction);
467 CHECK_NOT_NULL(aSurfaceControl);
468
469 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
470 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
471
472 uint32_t flags = (transparency == ASURFACE_TRANSACTION_TRANSPARENCY_OPAQUE) ?
473 layer_state_t::eLayerOpaque : 0;
474 transaction->setFlags(surfaceControl, flags, layer_state_t::eLayerOpaque);
475}
476
Marissa Wall1be5a102019-01-18 16:14:04 -0800477void ASurfaceTransaction_setDamageRegion(ASurfaceTransaction* aSurfaceTransaction,
478 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800479 const ARect rects[], uint32_t count) {
480 CHECK_NOT_NULL(aSurfaceTransaction);
481 CHECK_NOT_NULL(aSurfaceControl);
482
483 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
484 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
485
486 Region region;
487 for (uint32_t i = 0; i < count; ++i) {
Marissa Wallbb9b14f2019-04-23 14:10:15 -0700488 region.orSelf(static_cast<const Rect&>(rects[i]));
489 }
490
491 // Hardware composer interprets a DamageRegion with a single Rect of {0,0,0,0} to be an
492 // undamaged region and {0,0,-1,-1} to be a fully damaged buffer. This is a confusing
493 // distinction for a public api. Instead, default both cases to be a fully damaged buffer.
494 if (count == 1 && region.getBounds().isEmpty()) {
495 transaction->setSurfaceDamageRegion(surfaceControl, Region::INVALID_REGION);
496 return;
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800497 }
498
499 transaction->setSurfaceDamageRegion(surfaceControl, region);
500}
Marissa Wall1be5a102019-01-18 16:14:04 -0800501
502void ASurfaceTransaction_setDesiredPresentTime(ASurfaceTransaction* aSurfaceTransaction,
503 int64_t desiredPresentTime) {
504 CHECK_NOT_NULL(aSurfaceTransaction);
505
506 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
507
508 transaction->setDesiredPresentTime(static_cast<nsecs_t>(desiredPresentTime));
509}
510
511void ASurfaceTransaction_setBufferAlpha(ASurfaceTransaction* aSurfaceTransaction,
512 ASurfaceControl* aSurfaceControl,
513 float alpha) {
514 CHECK_NOT_NULL(aSurfaceTransaction);
515 CHECK_NOT_NULL(aSurfaceControl);
516
517 LOG_ALWAYS_FATAL_IF(alpha < 0.0 || alpha > 1.0, "invalid alpha");
518
519 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
520 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
521
522 transaction->setAlpha(surfaceControl, alpha);
523}
524
Marissa Wall7f24f792019-02-07 14:06:04 -0800525void ASurfaceTransaction_setBufferDataSpace(ASurfaceTransaction* aSurfaceTransaction,
526 ASurfaceControl* aSurfaceControl,
527 ADataSpace aDataSpace) {
528 CHECK_NOT_NULL(aSurfaceTransaction);
529 CHECK_NOT_NULL(aSurfaceControl);
530
531 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Marissa Wall7f24f792019-02-07 14:06:04 -0800532 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
Marissa Wall7f24f792019-02-07 14:06:04 -0800533 transaction->setDataspace(surfaceControl, static_cast<ui::Dataspace>(aDataSpace));
534}
535
Marissa Wall1be5a102019-01-18 16:14:04 -0800536void ASurfaceTransaction_setHdrMetadata_smpte2086(ASurfaceTransaction* aSurfaceTransaction,
537 ASurfaceControl* aSurfaceControl,
538 struct AHdrMetadata_smpte2086* metadata) {
539 CHECK_NOT_NULL(aSurfaceTransaction);
540 CHECK_NOT_NULL(aSurfaceControl);
541
542 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
543 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
544
545 HdrMetadata hdrMetadata;
546
547 if (metadata) {
548 hdrMetadata.smpte2086.displayPrimaryRed.x = metadata->displayPrimaryRed.x;
549 hdrMetadata.smpte2086.displayPrimaryRed.y = metadata->displayPrimaryRed.y;
550 hdrMetadata.smpte2086.displayPrimaryGreen.x = metadata->displayPrimaryGreen.x;
551 hdrMetadata.smpte2086.displayPrimaryGreen.y = metadata->displayPrimaryGreen.y;
552 hdrMetadata.smpte2086.displayPrimaryBlue.x = metadata->displayPrimaryBlue.x;
553 hdrMetadata.smpte2086.displayPrimaryBlue.y = metadata->displayPrimaryBlue.y;
554 hdrMetadata.smpte2086.whitePoint.x = metadata->whitePoint.x;
555 hdrMetadata.smpte2086.whitePoint.y = metadata->whitePoint.y;
556 hdrMetadata.smpte2086.minLuminance = metadata->minLuminance;
557 hdrMetadata.smpte2086.maxLuminance = metadata->maxLuminance;
558
559 hdrMetadata.validTypes |= HdrMetadata::SMPTE2086;
560 } else {
561 hdrMetadata.validTypes &= ~HdrMetadata::SMPTE2086;
562 }
563
564 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
565}
566
567void ASurfaceTransaction_setHdrMetadata_cta861_3(ASurfaceTransaction* aSurfaceTransaction,
568 ASurfaceControl* aSurfaceControl,
569 struct AHdrMetadata_cta861_3* metadata) {
570 CHECK_NOT_NULL(aSurfaceTransaction);
571 CHECK_NOT_NULL(aSurfaceControl);
572
573 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
574 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
575
576 HdrMetadata hdrMetadata;
577
578 if (metadata) {
579 hdrMetadata.cta8613.maxContentLightLevel = metadata->maxContentLightLevel;
580 hdrMetadata.cta8613.maxFrameAverageLightLevel = metadata->maxFrameAverageLightLevel;
581
582 hdrMetadata.validTypes |= HdrMetadata::CTA861_3;
583 } else {
584 hdrMetadata.validTypes &= ~HdrMetadata::CTA861_3;
585 }
586
587 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
588}
Valerie Hau5bbfd512019-01-22 17:39:43 -0800589
590void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction,
591 ASurfaceControl* aSurfaceControl,
592 float r, float g, float b, float alpha,
593 ADataSpace dataspace) {
594 CHECK_NOT_NULL(aSurfaceTransaction);
595 CHECK_NOT_NULL(aSurfaceControl);
596
597 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Valerie Hau5bbfd512019-01-22 17:39:43 -0800598 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
599
600 half3 color;
601 color.r = r;
602 color.g = g;
603 color.b = b;
604
Marin Shalamanov511f9142021-03-16 18:03:30 +0100605 transaction->setBackgroundColor(surfaceControl, color, alpha,
606 static_cast<ui::Dataspace>(dataspace));
Valerie Hau5bbfd512019-01-22 17:39:43 -0800607}
Steven Thomas6cf051e2020-01-14 11:37:21 -0800608
609void ASurfaceTransaction_setFrameRate(ASurfaceTransaction* aSurfaceTransaction,
Steven Thomasdd7bf2f2020-01-31 18:50:02 -0800610 ASurfaceControl* aSurfaceControl, float frameRate,
611 int8_t compatibility) {
Marin Shalamanov511f9142021-03-16 18:03:30 +0100612 ASurfaceTransaction_setFrameRateWithChangeStrategy(
613 aSurfaceTransaction, aSurfaceControl, frameRate, compatibility,
614 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
Marin Shalamanov41ffa8d2020-10-13 12:35:20 +0200615}
616
Marin Shalamanov511f9142021-03-16 18:03:30 +0100617void ASurfaceTransaction_setFrameRateWithChangeStrategy(ASurfaceTransaction* aSurfaceTransaction,
618 ASurfaceControl* aSurfaceControl,
619 float frameRate, int8_t compatibility,
620 int8_t changeFrameRateStrategy) {
Steven Thomas6cf051e2020-01-14 11:37:21 -0800621 CHECK_NOT_NULL(aSurfaceTransaction);
622 CHECK_NOT_NULL(aSurfaceControl);
Steven Thomas6cf051e2020-01-14 11:37:21 -0800623 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
Steven Thomasdd7bf2f2020-01-31 18:50:02 -0800624 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Marin Shalamanov511f9142021-03-16 18:03:30 +0100625 transaction->setFrameRate(surfaceControl, frameRate, compatibility, changeFrameRateStrategy);
Steven Thomas6cf051e2020-01-14 11:37:21 -0800626}
Robert Carrf57c0162021-03-24 15:48:25 -0700627
628void ASurfaceTransaction_setEnableBackPressure(ASurfaceTransaction* aSurfaceTransaction,
629 ASurfaceControl* aSurfaceControl,
630 bool enableBackpressure) {
631 CHECK_NOT_NULL(aSurfaceControl);
632 CHECK_NOT_NULL(aSurfaceTransaction);
633
634 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
635 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
636
637 const uint32_t flags = enableBackpressure ?
638 layer_state_t::eEnableBackpressure : 0;
639 transaction->setFlags(surfaceControl, flags, layer_state_t::eEnableBackpressure);
640}
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700641
642void ASurfaceTransaction_setOnCommit(ASurfaceTransaction* aSurfaceTransaction, void* context,
643 ASurfaceTransaction_OnCommit func) {
644 CHECK_NOT_NULL(aSurfaceTransaction);
645 CHECK_NOT_NULL(func);
646
647 TransactionCompletedCallbackTakesContext callback =
648 [func](void* callback_context, nsecs_t latchTime, const sp<Fence>& /* presentFence */,
649 const std::vector<SurfaceControlStats>& surfaceControlStats) {
650 ASurfaceTransactionStats aSurfaceTransactionStats;
651 aSurfaceTransactionStats.latchTime = latchTime;
652 aSurfaceTransactionStats.transactionCompleted = false;
653
654 auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
Ady Abraham62e15f02022-01-21 17:00:50 -0800655 for (const auto& [surfaceControl, latchTime, acquireTimeOrFence, presentFence,
656 previousReleaseFence, transformHint, frameEvents] :
657 surfaceControlStats) {
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700658 ASurfaceControl* aSurfaceControl =
659 reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
Ady Abraham62e15f02022-01-21 17:00:50 -0800660 aSurfaceControlStats[aSurfaceControl].acquireTimeOrFence = acquireTimeOrFence;
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700661 }
662
663 (*func)(callback_context, &aSurfaceTransactionStats);
664 };
665
666 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
667
668 transaction->addTransactionCommittedCallback(callback, context);
Pablo Gamito88660d72021-08-09 14:37:56 +0000669}
Rachel Leee1e77cc2021-10-19 16:40:41 -0700670
671void ASurfaceTransaction_setFrameTimeline(ASurfaceTransaction* aSurfaceTransaction,
672 int64_t vsyncId) {
673 CHECK_NOT_NULL(aSurfaceTransaction);
674 // TODO(b/210043506): Get start time from platform.
675 ASurfaceTransaction_to_Transaction(aSurfaceTransaction)
676 ->setFrameTimelineInfo({.vsyncId = vsyncId, .startTimeNanos = 0});
677}