blob: 13b307f6c07a400d443de963fbe7f39f1ad7f56c [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();
49 sp<IBinder> display(client->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
Peiyong Lin0d04f322019-01-24 17:49:46 -080050 bool isWideColorDisplay = false;
51 status_t err = client->isWideColorDisplay(display, &isWideColorDisplay);
Valerie Hau5bbfd512019-01-22 17:39:43 -080052 if (err) {
53 ALOGE("unable to get wide color support");
54 return false;
55 }
Peiyong Lin0d04f322019-01-24 17:49:46 -080056 return isWideColorDisplay;
Valerie Hau5bbfd512019-01-22 17:39:43 -080057}
58
59static bool getHdrSupport(const sp<SurfaceControl>& surfaceControl) {
60 sp<SurfaceComposerClient> client = surfaceControl->getClient();
61 sp<IBinder> display(client->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
62
63 HdrCapabilities hdrCapabilities;
64 status_t err = client->getHdrCapabilities(display, &hdrCapabilities);
65 if (err) {
66 ALOGE("unable to get hdr capabilities");
67 return false;
68 }
69
70 return !hdrCapabilities.getSupportedHdrTypes().empty();
71}
72
73static bool isDataSpaceValid(const sp<SurfaceControl>& surfaceControl, ADataSpace dataSpace) {
74 static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN));
75 static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) == static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR));
76 static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB));
77 static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB));
78 static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) == static_cast<int>(HAL_DATASPACE_DISPLAY_P3));
79 static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ));
80
81 switch (static_cast<android_dataspace_t>(dataSpace)) {
82 case HAL_DATASPACE_UNKNOWN:
83 case HAL_DATASPACE_V0_SRGB:
84 return true;
85 // These data space need wide gamut support.
86 case HAL_DATASPACE_V0_SCRGB_LINEAR:
87 case HAL_DATASPACE_V0_SCRGB:
88 case HAL_DATASPACE_DISPLAY_P3:
89 return getWideColorSupport(surfaceControl);
90 // These data space need HDR support.
91 case HAL_DATASPACE_BT2020_PQ:
92 return getHdrSupport(surfaceControl);
93 default:
94 return false;
95 }
96}
97
Marissa Wallf6a73fa2018-12-10 10:41:08 -080098Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) {
99 return reinterpret_cast<Transaction*>(aSurfaceTransaction);
100}
101
102SurfaceControl* ASurfaceControl_to_SurfaceControl(ASurfaceControl* aSurfaceControl) {
103 return reinterpret_cast<SurfaceControl*>(aSurfaceControl);
104}
105
106void SurfaceControl_acquire(SurfaceControl* surfaceControl) {
107 // incStrong/decStrong token must be the same, doesn't matter what it is
108 surfaceControl->incStrong((void*)SurfaceControl_acquire);
109}
110
111void SurfaceControl_release(SurfaceControl* surfaceControl) {
112 // incStrong/decStrong token must be the same, doesn't matter what it is
113 surfaceControl->decStrong((void*)SurfaceControl_acquire);
114}
115
116ASurfaceControl* ASurfaceControl_createFromWindow(ANativeWindow* window, const char* debug_name) {
117 CHECK_NOT_NULL(window);
118 CHECK_NOT_NULL(debug_name);
119
120 sp<SurfaceComposerClient> client = new SurfaceComposerClient();
121 if (client->initCheck() != NO_ERROR) {
122 return nullptr;
123 }
124
125 uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
126 sp<SurfaceControl> surfaceControl =
127 client->createWithSurfaceParent(String8(debug_name), 0 /* width */, 0 /* height */,
128 // Format is only relevant for buffer queue layers.
129 PIXEL_FORMAT_UNKNOWN /* format */, flags,
130 static_cast<Surface*>(window));
131 if (!surfaceControl) {
132 return nullptr;
133 }
134
135 SurfaceControl_acquire(surfaceControl.get());
136 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
137}
138
139ASurfaceControl* ASurfaceControl_create(ASurfaceControl* parent, const char* debug_name) {
140 CHECK_NOT_NULL(parent);
141 CHECK_NOT_NULL(debug_name);
142
143 SurfaceComposerClient* client = ASurfaceControl_to_SurfaceControl(parent)->getClient().get();
144
145 SurfaceControl* surfaceControlParent = ASurfaceControl_to_SurfaceControl(parent);
146
147 uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
148 sp<SurfaceControl> surfaceControl =
149 client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
150 // Format is only relevant for buffer queue layers.
151 PIXEL_FORMAT_UNKNOWN /* format */, flags,
152 surfaceControlParent);
153 if (!surfaceControl) {
154 return nullptr;
155 }
156
157 SurfaceControl_acquire(surfaceControl.get());
158 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
159}
160
Marissa Wall1be5a102019-01-18 16:14:04 -0800161void ASurfaceControl_release(ASurfaceControl* aSurfaceControl) {
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800162 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
163
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800164 SurfaceControl_release(surfaceControl.get());
165}
166
167ASurfaceTransaction* ASurfaceTransaction_create() {
168 Transaction* transaction = new Transaction;
169 return reinterpret_cast<ASurfaceTransaction*>(transaction);
170}
171
172void ASurfaceTransaction_delete(ASurfaceTransaction* aSurfaceTransaction) {
173 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
174 delete transaction;
175}
176
177void ASurfaceTransaction_apply(ASurfaceTransaction* aSurfaceTransaction) {
178 CHECK_NOT_NULL(aSurfaceTransaction);
179
180 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
181
182 transaction->apply();
183}
184
Marissa Wall1be5a102019-01-18 16:14:04 -0800185typedef struct ASurfaceControlStats {
186 int64_t acquireTime;
187 sp<Fence> previousReleaseFence;
188} ASurfaceControlStats;
189
190struct ASurfaceTransactionStats {
191 std::unordered_map<ASurfaceControl*, ASurfaceControlStats> aSurfaceControlStats;
192 int64_t latchTime;
193 sp<Fence> presentFence;
194};
195
196int64_t ASurfaceTransactionStats_getLatchTime(ASurfaceTransactionStats* aSurfaceTransactionStats) {
197 CHECK_NOT_NULL(aSurfaceTransactionStats);
198 return aSurfaceTransactionStats->latchTime;
199}
200
201int ASurfaceTransactionStats_getPresentFenceFd(ASurfaceTransactionStats* aSurfaceTransactionStats) {
202 CHECK_NOT_NULL(aSurfaceTransactionStats);
203 auto& presentFence = aSurfaceTransactionStats->presentFence;
204 return (presentFence) ? presentFence->dup() : -1;
205}
206
207void ASurfaceTransactionStats_getASurfaceControls(ASurfaceTransactionStats* aSurfaceTransactionStats,
208 ASurfaceControl*** outASurfaceControls,
209 size_t* outASurfaceControlsSize) {
210 CHECK_NOT_NULL(aSurfaceTransactionStats);
211 CHECK_NOT_NULL(outASurfaceControls);
212 CHECK_NOT_NULL(outASurfaceControlsSize);
213
214 size_t size = aSurfaceTransactionStats->aSurfaceControlStats.size();
215
216 SurfaceControl** surfaceControls = new SurfaceControl*[size];
217 ASurfaceControl** aSurfaceControls = reinterpret_cast<ASurfaceControl**>(surfaceControls);
218
219 size_t i = 0;
220 for (auto& [aSurfaceControl, aSurfaceControlStats] : aSurfaceTransactionStats->aSurfaceControlStats) {
221 aSurfaceControls[i] = aSurfaceControl;
222 i++;
223 }
224
225 *outASurfaceControls = aSurfaceControls;
226 *outASurfaceControlsSize = size;
227}
228
229int64_t ASurfaceTransactionStats_getAcquireTime(ASurfaceTransactionStats* aSurfaceTransactionStats,
230 ASurfaceControl* aSurfaceControl) {
231 CHECK_NOT_NULL(aSurfaceTransactionStats);
232 CHECK_NOT_NULL(aSurfaceControl);
233
234 const auto& aSurfaceControlStats =
235 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
236 LOG_ALWAYS_FATAL_IF(
237 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
238 "ASurfaceControl not found");
239
240 return aSurfaceControlStats->second.acquireTime;
241}
242
243int ASurfaceTransactionStats_getPreviousReleaseFenceFd(
244 ASurfaceTransactionStats* aSurfaceTransactionStats, ASurfaceControl* aSurfaceControl) {
245 CHECK_NOT_NULL(aSurfaceTransactionStats);
246 CHECK_NOT_NULL(aSurfaceControl);
247
248 const auto& aSurfaceControlStats =
249 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
250 LOG_ALWAYS_FATAL_IF(
251 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
252 "ASurfaceControl not found");
253
254 auto& previousReleaseFence = aSurfaceControlStats->second.previousReleaseFence;
255 return (previousReleaseFence) ? previousReleaseFence->dup() : -1;
256}
257
258void ASurfaceTransactionStats_releaseASurfaceControls(ASurfaceControl** aSurfaceControls) {
259 CHECK_NOT_NULL(aSurfaceControls);
260
261 SurfaceControl** surfaceControls = reinterpret_cast<SurfaceControl**>(aSurfaceControls);
262 delete[] surfaceControls;
263}
264
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800265void ASurfaceTransaction_setOnComplete(ASurfaceTransaction* aSurfaceTransaction, void* context,
266 ASurfaceTransaction_OnComplete func) {
267 CHECK_NOT_NULL(aSurfaceTransaction);
268 CHECK_NOT_NULL(context);
269 CHECK_NOT_NULL(func);
270
271 TransactionCompletedCallbackTakesContext callback = [func](void* callback_context,
Marissa Wall1be5a102019-01-18 16:14:04 -0800272 nsecs_t latchTime,
273 const sp<Fence>& presentFence,
274 const std::vector<SurfaceControlStats>& surfaceControlStats) {
275 ASurfaceTransactionStats aSurfaceTransactionStats;
276
277 aSurfaceTransactionStats.latchTime = latchTime;
278 aSurfaceTransactionStats.presentFence = presentFence;
279
280 auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
281
282 for (const auto& [surfaceControl, acquireTime, previousReleaseFence] : surfaceControlStats) {
283 ASurfaceControl* aSurfaceControl = reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
284 aSurfaceControlStats[aSurfaceControl].acquireTime = acquireTime;
285 aSurfaceControlStats[aSurfaceControl].previousReleaseFence = previousReleaseFence;
286 }
287
288 (*func)(callback_context, &aSurfaceTransactionStats);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800289 };
290
291 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
292
293 transaction->addTransactionCompletedCallback(callback, context);
294}
295
Marissa Wall1be5a102019-01-18 16:14:04 -0800296void ASurfaceTransaction_reparent(ASurfaceTransaction* aSurfaceTransaction,
297 ASurfaceControl* aSurfaceControl,
298 ASurfaceControl* newParentASurfaceControl) {
299 CHECK_NOT_NULL(aSurfaceTransaction);
300 CHECK_NOT_NULL(aSurfaceControl);
301
302 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
303 sp<SurfaceControl> newParentSurfaceControl = ASurfaceControl_to_SurfaceControl(
304 newParentASurfaceControl);
305 sp<IBinder> newParentHandle = (newParentSurfaceControl)? newParentSurfaceControl->getHandle() : nullptr;
306 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
307
308 transaction->reparent(surfaceControl, newParentHandle);
309}
310
311void ASurfaceTransaction_setVisibility(ASurfaceTransaction* aSurfaceTransaction,
312 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800313 int8_t visibility) {
314 CHECK_NOT_NULL(aSurfaceTransaction);
315 CHECK_NOT_NULL(aSurfaceControl);
316
317 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
318 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
319
320 switch (visibility) {
321 case ASURFACE_TRANSACTION_VISIBILITY_SHOW:
322 transaction->show(surfaceControl);
323 break;
324 case ASURFACE_TRANSACTION_VISIBILITY_HIDE:
325 transaction->hide(surfaceControl);
326 break;
327 default:
328 LOG_ALWAYS_FATAL("invalid visibility %d", visibility);
329 }
330}
331
Marissa Wall1be5a102019-01-18 16:14:04 -0800332void ASurfaceTransaction_setZOrder(ASurfaceTransaction* aSurfaceTransaction,
333 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800334 int32_t z_order) {
335 CHECK_NOT_NULL(aSurfaceTransaction);
336 CHECK_NOT_NULL(aSurfaceControl);
337
338 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
339 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
340
341 transaction->setLayer(surfaceControl, z_order);
342}
343
Marissa Wall1be5a102019-01-18 16:14:04 -0800344void ASurfaceTransaction_setBuffer(ASurfaceTransaction* aSurfaceTransaction,
345 ASurfaceControl* aSurfaceControl,
346 AHardwareBuffer* buffer, int acquire_fence_fd) {
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800347 CHECK_NOT_NULL(aSurfaceTransaction);
348 CHECK_NOT_NULL(aSurfaceControl);
349
350 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
351 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
352
353 sp<GraphicBuffer> graphic_buffer(reinterpret_cast<GraphicBuffer*>(buffer));
354
355 transaction->setBuffer(surfaceControl, graphic_buffer);
Marissa Wall1be5a102019-01-18 16:14:04 -0800356 if (acquire_fence_fd != -1) {
357 sp<Fence> fence = new Fence(acquire_fence_fd);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800358 transaction->setAcquireFence(surfaceControl, fence);
359 }
360}
361
362void ASurfaceTransaction_setGeometry(ASurfaceTransaction* aSurfaceTransaction,
363 ASurfaceControl* aSurfaceControl, const ARect& source,
364 const ARect& destination, int32_t transform) {
365 CHECK_NOT_NULL(aSurfaceTransaction);
366 CHECK_NOT_NULL(aSurfaceControl);
367 CHECK_VALID_RECT(source);
368 CHECK_VALID_RECT(destination);
369
370 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
371 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
372
373 transaction->setCrop(surfaceControl, static_cast<const Rect&>(source));
374 transaction->setFrame(surfaceControl, static_cast<const Rect&>(destination));
375 transaction->setTransform(surfaceControl, transform);
376}
377
378void ASurfaceTransaction_setBufferTransparency(ASurfaceTransaction* aSurfaceTransaction,
379 ASurfaceControl* aSurfaceControl,
380 int8_t transparency) {
381 CHECK_NOT_NULL(aSurfaceTransaction);
382 CHECK_NOT_NULL(aSurfaceControl);
383
384 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
385 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
386
387 uint32_t flags = (transparency == ASURFACE_TRANSACTION_TRANSPARENCY_OPAQUE) ?
388 layer_state_t::eLayerOpaque : 0;
389 transaction->setFlags(surfaceControl, flags, layer_state_t::eLayerOpaque);
390}
391
Marissa Wall1be5a102019-01-18 16:14:04 -0800392void ASurfaceTransaction_setDamageRegion(ASurfaceTransaction* aSurfaceTransaction,
393 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800394 const ARect rects[], uint32_t count) {
395 CHECK_NOT_NULL(aSurfaceTransaction);
396 CHECK_NOT_NULL(aSurfaceControl);
397
398 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
399 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
400
401 Region region;
402 for (uint32_t i = 0; i < count; ++i) {
403 region.merge(static_cast<const Rect&>(rects[i]));
404 }
405
406 transaction->setSurfaceDamageRegion(surfaceControl, region);
407}
Marissa Wall1be5a102019-01-18 16:14:04 -0800408
409void ASurfaceTransaction_setDesiredPresentTime(ASurfaceTransaction* aSurfaceTransaction,
410 int64_t desiredPresentTime) {
411 CHECK_NOT_NULL(aSurfaceTransaction);
412
413 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
414
415 transaction->setDesiredPresentTime(static_cast<nsecs_t>(desiredPresentTime));
416}
417
418void ASurfaceTransaction_setBufferAlpha(ASurfaceTransaction* aSurfaceTransaction,
419 ASurfaceControl* aSurfaceControl,
420 float alpha) {
421 CHECK_NOT_NULL(aSurfaceTransaction);
422 CHECK_NOT_NULL(aSurfaceControl);
423
424 LOG_ALWAYS_FATAL_IF(alpha < 0.0 || alpha > 1.0, "invalid alpha");
425
426 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
427 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
428
429 transaction->setAlpha(surfaceControl, alpha);
430}
431
Marissa Wall7f24f792019-02-07 14:06:04 -0800432void ASurfaceTransaction_setBufferDataSpace(ASurfaceTransaction* aSurfaceTransaction,
433 ASurfaceControl* aSurfaceControl,
434 ADataSpace aDataSpace) {
435 CHECK_NOT_NULL(aSurfaceTransaction);
436 CHECK_NOT_NULL(aSurfaceControl);
437
438 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
439 LOG_ALWAYS_FATAL_IF(!isDataSpaceValid(surfaceControl, aDataSpace), "invalid dataspace");
440
441 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
442
443 transaction->setDataspace(surfaceControl, static_cast<ui::Dataspace>(aDataSpace));
444}
445
Marissa Wall1be5a102019-01-18 16:14:04 -0800446void ASurfaceTransaction_setHdrMetadata_smpte2086(ASurfaceTransaction* aSurfaceTransaction,
447 ASurfaceControl* aSurfaceControl,
448 struct AHdrMetadata_smpte2086* metadata) {
449 CHECK_NOT_NULL(aSurfaceTransaction);
450 CHECK_NOT_NULL(aSurfaceControl);
451
452 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
453 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
454
455 HdrMetadata hdrMetadata;
456
457 if (metadata) {
458 hdrMetadata.smpte2086.displayPrimaryRed.x = metadata->displayPrimaryRed.x;
459 hdrMetadata.smpte2086.displayPrimaryRed.y = metadata->displayPrimaryRed.y;
460 hdrMetadata.smpte2086.displayPrimaryGreen.x = metadata->displayPrimaryGreen.x;
461 hdrMetadata.smpte2086.displayPrimaryGreen.y = metadata->displayPrimaryGreen.y;
462 hdrMetadata.smpte2086.displayPrimaryBlue.x = metadata->displayPrimaryBlue.x;
463 hdrMetadata.smpte2086.displayPrimaryBlue.y = metadata->displayPrimaryBlue.y;
464 hdrMetadata.smpte2086.whitePoint.x = metadata->whitePoint.x;
465 hdrMetadata.smpte2086.whitePoint.y = metadata->whitePoint.y;
466 hdrMetadata.smpte2086.minLuminance = metadata->minLuminance;
467 hdrMetadata.smpte2086.maxLuminance = metadata->maxLuminance;
468
469 hdrMetadata.validTypes |= HdrMetadata::SMPTE2086;
470 } else {
471 hdrMetadata.validTypes &= ~HdrMetadata::SMPTE2086;
472 }
473
474 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
475}
476
477void ASurfaceTransaction_setHdrMetadata_cta861_3(ASurfaceTransaction* aSurfaceTransaction,
478 ASurfaceControl* aSurfaceControl,
479 struct AHdrMetadata_cta861_3* metadata) {
480 CHECK_NOT_NULL(aSurfaceTransaction);
481 CHECK_NOT_NULL(aSurfaceControl);
482
483 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
484 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
485
486 HdrMetadata hdrMetadata;
487
488 if (metadata) {
489 hdrMetadata.cta8613.maxContentLightLevel = metadata->maxContentLightLevel;
490 hdrMetadata.cta8613.maxFrameAverageLightLevel = metadata->maxFrameAverageLightLevel;
491
492 hdrMetadata.validTypes |= HdrMetadata::CTA861_3;
493 } else {
494 hdrMetadata.validTypes &= ~HdrMetadata::CTA861_3;
495 }
496
497 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
498}
Valerie Hau5bbfd512019-01-22 17:39:43 -0800499
500void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction,
501 ASurfaceControl* aSurfaceControl,
502 float r, float g, float b, float alpha,
503 ADataSpace dataspace) {
504 CHECK_NOT_NULL(aSurfaceTransaction);
505 CHECK_NOT_NULL(aSurfaceControl);
506
507 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
508 LOG_ALWAYS_FATAL_IF(!isDataSpaceValid(surfaceControl, dataspace), "invalid dataspace");
509 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
510
511 half3 color;
512 color.r = r;
513 color.g = g;
514 color.b = b;
515
516 transaction->setColor(surfaceControl, color)
517 .setColorAlpha(surfaceControl, alpha)
518 .setColorDataspace(surfaceControl, static_cast<ui::Dataspace>(dataspace));
519}