blob: c1b5f1ddd4233f6cc6961f9185d1b8255d431982 [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>
20
Marissa Wall1be5a102019-01-18 16:14:04 -080021#include <configstore/Utils.h>
22
23#include <gui/HdrMetadata.h>
24#include <gui/ISurfaceComposer.h>
Marissa Wallf6a73fa2018-12-10 10:41:08 -080025#include <gui/Surface.h>
26#include <gui/SurfaceComposerClient.h>
27#include <gui/SurfaceControl.h>
28
Marissa Wall1be5a102019-01-18 16:14:04 -080029#include <ui/HdrCapabilities.h>
30
31#include <utils/Timers.h>
32
33using namespace android::hardware::configstore;
34using namespace android::hardware::configstore::V1_0;
Marissa Wallf6a73fa2018-12-10 10:41:08 -080035using namespace android;
Marissa Wall1be5a102019-01-18 16:14:04 -080036using android::hardware::configstore::V1_0::ISurfaceFlingerConfigs;
Marissa Wallf6a73fa2018-12-10 10:41:08 -080037
38using Transaction = SurfaceComposerClient::Transaction;
39
40#define CHECK_NOT_NULL(name) \
41 LOG_ALWAYS_FATAL_IF(name == nullptr, "nullptr passed as " #name " argument");
42
43#define CHECK_VALID_RECT(name) \
44 LOG_ALWAYS_FATAL_IF(!static_cast<const Rect&>(name).isValid(), \
45 "invalid arg passed as " #name " argument");
46
Valerie Hau5bbfd512019-01-22 17:39:43 -080047static bool getWideColorSupport(const sp<SurfaceControl>& surfaceControl) {
48 sp<SurfaceComposerClient> client = surfaceControl->getClient();
Dominik Laskowski3316a0a2019-01-25 02:56:41 -080049
50 const sp<IBinder> display = client->getInternalDisplayToken();
51 if (display == nullptr) {
52 ALOGE("unable to get wide color support for disconnected internal display");
53 return false;
54 }
55
Peiyong Lin0d04f322019-01-24 17:49:46 -080056 bool isWideColorDisplay = false;
57 status_t err = client->isWideColorDisplay(display, &isWideColorDisplay);
Valerie Hau5bbfd512019-01-22 17:39:43 -080058 if (err) {
59 ALOGE("unable to get wide color support");
60 return false;
61 }
Peiyong Lin0d04f322019-01-24 17:49:46 -080062 return isWideColorDisplay;
Valerie Hau5bbfd512019-01-22 17:39:43 -080063}
64
65static bool getHdrSupport(const sp<SurfaceControl>& surfaceControl) {
66 sp<SurfaceComposerClient> client = surfaceControl->getClient();
Dominik Laskowski3316a0a2019-01-25 02:56:41 -080067
68 const sp<IBinder> display = client->getInternalDisplayToken();
69 if (display == nullptr) {
70 ALOGE("unable to get hdr capabilities for disconnected internal display");
71 return false;
72 }
Valerie Hau5bbfd512019-01-22 17:39:43 -080073
74 HdrCapabilities hdrCapabilities;
75 status_t err = client->getHdrCapabilities(display, &hdrCapabilities);
76 if (err) {
77 ALOGE("unable to get hdr capabilities");
78 return false;
79 }
80
81 return !hdrCapabilities.getSupportedHdrTypes().empty();
82}
83
84static bool isDataSpaceValid(const sp<SurfaceControl>& surfaceControl, ADataSpace dataSpace) {
85 static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN));
86 static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) == static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR));
87 static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB));
88 static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB));
89 static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) == static_cast<int>(HAL_DATASPACE_DISPLAY_P3));
90 static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ));
91
92 switch (static_cast<android_dataspace_t>(dataSpace)) {
93 case HAL_DATASPACE_UNKNOWN:
94 case HAL_DATASPACE_V0_SRGB:
95 return true;
96 // These data space need wide gamut support.
97 case HAL_DATASPACE_V0_SCRGB_LINEAR:
98 case HAL_DATASPACE_V0_SCRGB:
99 case HAL_DATASPACE_DISPLAY_P3:
100 return getWideColorSupport(surfaceControl);
101 // These data space need HDR support.
102 case HAL_DATASPACE_BT2020_PQ:
Valerie Hau5e18c432019-08-26 12:48:49 -0700103 if (!getHdrSupport(surfaceControl)) {
104 ALOGE("Invalid dataspace - device does not support hdr");
105 return false;
106 }
107 return true;
Valerie Hau5bbfd512019-01-22 17:39:43 -0800108 default:
109 return false;
110 }
111}
112
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800113Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) {
114 return reinterpret_cast<Transaction*>(aSurfaceTransaction);
115}
116
117SurfaceControl* ASurfaceControl_to_SurfaceControl(ASurfaceControl* aSurfaceControl) {
118 return reinterpret_cast<SurfaceControl*>(aSurfaceControl);
119}
120
121void SurfaceControl_acquire(SurfaceControl* surfaceControl) {
122 // incStrong/decStrong token must be the same, doesn't matter what it is
123 surfaceControl->incStrong((void*)SurfaceControl_acquire);
124}
125
126void SurfaceControl_release(SurfaceControl* surfaceControl) {
127 // incStrong/decStrong token must be the same, doesn't matter what it is
128 surfaceControl->decStrong((void*)SurfaceControl_acquire);
129}
130
131ASurfaceControl* ASurfaceControl_createFromWindow(ANativeWindow* window, const char* debug_name) {
132 CHECK_NOT_NULL(window);
133 CHECK_NOT_NULL(debug_name);
134
135 sp<SurfaceComposerClient> client = new SurfaceComposerClient();
136 if (client->initCheck() != NO_ERROR) {
137 return nullptr;
138 }
139
Vishnu Nairce1a6482020-10-22 17:41:30 -0700140 Surface* surface = static_cast<Surface*>(window);
141 sp<IBinder> parentHandle = surface->getSurfaceControlHandle();
142
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800143 uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
Vishnu Nairce1a6482020-10-22 17:41:30 -0700144 sp<SurfaceControl> surfaceControl;
145 if (parentHandle) {
146 surfaceControl =
147 client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
148 // Format is only relevant for buffer queue layers.
149 PIXEL_FORMAT_UNKNOWN /* format */, flags, parentHandle);
150 } else {
151 surfaceControl =
152 client->createWithSurfaceParent(String8(debug_name), 0 /* width */, 0 /* height */,
153 // Format is only relevant for buffer queue layers.
154 PIXEL_FORMAT_UNKNOWN /* format */, flags,
155 static_cast<Surface*>(window));
156 }
157
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800158 if (!surfaceControl) {
159 return nullptr;
160 }
161
162 SurfaceControl_acquire(surfaceControl.get());
163 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
164}
165
166ASurfaceControl* ASurfaceControl_create(ASurfaceControl* parent, const char* debug_name) {
167 CHECK_NOT_NULL(parent);
168 CHECK_NOT_NULL(debug_name);
169
170 SurfaceComposerClient* client = ASurfaceControl_to_SurfaceControl(parent)->getClient().get();
171
172 SurfaceControl* surfaceControlParent = ASurfaceControl_to_SurfaceControl(parent);
173
174 uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
175 sp<SurfaceControl> surfaceControl =
176 client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
177 // Format is only relevant for buffer queue layers.
178 PIXEL_FORMAT_UNKNOWN /* format */, flags,
Vishnu Nairce1a6482020-10-22 17:41:30 -0700179 surfaceControlParent->getHandle());
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800180 if (!surfaceControl) {
181 return nullptr;
182 }
183
184 SurfaceControl_acquire(surfaceControl.get());
185 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
186}
187
Huihong Luo91697e12021-01-28 15:24:19 -0800188void ASurfaceControl_acquire(ASurfaceControl* aSurfaceControl) {
189 SurfaceControl* surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800190
Huihong Luo91697e12021-01-28 15:24:19 -0800191 SurfaceControl_acquire(surfaceControl);
192}
193
194void ASurfaceControl_release(ASurfaceControl* aSurfaceControl) {
195 SurfaceControl* surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
196
197 SurfaceControl_release(surfaceControl);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800198}
199
200ASurfaceTransaction* ASurfaceTransaction_create() {
201 Transaction* transaction = new Transaction;
202 return reinterpret_cast<ASurfaceTransaction*>(transaction);
203}
204
205void ASurfaceTransaction_delete(ASurfaceTransaction* aSurfaceTransaction) {
206 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
207 delete transaction;
208}
209
210void ASurfaceTransaction_apply(ASurfaceTransaction* aSurfaceTransaction) {
211 CHECK_NOT_NULL(aSurfaceTransaction);
212
213 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
214
215 transaction->apply();
216}
217
Marissa Wall1be5a102019-01-18 16:14:04 -0800218typedef struct ASurfaceControlStats {
219 int64_t acquireTime;
220 sp<Fence> previousReleaseFence;
221} ASurfaceControlStats;
222
223struct ASurfaceTransactionStats {
224 std::unordered_map<ASurfaceControl*, ASurfaceControlStats> aSurfaceControlStats;
225 int64_t latchTime;
226 sp<Fence> presentFence;
227};
228
229int64_t ASurfaceTransactionStats_getLatchTime(ASurfaceTransactionStats* aSurfaceTransactionStats) {
230 CHECK_NOT_NULL(aSurfaceTransactionStats);
231 return aSurfaceTransactionStats->latchTime;
232}
233
234int ASurfaceTransactionStats_getPresentFenceFd(ASurfaceTransactionStats* aSurfaceTransactionStats) {
235 CHECK_NOT_NULL(aSurfaceTransactionStats);
236 auto& presentFence = aSurfaceTransactionStats->presentFence;
237 return (presentFence) ? presentFence->dup() : -1;
238}
239
240void ASurfaceTransactionStats_getASurfaceControls(ASurfaceTransactionStats* aSurfaceTransactionStats,
241 ASurfaceControl*** outASurfaceControls,
242 size_t* outASurfaceControlsSize) {
243 CHECK_NOT_NULL(aSurfaceTransactionStats);
244 CHECK_NOT_NULL(outASurfaceControls);
245 CHECK_NOT_NULL(outASurfaceControlsSize);
246
247 size_t size = aSurfaceTransactionStats->aSurfaceControlStats.size();
248
249 SurfaceControl** surfaceControls = new SurfaceControl*[size];
250 ASurfaceControl** aSurfaceControls = reinterpret_cast<ASurfaceControl**>(surfaceControls);
251
252 size_t i = 0;
253 for (auto& [aSurfaceControl, aSurfaceControlStats] : aSurfaceTransactionStats->aSurfaceControlStats) {
254 aSurfaceControls[i] = aSurfaceControl;
255 i++;
256 }
257
258 *outASurfaceControls = aSurfaceControls;
259 *outASurfaceControlsSize = size;
260}
261
262int64_t ASurfaceTransactionStats_getAcquireTime(ASurfaceTransactionStats* aSurfaceTransactionStats,
263 ASurfaceControl* aSurfaceControl) {
264 CHECK_NOT_NULL(aSurfaceTransactionStats);
265 CHECK_NOT_NULL(aSurfaceControl);
266
267 const auto& aSurfaceControlStats =
268 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
269 LOG_ALWAYS_FATAL_IF(
270 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
271 "ASurfaceControl not found");
272
273 return aSurfaceControlStats->second.acquireTime;
274}
275
276int ASurfaceTransactionStats_getPreviousReleaseFenceFd(
277 ASurfaceTransactionStats* aSurfaceTransactionStats, ASurfaceControl* aSurfaceControl) {
278 CHECK_NOT_NULL(aSurfaceTransactionStats);
279 CHECK_NOT_NULL(aSurfaceControl);
280
281 const auto& aSurfaceControlStats =
282 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
283 LOG_ALWAYS_FATAL_IF(
284 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
285 "ASurfaceControl not found");
286
287 auto& previousReleaseFence = aSurfaceControlStats->second.previousReleaseFence;
288 return (previousReleaseFence) ? previousReleaseFence->dup() : -1;
289}
290
291void ASurfaceTransactionStats_releaseASurfaceControls(ASurfaceControl** aSurfaceControls) {
292 CHECK_NOT_NULL(aSurfaceControls);
293
294 SurfaceControl** surfaceControls = reinterpret_cast<SurfaceControl**>(aSurfaceControls);
295 delete[] surfaceControls;
296}
297
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800298void ASurfaceTransaction_setOnComplete(ASurfaceTransaction* aSurfaceTransaction, void* context,
299 ASurfaceTransaction_OnComplete func) {
300 CHECK_NOT_NULL(aSurfaceTransaction);
301 CHECK_NOT_NULL(context);
302 CHECK_NOT_NULL(func);
303
304 TransactionCompletedCallbackTakesContext callback = [func](void* callback_context,
Marissa Wall1be5a102019-01-18 16:14:04 -0800305 nsecs_t latchTime,
306 const sp<Fence>& presentFence,
307 const std::vector<SurfaceControlStats>& surfaceControlStats) {
308 ASurfaceTransactionStats aSurfaceTransactionStats;
309
310 aSurfaceTransactionStats.latchTime = latchTime;
311 aSurfaceTransactionStats.presentFence = presentFence;
312
313 auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
314
Valerie Haud6a222e2020-01-29 14:27:09 -0800315 for (const auto& [surfaceControl, latchTime, acquireTime, presentFence, previousReleaseFence, transformHint, frameEvents] : surfaceControlStats) {
Marissa Wall1be5a102019-01-18 16:14:04 -0800316 ASurfaceControl* aSurfaceControl = reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
317 aSurfaceControlStats[aSurfaceControl].acquireTime = acquireTime;
318 aSurfaceControlStats[aSurfaceControl].previousReleaseFence = previousReleaseFence;
319 }
320
321 (*func)(callback_context, &aSurfaceTransactionStats);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800322 };
323
324 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
325
326 transaction->addTransactionCompletedCallback(callback, context);
327}
328
Marissa Wall1be5a102019-01-18 16:14:04 -0800329void ASurfaceTransaction_reparent(ASurfaceTransaction* aSurfaceTransaction,
330 ASurfaceControl* aSurfaceControl,
331 ASurfaceControl* newParentASurfaceControl) {
332 CHECK_NOT_NULL(aSurfaceTransaction);
333 CHECK_NOT_NULL(aSurfaceControl);
334
335 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
336 sp<SurfaceControl> newParentSurfaceControl = ASurfaceControl_to_SurfaceControl(
337 newParentASurfaceControl);
Marissa Wall1be5a102019-01-18 16:14:04 -0800338 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
339
Pablo Gamito117040c2020-09-14 08:24:41 +0000340 transaction->reparent(surfaceControl, newParentSurfaceControl);
Marissa Wall1be5a102019-01-18 16:14:04 -0800341}
342
343void ASurfaceTransaction_setVisibility(ASurfaceTransaction* aSurfaceTransaction,
344 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800345 int8_t visibility) {
346 CHECK_NOT_NULL(aSurfaceTransaction);
347 CHECK_NOT_NULL(aSurfaceControl);
348
349 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
350 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
351
352 switch (visibility) {
353 case ASURFACE_TRANSACTION_VISIBILITY_SHOW:
354 transaction->show(surfaceControl);
355 break;
356 case ASURFACE_TRANSACTION_VISIBILITY_HIDE:
357 transaction->hide(surfaceControl);
358 break;
359 default:
360 LOG_ALWAYS_FATAL("invalid visibility %d", visibility);
361 }
362}
363
Marissa Wall1be5a102019-01-18 16:14:04 -0800364void ASurfaceTransaction_setZOrder(ASurfaceTransaction* aSurfaceTransaction,
365 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800366 int32_t z_order) {
367 CHECK_NOT_NULL(aSurfaceTransaction);
368 CHECK_NOT_NULL(aSurfaceControl);
369
370 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
371 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
372
373 transaction->setLayer(surfaceControl, z_order);
374}
375
Marissa Wall1be5a102019-01-18 16:14:04 -0800376void ASurfaceTransaction_setBuffer(ASurfaceTransaction* aSurfaceTransaction,
377 ASurfaceControl* aSurfaceControl,
378 AHardwareBuffer* buffer, int acquire_fence_fd) {
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800379 CHECK_NOT_NULL(aSurfaceTransaction);
380 CHECK_NOT_NULL(aSurfaceControl);
381
382 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
383 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
384
385 sp<GraphicBuffer> graphic_buffer(reinterpret_cast<GraphicBuffer*>(buffer));
386
387 transaction->setBuffer(surfaceControl, graphic_buffer);
Marissa Wall1be5a102019-01-18 16:14:04 -0800388 if (acquire_fence_fd != -1) {
389 sp<Fence> fence = new Fence(acquire_fence_fd);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800390 transaction->setAcquireFence(surfaceControl, fence);
391 }
392}
393
394void ASurfaceTransaction_setGeometry(ASurfaceTransaction* aSurfaceTransaction,
395 ASurfaceControl* aSurfaceControl, const ARect& source,
396 const ARect& destination, int32_t transform) {
397 CHECK_NOT_NULL(aSurfaceTransaction);
398 CHECK_NOT_NULL(aSurfaceControl);
399 CHECK_VALID_RECT(source);
400 CHECK_VALID_RECT(destination);
401
402 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
403 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
404
405 transaction->setCrop(surfaceControl, static_cast<const Rect&>(source));
406 transaction->setFrame(surfaceControl, static_cast<const Rect&>(destination));
407 transaction->setTransform(surfaceControl, transform);
Vishnu Nair1ad69542019-05-23 16:27:45 +0800408 bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
409 NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
410 transaction->setTransformToDisplayInverse(surfaceControl, transformToInverseDisplay);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800411}
412
413void ASurfaceTransaction_setBufferTransparency(ASurfaceTransaction* aSurfaceTransaction,
414 ASurfaceControl* aSurfaceControl,
415 int8_t transparency) {
416 CHECK_NOT_NULL(aSurfaceTransaction);
417 CHECK_NOT_NULL(aSurfaceControl);
418
419 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
420 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
421
422 uint32_t flags = (transparency == ASURFACE_TRANSACTION_TRANSPARENCY_OPAQUE) ?
423 layer_state_t::eLayerOpaque : 0;
424 transaction->setFlags(surfaceControl, flags, layer_state_t::eLayerOpaque);
425}
426
Marissa Wall1be5a102019-01-18 16:14:04 -0800427void ASurfaceTransaction_setDamageRegion(ASurfaceTransaction* aSurfaceTransaction,
428 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800429 const ARect rects[], uint32_t count) {
430 CHECK_NOT_NULL(aSurfaceTransaction);
431 CHECK_NOT_NULL(aSurfaceControl);
432
433 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
434 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
435
436 Region region;
437 for (uint32_t i = 0; i < count; ++i) {
Marissa Wallbb9b14f2019-04-23 14:10:15 -0700438 region.orSelf(static_cast<const Rect&>(rects[i]));
439 }
440
441 // Hardware composer interprets a DamageRegion with a single Rect of {0,0,0,0} to be an
442 // undamaged region and {0,0,-1,-1} to be a fully damaged buffer. This is a confusing
443 // distinction for a public api. Instead, default both cases to be a fully damaged buffer.
444 if (count == 1 && region.getBounds().isEmpty()) {
445 transaction->setSurfaceDamageRegion(surfaceControl, Region::INVALID_REGION);
446 return;
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800447 }
448
449 transaction->setSurfaceDamageRegion(surfaceControl, region);
450}
Marissa Wall1be5a102019-01-18 16:14:04 -0800451
452void ASurfaceTransaction_setDesiredPresentTime(ASurfaceTransaction* aSurfaceTransaction,
453 int64_t desiredPresentTime) {
454 CHECK_NOT_NULL(aSurfaceTransaction);
455
456 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
457
458 transaction->setDesiredPresentTime(static_cast<nsecs_t>(desiredPresentTime));
459}
460
461void ASurfaceTransaction_setBufferAlpha(ASurfaceTransaction* aSurfaceTransaction,
462 ASurfaceControl* aSurfaceControl,
463 float alpha) {
464 CHECK_NOT_NULL(aSurfaceTransaction);
465 CHECK_NOT_NULL(aSurfaceControl);
466
467 LOG_ALWAYS_FATAL_IF(alpha < 0.0 || alpha > 1.0, "invalid alpha");
468
469 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
470 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
471
472 transaction->setAlpha(surfaceControl, alpha);
473}
474
Marissa Wall7f24f792019-02-07 14:06:04 -0800475void ASurfaceTransaction_setBufferDataSpace(ASurfaceTransaction* aSurfaceTransaction,
476 ASurfaceControl* aSurfaceControl,
477 ADataSpace aDataSpace) {
478 CHECK_NOT_NULL(aSurfaceTransaction);
479 CHECK_NOT_NULL(aSurfaceControl);
480
481 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Valerie Hau5e18c432019-08-26 12:48:49 -0700482 if (!isDataSpaceValid(surfaceControl, aDataSpace)) {
483 ALOGE("Failed to set buffer dataspace - invalid dataspace");
484 return;
485 }
Marissa Wall7f24f792019-02-07 14:06:04 -0800486 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
Marissa Wall7f24f792019-02-07 14:06:04 -0800487 transaction->setDataspace(surfaceControl, static_cast<ui::Dataspace>(aDataSpace));
488}
489
Marissa Wall1be5a102019-01-18 16:14:04 -0800490void ASurfaceTransaction_setHdrMetadata_smpte2086(ASurfaceTransaction* aSurfaceTransaction,
491 ASurfaceControl* aSurfaceControl,
492 struct AHdrMetadata_smpte2086* metadata) {
493 CHECK_NOT_NULL(aSurfaceTransaction);
494 CHECK_NOT_NULL(aSurfaceControl);
495
496 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
497 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
498
499 HdrMetadata hdrMetadata;
500
501 if (metadata) {
502 hdrMetadata.smpte2086.displayPrimaryRed.x = metadata->displayPrimaryRed.x;
503 hdrMetadata.smpte2086.displayPrimaryRed.y = metadata->displayPrimaryRed.y;
504 hdrMetadata.smpte2086.displayPrimaryGreen.x = metadata->displayPrimaryGreen.x;
505 hdrMetadata.smpte2086.displayPrimaryGreen.y = metadata->displayPrimaryGreen.y;
506 hdrMetadata.smpte2086.displayPrimaryBlue.x = metadata->displayPrimaryBlue.x;
507 hdrMetadata.smpte2086.displayPrimaryBlue.y = metadata->displayPrimaryBlue.y;
508 hdrMetadata.smpte2086.whitePoint.x = metadata->whitePoint.x;
509 hdrMetadata.smpte2086.whitePoint.y = metadata->whitePoint.y;
510 hdrMetadata.smpte2086.minLuminance = metadata->minLuminance;
511 hdrMetadata.smpte2086.maxLuminance = metadata->maxLuminance;
512
513 hdrMetadata.validTypes |= HdrMetadata::SMPTE2086;
514 } else {
515 hdrMetadata.validTypes &= ~HdrMetadata::SMPTE2086;
516 }
517
518 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
519}
520
521void ASurfaceTransaction_setHdrMetadata_cta861_3(ASurfaceTransaction* aSurfaceTransaction,
522 ASurfaceControl* aSurfaceControl,
523 struct AHdrMetadata_cta861_3* metadata) {
524 CHECK_NOT_NULL(aSurfaceTransaction);
525 CHECK_NOT_NULL(aSurfaceControl);
526
527 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
528 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
529
530 HdrMetadata hdrMetadata;
531
532 if (metadata) {
533 hdrMetadata.cta8613.maxContentLightLevel = metadata->maxContentLightLevel;
534 hdrMetadata.cta8613.maxFrameAverageLightLevel = metadata->maxFrameAverageLightLevel;
535
536 hdrMetadata.validTypes |= HdrMetadata::CTA861_3;
537 } else {
538 hdrMetadata.validTypes &= ~HdrMetadata::CTA861_3;
539 }
540
541 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
542}
Valerie Hau5bbfd512019-01-22 17:39:43 -0800543
544void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction,
545 ASurfaceControl* aSurfaceControl,
546 float r, float g, float b, float alpha,
547 ADataSpace dataspace) {
548 CHECK_NOT_NULL(aSurfaceTransaction);
549 CHECK_NOT_NULL(aSurfaceControl);
550
551 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Valerie Hau5e18c432019-08-26 12:48:49 -0700552 if (!isDataSpaceValid(surfaceControl, dataspace)) {
553 ALOGE("Failed to set buffer dataspace - invalid dataspace");
554 return;
555 }
Valerie Hau5bbfd512019-01-22 17:39:43 -0800556 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
557
558 half3 color;
559 color.r = r;
560 color.g = g;
561 color.b = b;
562
Valerie Hau6bc482312019-01-29 15:01:53 -0800563 transaction->setBackgroundColor(surfaceControl, color, alpha, static_cast<ui::Dataspace>(dataspace));
Valerie Hau5bbfd512019-01-22 17:39:43 -0800564}
Steven Thomas6cf051e2020-01-14 11:37:21 -0800565
566void ASurfaceTransaction_setFrameRate(ASurfaceTransaction* aSurfaceTransaction,
Steven Thomasdd7bf2f2020-01-31 18:50:02 -0800567 ASurfaceControl* aSurfaceControl, float frameRate,
568 int8_t compatibility) {
Marin Shalamanov41ffa8d2020-10-13 12:35:20 +0200569 ASurfaceTransaction_setFrameRateWithSeamlessness(aSurfaceTransaction, aSurfaceControl,
570 frameRate, compatibility,
571 /*shouldBeSeamless*/ true);
572}
573
574void ASurfaceTransaction_setFrameRateWithSeamlessness(ASurfaceTransaction* aSurfaceTransaction,
575 ASurfaceControl* aSurfaceControl,
576 float frameRate, int8_t compatibility,
577 bool shouldBeSeamless) {
Steven Thomas6cf051e2020-01-14 11:37:21 -0800578 CHECK_NOT_NULL(aSurfaceTransaction);
579 CHECK_NOT_NULL(aSurfaceControl);
Steven Thomas6cf051e2020-01-14 11:37:21 -0800580 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
Steven Thomasdd7bf2f2020-01-31 18:50:02 -0800581 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
Marin Shalamanov41ffa8d2020-10-13 12:35:20 +0200582 transaction->setFrameRate(surfaceControl, frameRate, compatibility, shouldBeSeamless);
Steven Thomas6cf051e2020-01-14 11:37:21 -0800583}