Loading native/android/surface_control.cpp +8 −72 Original line number Original line Diff line number Diff line Loading @@ -44,71 +44,15 @@ using Transaction = SurfaceComposerClient::Transaction; LOG_ALWAYS_FATAL_IF(!static_cast<const Rect&>(name).isValid(), \ LOG_ALWAYS_FATAL_IF(!static_cast<const Rect&>(name).isValid(), \ "invalid arg passed as " #name " argument"); "invalid arg passed as " #name " argument"); static bool getWideColorSupport(const sp<SurfaceControl>& surfaceControl) { sp<SurfaceComposerClient> client = surfaceControl->getClient(); const sp<IBinder> display = client->getInternalDisplayToken(); if (display == nullptr) { ALOGE("unable to get wide color support for disconnected internal display"); return false; } bool isWideColorDisplay = false; status_t err = client->isWideColorDisplay(display, &isWideColorDisplay); if (err) { ALOGE("unable to get wide color support"); return false; } return isWideColorDisplay; } static bool getHdrSupport(const sp<SurfaceControl>& surfaceControl) { sp<SurfaceComposerClient> client = surfaceControl->getClient(); const sp<IBinder> display = client->getInternalDisplayToken(); if (display == nullptr) { ALOGE("unable to get hdr capabilities for disconnected internal display"); return false; } ui::DynamicDisplayInfo info; if (status_t err = client->getDynamicDisplayInfo(display, &info); err != NO_ERROR) { ALOGE("unable to get hdr capabilities"); return err; } return !info.hdrCapabilities.getSupportedHdrTypes().empty(); } static bool isDataSpaceValid(const sp<SurfaceControl>& surfaceControl, ADataSpace dataSpace) { static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN)); static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN)); static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) == static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR)); static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) == static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR)); static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB)); static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB)); static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB)); static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB)); static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) == static_cast<int>(HAL_DATASPACE_DISPLAY_P3)); static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) == static_cast<int>(HAL_DATASPACE_DISPLAY_P3)); static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ)); static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ)); switch (static_cast<android_dataspace_t>(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: if (!getHdrSupport(surfaceControl)) { ALOGE("Invalid dataspace - device does not support hdr"); return false; } return true; default: return false; } } Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) { Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) { return reinterpret_cast<Transaction*>(aSurfaceTransaction); return reinterpret_cast<Transaction*>(aSurfaceTransaction); } } Loading Loading @@ -580,10 +524,6 @@ void ASurfaceTransaction_setBufferDataSpace(ASurfaceTransaction* aSurfaceTransac CHECK_NOT_NULL(aSurfaceControl); CHECK_NOT_NULL(aSurfaceControl); sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl); sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl); if (!isDataSpaceValid(surfaceControl, aDataSpace)) { ALOGE("Failed to set buffer dataspace - invalid dataspace"); return; } Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction); Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction); transaction->setDataspace(surfaceControl, static_cast<ui::Dataspace>(aDataSpace)); transaction->setDataspace(surfaceControl, static_cast<ui::Dataspace>(aDataSpace)); } } Loading Loading @@ -650,10 +590,6 @@ void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction, CHECK_NOT_NULL(aSurfaceControl); CHECK_NOT_NULL(aSurfaceControl); sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl); sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl); if (!isDataSpaceValid(surfaceControl, dataspace)) { ALOGE("Failed to set buffer dataspace - invalid dataspace"); return; } Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction); Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction); half3 color; half3 color; Loading Loading
native/android/surface_control.cpp +8 −72 Original line number Original line Diff line number Diff line Loading @@ -44,71 +44,15 @@ using Transaction = SurfaceComposerClient::Transaction; LOG_ALWAYS_FATAL_IF(!static_cast<const Rect&>(name).isValid(), \ LOG_ALWAYS_FATAL_IF(!static_cast<const Rect&>(name).isValid(), \ "invalid arg passed as " #name " argument"); "invalid arg passed as " #name " argument"); static bool getWideColorSupport(const sp<SurfaceControl>& surfaceControl) { sp<SurfaceComposerClient> client = surfaceControl->getClient(); const sp<IBinder> display = client->getInternalDisplayToken(); if (display == nullptr) { ALOGE("unable to get wide color support for disconnected internal display"); return false; } bool isWideColorDisplay = false; status_t err = client->isWideColorDisplay(display, &isWideColorDisplay); if (err) { ALOGE("unable to get wide color support"); return false; } return isWideColorDisplay; } static bool getHdrSupport(const sp<SurfaceControl>& surfaceControl) { sp<SurfaceComposerClient> client = surfaceControl->getClient(); const sp<IBinder> display = client->getInternalDisplayToken(); if (display == nullptr) { ALOGE("unable to get hdr capabilities for disconnected internal display"); return false; } ui::DynamicDisplayInfo info; if (status_t err = client->getDynamicDisplayInfo(display, &info); err != NO_ERROR) { ALOGE("unable to get hdr capabilities"); return err; } return !info.hdrCapabilities.getSupportedHdrTypes().empty(); } static bool isDataSpaceValid(const sp<SurfaceControl>& surfaceControl, ADataSpace dataSpace) { static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN)); static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN)); static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) == static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR)); static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) == static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR)); static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB)); static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB)); static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB)); static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB)); static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) == static_cast<int>(HAL_DATASPACE_DISPLAY_P3)); static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) == static_cast<int>(HAL_DATASPACE_DISPLAY_P3)); static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ)); static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ)); switch (static_cast<android_dataspace_t>(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: if (!getHdrSupport(surfaceControl)) { ALOGE("Invalid dataspace - device does not support hdr"); return false; } return true; default: return false; } } Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) { Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) { return reinterpret_cast<Transaction*>(aSurfaceTransaction); return reinterpret_cast<Transaction*>(aSurfaceTransaction); } } Loading Loading @@ -580,10 +524,6 @@ void ASurfaceTransaction_setBufferDataSpace(ASurfaceTransaction* aSurfaceTransac CHECK_NOT_NULL(aSurfaceControl); CHECK_NOT_NULL(aSurfaceControl); sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl); sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl); if (!isDataSpaceValid(surfaceControl, aDataSpace)) { ALOGE("Failed to set buffer dataspace - invalid dataspace"); return; } Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction); Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction); transaction->setDataspace(surfaceControl, static_cast<ui::Dataspace>(aDataSpace)); transaction->setDataspace(surfaceControl, static_cast<ui::Dataspace>(aDataSpace)); } } Loading Loading @@ -650,10 +590,6 @@ void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction, CHECK_NOT_NULL(aSurfaceControl); CHECK_NOT_NULL(aSurfaceControl); sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl); sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl); if (!isDataSpaceValid(surfaceControl, dataspace)) { ALOGE("Failed to set buffer dataspace - invalid dataspace"); return; } Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction); Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction); half3 color; half3 color; Loading