From 5bbfd517576d61ee0802c799c45732b14f4c9c01 Mon Sep 17 00:00:00 2001 From: Valerie Hau Date: Tue, 22 Jan 2019 17:39:43 -0800 Subject: [PATCH] Add setColor, setColorAlpha, and setColorDataspace to ASurfaceControl Bug:122326454 Test: atest CtsViewTestCases:android.view.cts.ASurfaceControlTests Change-Id: If41f0a6b736315dbdb829cf3f8fefc654ede9bcf --- native/android/libandroid.map.txt | 1 + native/android/surface_control.cpp | 91 ++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt index 8b45af0c3450b..51afbc7d91b02 100644 --- a/native/android/libandroid.map.txt +++ b/native/android/libandroid.map.txt @@ -231,6 +231,7 @@ LIBANDROID { ASurfaceTransaction_setBuffer; # introduced=29 ASurfaceTransaction_setBufferAlpha; # introduced=29 ASurfaceTransaction_setBufferTransparency; # introduced=29 + ASurfaceTransaction_setColor; # introduced=29 ASurfaceTransaction_setDamageRegion; # introduced=29 ASurfaceTransaction_setDesiredPresentTime; # introduced=29 ASurfaceTransaction_setGeometry; # introduced=29 diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp index f0100a9fd4f95..5fae9d5a7974b 100644 --- a/native/android/surface_control.cpp +++ b/native/android/surface_control.cpp @@ -44,6 +44,76 @@ using Transaction = SurfaceComposerClient::Transaction; LOG_ALWAYS_FATAL_IF(!static_cast(name).isValid(), \ "invalid arg passed as " #name " argument"); +static bool getWideColorSupport(const sp& surfaceControl) { + sp client = surfaceControl->getClient(); + sp display(client->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain)); + + Vector colorModes; + status_t err = client->getDisplayColorModes(display, &colorModes); + if (err) { + ALOGE("unable to get wide color support"); + return false; + } + + bool wideColorBoardConfig = + getBool(false); + + for (android::ui::ColorMode colorMode : colorModes) { + switch (colorMode) { + case ui::ColorMode::DISPLAY_P3: + case ui::ColorMode::ADOBE_RGB: + case ui::ColorMode::DCI_P3: + if (wideColorBoardConfig) { + return true; + } + break; + default: + break; + } + } + return false; +} + +static bool getHdrSupport(const sp& surfaceControl) { + sp client = surfaceControl->getClient(); + sp display(client->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain)); + + HdrCapabilities hdrCapabilities; + status_t err = client->getHdrCapabilities(display, &hdrCapabilities); + if (err) { + ALOGE("unable to get hdr capabilities"); + return false; + } + + return !hdrCapabilities.getSupportedHdrTypes().empty(); +} + +static bool isDataSpaceValid(const sp& surfaceControl, ADataSpace dataSpace) { + static_assert(static_cast(ADATASPACE_UNKNOWN) == static_cast(HAL_DATASPACE_UNKNOWN)); + static_assert(static_cast(ADATASPACE_SCRGB_LINEAR) == static_cast(HAL_DATASPACE_V0_SCRGB_LINEAR)); + static_assert(static_cast(ADATASPACE_SRGB) == static_cast(HAL_DATASPACE_V0_SRGB)); + static_assert(static_cast(ADATASPACE_SCRGB) == static_cast(HAL_DATASPACE_V0_SCRGB)); + static_assert(static_cast(ADATASPACE_DISPLAY_P3) == static_cast(HAL_DATASPACE_DISPLAY_P3)); + static_assert(static_cast(ADATASPACE_BT2020_PQ) == static_cast(HAL_DATASPACE_BT2020_PQ)); + + switch (static_cast(dataSpace)) { + case HAL_DATASPACE_UNKNOWN: + case HAL_DATASPACE_V0_SRGB: + return true; + // These data space need wide gamut support. + case HAL_DATASPACE_V0_SCRGB_LINEAR: + case HAL_DATASPACE_V0_SCRGB: + case HAL_DATASPACE_DISPLAY_P3: + return getWideColorSupport(surfaceControl); + // These data space need HDR support. + case HAL_DATASPACE_BT2020_PQ: + return getHdrSupport(surfaceControl); + default: + return false; + } +} + Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) { return reinterpret_cast(aSurfaceTransaction); } @@ -431,3 +501,24 @@ void ASurfaceTransaction_setHdrMetadata_cta861_3(ASurfaceTransaction* aSurfaceTr transaction->setHdrMetadata(surfaceControl, hdrMetadata); } + +void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction, + ASurfaceControl* aSurfaceControl, + float r, float g, float b, float alpha, + ADataSpace dataspace) { + CHECK_NOT_NULL(aSurfaceTransaction); + CHECK_NOT_NULL(aSurfaceControl); + + sp surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl); + LOG_ALWAYS_FATAL_IF(!isDataSpaceValid(surfaceControl, dataspace), "invalid dataspace"); + Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction); + + half3 color; + color.r = r; + color.g = g; + color.b = b; + + transaction->setColor(surfaceControl, color) + .setColorAlpha(surfaceControl, alpha) + .setColorDataspace(surfaceControl, static_cast(dataspace)); +}