xref: /aosp_15_r20/frameworks/base/native/android/surface_control.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
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