blob: e51add276647dd378fb2991d37455b8959cb55e2 [file] [log] [blame]
Marissa Wallf6a73fa2018-12-10 10:41:08 -08001/*
2 * Copyright 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Marissa Wall1be5a102019-01-18 16:14:04 -080017#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
Marissa Wallf6a73fa2018-12-10 10:41:08 -080018#include <android/native_window.h>
19#include <android/surface_control.h>
Jorim Jaggi71db8892021-02-03 23:19:29 +010020#include <surface_control_private.h>
Marissa Wallf6a73fa2018-12-10 10:41:08 -080021
Marissa Wall1be5a102019-01-18 16:14:04 -080022#include <configstore/Utils.h>
23
24#include <gui/HdrMetadata.h>
25#include <gui/ISurfaceComposer.h>
Marissa Wallf6a73fa2018-12-10 10:41:08 -080026#include <gui/Surface.h>
27#include <gui/SurfaceComposerClient.h>
28#include <gui/SurfaceControl.h>
29
Marissa Wall1be5a102019-01-18 16:14:04 -080030#include <ui/HdrCapabilities.h>
31
32#include <utils/Timers.h>
33
34using namespace android::hardware::configstore;
35using namespace android::hardware::configstore::V1_0;
Marissa Wallf6a73fa2018-12-10 10:41:08 -080036using namespace android;
Marissa Wall1be5a102019-01-18 16:14:04 -080037using android::hardware::configstore::V1_0::ISurfaceFlingerConfigs;
Marissa Wallf6a73fa2018-12-10 10:41:08 -080038
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
Valerie Hau5bbfd512019-01-22 17:39:43 -080048static bool getWideColorSupport(const sp<SurfaceControl>& surfaceControl) {
49 sp<SurfaceComposerClient> client = surfaceControl->getClient();
Dominik Laskowski3316a0a2019-01-25 02:56:41 -080050
51 const sp<IBinder> display = client->getInternalDisplayToken();
52 if (display == nullptr) {
53 ALOGE("unable to get wide color support for disconnected internal display");
54 return false;
55 }
56
Peiyong Lin0d04f322019-01-24 17:49:46 -080057 bool isWideColorDisplay = false;
58 status_t err = client->isWideColorDisplay(display, &isWideColorDisplay);
Valerie Hau5bbfd512019-01-22 17:39:43 -080059 if (err) {
60 ALOGE("unable to get wide color support");
61 return false;
62 }
Peiyong Lin0d04f322019-01-24 17:49:46 -080063 return isWideColorDisplay;
Valerie Hau5bbfd512019-01-22 17:39:43 -080064}
65
66static bool getHdrSupport(const sp<SurfaceControl>& surfaceControl) {
67 sp<SurfaceComposerClient> client = surfaceControl->getClient();
Dominik Laskowski3316a0a2019-01-25 02:56:41 -080068
69 const sp<IBinder> display = client->getInternalDisplayToken();
70 if (display == nullptr) {
71 ALOGE("unable to get hdr capabilities for disconnected internal display");
72 return false;
73 }
Valerie Hau5bbfd512019-01-22 17:39:43 -080074
75 HdrCapabilities hdrCapabilities;
76 status_t err = client->getHdrCapabilities(display, &hdrCapabilities);
77 if (err) {
78 ALOGE("unable to get hdr capabilities");
79 return false;
80 }
81
82 return !hdrCapabilities.getSupportedHdrTypes().empty();
83}
84
85static bool isDataSpaceValid(const sp<SurfaceControl>& surfaceControl, ADataSpace dataSpace) {
86 static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN));
87 static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) == static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR));
88 static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB));
89 static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB));
90 static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) == static_cast<int>(HAL_DATASPACE_DISPLAY_P3));
91 static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ));
92
93 switch (static_cast<android_dataspace_t>(dataSpace)) {
94 case HAL_DATASPACE_UNKNOWN:
95 case HAL_DATASPACE_V0_SRGB:
96 return true;
97 // These data space need wide gamut support.
98 case HAL_DATASPACE_V0_SCRGB_LINEAR:
99 case HAL_DATASPACE_V0_SCRGB:
100 case HAL_DATASPACE_DISPLAY_P3:
101 return getWideColorSupport(surfaceControl);
102 // These data space need HDR support.
103 case HAL_DATASPACE_BT2020_PQ:
Valerie Hau5e18c432019-08-26 12:48:49 -0700104 if (!getHdrSupport(surfaceControl)) {
105 ALOGE("Invalid dataspace - device does not support hdr");
106 return false;
107 }
108 return true;
Valerie Hau5bbfd512019-01-22 17:39:43 -0800109 default:
110 return false;
111 }
112}
113
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800114Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) {
115 return reinterpret_cast<Transaction*>(aSurfaceTransaction);
116}
117
118SurfaceControl* ASurfaceControl_to_SurfaceControl(ASurfaceControl* aSurfaceControl) {
119 return reinterpret_cast<SurfaceControl*>(aSurfaceControl);
120}
121
122void SurfaceControl_acquire(SurfaceControl* surfaceControl) {
123 // incStrong/decStrong token must be the same, doesn't matter what it is
124 surfaceControl->incStrong((void*)SurfaceControl_acquire);
125}
126
127void SurfaceControl_release(SurfaceControl* surfaceControl) {
128 // incStrong/decStrong token must be the same, doesn't matter what it is
129 surfaceControl->decStrong((void*)SurfaceControl_acquire);
130}
131
132ASurfaceControl* ASurfaceControl_createFromWindow(ANativeWindow* window, const char* debug_name) {
133 CHECK_NOT_NULL(window);
134 CHECK_NOT_NULL(debug_name);
135
136 sp<SurfaceComposerClient> client = new SurfaceComposerClient();
137 if (client->initCheck() != NO_ERROR) {
138 return nullptr;
139 }
140
Vishnu Nairce1a6482020-10-22 17:41:30 -0700141 Surface* surface = static_cast<Surface*>(window);
142 sp<IBinder> parentHandle = surface->getSurfaceControlHandle();
143
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800144 uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
Vishnu Nairce1a6482020-10-22 17:41:30 -0700145 sp<SurfaceControl> surfaceControl;
146 if (parentHandle) {
147 surfaceControl =
148 client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
149 // Format is only relevant for buffer queue layers.
150 PIXEL_FORMAT_UNKNOWN /* format */, flags, parentHandle);
151 } else {
152 surfaceControl =
153 client->createWithSurfaceParent(String8(debug_name), 0 /* width */, 0 /* height */,
154 // Format is only relevant for buffer queue layers.
155 PIXEL_FORMAT_UNKNOWN /* format */, flags,
156 static_cast<Surface*>(window));
157 }
158
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800159 if (!surfaceControl) {
160 return nullptr;
161 }
162
163 SurfaceControl_acquire(surfaceControl.get());
164 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
165}
166
167ASurfaceControl* ASurfaceControl_create(ASurfaceControl* parent, const char* debug_name) {
168 CHECK_NOT_NULL(parent);
169 CHECK_NOT_NULL(debug_name);
170
171 SurfaceComposerClient* client = ASurfaceControl_to_SurfaceControl(parent)->getClient().get();
172
173 SurfaceControl* surfaceControlParent = ASurfaceControl_to_SurfaceControl(parent);
174
175 uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
176 sp<SurfaceControl> surfaceControl =
177 client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
178 // Format is only relevant for buffer queue layers.
179 PIXEL_FORMAT_UNKNOWN /* format */, flags,
Vishnu Nairce1a6482020-10-22 17:41:30 -0700180 surfaceControlParent->getHandle());
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800181 if (!surfaceControl) {
182 return nullptr;
183 }
184
185 SurfaceControl_acquire(surfaceControl.get());
186 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
187}
188
Huihong Luo91697e12021-01-28 15:24:19 -0800189void ASurfaceControl_acquire(ASurfaceControl* aSurfaceControl) {
190 SurfaceControl* surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800191
Huihong Luo91697e12021-01-28 15:24:19 -0800192 SurfaceControl_acquire(surfaceControl);
193}
194
195void ASurfaceControl_release(ASurfaceControl* aSurfaceControl) {
196 SurfaceControl* surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
197
198 SurfaceControl_release(surfaceControl);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800199}
200
Jorim Jaggi71db8892021-02-03 23:19:29 +0100201struct ASurfaceControlStats {
202 int64_t acquireTime;
203 sp<Fence> previousReleaseFence;
204 uint64_t frameNumber;
205};
206
207void ASurfaceControl_registerSurfaceStatsListener(ASurfaceControl* control, void* context,
208 ASurfaceControl_SurfaceStatsListener func) {
209 SurfaceStatsCallback callback = [func](void* callback_context,
210 nsecs_t,
211 const sp<Fence>&,
212 const SurfaceStats& surfaceStats) {
213
214 ASurfaceControlStats aSurfaceControlStats;
215
216 ASurfaceControl* aSurfaceControl =
217 reinterpret_cast<ASurfaceControl*>(surfaceStats.surfaceControl.get());
218 aSurfaceControlStats.acquireTime = surfaceStats.acquireTime;
219 aSurfaceControlStats.previousReleaseFence = surfaceStats.previousReleaseFence;
220 aSurfaceControlStats.frameNumber = surfaceStats.eventStats.frameNumber;
221
222 (*func)(callback_context, aSurfaceControl, &aSurfaceControlStats);
223 };
224 TransactionCompletedListener::getInstance()->addSurfaceStatsListener(context,
225 reinterpret_cast<void*>(func), ASurfaceControl_to_SurfaceControl(control), callback);
226}
227
228
229void ASurfaceControl_unregisterSurfaceStatsListener(void* context,
230 ASurfaceControl_SurfaceStatsListener func) {
231 TransactionCompletedListener::getInstance()->removeSurfaceStatsListener(context,
232 reinterpret_cast<void*>(func));
233}
234
235int64_t ASurfaceControlStats_getAcquireTime(ASurfaceControlStats* stats) {
236 return stats->acquireTime;
237}
238
239uint64_t ASurfaceControlStats_getFrameNumber(ASurfaceControlStats* stats) {
240 return stats->frameNumber;
241}
242
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800243ASurfaceTransaction* ASurfaceTransaction_create() {
244 Transaction* transaction = new Transaction;
245 return reinterpret_cast<ASurfaceTransaction*>(transaction);
246}
247
248void ASurfaceTransaction_delete(ASurfaceTransaction* aSurfaceTransaction) {
249 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
250 delete transaction;
251}
252
253void ASurfaceTransaction_apply(ASurfaceTransaction* aSurfaceTransaction) {
254 CHECK_NOT_NULL(aSurfaceTransaction);
255
256 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
257
258 transaction->apply();
259}
260
Marissa Wall1be5a102019-01-18 16:14:04 -0800261struct ASurfaceTransactionStats {
262 std::unordered_map<ASurfaceControl*, ASurfaceControlStats> aSurfaceControlStats;
263 int64_t latchTime;
264 sp<Fence> presentFence;
265};
266
267int64_t ASurfaceTransactionStats_getLatchTime(ASurfaceTransactionStats* aSurfaceTransactionStats) {
268 CHECK_NOT_NULL(aSurfaceTransactionStats);
269 return aSurfaceTransactionStats->latchTime;
270}
271
272int ASurfaceTransactionStats_getPresentFenceFd(ASurfaceTransactionStats* aSurfaceTransactionStats) {
273 CHECK_NOT_NULL(aSurfaceTransactionStats);
274 auto& presentFence = aSurfaceTransactionStats->presentFence;
275 return (presentFence) ? presentFence->dup() : -1;
276}
277
278void ASurfaceTransactionStats_getASurfaceControls(ASurfaceTransactionStats* aSurfaceTransactionStats,
279 ASurfaceControl*** outASurfaceControls,
280 size_t* outASurfaceControlsSize) {
281 CHECK_NOT_NULL(aSurfaceTransactionStats);
282 CHECK_NOT_NULL(outASurfaceControls);
283 CHECK_NOT_NULL(outASurfaceControlsSize);
284
285 size_t size = aSurfaceTransactionStats->aSurfaceControlStats.size();
286
287 SurfaceControl** surfaceControls = new SurfaceControl*[size];
288 ASurfaceControl** aSurfaceControls = reinterpret_cast<ASurfaceControl**>(surfaceControls);
289
290 size_t i = 0;
291 for (auto& [aSurfaceControl, aSurfaceControlStats] : aSurfaceTransactionStats->aSurfaceControlStats) {
292 aSurfaceControls[i] = aSurfaceControl;
293 i++;
294 }
295
296 *outASurfaceControls = aSurfaceControls;
297 *outASurfaceControlsSize = size;
298}
299
300int64_t ASurfaceTransactionStats_getAcquireTime(ASurfaceTransactionStats* aSurfaceTransactionStats,
301 ASurfaceControl* aSurfaceControl) {
302 CHECK_NOT_NULL(aSurfaceTransactionStats);
303 CHECK_NOT_NULL(aSurfaceControl);
304
305 const auto& aSurfaceControlStats =
306 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
307 LOG_ALWAYS_FATAL_IF(
308 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
309 "ASurfaceControl not found");
310
311 return aSurfaceControlStats->second.acquireTime;
312}
313
314int ASurfaceTransactionStats_getPreviousReleaseFenceFd(
315 ASurfaceTransactionStats* aSurfaceTransactionStats, ASurfaceControl* aSurfaceControl) {
316 CHECK_NOT_NULL(aSurfaceTransactionStats);
317 CHECK_NOT_NULL(aSurfaceControl);
318
319 const auto& aSurfaceControlStats =
320 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
321 LOG_ALWAYS_FATAL_IF(
322 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
323 "ASurfaceControl not found");
324
325 auto& previousReleaseFence = aSurfaceControlStats->second.previousReleaseFence;
326 return (previousReleaseFence) ? previousReleaseFence->dup() : -1;
327}
328
329void ASurfaceTransactionStats_releaseASurfaceControls(ASurfaceControl** aSurfaceControls) {
330 CHECK_NOT_NULL(aSurfaceControls);
331
332 SurfaceControl** surfaceControls = reinterpret_cast<SurfaceControl**>(aSurfaceControls);
333 delete[] surfaceControls;
334}
335
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800336void ASurfaceTransaction_setOnComplete(ASurfaceTransaction* aSurfaceTransaction, void* context,
337 ASurfaceTransaction_OnComplete func) {
338 CHECK_NOT_NULL(aSurfaceTransaction);
339 CHECK_NOT_NULL(context);
340 CHECK_NOT_NULL(func);
341
342 TransactionCompletedCallbackTakesContext callback = [func](void* callback_context,
Marissa Wall1be5a102019-01-18 16:14:04 -0800343 nsecs_t latchTime,
344 const sp<Fence>& presentFence,
345 const std::vector<SurfaceControlStats>& surfaceControlStats) {
346 ASurfaceTransactionStats aSurfaceTransactionStats;
347
348 aSurfaceTransactionStats.latchTime = latchTime;
349 aSurfaceTransactionStats.presentFence = presentFence;
350
351 auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
352
Valerie Haud6a222e2020-01-29 14:27:09 -0800353 for (const auto& [surfaceControl, latchTime, acquireTime, presentFence, previousReleaseFence, transformHint, frameEvents] : surfaceControlStats) {
Marissa Wall1be5a102019-01-18 16:14:04 -0800354 ASurfaceControl* aSurfaceControl = reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
355 aSurfaceControlStats[aSurfaceControl].acquireTime = acquireTime;
356 aSurfaceControlStats[aSurfaceControl].previousReleaseFence = previousReleaseFence;
357 }
358
359 (*func)(callback_context, &aSurfaceTransactionStats);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800360 };
361
362 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
363
364 transaction->addTransactionCompletedCallback(callback, context);
365}
366
Marissa Wall1be5a102019-01-18 16:14:04 -0800367void 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);
Marissa Wall1be5a102019-01-18 16:14:04 -0800376 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
377
Pablo Gamito117040c2020-09-14 08:24:41 +0000378 transaction->reparent(surfaceControl, newParentSurfaceControl);
Marissa Wall1be5a102019-01-18 16:14:04 -0800379}
380
381void ASurfaceTransaction_setVisibility(ASurfaceTransaction* aSurfaceTransaction,
382 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800383 int8_t 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
Marissa Wall1be5a102019-01-18 16:14:04 -0800402void ASurfaceTransaction_setZOrder(ASurfaceTransaction* aSurfaceTransaction,
403 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800404 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
Marissa Wall1be5a102019-01-18 16:14:04 -0800414void ASurfaceTransaction_setBuffer(ASurfaceTransaction* aSurfaceTransaction,
415 ASurfaceControl* aSurfaceControl,
416 AHardwareBuffer* buffer, int acquire_fence_fd) {
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800417 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(reinterpret_cast<GraphicBuffer*>(buffer));
424
425 transaction->setBuffer(surfaceControl, graphic_buffer);
Marissa Wall1be5a102019-01-18 16:14:04 -0800426 if (acquire_fence_fd != -1) {
427 sp<Fence> fence = new Fence(acquire_fence_fd);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800428 transaction->setAcquireFence(surfaceControl, fence);
429 }
430}
431
432void ASurfaceTransaction_setGeometry(ASurfaceTransaction* aSurfaceTransaction,
433 ASurfaceControl* aSurfaceControl, const ARect& source,
434 const ARect& destination, int32_t transform) {
435 CHECK_NOT_NULL(aSurfaceTransaction);
436 CHECK_NOT_NULL(aSurfaceControl);
437 CHECK_VALID_RECT(source);
438 CHECK_VALID_RECT(destination);
439
440 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
441 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
442
443 transaction->setCrop(surfaceControl, static_cast<const Rect&>(source));
444 transaction->setFrame(surfaceControl, static_cast<const Rect&>(destination));
445 transaction->setTransform(surfaceControl, transform);
Vishnu Nair1ad69542019-05-23 16:27:45 +0800446 bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
447 NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
448 transaction->setTransformToDisplayInverse(surfaceControl, transformToInverseDisplay);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800449}
450
451void ASurfaceTransaction_setBufferTransparency(ASurfaceTransaction* aSurfaceTransaction,
452 ASurfaceControl* aSurfaceControl,
453 int8_t transparency) {
454 CHECK_NOT_NULL(aSurfaceTransaction);
455 CHECK_NOT_NULL(aSurfaceControl);
456
457 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
458 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
459
460 uint32_t flags = (transparency == ASURFACE_TRANSACTION_TRANSPARENCY_OPAQUE) ?
461 layer_state_t::eLayerOpaque : 0;
462 transaction->setFlags(surfaceControl, flags, layer_state_t::eLayerOpaque);
463}
464
Marissa Wall1be5a102019-01-18 16:14:04 -0800465void ASurfaceTransaction_setDamageRegion(ASurfaceTransaction* aSurfaceTransaction,
466 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800467 const ARect rects[], uint32_t count) {
468 CHECK_NOT_NULL(aSurfaceTransaction);
469 CHECK_NOT_NULL(aSurfaceControl);
470
471 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
472 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
473
474 Region region;
475 for (uint32_t i = 0; i < count; ++i) {
Marissa Wallbb9b14f2019-04-23 14:10:15 -0700476 region.orSelf(static_cast<const Rect&>(rects[i]));
477 }
478
479 // Hardware composer interprets a DamageRegion with a single Rect of {0,0,0,0} to be an
480 // undamaged region and {0,0,-1,-1} to be a fully damaged buffer. This is a confusing
481 // distinction for a public api. Instead, default both cases to be a fully damaged buffer.
482 if (count == 1 && region.getBounds().isEmpty()) {
483 transaction->setSurfaceDamageRegion(surfaceControl, Region::INVALID_REGION);
484 return;
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800485 }
486
487 transaction->setSurfaceDamageRegion(surfaceControl, region);
488}
Marissa Wall1be5a102019-01-18 16:14:04 -0800489
490void ASurfaceTransaction_setDesiredPresentTime(ASurfaceTransaction* aSurfaceTransaction,
491 int64_t desiredPresentTime) {
492 CHECK_NOT_NULL(aSurfaceTransaction);
493
494 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
495
496 transaction->setDesiredPresentTime(static_cast<nsecs_t>(desiredPresentTime));
497}
498
499void ASurfaceTransaction_setBufferAlpha(ASurfaceTransaction* aSurfaceTransaction,
500 ASurfaceControl* aSurfaceControl,
501 float alpha) {
502 CHECK_NOT_NULL(aSurfaceTransaction);
503 CHECK_NOT_NULL(aSurfaceControl);
504
505 LOG_ALWAYS_FATAL_IF(alpha < 0.0 || alpha > 1.0, "invalid alpha");
506
507 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
508 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
509
510 transaction->setAlpha(surfaceControl, alpha);
511}
512
Marissa Wall7f24f792019-02-07 14:06:04 -0800513void ASurfaceTransaction_setBufferDataSpace(ASurfaceTransaction* aSurfaceTransaction,
514 ASurfaceControl* aSurfaceControl,
515 ADataSpace aDataSpace) {
516 CHECK_NOT_NULL(aSurfaceTransaction);
517 CHECK_NOT_NULL(aSurfaceControl);
518
519 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Valerie Hau5e18c432019-08-26 12:48:49 -0700520 if (!isDataSpaceValid(surfaceControl, aDataSpace)) {
521 ALOGE("Failed to set buffer dataspace - invalid dataspace");
522 return;
523 }
Marissa Wall7f24f792019-02-07 14:06:04 -0800524 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
Marissa Wall7f24f792019-02-07 14:06:04 -0800525 transaction->setDataspace(surfaceControl, static_cast<ui::Dataspace>(aDataSpace));
526}
527
Marissa Wall1be5a102019-01-18 16:14:04 -0800528void ASurfaceTransaction_setHdrMetadata_smpte2086(ASurfaceTransaction* aSurfaceTransaction,
529 ASurfaceControl* aSurfaceControl,
530 struct AHdrMetadata_smpte2086* metadata) {
531 CHECK_NOT_NULL(aSurfaceTransaction);
532 CHECK_NOT_NULL(aSurfaceControl);
533
534 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
535 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
536
537 HdrMetadata hdrMetadata;
538
539 if (metadata) {
540 hdrMetadata.smpte2086.displayPrimaryRed.x = metadata->displayPrimaryRed.x;
541 hdrMetadata.smpte2086.displayPrimaryRed.y = metadata->displayPrimaryRed.y;
542 hdrMetadata.smpte2086.displayPrimaryGreen.x = metadata->displayPrimaryGreen.x;
543 hdrMetadata.smpte2086.displayPrimaryGreen.y = metadata->displayPrimaryGreen.y;
544 hdrMetadata.smpte2086.displayPrimaryBlue.x = metadata->displayPrimaryBlue.x;
545 hdrMetadata.smpte2086.displayPrimaryBlue.y = metadata->displayPrimaryBlue.y;
546 hdrMetadata.smpte2086.whitePoint.x = metadata->whitePoint.x;
547 hdrMetadata.smpte2086.whitePoint.y = metadata->whitePoint.y;
548 hdrMetadata.smpte2086.minLuminance = metadata->minLuminance;
549 hdrMetadata.smpte2086.maxLuminance = metadata->maxLuminance;
550
551 hdrMetadata.validTypes |= HdrMetadata::SMPTE2086;
552 } else {
553 hdrMetadata.validTypes &= ~HdrMetadata::SMPTE2086;
554 }
555
556 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
557}
558
559void ASurfaceTransaction_setHdrMetadata_cta861_3(ASurfaceTransaction* aSurfaceTransaction,
560 ASurfaceControl* aSurfaceControl,
561 struct AHdrMetadata_cta861_3* metadata) {
562 CHECK_NOT_NULL(aSurfaceTransaction);
563 CHECK_NOT_NULL(aSurfaceControl);
564
565 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
566 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
567
568 HdrMetadata hdrMetadata;
569
570 if (metadata) {
571 hdrMetadata.cta8613.maxContentLightLevel = metadata->maxContentLightLevel;
572 hdrMetadata.cta8613.maxFrameAverageLightLevel = metadata->maxFrameAverageLightLevel;
573
574 hdrMetadata.validTypes |= HdrMetadata::CTA861_3;
575 } else {
576 hdrMetadata.validTypes &= ~HdrMetadata::CTA861_3;
577 }
578
579 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
580}
Valerie Hau5bbfd512019-01-22 17:39:43 -0800581
582void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction,
583 ASurfaceControl* aSurfaceControl,
584 float r, float g, float b, float alpha,
585 ADataSpace dataspace) {
586 CHECK_NOT_NULL(aSurfaceTransaction);
587 CHECK_NOT_NULL(aSurfaceControl);
588
589 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Valerie Hau5e18c432019-08-26 12:48:49 -0700590 if (!isDataSpaceValid(surfaceControl, dataspace)) {
591 ALOGE("Failed to set buffer dataspace - invalid dataspace");
592 return;
593 }
Valerie Hau5bbfd512019-01-22 17:39:43 -0800594 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
595
596 half3 color;
597 color.r = r;
598 color.g = g;
599 color.b = b;
600
Valerie Hau6bc482312019-01-29 15:01:53 -0800601 transaction->setBackgroundColor(surfaceControl, color, alpha, static_cast<ui::Dataspace>(dataspace));
Valerie Hau5bbfd512019-01-22 17:39:43 -0800602}
Steven Thomas6cf051e2020-01-14 11:37:21 -0800603
604void ASurfaceTransaction_setFrameRate(ASurfaceTransaction* aSurfaceTransaction,
Steven Thomasdd7bf2f2020-01-31 18:50:02 -0800605 ASurfaceControl* aSurfaceControl, float frameRate,
606 int8_t compatibility) {
Marin Shalamanov41ffa8d2020-10-13 12:35:20 +0200607 ASurfaceTransaction_setFrameRateWithSeamlessness(aSurfaceTransaction, aSurfaceControl,
608 frameRate, compatibility,
609 /*shouldBeSeamless*/ true);
610}
611
612void ASurfaceTransaction_setFrameRateWithSeamlessness(ASurfaceTransaction* aSurfaceTransaction,
613 ASurfaceControl* aSurfaceControl,
614 float frameRate, int8_t compatibility,
615 bool shouldBeSeamless) {
Steven Thomas6cf051e2020-01-14 11:37:21 -0800616 CHECK_NOT_NULL(aSurfaceTransaction);
617 CHECK_NOT_NULL(aSurfaceControl);
Steven Thomas6cf051e2020-01-14 11:37:21 -0800618 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
Steven Thomasdd7bf2f2020-01-31 18:50:02 -0800619 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Marin Shalamanov41ffa8d2020-10-13 12:35:20 +0200620 transaction->setFrameRate(surfaceControl, frameRate, compatibility, shouldBeSeamless);
Steven Thomas6cf051e2020-01-14 11:37:21 -0800621}