1 /*
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
17 #include <android/gui/LutProperties.h>
18 #include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
19 #include <android/native_window.h>
20 #include <android/surface_control.h>
21 #include <android/surface_control_jni.h>
22 #include <android_runtime/android_view_SurfaceControl.h>
23 #include <configstore/Utils.h>
24 #include <cutils/ashmem.h>
25 #include <display_luts_private.h>
26 #include <gui/HdrMetadata.h>
27 #include <gui/ISurfaceComposer.h>
28 #include <gui/Surface.h>
29 #include <gui/SurfaceComposerClient.h>
30 #include <gui/SurfaceControl.h>
31 #include <private/android/choreographer.h>
32 #include <surface_control_private.h>
33 #include <ui/DynamicDisplayInfo.h>
34 #include <utils/Timers.h>
35
36 #include <utility>
37
38 using namespace android::hardware::configstore;
39 using namespace android::hardware::configstore::V1_0;
40 using namespace android;
41
42 using Transaction = SurfaceComposerClient::Transaction;
43
44 #define CHECK_NOT_NULL(name) \
45 LOG_ALWAYS_FATAL_IF(name == nullptr, "nullptr passed as " #name " argument");
46
47 #define CHECK_VALID_RECT(name) \
48 LOG_ALWAYS_FATAL_IF(!static_cast<const Rect&>(name).isValid(), \
49 "invalid arg passed as " #name " argument");
50
51 static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN));
52 static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) ==
53 static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR));
54 static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB));
55 static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB));
56 static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) ==
57 static_cast<int>(HAL_DATASPACE_DISPLAY_P3));
58 static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ));
59 static_assert(static_cast<int>(ADISPLAYLUTS_ONE_DIMENSION) ==
60 static_cast<int>(android::gui::LutProperties::Dimension::ONE_D));
61 static_assert(static_cast<int>(ADISPLAYLUTS_THREE_DIMENSION) ==
62 static_cast<int>(android::gui::LutProperties::Dimension::THREE_D));
63 static_assert(static_cast<int>(ADISPLAYLUTS_SAMPLINGKEY_RGB) ==
64 static_cast<int>(android::gui::LutProperties::SamplingKey::RGB));
65 static_assert(static_cast<int>(ADISPLAYLUTS_SAMPLINGKEY_MAX_RGB) ==
66 static_cast<int>(android::gui::LutProperties::SamplingKey::MAX_RGB));
67 static_assert(static_cast<int>(ADISPLAYLUTS_SAMPLINGKEY_CIE_Y) ==
68 static_cast<int>(android::gui::LutProperties::SamplingKey::CIE_Y));
69
ASurfaceTransaction_to_Transaction(ASurfaceTransaction * aSurfaceTransaction)70 Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) {
71 return reinterpret_cast<Transaction*>(aSurfaceTransaction);
72 }
73
ASurfaceControl_to_SurfaceControl(ASurfaceControl * aSurfaceControl)74 SurfaceControl* ASurfaceControl_to_SurfaceControl(ASurfaceControl* aSurfaceControl) {
75 return reinterpret_cast<SurfaceControl*>(aSurfaceControl);
76 }
77
SurfaceControl_acquire(SurfaceControl * surfaceControl)78 void SurfaceControl_acquire(SurfaceControl* surfaceControl) {
79 // incStrong/decStrong token must be the same, doesn't matter what it is
80 surfaceControl->incStrong((void*)SurfaceControl_acquire);
81 }
82
SurfaceControl_release(SurfaceControl * surfaceControl)83 void SurfaceControl_release(SurfaceControl* surfaceControl) {
84 // incStrong/decStrong token must be the same, doesn't matter what it is
85 surfaceControl->decStrong((void*)SurfaceControl_acquire);
86 }
87
ASurfaceControl_createFromWindow(ANativeWindow * window,const char * debug_name)88 ASurfaceControl* ASurfaceControl_createFromWindow(ANativeWindow* window, const char* debug_name) {
89 CHECK_NOT_NULL(window);
90 CHECK_NOT_NULL(debug_name);
91
92 sp<SurfaceComposerClient> client = new SurfaceComposerClient();
93 if (client->initCheck() != NO_ERROR) {
94 return nullptr;
95 }
96
97 Surface* surface = static_cast<Surface*>(window);
98 sp<IBinder> parentHandle = surface->getSurfaceControlHandle();
99
100 int32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
101 sp<SurfaceControl> surfaceControl;
102 if (parentHandle) {
103 surfaceControl =
104 client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
105 // Format is only relevant for buffer queue layers.
106 PIXEL_FORMAT_UNKNOWN /* format */, flags, parentHandle);
107 } else {
108 // deprecated, this should no longer be used
109 surfaceControl = nullptr;
110 }
111
112 if (!surfaceControl) {
113 return nullptr;
114 }
115
116 SurfaceControl_acquire(surfaceControl.get());
117 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
118 }
119
ASurfaceControl_create(ASurfaceControl * parent,const char * debug_name)120 ASurfaceControl* ASurfaceControl_create(ASurfaceControl* parent, const char* debug_name) {
121 CHECK_NOT_NULL(parent);
122 CHECK_NOT_NULL(debug_name);
123
124 SurfaceComposerClient* client = ASurfaceControl_to_SurfaceControl(parent)->getClient().get();
125
126 SurfaceControl* surfaceControlParent = ASurfaceControl_to_SurfaceControl(parent);
127
128 uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
129 sp<SurfaceControl> surfaceControl =
130 client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
131 // Format is only relevant for buffer queue layers.
132 PIXEL_FORMAT_UNKNOWN /* format */, flags,
133 surfaceControlParent->getHandle());
134 if (!surfaceControl) {
135 return nullptr;
136 }
137
138 SurfaceControl_acquire(surfaceControl.get());
139 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
140 }
141
ASurfaceControl_acquire(ASurfaceControl * aSurfaceControl)142 void ASurfaceControl_acquire(ASurfaceControl* aSurfaceControl) {
143 SurfaceControl* surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
144
145 SurfaceControl_acquire(surfaceControl);
146 }
147
ASurfaceControl_release(ASurfaceControl * aSurfaceControl)148 void ASurfaceControl_release(ASurfaceControl* aSurfaceControl) {
149 SurfaceControl* surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
150
151 SurfaceControl_release(surfaceControl);
152 }
153
ASurfaceControl_fromJava(JNIEnv * env,jobject surfaceControlObj)154 ASurfaceControl* ASurfaceControl_fromJava(JNIEnv* env, jobject surfaceControlObj) {
155 LOG_ALWAYS_FATAL_IF(!env, "nullptr passed to ASurfaceControl_fromJava as env argument");
156 LOG_ALWAYS_FATAL_IF(!surfaceControlObj,
157 "nullptr passed to ASurfaceControl_fromJava as surfaceControlObj argument");
158 SurfaceControl* surfaceControl =
159 android_view_SurfaceControl_getNativeSurfaceControl(env, surfaceControlObj);
160 LOG_ALWAYS_FATAL_IF(!surfaceControl,
161 "surfaceControlObj passed to ASurfaceControl_fromJava is not valid");
162 SurfaceControl_acquire(surfaceControl);
163 return reinterpret_cast<ASurfaceControl*>(surfaceControl);
164 }
165
166 struct ASurfaceControlStats {
167 std::variant<int64_t, sp<Fence>> acquireTimeOrFence;
168 sp<Fence> previousReleaseFence;
169 uint64_t frameNumber;
170 };
171
ASurfaceControl_registerSurfaceStatsListener(ASurfaceControl * control,int32_t id,void * context,ASurfaceControl_SurfaceStatsListener func)172 void ASurfaceControl_registerSurfaceStatsListener(ASurfaceControl* control, int32_t id,
173 void* context,
174 ASurfaceControl_SurfaceStatsListener func) {
175 SurfaceStatsCallback callback = [func, id](void* callback_context, nsecs_t, const sp<Fence>&,
176 const SurfaceStats& surfaceStats) {
177 ASurfaceControlStats aSurfaceControlStats;
178
179 aSurfaceControlStats.acquireTimeOrFence = surfaceStats.acquireTimeOrFence;
180 aSurfaceControlStats.previousReleaseFence = surfaceStats.previousReleaseFence;
181 aSurfaceControlStats.frameNumber = surfaceStats.eventStats.frameNumber;
182
183 (*func)(callback_context, id, &aSurfaceControlStats);
184 };
185
186 TransactionCompletedListener::getInstance()->addSurfaceStatsListener(context,
187 reinterpret_cast<void*>(func), ASurfaceControl_to_SurfaceControl(control), callback);
188 }
189
ASurfaceControl_unregisterSurfaceStatsListener(void * context,ASurfaceControl_SurfaceStatsListener func)190 void ASurfaceControl_unregisterSurfaceStatsListener(void* context,
191 ASurfaceControl_SurfaceStatsListener func) {
192 TransactionCompletedListener::getInstance()->removeSurfaceStatsListener(context,
193 reinterpret_cast<void*>(func));
194 }
195
ASurfaceControl_getChoreographer(ASurfaceControl * aSurfaceControl)196 AChoreographer* ASurfaceControl_getChoreographer(ASurfaceControl* aSurfaceControl) {
197 LOG_ALWAYS_FATAL_IF(aSurfaceControl == nullptr, "aSurfaceControl should not be nullptr");
198 SurfaceControl* surfaceControl =
199 ASurfaceControl_to_SurfaceControl(reinterpret_cast<ASurfaceControl*>(aSurfaceControl));
200 if (!surfaceControl->isValid()) {
201 ALOGE("Attempted to get choreographer from invalid surface control");
202 return nullptr;
203 }
204 SurfaceControl_acquire(surfaceControl);
205 return reinterpret_cast<AChoreographer*>(surfaceControl->getChoreographer().get());
206 }
207
ASurfaceControlStats_getAcquireTime(ASurfaceControlStats * stats)208 int64_t ASurfaceControlStats_getAcquireTime(ASurfaceControlStats* stats) {
209 if (const auto* fence = std::get_if<sp<Fence>>(&stats->acquireTimeOrFence)) {
210 // We got a fence instead of the acquire time due to latch unsignaled.
211 // Ideally the client could just get the acquire time dericly from
212 // the fence instead of calling this function which needs to block.
213 (*fence)->waitForever("ASurfaceControlStats_getAcquireTime");
214 return (*fence)->getSignalTime();
215 }
216
217 return std::get<int64_t>(stats->acquireTimeOrFence);
218 }
219
ASurfaceControlStats_getFrameNumber(ASurfaceControlStats * stats)220 uint64_t ASurfaceControlStats_getFrameNumber(ASurfaceControlStats* stats) {
221 return stats->frameNumber;
222 }
223
ASurfaceTransaction_create()224 ASurfaceTransaction* ASurfaceTransaction_create() {
225 Transaction* transaction = new Transaction;
226 return reinterpret_cast<ASurfaceTransaction*>(transaction);
227 }
228
ASurfaceTransaction_delete(ASurfaceTransaction * aSurfaceTransaction)229 void ASurfaceTransaction_delete(ASurfaceTransaction* aSurfaceTransaction) {
230 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
231 delete transaction;
232 }
233
ASurfaceTransaction_fromJava(JNIEnv * env,jobject transactionObj)234 ASurfaceTransaction* ASurfaceTransaction_fromJava(JNIEnv* env, jobject transactionObj) {
235 LOG_ALWAYS_FATAL_IF(!env, "nullptr passed to ASurfaceTransaction_fromJava as env argument");
236 LOG_ALWAYS_FATAL_IF(!transactionObj,
237 "nullptr passed to ASurfaceTransaction_fromJava as transactionObj "
238 "argument");
239 Transaction* transaction =
240 android_view_SurfaceTransaction_getNativeSurfaceTransaction(env, transactionObj);
241 LOG_ALWAYS_FATAL_IF(!transaction,
242 "surfaceControlObj passed to ASurfaceTransaction_fromJava is not valid");
243 return reinterpret_cast<ASurfaceTransaction*>(transaction);
244 }
245
ASurfaceTransaction_apply(ASurfaceTransaction * aSurfaceTransaction)246 void ASurfaceTransaction_apply(ASurfaceTransaction* aSurfaceTransaction) {
247 CHECK_NOT_NULL(aSurfaceTransaction);
248
249 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
250
251 transaction->apply();
252 }
253
254 struct ASurfaceTransactionStats {
255 std::unordered_map<ASurfaceControl*, ASurfaceControlStats> aSurfaceControlStats;
256 int64_t latchTime;
257 sp<Fence> presentFence;
258 bool transactionCompleted;
259 };
260
ASurfaceTransactionStats_getLatchTime(ASurfaceTransactionStats * aSurfaceTransactionStats)261 int64_t ASurfaceTransactionStats_getLatchTime(ASurfaceTransactionStats* aSurfaceTransactionStats) {
262 CHECK_NOT_NULL(aSurfaceTransactionStats);
263 return aSurfaceTransactionStats->latchTime;
264 }
265
ASurfaceTransactionStats_getPresentFenceFd(ASurfaceTransactionStats * aSurfaceTransactionStats)266 int ASurfaceTransactionStats_getPresentFenceFd(ASurfaceTransactionStats* aSurfaceTransactionStats) {
267 CHECK_NOT_NULL(aSurfaceTransactionStats);
268 LOG_ALWAYS_FATAL_IF(!aSurfaceTransactionStats->transactionCompleted,
269 "ASurfaceTransactionStats queried from an incomplete transaction callback");
270
271 auto& presentFence = aSurfaceTransactionStats->presentFence;
272 return (presentFence) ? presentFence->dup() : -1;
273 }
274
ASurfaceTransactionStats_getASurfaceControls(ASurfaceTransactionStats * aSurfaceTransactionStats,ASurfaceControl *** outASurfaceControls,size_t * outASurfaceControlsSize)275 void ASurfaceTransactionStats_getASurfaceControls(ASurfaceTransactionStats* aSurfaceTransactionStats,
276 ASurfaceControl*** outASurfaceControls,
277 size_t* outASurfaceControlsSize) {
278 CHECK_NOT_NULL(aSurfaceTransactionStats);
279 CHECK_NOT_NULL(outASurfaceControls);
280 CHECK_NOT_NULL(outASurfaceControlsSize);
281
282 size_t size = aSurfaceTransactionStats->aSurfaceControlStats.size();
283
284 SurfaceControl** surfaceControls = new SurfaceControl*[size];
285 ASurfaceControl** aSurfaceControls = reinterpret_cast<ASurfaceControl**>(surfaceControls);
286
287 size_t i = 0;
288 for (auto& [aSurfaceControl, aSurfaceControlStats] : aSurfaceTransactionStats->aSurfaceControlStats) {
289 aSurfaceControls[i] = aSurfaceControl;
290 i++;
291 }
292
293 *outASurfaceControls = aSurfaceControls;
294 *outASurfaceControlsSize = size;
295 }
296
ASurfaceTransactionStats_getAcquireTime(ASurfaceTransactionStats * aSurfaceTransactionStats,ASurfaceControl * aSurfaceControl)297 int64_t ASurfaceTransactionStats_getAcquireTime(ASurfaceTransactionStats* aSurfaceTransactionStats,
298 ASurfaceControl* aSurfaceControl) {
299 CHECK_NOT_NULL(aSurfaceTransactionStats);
300 CHECK_NOT_NULL(aSurfaceControl);
301
302 const auto& aSurfaceControlStats =
303 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
304 LOG_ALWAYS_FATAL_IF(
305 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
306 "ASurfaceControl not found");
307
308 return ASurfaceControlStats_getAcquireTime(&aSurfaceControlStats->second);
309 }
310
ASurfaceTransactionStats_getPreviousReleaseFenceFd(ASurfaceTransactionStats * aSurfaceTransactionStats,ASurfaceControl * aSurfaceControl)311 int ASurfaceTransactionStats_getPreviousReleaseFenceFd(
312 ASurfaceTransactionStats* aSurfaceTransactionStats, ASurfaceControl* aSurfaceControl) {
313 CHECK_NOT_NULL(aSurfaceTransactionStats);
314 CHECK_NOT_NULL(aSurfaceControl);
315 LOG_ALWAYS_FATAL_IF(!aSurfaceTransactionStats->transactionCompleted,
316 "ASurfaceTransactionStats queried from an incomplete transaction callback");
317
318 const auto& aSurfaceControlStats =
319 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
320 LOG_ALWAYS_FATAL_IF(
321 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
322 "ASurfaceControl not found");
323
324 auto& previousReleaseFence = aSurfaceControlStats->second.previousReleaseFence;
325 return (previousReleaseFence) ? previousReleaseFence->dup() : -1;
326 }
327
ASurfaceTransactionStats_releaseASurfaceControls(ASurfaceControl ** aSurfaceControls)328 void ASurfaceTransactionStats_releaseASurfaceControls(ASurfaceControl** aSurfaceControls) {
329 CHECK_NOT_NULL(aSurfaceControls);
330
331 SurfaceControl** surfaceControls = reinterpret_cast<SurfaceControl**>(aSurfaceControls);
332 delete[] surfaceControls;
333 }
334
ASurfaceTransaction_setOnComplete(ASurfaceTransaction * aSurfaceTransaction,void * context,ASurfaceTransaction_OnComplete func)335 void ASurfaceTransaction_setOnComplete(ASurfaceTransaction* aSurfaceTransaction, void* context,
336 ASurfaceTransaction_OnComplete func) {
337 CHECK_NOT_NULL(aSurfaceTransaction);
338 CHECK_NOT_NULL(func);
339
340 TransactionCompletedCallbackTakesContext callback = [func](void* callback_context,
341 nsecs_t latchTime,
342 const sp<Fence>& presentFence,
343 const std::vector<SurfaceControlStats>& surfaceControlStats) {
344 ASurfaceTransactionStats aSurfaceTransactionStats;
345
346 aSurfaceTransactionStats.latchTime = latchTime;
347 aSurfaceTransactionStats.presentFence = presentFence;
348 aSurfaceTransactionStats.transactionCompleted = true;
349
350 auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
351
352 for (const auto& [surfaceControl, latchTime, acquireTimeOrFence, presentFence,
353 previousReleaseFence, transformHint, frameEvents, ignore] : surfaceControlStats) {
354 ASurfaceControl* aSurfaceControl = reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
355 aSurfaceControlStats[aSurfaceControl].acquireTimeOrFence = acquireTimeOrFence;
356 aSurfaceControlStats[aSurfaceControl].previousReleaseFence = previousReleaseFence;
357 }
358
359 (*func)(callback_context, &aSurfaceTransactionStats);
360 };
361
362 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
363
364 transaction->addTransactionCompletedCallback(callback, context);
365 }
366
ASurfaceTransaction_reparent(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,ASurfaceControl * newParentASurfaceControl)367 void ASurfaceTransaction_reparent(ASurfaceTransaction* aSurfaceTransaction,
368 ASurfaceControl* aSurfaceControl,
369 ASurfaceControl* newParentASurfaceControl) {
370 CHECK_NOT_NULL(aSurfaceTransaction);
371 CHECK_NOT_NULL(aSurfaceControl);
372
373 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
374 sp<SurfaceControl> newParentSurfaceControl = ASurfaceControl_to_SurfaceControl(
375 newParentASurfaceControl);
376 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
377
378 transaction->reparent(surfaceControl, newParentSurfaceControl);
379 }
380
ASurfaceTransaction_setVisibility(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,ASurfaceTransactionVisibility visibility)381 void ASurfaceTransaction_setVisibility(ASurfaceTransaction* aSurfaceTransaction,
382 ASurfaceControl* aSurfaceControl,
383 ASurfaceTransactionVisibility visibility) {
384 CHECK_NOT_NULL(aSurfaceTransaction);
385 CHECK_NOT_NULL(aSurfaceControl);
386
387 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
388 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
389
390 switch (visibility) {
391 case ASURFACE_TRANSACTION_VISIBILITY_SHOW:
392 transaction->show(surfaceControl);
393 break;
394 case ASURFACE_TRANSACTION_VISIBILITY_HIDE:
395 transaction->hide(surfaceControl);
396 break;
397 default:
398 LOG_ALWAYS_FATAL("invalid visibility %d", visibility);
399 }
400 }
401
ASurfaceTransaction_setZOrder(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,int32_t z_order)402 void ASurfaceTransaction_setZOrder(ASurfaceTransaction* aSurfaceTransaction,
403 ASurfaceControl* aSurfaceControl,
404 int32_t z_order) {
405 CHECK_NOT_NULL(aSurfaceTransaction);
406 CHECK_NOT_NULL(aSurfaceControl);
407
408 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
409 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
410
411 transaction->setLayer(surfaceControl, z_order);
412 }
413
ASurfaceTransaction_setBuffer(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,AHardwareBuffer * buffer,int acquire_fence_fd)414 void ASurfaceTransaction_setBuffer(ASurfaceTransaction* aSurfaceTransaction,
415 ASurfaceControl* aSurfaceControl,
416 AHardwareBuffer* buffer, int acquire_fence_fd) {
417 CHECK_NOT_NULL(aSurfaceTransaction);
418 CHECK_NOT_NULL(aSurfaceControl);
419
420 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
421 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
422
423 sp<GraphicBuffer> graphic_buffer(GraphicBuffer::fromAHardwareBuffer(buffer));
424
425 std::optional<sp<Fence>> fence = std::nullopt;
426 if (acquire_fence_fd != -1) {
427 fence = new Fence(acquire_fence_fd);
428 }
429 transaction->setBuffer(surfaceControl, graphic_buffer, fence);
430 }
431
ASurfaceTransaction_setBufferWithRelease(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,AHardwareBuffer * buffer,int acquire_fence_fd,void * _Null_unspecified context,ASurfaceTransaction_OnBufferRelease aReleaseCallback)432 void ASurfaceTransaction_setBufferWithRelease(
433 ASurfaceTransaction* aSurfaceTransaction, ASurfaceControl* aSurfaceControl,
434 AHardwareBuffer* buffer, int acquire_fence_fd, void* _Null_unspecified context,
435 ASurfaceTransaction_OnBufferRelease aReleaseCallback) {
436 CHECK_NOT_NULL(aSurfaceTransaction);
437 CHECK_NOT_NULL(aSurfaceControl);
438 CHECK_NOT_NULL(aReleaseCallback);
439
440 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
441 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
442
443 sp<GraphicBuffer> graphic_buffer(GraphicBuffer::fromAHardwareBuffer(buffer));
444
445 std::optional<sp<Fence>> fence = std::nullopt;
446 if (acquire_fence_fd != -1) {
447 fence = new Fence(acquire_fence_fd);
448 }
449
450 ReleaseBufferCallback releaseBufferCallback =
451 [context,
452 aReleaseCallback](const ReleaseCallbackId&, const sp<Fence>& releaseFence,
453 std::optional<uint32_t> /* currentMaxAcquiredBufferCount */) {
454 (*aReleaseCallback)(context, (releaseFence) ? releaseFence->dup() : -1);
455 };
456
457 transaction->setBuffer(surfaceControl, graphic_buffer, fence, /* frameNumber */ std::nullopt,
458 /* producerId */ 0, releaseBufferCallback);
459 }
460
ASurfaceTransaction_setGeometry(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,const ARect & source,const ARect & destination,int32_t transform)461 void ASurfaceTransaction_setGeometry(ASurfaceTransaction* aSurfaceTransaction,
462 ASurfaceControl* aSurfaceControl, const ARect& source,
463 const ARect& destination, int32_t transform) {
464 CHECK_NOT_NULL(aSurfaceTransaction);
465 CHECK_NOT_NULL(aSurfaceControl);
466 CHECK_VALID_RECT(source);
467 CHECK_VALID_RECT(destination);
468
469 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
470 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
471
472 Rect sourceRect = static_cast<const Rect&>(source);
473 Rect destRect = static_cast<const Rect&>(destination);
474 // Adjust the source so its top and left are not negative
475 sourceRect.left = std::max(sourceRect.left, 0);
476 sourceRect.top = std::max(sourceRect.top, 0);
477
478 if (!sourceRect.isValid()) {
479 sourceRect.makeInvalid();
480 }
481 transaction->setBufferCrop(surfaceControl, sourceRect);
482 transaction->setDestinationFrame(surfaceControl, destRect);
483 transaction->setTransform(surfaceControl, transform);
484 bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
485 NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
486 transaction->setTransformToDisplayInverse(surfaceControl, transformToInverseDisplay);
487 }
488
ASurfaceTransaction_setCrop(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,const ARect & crop)489 void ASurfaceTransaction_setCrop(ASurfaceTransaction* aSurfaceTransaction,
490 ASurfaceControl* aSurfaceControl, const ARect& crop) {
491 CHECK_NOT_NULL(aSurfaceTransaction);
492 CHECK_NOT_NULL(aSurfaceControl);
493 CHECK_VALID_RECT(crop);
494
495 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
496 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
497
498 transaction->setCrop(surfaceControl, static_cast<const Rect&>(crop));
499 }
500
ASurfaceTransaction_setPosition(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,int32_t x,int32_t y)501 void ASurfaceTransaction_setPosition(ASurfaceTransaction* aSurfaceTransaction,
502 ASurfaceControl* aSurfaceControl, int32_t x, int32_t y) {
503 CHECK_NOT_NULL(aSurfaceTransaction);
504 CHECK_NOT_NULL(aSurfaceControl);
505
506 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
507 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
508
509 transaction->setPosition(surfaceControl, x, y);
510 }
511
ASurfaceTransaction_setBufferTransform(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,int32_t transform)512 void ASurfaceTransaction_setBufferTransform(ASurfaceTransaction* aSurfaceTransaction,
513 ASurfaceControl* aSurfaceControl, int32_t transform) {
514 CHECK_NOT_NULL(aSurfaceTransaction);
515 CHECK_NOT_NULL(aSurfaceControl);
516
517 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
518 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
519
520 transaction->setTransform(surfaceControl, transform);
521 bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
522 NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
523 transaction->setTransformToDisplayInverse(surfaceControl, transformToInverseDisplay);
524 }
525
ASurfaceTransaction_setScale(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,float xScale,float yScale)526 void ASurfaceTransaction_setScale(ASurfaceTransaction* aSurfaceTransaction,
527 ASurfaceControl* aSurfaceControl, float xScale, float yScale) {
528 CHECK_NOT_NULL(aSurfaceTransaction);
529 CHECK_NOT_NULL(aSurfaceControl);
530 LOG_ALWAYS_FATAL_IF(xScale < 0, "negative value passed in for xScale");
531 LOG_ALWAYS_FATAL_IF(yScale < 0, "negative value passed in for yScale");
532
533 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
534 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
535
536 transaction->setMatrix(surfaceControl, xScale, 0, 0, yScale);
537 }
538
ASurfaceTransaction_setBufferTransparency(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,ASurfaceTransactionTransparency transparency)539 void ASurfaceTransaction_setBufferTransparency(ASurfaceTransaction* aSurfaceTransaction,
540 ASurfaceControl* aSurfaceControl,
541 ASurfaceTransactionTransparency transparency) {
542 CHECK_NOT_NULL(aSurfaceTransaction);
543 CHECK_NOT_NULL(aSurfaceControl);
544
545 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
546 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
547
548 uint32_t flags = (transparency == ASURFACE_TRANSACTION_TRANSPARENCY_OPAQUE) ?
549 layer_state_t::eLayerOpaque : 0;
550 transaction->setFlags(surfaceControl, flags, layer_state_t::eLayerOpaque);
551 }
552
ASurfaceTransaction_setDamageRegion(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,const ARect rects[],uint32_t count)553 void ASurfaceTransaction_setDamageRegion(ASurfaceTransaction* aSurfaceTransaction,
554 ASurfaceControl* aSurfaceControl,
555 const ARect rects[], uint32_t count) {
556 CHECK_NOT_NULL(aSurfaceTransaction);
557 CHECK_NOT_NULL(aSurfaceControl);
558
559 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
560 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
561
562 Region region;
563 for (uint32_t i = 0; i < count; ++i) {
564 region.orSelf(static_cast<const Rect&>(rects[i]));
565 }
566
567 // Hardware composer interprets a DamageRegion with a single Rect of {0,0,0,0} to be an
568 // undamaged region and {0,0,-1,-1} to be a fully damaged buffer. This is a confusing
569 // distinction for a public api. Instead, default both cases to be a fully damaged buffer.
570 if (count == 1 && region.getBounds().isEmpty()) {
571 transaction->setSurfaceDamageRegion(surfaceControl, Region::INVALID_REGION);
572 return;
573 }
574
575 transaction->setSurfaceDamageRegion(surfaceControl, region);
576 }
577
ASurfaceTransaction_setDesiredPresentTime(ASurfaceTransaction * aSurfaceTransaction,int64_t desiredPresentTime)578 void ASurfaceTransaction_setDesiredPresentTime(ASurfaceTransaction* aSurfaceTransaction,
579 int64_t desiredPresentTime) {
580 CHECK_NOT_NULL(aSurfaceTransaction);
581
582 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
583
584 transaction->setDesiredPresentTime(static_cast<nsecs_t>(desiredPresentTime));
585 }
586
ASurfaceTransaction_setBufferAlpha(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,float alpha)587 void ASurfaceTransaction_setBufferAlpha(ASurfaceTransaction* aSurfaceTransaction,
588 ASurfaceControl* aSurfaceControl,
589 float alpha) {
590 CHECK_NOT_NULL(aSurfaceTransaction);
591 CHECK_NOT_NULL(aSurfaceControl);
592
593 LOG_ALWAYS_FATAL_IF(alpha < 0.0 || alpha > 1.0, "invalid alpha");
594
595 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
596 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
597
598 transaction->setAlpha(surfaceControl, alpha);
599 }
600
ASurfaceTransaction_setBufferDataSpace(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,ADataSpace aDataSpace)601 void ASurfaceTransaction_setBufferDataSpace(ASurfaceTransaction* aSurfaceTransaction,
602 ASurfaceControl* aSurfaceControl,
603 ADataSpace aDataSpace) {
604 CHECK_NOT_NULL(aSurfaceTransaction);
605 CHECK_NOT_NULL(aSurfaceControl);
606
607 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
608 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
609 transaction->setDataspace(surfaceControl, static_cast<ui::Dataspace>(aDataSpace));
610 }
611
ASurfaceTransaction_setHdrMetadata_smpte2086(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,struct AHdrMetadata_smpte2086 * metadata)612 void ASurfaceTransaction_setHdrMetadata_smpte2086(ASurfaceTransaction* aSurfaceTransaction,
613 ASurfaceControl* aSurfaceControl,
614 struct AHdrMetadata_smpte2086* metadata) {
615 CHECK_NOT_NULL(aSurfaceTransaction);
616 CHECK_NOT_NULL(aSurfaceControl);
617
618 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
619 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
620
621 HdrMetadata hdrMetadata;
622
623 if (metadata) {
624 hdrMetadata.smpte2086.displayPrimaryRed.x = metadata->displayPrimaryRed.x;
625 hdrMetadata.smpte2086.displayPrimaryRed.y = metadata->displayPrimaryRed.y;
626 hdrMetadata.smpte2086.displayPrimaryGreen.x = metadata->displayPrimaryGreen.x;
627 hdrMetadata.smpte2086.displayPrimaryGreen.y = metadata->displayPrimaryGreen.y;
628 hdrMetadata.smpte2086.displayPrimaryBlue.x = metadata->displayPrimaryBlue.x;
629 hdrMetadata.smpte2086.displayPrimaryBlue.y = metadata->displayPrimaryBlue.y;
630 hdrMetadata.smpte2086.whitePoint.x = metadata->whitePoint.x;
631 hdrMetadata.smpte2086.whitePoint.y = metadata->whitePoint.y;
632 hdrMetadata.smpte2086.minLuminance = metadata->minLuminance;
633 hdrMetadata.smpte2086.maxLuminance = metadata->maxLuminance;
634
635 hdrMetadata.validTypes |= HdrMetadata::SMPTE2086;
636 } else {
637 hdrMetadata.validTypes &= ~HdrMetadata::SMPTE2086;
638 }
639
640 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
641 }
642
ASurfaceTransaction_setHdrMetadata_cta861_3(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,struct AHdrMetadata_cta861_3 * metadata)643 void ASurfaceTransaction_setHdrMetadata_cta861_3(ASurfaceTransaction* aSurfaceTransaction,
644 ASurfaceControl* aSurfaceControl,
645 struct AHdrMetadata_cta861_3* metadata) {
646 CHECK_NOT_NULL(aSurfaceTransaction);
647 CHECK_NOT_NULL(aSurfaceControl);
648
649 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
650 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
651
652 HdrMetadata hdrMetadata;
653
654 if (metadata) {
655 hdrMetadata.cta8613.maxContentLightLevel = metadata->maxContentLightLevel;
656 hdrMetadata.cta8613.maxFrameAverageLightLevel = metadata->maxFrameAverageLightLevel;
657
658 hdrMetadata.validTypes |= HdrMetadata::CTA861_3;
659 } else {
660 hdrMetadata.validTypes &= ~HdrMetadata::CTA861_3;
661 }
662
663 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
664 }
665
ASurfaceTransaction_setExtendedRangeBrightness(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,float currentBufferRatio,float desiredRatio)666 void ASurfaceTransaction_setExtendedRangeBrightness(ASurfaceTransaction* aSurfaceTransaction,
667 ASurfaceControl* aSurfaceControl,
668 float currentBufferRatio, float desiredRatio) {
669 CHECK_NOT_NULL(aSurfaceTransaction);
670 CHECK_NOT_NULL(aSurfaceControl);
671
672 if (!isfinite(currentBufferRatio) || currentBufferRatio < 1.0f) {
673 LOG_ALWAYS_FATAL("setExtendedRangeBrightness, currentBufferRatio %f isn't finite or >= "
674 "1.0f",
675 currentBufferRatio);
676 return;
677 }
678
679 if (!isfinite(desiredRatio) || desiredRatio < 1.0f) {
680 LOG_ALWAYS_FATAL("setExtendedRangeBrightness, desiredRatio %f isn't finite or >= 1.0f",
681 desiredRatio);
682 return;
683 }
684
685 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
686 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
687
688 transaction->setExtendedRangeBrightness(surfaceControl, currentBufferRatio, desiredRatio);
689 }
690
ASurfaceTransaction_setDesiredHdrHeadroom(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,float desiredRatio)691 void ASurfaceTransaction_setDesiredHdrHeadroom(ASurfaceTransaction* aSurfaceTransaction,
692 ASurfaceControl* aSurfaceControl,
693 float desiredRatio) {
694 CHECK_NOT_NULL(aSurfaceTransaction);
695 CHECK_NOT_NULL(aSurfaceControl);
696
697 if (!isfinite(desiredRatio) || (desiredRatio < 1.0f && desiredRatio > 0.0f)) {
698 LOG_ALWAYS_FATAL("setDesiredHdrHeadroom, desiredRatio isn't finite && >= 1.0f or 0, got %f",
699 desiredRatio);
700 return;
701 }
702
703 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
704 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
705
706 transaction->setDesiredHdrHeadroom(surfaceControl, desiredRatio);
707 }
708
ASurfaceTransaction_setLuts(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,const struct ADisplayLuts * luts)709 void ASurfaceTransaction_setLuts(ASurfaceTransaction* aSurfaceTransaction,
710 ASurfaceControl* aSurfaceControl,
711 const struct ADisplayLuts* luts) {
712 CHECK_NOT_NULL(aSurfaceTransaction);
713 CHECK_NOT_NULL(aSurfaceControl);
714
715 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
716 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
717
718 int fd = -1;
719 std::vector<int32_t> offsets;
720 std::vector<int32_t> dimensions;
721 std::vector<int32_t> sizes;
722 std::vector<int32_t> samplingKeys;
723
724 if (luts) {
725 std::vector<float> buffer(luts->totalBufferSize);
726 int32_t count = luts->offsets.size();
727 offsets = luts->offsets;
728
729 dimensions.reserve(count);
730 sizes.reserve(count);
731 samplingKeys.reserve(count);
732 for (int32_t i = 0; i < count; i++) {
733 dimensions.emplace_back(luts->entries[i]->properties.dimension);
734 sizes.emplace_back(luts->entries[i]->properties.size);
735 samplingKeys.emplace_back(luts->entries[i]->properties.samplingKey);
736 std::copy(luts->entries[i]->buffer.data.begin(), luts->entries[i]->buffer.data.end(),
737 buffer.begin() + offsets[i]);
738 }
739
740 // mmap
741 fd = ashmem_create_region("lut_shared_mem", luts->totalBufferSize * sizeof(float));
742 if (fd < 0) {
743 LOG_ALWAYS_FATAL("setLuts, ashmem_create_region() failed");
744 return;
745 }
746 void* ptr = mmap(nullptr, luts->totalBufferSize * sizeof(float), PROT_READ | PROT_WRITE,
747 MAP_SHARED, fd, 0);
748 if (ptr == MAP_FAILED) {
749 LOG_ALWAYS_FATAL("setLuts, Failed to map the shared memory");
750 return;
751 }
752
753 memcpy(ptr, buffer.data(), luts->totalBufferSize * sizeof(float));
754 munmap(ptr, luts->totalBufferSize * sizeof(float));
755 }
756
757 transaction->setLuts(surfaceControl, base::unique_fd(fd), offsets, dimensions, sizes,
758 samplingKeys);
759 }
760
ASurfaceTransaction_setColor(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,float r,float g,float b,float alpha,ADataSpace dataspace)761 void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction,
762 ASurfaceControl* aSurfaceControl,
763 float r, float g, float b, float alpha,
764 ADataSpace dataspace) {
765 CHECK_NOT_NULL(aSurfaceTransaction);
766 CHECK_NOT_NULL(aSurfaceControl);
767
768 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
769 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
770
771 half3 color;
772 color.r = r;
773 color.g = g;
774 color.b = b;
775
776 transaction->setBackgroundColor(surfaceControl, color, alpha,
777 static_cast<ui::Dataspace>(dataspace));
778 }
779
ASurfaceTransaction_setFrameRate(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,float frameRate,int8_t compatibility)780 void ASurfaceTransaction_setFrameRate(ASurfaceTransaction* aSurfaceTransaction,
781 ASurfaceControl* aSurfaceControl, float frameRate,
782 int8_t compatibility) {
783 ASurfaceTransaction_setFrameRateWithChangeStrategy(
784 aSurfaceTransaction, aSurfaceControl, frameRate, compatibility,
785 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
786 }
787
ASurfaceTransaction_setFrameRateWithChangeStrategy(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,float frameRate,int8_t compatibility,int8_t changeFrameRateStrategy)788 void ASurfaceTransaction_setFrameRateWithChangeStrategy(ASurfaceTransaction* aSurfaceTransaction,
789 ASurfaceControl* aSurfaceControl,
790 float frameRate, int8_t compatibility,
791 int8_t changeFrameRateStrategy) {
792 CHECK_NOT_NULL(aSurfaceTransaction);
793 CHECK_NOT_NULL(aSurfaceControl);
794 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
795 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
796 transaction->setFrameRate(surfaceControl, frameRate, compatibility, changeFrameRateStrategy);
797 }
798
ASurfaceTransaction_clearFrameRate(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl)799 void ASurfaceTransaction_clearFrameRate(ASurfaceTransaction* aSurfaceTransaction,
800 ASurfaceControl* aSurfaceControl) {
801 CHECK_NOT_NULL(aSurfaceTransaction);
802 CHECK_NOT_NULL(aSurfaceControl);
803 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
804 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
805 transaction->setFrameRate(surfaceControl, 0, ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_DEFAULT,
806 ANATIVEWINDOW_CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
807 }
808
ASurfaceTransaction_setEnableBackPressure(ASurfaceTransaction * aSurfaceTransaction,ASurfaceControl * aSurfaceControl,bool enableBackpressure)809 void ASurfaceTransaction_setEnableBackPressure(ASurfaceTransaction* aSurfaceTransaction,
810 ASurfaceControl* aSurfaceControl,
811 bool enableBackpressure) {
812 CHECK_NOT_NULL(aSurfaceControl);
813 CHECK_NOT_NULL(aSurfaceTransaction);
814
815 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
816 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
817
818 const uint32_t flags = enableBackpressure ?
819 layer_state_t::eEnableBackpressure : 0;
820 transaction->setFlags(surfaceControl, flags, layer_state_t::eEnableBackpressure);
821 }
822
ASurfaceTransaction_setOnCommit(ASurfaceTransaction * aSurfaceTransaction,void * context,ASurfaceTransaction_OnCommit func)823 void ASurfaceTransaction_setOnCommit(ASurfaceTransaction* aSurfaceTransaction, void* context,
824 ASurfaceTransaction_OnCommit func) {
825 CHECK_NOT_NULL(aSurfaceTransaction);
826 CHECK_NOT_NULL(func);
827
828 TransactionCompletedCallbackTakesContext callback =
829 [func](void* callback_context, nsecs_t latchTime, const sp<Fence>& /* presentFence */,
830 const std::vector<SurfaceControlStats>& surfaceControlStats) {
831 ASurfaceTransactionStats aSurfaceTransactionStats;
832 aSurfaceTransactionStats.latchTime = latchTime;
833 aSurfaceTransactionStats.transactionCompleted = false;
834
835 auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
836 for (const auto& [surfaceControl, latchTime, acquireTimeOrFence, presentFence,
837 previousReleaseFence, transformHint, frameEvents, ignore] :
838 surfaceControlStats) {
839 ASurfaceControl* aSurfaceControl =
840 reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
841 aSurfaceControlStats[aSurfaceControl].acquireTimeOrFence = acquireTimeOrFence;
842 }
843
844 (*func)(callback_context, &aSurfaceTransactionStats);
845 };
846
847 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
848
849 transaction->addTransactionCommittedCallback(callback, context);
850 }
851
ASurfaceTransaction_setFrameTimeline(ASurfaceTransaction * aSurfaceTransaction,AVsyncId vsyncId)852 void ASurfaceTransaction_setFrameTimeline(ASurfaceTransaction* aSurfaceTransaction,
853 AVsyncId vsyncId) {
854 CHECK_NOT_NULL(aSurfaceTransaction);
855 const auto startTime = AChoreographer_getStartTimeNanosForVsyncId(vsyncId);
856 FrameTimelineInfo ftInfo;
857 ftInfo.vsyncId = vsyncId;
858 ftInfo.startTimeNanos = startTime;
859 ASurfaceTransaction_to_Transaction(aSurfaceTransaction)->setFrameTimelineInfo(ftInfo);
860 }
861