blob: d07052bb3b3f483c5a127f95c38115d77927e5f5 [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:
103 return getHdrSupport(surfaceControl);
104 default:
105 return false;
106 }
107}
108
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800109Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) {
110 return reinterpret_cast<Transaction*>(aSurfaceTransaction);
111}
112
113SurfaceControl* ASurfaceControl_to_SurfaceControl(ASurfaceControl* aSurfaceControl) {
114 return reinterpret_cast<SurfaceControl*>(aSurfaceControl);
115}
116
117void SurfaceControl_acquire(SurfaceControl* surfaceControl) {
118 // incStrong/decStrong token must be the same, doesn't matter what it is
119 surfaceControl->incStrong((void*)SurfaceControl_acquire);
120}
121
122void SurfaceControl_release(SurfaceControl* surfaceControl) {
123 // incStrong/decStrong token must be the same, doesn't matter what it is
124 surfaceControl->decStrong((void*)SurfaceControl_acquire);
125}
126
127ASurfaceControl* ASurfaceControl_createFromWindow(ANativeWindow* window, const char* debug_name) {
128 CHECK_NOT_NULL(window);
129 CHECK_NOT_NULL(debug_name);
130
131 sp<SurfaceComposerClient> client = new SurfaceComposerClient();
132 if (client->initCheck() != NO_ERROR) {
133 return nullptr;
134 }
135
136 uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
137 sp<SurfaceControl> surfaceControl =
138 client->createWithSurfaceParent(String8(debug_name), 0 /* width */, 0 /* height */,
139 // Format is only relevant for buffer queue layers.
140 PIXEL_FORMAT_UNKNOWN /* format */, flags,
141 static_cast<Surface*>(window));
142 if (!surfaceControl) {
143 return nullptr;
144 }
145
146 SurfaceControl_acquire(surfaceControl.get());
147 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
148}
149
150ASurfaceControl* ASurfaceControl_create(ASurfaceControl* parent, const char* debug_name) {
151 CHECK_NOT_NULL(parent);
152 CHECK_NOT_NULL(debug_name);
153
154 SurfaceComposerClient* client = ASurfaceControl_to_SurfaceControl(parent)->getClient().get();
155
156 SurfaceControl* surfaceControlParent = ASurfaceControl_to_SurfaceControl(parent);
157
158 uint32_t flags = ISurfaceComposerClient::eFXSurfaceBufferState;
159 sp<SurfaceControl> surfaceControl =
160 client->createSurface(String8(debug_name), 0 /* width */, 0 /* height */,
161 // Format is only relevant for buffer queue layers.
162 PIXEL_FORMAT_UNKNOWN /* format */, flags,
163 surfaceControlParent);
164 if (!surfaceControl) {
165 return nullptr;
166 }
167
168 SurfaceControl_acquire(surfaceControl.get());
169 return reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
170}
171
Marissa Wall1be5a102019-01-18 16:14:04 -0800172void ASurfaceControl_release(ASurfaceControl* aSurfaceControl) {
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800173 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
174
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800175 SurfaceControl_release(surfaceControl.get());
176}
177
178ASurfaceTransaction* ASurfaceTransaction_create() {
179 Transaction* transaction = new Transaction;
180 return reinterpret_cast<ASurfaceTransaction*>(transaction);
181}
182
183void ASurfaceTransaction_delete(ASurfaceTransaction* aSurfaceTransaction) {
184 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
185 delete transaction;
186}
187
188void ASurfaceTransaction_apply(ASurfaceTransaction* aSurfaceTransaction) {
189 CHECK_NOT_NULL(aSurfaceTransaction);
190
191 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
192
193 transaction->apply();
194}
195
Marissa Wall1be5a102019-01-18 16:14:04 -0800196typedef struct ASurfaceControlStats {
197 int64_t acquireTime;
198 sp<Fence> previousReleaseFence;
199} ASurfaceControlStats;
200
201struct ASurfaceTransactionStats {
202 std::unordered_map<ASurfaceControl*, ASurfaceControlStats> aSurfaceControlStats;
203 int64_t latchTime;
204 sp<Fence> presentFence;
205};
206
207int64_t ASurfaceTransactionStats_getLatchTime(ASurfaceTransactionStats* aSurfaceTransactionStats) {
208 CHECK_NOT_NULL(aSurfaceTransactionStats);
209 return aSurfaceTransactionStats->latchTime;
210}
211
212int ASurfaceTransactionStats_getPresentFenceFd(ASurfaceTransactionStats* aSurfaceTransactionStats) {
213 CHECK_NOT_NULL(aSurfaceTransactionStats);
214 auto& presentFence = aSurfaceTransactionStats->presentFence;
215 return (presentFence) ? presentFence->dup() : -1;
216}
217
218void ASurfaceTransactionStats_getASurfaceControls(ASurfaceTransactionStats* aSurfaceTransactionStats,
219 ASurfaceControl*** outASurfaceControls,
220 size_t* outASurfaceControlsSize) {
221 CHECK_NOT_NULL(aSurfaceTransactionStats);
222 CHECK_NOT_NULL(outASurfaceControls);
223 CHECK_NOT_NULL(outASurfaceControlsSize);
224
225 size_t size = aSurfaceTransactionStats->aSurfaceControlStats.size();
226
227 SurfaceControl** surfaceControls = new SurfaceControl*[size];
228 ASurfaceControl** aSurfaceControls = reinterpret_cast<ASurfaceControl**>(surfaceControls);
229
230 size_t i = 0;
231 for (auto& [aSurfaceControl, aSurfaceControlStats] : aSurfaceTransactionStats->aSurfaceControlStats) {
232 aSurfaceControls[i] = aSurfaceControl;
233 i++;
234 }
235
236 *outASurfaceControls = aSurfaceControls;
237 *outASurfaceControlsSize = size;
238}
239
240int64_t ASurfaceTransactionStats_getAcquireTime(ASurfaceTransactionStats* aSurfaceTransactionStats,
241 ASurfaceControl* aSurfaceControl) {
242 CHECK_NOT_NULL(aSurfaceTransactionStats);
243 CHECK_NOT_NULL(aSurfaceControl);
244
245 const auto& aSurfaceControlStats =
246 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
247 LOG_ALWAYS_FATAL_IF(
248 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
249 "ASurfaceControl not found");
250
251 return aSurfaceControlStats->second.acquireTime;
252}
253
254int ASurfaceTransactionStats_getPreviousReleaseFenceFd(
255 ASurfaceTransactionStats* aSurfaceTransactionStats, ASurfaceControl* aSurfaceControl) {
256 CHECK_NOT_NULL(aSurfaceTransactionStats);
257 CHECK_NOT_NULL(aSurfaceControl);
258
259 const auto& aSurfaceControlStats =
260 aSurfaceTransactionStats->aSurfaceControlStats.find(aSurfaceControl);
261 LOG_ALWAYS_FATAL_IF(
262 aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
263 "ASurfaceControl not found");
264
265 auto& previousReleaseFence = aSurfaceControlStats->second.previousReleaseFence;
266 return (previousReleaseFence) ? previousReleaseFence->dup() : -1;
267}
268
269void ASurfaceTransactionStats_releaseASurfaceControls(ASurfaceControl** aSurfaceControls) {
270 CHECK_NOT_NULL(aSurfaceControls);
271
272 SurfaceControl** surfaceControls = reinterpret_cast<SurfaceControl**>(aSurfaceControls);
273 delete[] surfaceControls;
274}
275
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800276void ASurfaceTransaction_setOnComplete(ASurfaceTransaction* aSurfaceTransaction, void* context,
277 ASurfaceTransaction_OnComplete func) {
278 CHECK_NOT_NULL(aSurfaceTransaction);
279 CHECK_NOT_NULL(context);
280 CHECK_NOT_NULL(func);
281
282 TransactionCompletedCallbackTakesContext callback = [func](void* callback_context,
Marissa Wall1be5a102019-01-18 16:14:04 -0800283 nsecs_t latchTime,
284 const sp<Fence>& presentFence,
285 const std::vector<SurfaceControlStats>& surfaceControlStats) {
286 ASurfaceTransactionStats aSurfaceTransactionStats;
287
288 aSurfaceTransactionStats.latchTime = latchTime;
289 aSurfaceTransactionStats.presentFence = presentFence;
290
291 auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
292
293 for (const auto& [surfaceControl, acquireTime, previousReleaseFence] : surfaceControlStats) {
294 ASurfaceControl* aSurfaceControl = reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
295 aSurfaceControlStats[aSurfaceControl].acquireTime = acquireTime;
296 aSurfaceControlStats[aSurfaceControl].previousReleaseFence = previousReleaseFence;
297 }
298
299 (*func)(callback_context, &aSurfaceTransactionStats);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800300 };
301
302 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
303
304 transaction->addTransactionCompletedCallback(callback, context);
305}
306
Marissa Wall1be5a102019-01-18 16:14:04 -0800307void ASurfaceTransaction_reparent(ASurfaceTransaction* aSurfaceTransaction,
308 ASurfaceControl* aSurfaceControl,
309 ASurfaceControl* newParentASurfaceControl) {
310 CHECK_NOT_NULL(aSurfaceTransaction);
311 CHECK_NOT_NULL(aSurfaceControl);
312
313 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
314 sp<SurfaceControl> newParentSurfaceControl = ASurfaceControl_to_SurfaceControl(
315 newParentASurfaceControl);
316 sp<IBinder> newParentHandle = (newParentSurfaceControl)? newParentSurfaceControl->getHandle() : nullptr;
317 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
318
319 transaction->reparent(surfaceControl, newParentHandle);
320}
321
322void ASurfaceTransaction_setVisibility(ASurfaceTransaction* aSurfaceTransaction,
323 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800324 int8_t visibility) {
325 CHECK_NOT_NULL(aSurfaceTransaction);
326 CHECK_NOT_NULL(aSurfaceControl);
327
328 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
329 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
330
331 switch (visibility) {
332 case ASURFACE_TRANSACTION_VISIBILITY_SHOW:
333 transaction->show(surfaceControl);
334 break;
335 case ASURFACE_TRANSACTION_VISIBILITY_HIDE:
336 transaction->hide(surfaceControl);
337 break;
338 default:
339 LOG_ALWAYS_FATAL("invalid visibility %d", visibility);
340 }
341}
342
Marissa Wall1be5a102019-01-18 16:14:04 -0800343void ASurfaceTransaction_setZOrder(ASurfaceTransaction* aSurfaceTransaction,
344 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800345 int32_t z_order) {
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 transaction->setLayer(surfaceControl, z_order);
353}
354
Marissa Wall1be5a102019-01-18 16:14:04 -0800355void ASurfaceTransaction_setBuffer(ASurfaceTransaction* aSurfaceTransaction,
356 ASurfaceControl* aSurfaceControl,
357 AHardwareBuffer* buffer, int acquire_fence_fd) {
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800358 CHECK_NOT_NULL(aSurfaceTransaction);
359 CHECK_NOT_NULL(aSurfaceControl);
360
361 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
362 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
363
364 sp<GraphicBuffer> graphic_buffer(reinterpret_cast<GraphicBuffer*>(buffer));
365
366 transaction->setBuffer(surfaceControl, graphic_buffer);
Marissa Wall1be5a102019-01-18 16:14:04 -0800367 if (acquire_fence_fd != -1) {
368 sp<Fence> fence = new Fence(acquire_fence_fd);
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800369 transaction->setAcquireFence(surfaceControl, fence);
370 }
371}
372
373void ASurfaceTransaction_setGeometry(ASurfaceTransaction* aSurfaceTransaction,
374 ASurfaceControl* aSurfaceControl, const ARect& source,
375 const ARect& destination, int32_t transform) {
376 CHECK_NOT_NULL(aSurfaceTransaction);
377 CHECK_NOT_NULL(aSurfaceControl);
378 CHECK_VALID_RECT(source);
379 CHECK_VALID_RECT(destination);
380
381 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
382 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
383
384 transaction->setCrop(surfaceControl, static_cast<const Rect&>(source));
385 transaction->setFrame(surfaceControl, static_cast<const Rect&>(destination));
386 transaction->setTransform(surfaceControl, transform);
387}
388
389void ASurfaceTransaction_setBufferTransparency(ASurfaceTransaction* aSurfaceTransaction,
390 ASurfaceControl* aSurfaceControl,
391 int8_t transparency) {
392 CHECK_NOT_NULL(aSurfaceTransaction);
393 CHECK_NOT_NULL(aSurfaceControl);
394
395 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
396 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
397
398 uint32_t flags = (transparency == ASURFACE_TRANSACTION_TRANSPARENCY_OPAQUE) ?
399 layer_state_t::eLayerOpaque : 0;
400 transaction->setFlags(surfaceControl, flags, layer_state_t::eLayerOpaque);
401}
402
Marissa Wall1be5a102019-01-18 16:14:04 -0800403void ASurfaceTransaction_setDamageRegion(ASurfaceTransaction* aSurfaceTransaction,
404 ASurfaceControl* aSurfaceControl,
Marissa Wallf6a73fa2018-12-10 10:41:08 -0800405 const ARect rects[], uint32_t count) {
406 CHECK_NOT_NULL(aSurfaceTransaction);
407 CHECK_NOT_NULL(aSurfaceControl);
408
409 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
410 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
411
412 Region region;
413 for (uint32_t i = 0; i < count; ++i) {
414 region.merge(static_cast<const Rect&>(rects[i]));
415 }
416
417 transaction->setSurfaceDamageRegion(surfaceControl, region);
418}
Marissa Wall1be5a102019-01-18 16:14:04 -0800419
420void ASurfaceTransaction_setDesiredPresentTime(ASurfaceTransaction* aSurfaceTransaction,
421 int64_t desiredPresentTime) {
422 CHECK_NOT_NULL(aSurfaceTransaction);
423
424 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
425
426 transaction->setDesiredPresentTime(static_cast<nsecs_t>(desiredPresentTime));
427}
428
429void ASurfaceTransaction_setBufferAlpha(ASurfaceTransaction* aSurfaceTransaction,
430 ASurfaceControl* aSurfaceControl,
431 float alpha) {
432 CHECK_NOT_NULL(aSurfaceTransaction);
433 CHECK_NOT_NULL(aSurfaceControl);
434
435 LOG_ALWAYS_FATAL_IF(alpha < 0.0 || alpha > 1.0, "invalid alpha");
436
437 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
438 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
439
440 transaction->setAlpha(surfaceControl, alpha);
441}
442
Marissa Wall7f24f792019-02-07 14:06:04 -0800443void ASurfaceTransaction_setBufferDataSpace(ASurfaceTransaction* aSurfaceTransaction,
444 ASurfaceControl* aSurfaceControl,
445 ADataSpace aDataSpace) {
446 CHECK_NOT_NULL(aSurfaceTransaction);
447 CHECK_NOT_NULL(aSurfaceControl);
448
449 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
450 LOG_ALWAYS_FATAL_IF(!isDataSpaceValid(surfaceControl, aDataSpace), "invalid dataspace");
451
452 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
453
454 transaction->setDataspace(surfaceControl, static_cast<ui::Dataspace>(aDataSpace));
455}
456
Marissa Wall1be5a102019-01-18 16:14:04 -0800457void ASurfaceTransaction_setHdrMetadata_smpte2086(ASurfaceTransaction* aSurfaceTransaction,
458 ASurfaceControl* aSurfaceControl,
459 struct AHdrMetadata_smpte2086* metadata) {
460 CHECK_NOT_NULL(aSurfaceTransaction);
461 CHECK_NOT_NULL(aSurfaceControl);
462
463 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
464 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
465
466 HdrMetadata hdrMetadata;
467
468 if (metadata) {
469 hdrMetadata.smpte2086.displayPrimaryRed.x = metadata->displayPrimaryRed.x;
470 hdrMetadata.smpte2086.displayPrimaryRed.y = metadata->displayPrimaryRed.y;
471 hdrMetadata.smpte2086.displayPrimaryGreen.x = metadata->displayPrimaryGreen.x;
472 hdrMetadata.smpte2086.displayPrimaryGreen.y = metadata->displayPrimaryGreen.y;
473 hdrMetadata.smpte2086.displayPrimaryBlue.x = metadata->displayPrimaryBlue.x;
474 hdrMetadata.smpte2086.displayPrimaryBlue.y = metadata->displayPrimaryBlue.y;
475 hdrMetadata.smpte2086.whitePoint.x = metadata->whitePoint.x;
476 hdrMetadata.smpte2086.whitePoint.y = metadata->whitePoint.y;
477 hdrMetadata.smpte2086.minLuminance = metadata->minLuminance;
478 hdrMetadata.smpte2086.maxLuminance = metadata->maxLuminance;
479
480 hdrMetadata.validTypes |= HdrMetadata::SMPTE2086;
481 } else {
482 hdrMetadata.validTypes &= ~HdrMetadata::SMPTE2086;
483 }
484
485 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
486}
487
488void ASurfaceTransaction_setHdrMetadata_cta861_3(ASurfaceTransaction* aSurfaceTransaction,
489 ASurfaceControl* aSurfaceControl,
490 struct AHdrMetadata_cta861_3* metadata) {
491 CHECK_NOT_NULL(aSurfaceTransaction);
492 CHECK_NOT_NULL(aSurfaceControl);
493
494 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
495 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
496
497 HdrMetadata hdrMetadata;
498
499 if (metadata) {
500 hdrMetadata.cta8613.maxContentLightLevel = metadata->maxContentLightLevel;
501 hdrMetadata.cta8613.maxFrameAverageLightLevel = metadata->maxFrameAverageLightLevel;
502
503 hdrMetadata.validTypes |= HdrMetadata::CTA861_3;
504 } else {
505 hdrMetadata.validTypes &= ~HdrMetadata::CTA861_3;
506 }
507
508 transaction->setHdrMetadata(surfaceControl, hdrMetadata);
509}
Valerie Hau5bbfd512019-01-22 17:39:43 -0800510
511void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction,
512 ASurfaceControl* aSurfaceControl,
513 float r, float g, float b, float alpha,
514 ADataSpace dataspace) {
515 CHECK_NOT_NULL(aSurfaceTransaction);
516 CHECK_NOT_NULL(aSurfaceControl);
517
518 sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
519 LOG_ALWAYS_FATAL_IF(!isDataSpaceValid(surfaceControl, dataspace), "invalid dataspace");
520 Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
521
522 half3 color;
523 color.r = r;
524 color.g = g;
525 color.b = b;
526
Valerie Hau6bc482312019-01-29 15:01:53 -0800527 transaction->setBackgroundColor(surfaceControl, color, alpha, static_cast<ui::Dataspace>(dataspace));
Valerie Hau5bbfd512019-01-22 17:39:43 -0800528}