blob: 58de02c79e359408c0e057d726c44397fc595f9c [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>
Bo Liu789103b2022-09-15 16:24:31 -040020#include <android/surface_control_jni.h>
21#include <android_runtime/android_view_SurfaceControl.h>
Marissa Wall1be5a102019-01-18 16:14:04 -080022#include <configstore/Utils.h>
Marissa Wall1be5a102019-01-18 16:14:04 -080023#include <gui/HdrMetadata.h>
24#include <gui/ISurfaceComposer.h>
Marissa Wallf6a73fa2018-12-10 10:41:08 -080025#include <gui/Surface.h>
26#include <gui/SurfaceComposerClient.h>
27#include <gui/SurfaceControl.h>
Rachel Leeb6c93aa2022-02-22 15:48:28 -080028#include <private/android/choreographer.h>
29#include <surface_control_private.h>
Marin Shalamanov463ad8e2021-01-28 22:58:37 +010030#include <ui/DynamicDisplayInfo.h>
Marissa Wall1be5a102019-01-18 16:14:04 -080031#include <utils/Timers.h>
32
Bo Liu789103b2022-09-15 16:24:31 -040033#include <utility>
34
Marissa Wall1be5a102019-01-18 16:14:04 -080035using namespace android::hardware::configstore;
36using namespace android::hardware::configstore::V1_0;
Marissa Wallf6a73fa2018-12-10 10:41:08 -080037using namespace android;
38
39using Transaction = SurfaceComposerClient::Transaction;
40
41#define CHECK_NOT_NULL(name) \
42 LOG_ALWAYS_FATAL_IF(name == nullptr, "nullptr passed as " #name " argument");
43
44#define CHECK_VALID_RECT(name) \
45 LOG_ALWAYS_FATAL_IF(!static_cast<const Rect&>(name).isValid(), \
46 "invalid arg passed as " #name " argument");
47
John Reck2b2ba932021-07-12 21:51:09 -040048static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN));
49static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) ==
50 static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR));
51static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB));
52static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB));
53static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) ==
54 static_cast<int>(HAL_DATASPACE_DISPLAY_P3));
55static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ));
Valerie Hau5bbfd512019-01-22 17:39:43 -080056
Marissa Wallf6a73fa2018-12-10 10:41:08 -080057Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) {
58 return reinterpret_cast<Transaction*>(aSurfaceTransaction);
59}
60
61SurfaceControl* ASurfaceControl_to_SurfaceControl(ASurfaceControl* aSurfaceControl) {
62 return reinterpret_cast<SurfaceControl*>(aSurfaceControl);
63}
64
65void SurfaceControl_acquire(SurfaceControl* surfaceControl) {
66 // incStrong/decStrong token must be the same, doesn't matter what it is
67 surfaceControl->incStrong((void*)SurfaceControl_acquire);
68}
69
70void SurfaceControl_release(SurfaceControl* surfaceControl) {
71 // incStrong/decStrong token must be the same, doesn't matter what it is
72 surfaceControl->decStrong((void*)SurfaceControl_acquire);
73}
74
75ASurfaceControl* ASurfaceControl_createFromWindow(ANativeWindow* window, const char* debug_name) {
76 CHECK_NOT_NULL(window);
77 CHECK_NOT_NULL(debug_name);
78
79 sp<SurfaceComposerClient> client = new SurfaceComposerClient();
80 if (client->initCheck() != NO_ERROR) {
81 return nullptr;
82 }
83
Vishnu Nairce1a6482020-10-22 17:41:30 -070084 Surface* surface = static_cast<Surface*>(window);
85 sp<IBinder> parentHandle = surface->getSurfaceControlHandle();
86
Huihong Luo36b55bc2022-03-08 14:50:45 -080087 int32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
Vishnu Nairce1a6482020-10-22 17:41:30 -070088 sp<SurfaceControl> surfaceControl;
89 if (parentHandle) {
90 surfaceControl =
91 client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
92 // Format is only relevant for buffer queue layers.
93 PIXEL_FORMAT_UNKNOWN /* format */, flags, parentHandle);
94 } else {
Huihong Luo36b55bc2022-03-08 14:50:45 -080095 // deprecated, this should no longer be used
96 surfaceControl = nullptr;
Vishnu Nairce1a6482020-10-22 17:41:30 -070097 }
98
Marissa Wallf6a73fa2018-12-10 10:41:08 -080099 if (!surfaceControl) {
100 return nullptr;
101 }
102
103 SurfaceControl_acquire(surfaceControl.get());
104 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
105}
106
107ASurfaceControl* ASurfaceControl_create(ASurfaceControl* parent, const char* debug_name) {
108 CHECK_NOT_NULL(parent);
109 CHECK_NOT_NULL(debug_name);
110
111 SurfaceComposerClient* client = ASurfaceControl_to_SurfaceControl(parent)->getClient().get();
112
113 SurfaceControl* surfaceControlParent = ASurfaceControl_to_SurfaceControl(parent);
114
115 uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
116 sp<SurfaceControl> surfaceControl =
117 client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
118 // Format is only relevant for buffer queue layers.
119 PIXEL_FORMAT_UNKNOWN /* format */, flags,
Vishnu Nairce1a6482020-10-22 17:41:30 -0700120 surfaceControlParent->getHandle());
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800121 if (!surfaceControl) {
122 return nullptr;
123 }
124
125 SurfaceControl_acquire(surfaceControl.get());
126 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
127}
128
Huihong Luo91697e12021-01-28 15:24:19 -0800129void ASurfaceControl_acquire(ASurfaceControl* aSurfaceControl) {
130 SurfaceControl* surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800131
Huihong Luo91697e12021-01-28 15:24:19 -0800132 SurfaceControl_acquire(surfaceControl);
133}
134
135void ASurfaceControl_release(ASurfaceControl* aSurfaceControl) {
136 SurfaceControl* surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
137
138 SurfaceControl_release(surfaceControl);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800139}
140
Bo Liu23af7022022-11-11 15:00:19 -0500141ASurfaceControl* ASurfaceControl_fromJava(JNIEnv* env, jobject surfaceControlObj) {
142 LOG_ALWAYS_FATAL_IF(!env, "nullptr passed to ASurfaceControl_fromJava as env argument");
Bo Liudd89c3b2022-10-11 20:26:31 -0400143 LOG_ALWAYS_FATAL_IF(!surfaceControlObj,
Bo Liu23af7022022-11-11 15:00:19 -0500144 "nullptr passed to ASurfaceControl_fromJava as surfaceControlObj argument");
Bo Liudd89c3b2022-10-11 20:26:31 -0400145 SurfaceControl* surfaceControl =
146 android_view_SurfaceControl_getNativeSurfaceControl(env, surfaceControlObj);
147 LOG_ALWAYS_FATAL_IF(!surfaceControl,
Bo Liu23af7022022-11-11 15:00:19 -0500148 "surfaceControlObj passed to ASurfaceControl_fromJava is not valid");
Bo Liudd89c3b2022-10-11 20:26:31 -0400149 SurfaceControl_acquire(surfaceControl);
150 return reinterpret_cast<ASurfaceControl*>(surfaceControl);
Bo Liu789103b2022-09-15 16:24:31 -0400151}
152
Jorim Jaggi71db8892021-02-03 23:19:29 +0100153struct ASurfaceControlStats {
Ady Abraham62e15f02022-01-21 17:00:50 -0800154 std::variant<int64_t, sp<Fence>> acquireTimeOrFence;
Jorim Jaggi71db8892021-02-03 23:19:29 +0100155 sp<Fence> previousReleaseFence;
156 uint64_t frameNumber;
157};
158
Pablo Gamitobc9e5292021-08-23 17:12:29 +0200159void ASurfaceControl_registerSurfaceStatsListener(ASurfaceControl* control, int32_t id,
160 void* context,
161 ASurfaceControl_SurfaceStatsListener func) {
Pablo Gamito14b28ce9c2021-09-06 16:33:23 +0000162 SurfaceStatsCallback callback = [func, id](void* callback_context, nsecs_t, const sp<Fence>&,
163 const SurfaceStats& surfaceStats) {
Jorim Jaggi71db8892021-02-03 23:19:29 +0100164 ASurfaceControlStats aSurfaceControlStats;
165
Ady Abraham62e15f02022-01-21 17:00:50 -0800166 aSurfaceControlStats.acquireTimeOrFence = surfaceStats.acquireTimeOrFence;
Jorim Jaggi71db8892021-02-03 23:19:29 +0100167 aSurfaceControlStats.previousReleaseFence = surfaceStats.previousReleaseFence;
168 aSurfaceControlStats.frameNumber = surfaceStats.eventStats.frameNumber;
169
Pablo Gamito14b28ce9c2021-09-06 16:33:23 +0000170 (*func)(callback_context, id, &aSurfaceControlStats);
Jorim Jaggi71db8892021-02-03 23:19:29 +0100171 };
Pablo Gamitobc9e5292021-08-23 17:12:29 +0200172
Jorim Jaggi71db8892021-02-03 23:19:29 +0100173 TransactionCompletedListener::getInstance()->addSurfaceStatsListener(context,
174 reinterpret_cast<void*>(func), ASurfaceControl_to_SurfaceControl(control), callback);
175}
176
Jorim Jaggi71db8892021-02-03 23:19:29 +0100177void ASurfaceControl_unregisterSurfaceStatsListener(void* context,
178 ASurfaceControl_SurfaceStatsListener func) {
179 TransactionCompletedListener::getInstance()->removeSurfaceStatsListener(context,
180 reinterpret_cast<void*>(func));
181}
182
183int64_t ASurfaceControlStats_getAcquireTime(ASurfaceControlStats* stats) {
Ady Abraham62e15f02022-01-21 17:00:50 -0800184 if (const auto* fence = std::get_if<sp<Fence>>(&stats->acquireTimeOrFence)) {
185 // We got a fence instead of the acquire time due to latch unsignaled.
186 // Ideally the client could just get the acquire time dericly from
187 // the fence instead of calling this function which needs to block.
188 (*fence)->waitForever("ASurfaceControlStats_getAcquireTime");
189 return (*fence)->getSignalTime();
190 }
191
192 return std::get<int64_t>(stats->acquireTimeOrFence);
Jorim Jaggi71db8892021-02-03 23:19:29 +0100193}
194
195uint64_t ASurfaceControlStats_getFrameNumber(ASurfaceControlStats* stats) {
196 return stats->frameNumber;
197}
198
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800199ASurfaceTransaction* ASurfaceTransaction_create() {
200 Transaction* transaction = new Transaction;
201 return reinterpret_cast<ASurfaceTransaction*>(transaction);
202}
203
204void ASurfaceTransaction_delete(ASurfaceTransaction* aSurfaceTransaction) {
205 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
206 delete transaction;
207}
208
Bo Liu23af7022022-11-11 15:00:19 -0500209ASurfaceTransaction* ASurfaceTransaction_fromJava(JNIEnv* env, jobject transactionObj) {
210 LOG_ALWAYS_FATAL_IF(!env, "nullptr passed to ASurfaceTransaction_fromJava as env argument");
Bo Liudd89c3b2022-10-11 20:26:31 -0400211 LOG_ALWAYS_FATAL_IF(!transactionObj,
Bo Liu23af7022022-11-11 15:00:19 -0500212 "nullptr passed to ASurfaceTransaction_fromJava as transactionObj "
Bo Liudd89c3b2022-10-11 20:26:31 -0400213 "argument");
214 Transaction* transaction =
215 android_view_SurfaceTransaction_getNativeSurfaceTransaction(env, transactionObj);
216 LOG_ALWAYS_FATAL_IF(!transaction,
Bo Liu23af7022022-11-11 15:00:19 -0500217 "surfaceControlObj passed to ASurfaceTransaction_fromJava is not valid");
Bo Liudd89c3b2022-10-11 20:26:31 -0400218 return reinterpret_cast<ASurfaceTransaction*>(transaction);
Bo Liu789103b2022-09-15 16:24:31 -0400219}
220
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800221void ASurfaceTransaction_apply(ASurfaceTransaction* aSurfaceTransaction) {
222 CHECK_NOT_NULL(aSurfaceTransaction);
223
224 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
225
226 transaction->apply();
227}
228
Marissa Wall1be5a102019-01-18 16:14:04 -0800229struct ASurfaceTransactionStats {
230 std::unordered_map<ASurfaceControl*, ASurfaceControlStats> aSurfaceControlStats;
231 int64_t latchTime;
232 sp<Fence> presentFence;
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700233 bool transactionCompleted;
Marissa Wall1be5a102019-01-18 16:14:04 -0800234};
235
236int64_t ASurfaceTransactionStats_getLatchTime(ASurfaceTransactionStats* aSurfaceTransactionStats) {
237 CHECK_NOT_NULL(aSurfaceTransactionStats);
238 return aSurfaceTransactionStats->latchTime;
239}
240
241int ASurfaceTransactionStats_getPresentFenceFd(ASurfaceTransactionStats* aSurfaceTransactionStats) {
242 CHECK_NOT_NULL(aSurfaceTransactionStats);
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700243 LOG_ALWAYS_FATAL_IF(!aSurfaceTransactionStats->transactionCompleted,
244 "ASurfaceTransactionStats queried from an incomplete transaction callback");
245
Marissa Wall1be5a102019-01-18 16:14:04 -0800246 auto& presentFence = aSurfaceTransactionStats->presentFence;
247 return (presentFence) ? presentFence->dup() : -1;
248}
249
250void ASurfaceTransactionStats_getASurfaceControls(ASurfaceTransactionStats* aSurfaceTransactionStats,
251 ASurfaceControl*** outASurfaceControls,
252 size_t* outASurfaceControlsSize) {
253 CHECK_NOT_NULL(aSurfaceTransactionStats);
254 CHECK_NOT_NULL(outASurfaceControls);
255 CHECK_NOT_NULL(outASurfaceControlsSize);
256
257 size_t size = aSurfaceTransactionStats->aSurfaceControlStats.size();
258
259 SurfaceControl** surfaceControls = new SurfaceControl*[size];
260 ASurfaceControl** aSurfaceControls = reinterpret_cast<ASurfaceControl**>(surfaceControls);
261
262 size_t i = 0;
263 for (auto& [aSurfaceControl, aSurfaceControlStats] : aSurfaceTransactionStats->aSurfaceControlStats) {
264 aSurfaceControls[i] = aSurfaceControl;
265 i++;
266 }
267
268 *outASurfaceControls = aSurfaceControls;
269 *outASurfaceControlsSize = size;
270}
271
272int64_t ASurfaceTransactionStats_getAcquireTime(ASurfaceTransactionStats* aSurfaceTransactionStats,
273 ASurfaceControl* aSurfaceControl) {
274 CHECK_NOT_NULL(aSurfaceTransactionStats);
275 CHECK_NOT_NULL(aSurfaceControl);
276
277 const auto& aSurfaceControlStats =
278 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
279 LOG_ALWAYS_FATAL_IF(
280 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
281 "ASurfaceControl not found");
282
Ady Abraham62e15f02022-01-21 17:00:50 -0800283 return ASurfaceControlStats_getAcquireTime(&aSurfaceControlStats->second);
Marissa Wall1be5a102019-01-18 16:14:04 -0800284}
285
286int ASurfaceTransactionStats_getPreviousReleaseFenceFd(
287 ASurfaceTransactionStats* aSurfaceTransactionStats, ASurfaceControl* aSurfaceControl) {
288 CHECK_NOT_NULL(aSurfaceTransactionStats);
289 CHECK_NOT_NULL(aSurfaceControl);
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700290 LOG_ALWAYS_FATAL_IF(!aSurfaceTransactionStats->transactionCompleted,
291 "ASurfaceTransactionStats queried from an incomplete transaction callback");
Marissa Wall1be5a102019-01-18 16:14:04 -0800292
293 const auto& aSurfaceControlStats =
294 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
295 LOG_ALWAYS_FATAL_IF(
296 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
297 "ASurfaceControl not found");
298
299 auto& previousReleaseFence = aSurfaceControlStats->second.previousReleaseFence;
300 return (previousReleaseFence) ? previousReleaseFence->dup() : -1;
301}
302
303void ASurfaceTransactionStats_releaseASurfaceControls(ASurfaceControl** aSurfaceControls) {
304 CHECK_NOT_NULL(aSurfaceControls);
305
306 SurfaceControl** surfaceControls = reinterpret_cast<SurfaceControl**>(aSurfaceControls);
307 delete[] surfaceControls;
308}
309
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800310void ASurfaceTransaction_setOnComplete(ASurfaceTransaction* aSurfaceTransaction, void* context,
311 ASurfaceTransaction_OnComplete func) {
312 CHECK_NOT_NULL(aSurfaceTransaction);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800313 CHECK_NOT_NULL(func);
314
315 TransactionCompletedCallbackTakesContext callback = [func](void* callback_context,
Marissa Wall1be5a102019-01-18 16:14:04 -0800316 nsecs_t latchTime,
317 const sp<Fence>& presentFence,
318 const std::vector<SurfaceControlStats>& surfaceControlStats) {
319 ASurfaceTransactionStats aSurfaceTransactionStats;
320
321 aSurfaceTransactionStats.latchTime = latchTime;
322 aSurfaceTransactionStats.presentFence = presentFence;
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700323 aSurfaceTransactionStats.transactionCompleted = true;
Marissa Wall1be5a102019-01-18 16:14:04 -0800324
325 auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
326
Ady Abraham62e15f02022-01-21 17:00:50 -0800327 for (const auto& [surfaceControl, latchTime, acquireTimeOrFence, presentFence,
Rob Carr7c703732022-09-27 00:57:27 +0000328 previousReleaseFence, transformHint, frameEvents, ignore] : surfaceControlStats) {
Marissa Wall1be5a102019-01-18 16:14:04 -0800329 ASurfaceControl* aSurfaceControl = reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
Ady Abraham62e15f02022-01-21 17:00:50 -0800330 aSurfaceControlStats[aSurfaceControl].acquireTimeOrFence = acquireTimeOrFence;
Marissa Wall1be5a102019-01-18 16:14:04 -0800331 aSurfaceControlStats[aSurfaceControl].previousReleaseFence = previousReleaseFence;
332 }
333
334 (*func)(callback_context, &aSurfaceTransactionStats);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800335 };
336
337 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
338
339 transaction->addTransactionCompletedCallback(callback, context);
340}
341
Marissa Wall1be5a102019-01-18 16:14:04 -0800342void ASurfaceTransaction_reparent(ASurfaceTransaction* aSurfaceTransaction,
343 ASurfaceControl* aSurfaceControl,
344 ASurfaceControl* newParentASurfaceControl) {
345 CHECK_NOT_NULL(aSurfaceTransaction);
346 CHECK_NOT_NULL(aSurfaceControl);
347
348 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
349 sp<SurfaceControl> newParentSurfaceControl = ASurfaceControl_to_SurfaceControl(
350 newParentASurfaceControl);
Marissa Wall1be5a102019-01-18 16:14:04 -0800351 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
352
Pablo Gamito117040c2020-09-14 08:24:41 +0000353 transaction->reparent(surfaceControl, newParentSurfaceControl);
Marissa Wall1be5a102019-01-18 16:14:04 -0800354}
355
356void ASurfaceTransaction_setVisibility(ASurfaceTransaction* aSurfaceTransaction,
357 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800358 int8_t visibility) {
359 CHECK_NOT_NULL(aSurfaceTransaction);
360 CHECK_NOT_NULL(aSurfaceControl);
361
362 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
363 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
364
365 switch (visibility) {
366 case ASURFACE_TRANSACTION_VISIBILITY_SHOW:
367 transaction->show(surfaceControl);
368 break;
369 case ASURFACE_TRANSACTION_VISIBILITY_HIDE:
370 transaction->hide(surfaceControl);
371 break;
372 default:
373 LOG_ALWAYS_FATAL("invalid visibility %d", visibility);
374 }
375}
376
Marissa Wall1be5a102019-01-18 16:14:04 -0800377void ASurfaceTransaction_setZOrder(ASurfaceTransaction* aSurfaceTransaction,
378 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800379 int32_t z_order) {
380 CHECK_NOT_NULL(aSurfaceTransaction);
381 CHECK_NOT_NULL(aSurfaceControl);
382
383 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
384 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
385
386 transaction->setLayer(surfaceControl, z_order);
387}
388
Marissa Wall1be5a102019-01-18 16:14:04 -0800389void ASurfaceTransaction_setBuffer(ASurfaceTransaction* aSurfaceTransaction,
390 ASurfaceControl* aSurfaceControl,
391 AHardwareBuffer* buffer, int acquire_fence_fd) {
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800392 CHECK_NOT_NULL(aSurfaceTransaction);
393 CHECK_NOT_NULL(aSurfaceControl);
394
395 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
396 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
397
John Reck7f55b132021-09-20 14:42:29 -0400398 sp<GraphicBuffer> graphic_buffer(GraphicBuffer::fromAHardwareBuffer(buffer));
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800399
chaviw5513c612021-09-15 15:26:23 -0500400 std::optional<sp<Fence>> fence = std::nullopt;
Marissa Wall1be5a102019-01-18 16:14:04 -0800401 if (acquire_fence_fd != -1) {
chaviw5513c612021-09-15 15:26:23 -0500402 fence = new Fence(acquire_fence_fd);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800403 }
chaviw5513c612021-09-15 15:26:23 -0500404 transaction->setBuffer(surfaceControl, graphic_buffer, fence);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800405}
406
407void ASurfaceTransaction_setGeometry(ASurfaceTransaction* aSurfaceTransaction,
408 ASurfaceControl* aSurfaceControl, const ARect& source,
409 const ARect& destination, int32_t transform) {
410 CHECK_NOT_NULL(aSurfaceTransaction);
411 CHECK_NOT_NULL(aSurfaceControl);
chaviw87a07ea2021-04-29 09:04:41 -0500412 CHECK_VALID_RECT(source);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800413 CHECK_VALID_RECT(destination);
414
415 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
416 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
417
chaviw87a07ea2021-04-29 09:04:41 -0500418 Rect sourceRect = static_cast<const Rect&>(source);
419 Rect destRect = static_cast<const Rect&>(destination);
420 // Adjust the source so its top and left are not negative
421 sourceRect.left = std::max(sourceRect.left, 0);
422 sourceRect.top = std::max(sourceRect.top, 0);
423
424 if (!sourceRect.isValid()) {
425 sourceRect.makeInvalid();
426 }
chaviw9b2ac242021-04-27 15:52:09 -0500427 transaction->setBufferCrop(surfaceControl, sourceRect);
Vishnu Nair0d7aff72021-05-10 15:01:20 -0700428 transaction->setDestinationFrame(surfaceControl, destRect);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800429 transaction->setTransform(surfaceControl, transform);
Vishnu Nair1ad69542019-05-23 16:27:45 +0800430 bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
431 NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
432 transaction->setTransformToDisplayInverse(surfaceControl, transformToInverseDisplay);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800433}
434
chaviwccf3e8b2021-03-25 15:28:44 -0500435void ASurfaceTransaction_setCrop(ASurfaceTransaction* aSurfaceTransaction,
436 ASurfaceControl* aSurfaceControl, const ARect& crop) {
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500437 CHECK_NOT_NULL(aSurfaceTransaction);
438 CHECK_NOT_NULL(aSurfaceControl);
chaviwccf3e8b2021-03-25 15:28:44 -0500439 CHECK_VALID_RECT(crop);
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500440
441 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
442 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
443
chaviwccf3e8b2021-03-25 15:28:44 -0500444 transaction->setCrop(surfaceControl, static_cast<const Rect&>(crop));
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500445}
446
chaviwccf3e8b2021-03-25 15:28:44 -0500447void ASurfaceTransaction_setPosition(ASurfaceTransaction* aSurfaceTransaction,
448 ASurfaceControl* aSurfaceControl, int32_t x, int32_t y) {
449 CHECK_NOT_NULL(aSurfaceTransaction);
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500450 CHECK_NOT_NULL(aSurfaceControl);
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500451
452 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
453 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
454
chaviwccf3e8b2021-03-25 15:28:44 -0500455 transaction->setPosition(surfaceControl, x, y);
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500456}
457
chaviwccf3e8b2021-03-25 15:28:44 -0500458void ASurfaceTransaction_setBufferTransform(ASurfaceTransaction* aSurfaceTransaction,
459 ASurfaceControl* aSurfaceControl, int32_t transform) {
Vasiliy Telezhnikov5ead3aa2021-03-13 19:55:00 -0500460 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 transaction->setTransform(surfaceControl, transform);
467 bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
468 NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
469 transaction->setTransformToDisplayInverse(surfaceControl, transformToInverseDisplay);
470}
471
chaviwccf3e8b2021-03-25 15:28:44 -0500472void ASurfaceTransaction_setScale(ASurfaceTransaction* aSurfaceTransaction,
473 ASurfaceControl* aSurfaceControl, float xScale, float yScale) {
474 CHECK_NOT_NULL(aSurfaceTransaction);
475 CHECK_NOT_NULL(aSurfaceControl);
476 LOG_ALWAYS_FATAL_IF(xScale < 0, "negative value passed in for xScale");
477 LOG_ALWAYS_FATAL_IF(yScale < 0, "negative value passed in for yScale");
478
479 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
480 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
481
482 transaction->setMatrix(surfaceControl, xScale, 0, 0, yScale);
483}
484
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800485void ASurfaceTransaction_setBufferTransparency(ASurfaceTransaction* aSurfaceTransaction,
486 ASurfaceControl* aSurfaceControl,
487 int8_t transparency) {
488 CHECK_NOT_NULL(aSurfaceTransaction);
489 CHECK_NOT_NULL(aSurfaceControl);
490
491 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
492 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
493
494 uint32_t flags = (transparency == ASURFACE_TRANSACTION_TRANSPARENCY_OPAQUE) ?
495 layer_state_t::eLayerOpaque : 0;
496 transaction->setFlags(surfaceControl, flags, layer_state_t::eLayerOpaque);
497}
498
Marissa Wall1be5a102019-01-18 16:14:04 -0800499void ASurfaceTransaction_setDamageRegion(ASurfaceTransaction* aSurfaceTransaction,
500 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800501 const ARect rects[], uint32_t count) {
502 CHECK_NOT_NULL(aSurfaceTransaction);
503 CHECK_NOT_NULL(aSurfaceControl);
504
505 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
506 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
507
508 Region region;
509 for (uint32_t i = 0; i < count; ++i) {
Marissa Wallbb9b14f2019-04-23 14:10:15 -0700510 region.orSelf(static_cast<const Rect&>(rects[i]));
511 }
512
513 // Hardware composer interprets a DamageRegion with a single Rect of {0,0,0,0} to be an
514 // undamaged region and {0,0,-1,-1} to be a fully damaged buffer. This is a confusing
515 // distinction for a public api. Instead, default both cases to be a fully damaged buffer.
516 if (count == 1 && region.getBounds().isEmpty()) {
517 transaction->setSurfaceDamageRegion(surfaceControl, Region::INVALID_REGION);
518 return;
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800519 }
520
521 transaction->setSurfaceDamageRegion(surfaceControl, region);
522}
Marissa Wall1be5a102019-01-18 16:14:04 -0800523
524void ASurfaceTransaction_setDesiredPresentTime(ASurfaceTransaction* aSurfaceTransaction,
525 int64_t desiredPresentTime) {
526 CHECK_NOT_NULL(aSurfaceTransaction);
527
528 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
529
530 transaction->setDesiredPresentTime(static_cast<nsecs_t>(desiredPresentTime));
531}
532
533void ASurfaceTransaction_setBufferAlpha(ASurfaceTransaction* aSurfaceTransaction,
534 ASurfaceControl* aSurfaceControl,
535 float alpha) {
536 CHECK_NOT_NULL(aSurfaceTransaction);
537 CHECK_NOT_NULL(aSurfaceControl);
538
539 LOG_ALWAYS_FATAL_IF(alpha < 0.0 || alpha > 1.0, "invalid alpha");
540
541 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
542 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
543
544 transaction->setAlpha(surfaceControl, alpha);
545}
546
Marissa Wall7f24f792019-02-07 14:06:04 -0800547void ASurfaceTransaction_setBufferDataSpace(ASurfaceTransaction* aSurfaceTransaction,
548 ASurfaceControl* aSurfaceControl,
549 ADataSpace aDataSpace) {
550 CHECK_NOT_NULL(aSurfaceTransaction);
551 CHECK_NOT_NULL(aSurfaceControl);
552
553 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Marissa Wall7f24f792019-02-07 14:06:04 -0800554 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
Marissa Wall7f24f792019-02-07 14:06:04 -0800555 transaction->setDataspace(surfaceControl, static_cast<ui::Dataspace>(aDataSpace));
556}
557
Marissa Wall1be5a102019-01-18 16:14:04 -0800558void ASurfaceTransaction_setHdrMetadata_smpte2086(ASurfaceTransaction* aSurfaceTransaction,
559 ASurfaceControl* aSurfaceControl,
560 struct AHdrMetadata_smpte2086* metadata) {
561 CHECK_NOT_NULL(aSurfaceTransaction);
562 CHECK_NOT_NULL(aSurfaceControl);
563
564 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
565 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
566
567 HdrMetadata hdrMetadata;
568
569 if (metadata) {
570 hdrMetadata.smpte2086.displayPrimaryRed.x = metadata->displayPrimaryRed.x;
571 hdrMetadata.smpte2086.displayPrimaryRed.y = metadata->displayPrimaryRed.y;
572 hdrMetadata.smpte2086.displayPrimaryGreen.x = metadata->displayPrimaryGreen.x;
573 hdrMetadata.smpte2086.displayPrimaryGreen.y = metadata->displayPrimaryGreen.y;
574 hdrMetadata.smpte2086.displayPrimaryBlue.x = metadata->displayPrimaryBlue.x;
575 hdrMetadata.smpte2086.displayPrimaryBlue.y = metadata->displayPrimaryBlue.y;
576 hdrMetadata.smpte2086.whitePoint.x = metadata->whitePoint.x;
577 hdrMetadata.smpte2086.whitePoint.y = metadata->whitePoint.y;
578 hdrMetadata.smpte2086.minLuminance = metadata->minLuminance;
579 hdrMetadata.smpte2086.maxLuminance = metadata->maxLuminance;
580
581 hdrMetadata.validTypes |= HdrMetadata::SMPTE2086;
582 } else {
583 hdrMetadata.validTypes &= ~HdrMetadata::SMPTE2086;
584 }
585
586 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
587}
588
589void ASurfaceTransaction_setHdrMetadata_cta861_3(ASurfaceTransaction* aSurfaceTransaction,
590 ASurfaceControl* aSurfaceControl,
591 struct AHdrMetadata_cta861_3* metadata) {
592 CHECK_NOT_NULL(aSurfaceTransaction);
593 CHECK_NOT_NULL(aSurfaceControl);
594
595 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
596 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
597
598 HdrMetadata hdrMetadata;
599
600 if (metadata) {
601 hdrMetadata.cta8613.maxContentLightLevel = metadata->maxContentLightLevel;
602 hdrMetadata.cta8613.maxFrameAverageLightLevel = metadata->maxFrameAverageLightLevel;
603
604 hdrMetadata.validTypes |= HdrMetadata::CTA861_3;
605 } else {
606 hdrMetadata.validTypes &= ~HdrMetadata::CTA861_3;
607 }
608
609 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
610}
Valerie Hau5bbfd512019-01-22 17:39:43 -0800611
John Recka40ad032023-02-13 10:20:24 -0500612void ASurfaceTransaction_setExtendedRangeBrightness(ASurfaceTransaction* aSurfaceTransaction,
613 ASurfaceControl* aSurfaceControl,
614 float currentBufferRatio, float desiredRatio) {
615 CHECK_NOT_NULL(aSurfaceTransaction);
616 CHECK_NOT_NULL(aSurfaceControl);
617
618 if (!isfinite(currentBufferRatio) || currentBufferRatio < 1.0f) {
619 ALOGE("Ignore setExtendedRangeBrightness, currentBufferRatio %f isn't finite or >= 1.0f",
620 currentBufferRatio);
621 return;
622 }
623
624 if (!isfinite(desiredRatio) || desiredRatio < 1.0f) {
625 ALOGE("Ignore setExtendedRangeBrightness, desiredRatio %f isn't finite or >= 1.0f",
626 desiredRatio);
627 return;
628 }
629
630 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
631 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
632
633 transaction->setExtendedRangeBrightness(surfaceControl, currentBufferRatio, desiredRatio);
634}
635
Valerie Hau5bbfd512019-01-22 17:39:43 -0800636void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction,
637 ASurfaceControl* aSurfaceControl,
638 float r, float g, float b, float alpha,
639 ADataSpace dataspace) {
640 CHECK_NOT_NULL(aSurfaceTransaction);
641 CHECK_NOT_NULL(aSurfaceControl);
642
643 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Valerie Hau5bbfd512019-01-22 17:39:43 -0800644 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
645
646 half3 color;
647 color.r = r;
648 color.g = g;
649 color.b = b;
650
Marin Shalamanov511f9142021-03-16 18:03:30 +0100651 transaction->setBackgroundColor(surfaceControl, color, alpha,
652 static_cast<ui::Dataspace>(dataspace));
Valerie Hau5bbfd512019-01-22 17:39:43 -0800653}
Steven Thomas6cf051e2020-01-14 11:37:21 -0800654
655void ASurfaceTransaction_setFrameRate(ASurfaceTransaction* aSurfaceTransaction,
Steven Thomasdd7bf2f2020-01-31 18:50:02 -0800656 ASurfaceControl* aSurfaceControl, float frameRate,
657 int8_t compatibility) {
Marin Shalamanov511f9142021-03-16 18:03:30 +0100658 ASurfaceTransaction_setFrameRateWithChangeStrategy(
659 aSurfaceTransaction, aSurfaceControl, frameRate, compatibility,
660 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
Marin Shalamanov41ffa8d2020-10-13 12:35:20 +0200661}
662
Marin Shalamanov511f9142021-03-16 18:03:30 +0100663void ASurfaceTransaction_setFrameRateWithChangeStrategy(ASurfaceTransaction* aSurfaceTransaction,
664 ASurfaceControl* aSurfaceControl,
665 float frameRate, int8_t compatibility,
666 int8_t changeFrameRateStrategy) {
Steven Thomas6cf051e2020-01-14 11:37:21 -0800667 CHECK_NOT_NULL(aSurfaceTransaction);
668 CHECK_NOT_NULL(aSurfaceControl);
Steven Thomas6cf051e2020-01-14 11:37:21 -0800669 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
Steven Thomasdd7bf2f2020-01-31 18:50:02 -0800670 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Marin Shalamanov511f9142021-03-16 18:03:30 +0100671 transaction->setFrameRate(surfaceControl, frameRate, compatibility, changeFrameRateStrategy);
Steven Thomas6cf051e2020-01-14 11:37:21 -0800672}
Robert Carrf57c0162021-03-24 15:48:25 -0700673
Kriti Dang4bfeeb42022-08-11 15:15:36 +0200674void ASurfaceTransaction_clearFrameRate(ASurfaceTransaction* aSurfaceTransaction,
675 ASurfaceControl* aSurfaceControl) {
676 CHECK_NOT_NULL(aSurfaceTransaction);
677 CHECK_NOT_NULL(aSurfaceControl);
678 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
679 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
680 transaction->setFrameRate(surfaceControl, 0, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
681 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
682}
683
Robert Carrf57c0162021-03-24 15:48:25 -0700684void ASurfaceTransaction_setEnableBackPressure(ASurfaceTransaction* aSurfaceTransaction,
685 ASurfaceControl* aSurfaceControl,
686 bool enableBackpressure) {
687 CHECK_NOT_NULL(aSurfaceControl);
688 CHECK_NOT_NULL(aSurfaceTransaction);
689
690 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
691 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
692
693 const uint32_t flags = enableBackpressure ?
694 layer_state_t::eEnableBackpressure : 0;
695 transaction->setFlags(surfaceControl, flags, layer_state_t::eEnableBackpressure);
696}
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700697
698void ASurfaceTransaction_setOnCommit(ASurfaceTransaction* aSurfaceTransaction, void* context,
699 ASurfaceTransaction_OnCommit func) {
700 CHECK_NOT_NULL(aSurfaceTransaction);
701 CHECK_NOT_NULL(func);
702
703 TransactionCompletedCallbackTakesContext callback =
704 [func](void* callback_context, nsecs_t latchTime, const sp<Fence>& /* presentFence */,
705 const std::vector<SurfaceControlStats>& surfaceControlStats) {
706 ASurfaceTransactionStats aSurfaceTransactionStats;
707 aSurfaceTransactionStats.latchTime = latchTime;
708 aSurfaceTransactionStats.transactionCompleted = false;
709
710 auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
Ady Abraham62e15f02022-01-21 17:00:50 -0800711 for (const auto& [surfaceControl, latchTime, acquireTimeOrFence, presentFence,
Rob Carr7c703732022-09-27 00:57:27 +0000712 previousReleaseFence, transformHint, frameEvents, ignore] :
Ady Abraham62e15f02022-01-21 17:00:50 -0800713 surfaceControlStats) {
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700714 ASurfaceControl* aSurfaceControl =
715 reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
Ady Abraham62e15f02022-01-21 17:00:50 -0800716 aSurfaceControlStats[aSurfaceControl].acquireTimeOrFence = acquireTimeOrFence;
Vishnu Nairbeb3b482021-04-21 08:31:27 -0700717 }
718
719 (*func)(callback_context, &aSurfaceTransactionStats);
720 };
721
722 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
723
724 transaction->addTransactionCommittedCallback(callback, context);
Pablo Gamito88660d72021-08-09 14:37:56 +0000725}
Rachel Leee1e77cc2021-10-19 16:40:41 -0700726
727void ASurfaceTransaction_setFrameTimeline(ASurfaceTransaction* aSurfaceTransaction,
Rachel Lee7e47b3d2022-01-12 14:28:26 -0800728 AVsyncId vsyncId) {
Rachel Leee1e77cc2021-10-19 16:40:41 -0700729 CHECK_NOT_NULL(aSurfaceTransaction);
Rachel Leeb6c93aa2022-02-22 15:48:28 -0800730 const auto startTime = AChoreographer_getStartTimeNanosForVsyncId(vsyncId);
Huihong Luo4fed9b42022-03-03 15:10:33 -0800731 FrameTimelineInfo ftInfo;
732 ftInfo.vsyncId = vsyncId;
733 ftInfo.startTimeNanos = startTime;
734 ASurfaceTransaction_to_Transaction(aSurfaceTransaction)->setFrameTimelineInfo(ftInfo);
Rachel Leee1e77cc2021-10-19 16:40:41 -0700735}