[SurfaceFlinger] Add HLG simulation support.
This patch adds GPU fallback configuration in SurfaceFlinger for HLG support,
as well as propagate HLG simulation up to frameworks.
BUG: 73825729
Test: build, flash
Change-Id: I58e52648817b326dee868949c3845f613fd218d6
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index e661f03..e12d7ca 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -1123,12 +1123,16 @@
int status = getBE().mHwc->getHdrCapabilities(
displayDevice->getHwcDisplayId(), &capabilities);
if (status == NO_ERROR) {
- if (displayDevice->hasWideColorGamut() &&
- !displayDevice->hasHDR10Support()) {
- // insert HDR10 as we will force client composition for HDR10
- // layers
+ if (displayDevice->hasWideColorGamut()) {
std::vector<Hdr> types = capabilities.getSupportedHdrTypes();
- types.push_back(Hdr::HDR10);
+ // insert HDR10/HLG as we will force client composition for HDR10/HLG
+ // layers
+ if (!displayDevice->hasHDR10Support()) {
+ types.push_back(Hdr::HDR10);
+ }
+ if (!displayDevice->hasHLGSupport()) {
+ types.push_back(Hdr::HLG);
+ }
*outCapabilities = HdrCapabilities(types,
capabilities.getDesiredMaxLuminance(),
@@ -1904,17 +1908,23 @@
case Dataspace::V0_SCRGB_LINEAR:
// return immediately
return Dataspace::V0_SCRGB_LINEAR;
+ case Dataspace::DISPLAY_P3:
+ bestDataspace = Dataspace::DISPLAY_P3;
+ break;
+ // Historically, HDR dataspaces are ignored by SurfaceFlinger. But
+ // since SurfaceFlinger simulates HDR support now, it should honor
+ // them unless there is also native support.
case Dataspace::BT2020_PQ:
case Dataspace::BT2020_ITU_PQ:
- // Historically, HDR dataspaces are ignored by SurfaceFlinger. But
- // since SurfaceFlinger simulates HDR support now, it should honor
- // them unless there is also native support.
if (!displayDevice->hasHDR10Support()) {
return Dataspace::V0_SCRGB_LINEAR;
}
break;
- case Dataspace::DISPLAY_P3:
- bestDataspace = Dataspace::DISPLAY_P3;
+ case Dataspace::BT2020_HLG:
+ case Dataspace::BT2020_ITU_HLG:
+ if (!displayDevice->hasHLGSupport()) {
+ return Dataspace::V0_SCRGB_LINEAR;
+ }
break;
default:
break;
@@ -2030,6 +2040,11 @@
!displayDevice->hasHDR10Support()) {
layer->forceClientComposition(hwcId);
}
+ if ((layer->getDataSpace() == Dataspace::BT2020_HLG ||
+ layer->getDataSpace() == Dataspace::BT2020_ITU_HLG) &&
+ !displayDevice->hasHLGSupport()) {
+ layer->forceClientComposition(hwcId);
+ }
if (layer->getForceClientComposition(hwcId)) {
ALOGV("[%s] Requesting Client composition", layer->getName().string());