Loading services/surfaceflinger/SurfaceFlinger.cpp +25 −10 Original line number Original line Diff line number Diff line Loading @@ -1123,12 +1123,16 @@ status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& display, int status = getBE().mHwc->getHdrCapabilities( int status = getBE().mHwc->getHdrCapabilities( displayDevice->getHwcDisplayId(), &capabilities); displayDevice->getHwcDisplayId(), &capabilities); if (status == NO_ERROR) { if (status == NO_ERROR) { if (displayDevice->hasWideColorGamut() && if (displayDevice->hasWideColorGamut()) { !displayDevice->hasHDR10Support()) { // insert HDR10 as we will force client composition for HDR10 // layers std::vector<Hdr> types = capabilities.getSupportedHdrTypes(); std::vector<Hdr> types = capabilities.getSupportedHdrTypes(); // insert HDR10/HLG as we will force client composition for HDR10/HLG // layers if (!displayDevice->hasHDR10Support()) { types.push_back(Hdr::HDR10); types.push_back(Hdr::HDR10); } if (!displayDevice->hasHLGSupport()) { types.push_back(Hdr::HLG); } *outCapabilities = HdrCapabilities(types, *outCapabilities = HdrCapabilities(types, capabilities.getDesiredMaxLuminance(), capabilities.getDesiredMaxLuminance(), Loading Loading @@ -1904,17 +1908,23 @@ ui::Dataspace SurfaceFlinger::getBestDataspace( case Dataspace::V0_SCRGB_LINEAR: case Dataspace::V0_SCRGB_LINEAR: // return immediately // return immediately return Dataspace::V0_SCRGB_LINEAR; return Dataspace::V0_SCRGB_LINEAR; case Dataspace::BT2020_PQ: case Dataspace::DISPLAY_P3: case Dataspace::BT2020_ITU_PQ: bestDataspace = Dataspace::DISPLAY_P3; break; // Historically, HDR dataspaces are ignored by SurfaceFlinger. But // Historically, HDR dataspaces are ignored by SurfaceFlinger. But // since SurfaceFlinger simulates HDR support now, it should honor // since SurfaceFlinger simulates HDR support now, it should honor // them unless there is also native support. // them unless there is also native support. case Dataspace::BT2020_PQ: case Dataspace::BT2020_ITU_PQ: if (!displayDevice->hasHDR10Support()) { if (!displayDevice->hasHDR10Support()) { return Dataspace::V0_SCRGB_LINEAR; return Dataspace::V0_SCRGB_LINEAR; } } break; break; case Dataspace::DISPLAY_P3: case Dataspace::BT2020_HLG: bestDataspace = Dataspace::DISPLAY_P3; case Dataspace::BT2020_ITU_HLG: if (!displayDevice->hasHLGSupport()) { return Dataspace::V0_SCRGB_LINEAR; } break; break; default: default: break; break; Loading Loading @@ -2030,6 +2040,11 @@ void SurfaceFlinger::setUpHWComposer() { !displayDevice->hasHDR10Support()) { !displayDevice->hasHDR10Support()) { layer->forceClientComposition(hwcId); layer->forceClientComposition(hwcId); } } if ((layer->getDataSpace() == Dataspace::BT2020_HLG || layer->getDataSpace() == Dataspace::BT2020_ITU_HLG) && !displayDevice->hasHLGSupport()) { layer->forceClientComposition(hwcId); } if (layer->getForceClientComposition(hwcId)) { if (layer->getForceClientComposition(hwcId)) { ALOGV("[%s] Requesting Client composition", layer->getName().string()); ALOGV("[%s] Requesting Client composition", layer->getName().string()); Loading Loading
services/surfaceflinger/SurfaceFlinger.cpp +25 −10 Original line number Original line Diff line number Diff line Loading @@ -1123,12 +1123,16 @@ status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& display, int status = getBE().mHwc->getHdrCapabilities( int status = getBE().mHwc->getHdrCapabilities( displayDevice->getHwcDisplayId(), &capabilities); displayDevice->getHwcDisplayId(), &capabilities); if (status == NO_ERROR) { if (status == NO_ERROR) { if (displayDevice->hasWideColorGamut() && if (displayDevice->hasWideColorGamut()) { !displayDevice->hasHDR10Support()) { // insert HDR10 as we will force client composition for HDR10 // layers std::vector<Hdr> types = capabilities.getSupportedHdrTypes(); std::vector<Hdr> types = capabilities.getSupportedHdrTypes(); // insert HDR10/HLG as we will force client composition for HDR10/HLG // layers if (!displayDevice->hasHDR10Support()) { types.push_back(Hdr::HDR10); types.push_back(Hdr::HDR10); } if (!displayDevice->hasHLGSupport()) { types.push_back(Hdr::HLG); } *outCapabilities = HdrCapabilities(types, *outCapabilities = HdrCapabilities(types, capabilities.getDesiredMaxLuminance(), capabilities.getDesiredMaxLuminance(), Loading Loading @@ -1904,17 +1908,23 @@ ui::Dataspace SurfaceFlinger::getBestDataspace( case Dataspace::V0_SCRGB_LINEAR: case Dataspace::V0_SCRGB_LINEAR: // return immediately // return immediately return Dataspace::V0_SCRGB_LINEAR; return Dataspace::V0_SCRGB_LINEAR; case Dataspace::BT2020_PQ: case Dataspace::DISPLAY_P3: case Dataspace::BT2020_ITU_PQ: bestDataspace = Dataspace::DISPLAY_P3; break; // Historically, HDR dataspaces are ignored by SurfaceFlinger. But // Historically, HDR dataspaces are ignored by SurfaceFlinger. But // since SurfaceFlinger simulates HDR support now, it should honor // since SurfaceFlinger simulates HDR support now, it should honor // them unless there is also native support. // them unless there is also native support. case Dataspace::BT2020_PQ: case Dataspace::BT2020_ITU_PQ: if (!displayDevice->hasHDR10Support()) { if (!displayDevice->hasHDR10Support()) { return Dataspace::V0_SCRGB_LINEAR; return Dataspace::V0_SCRGB_LINEAR; } } break; break; case Dataspace::DISPLAY_P3: case Dataspace::BT2020_HLG: bestDataspace = Dataspace::DISPLAY_P3; case Dataspace::BT2020_ITU_HLG: if (!displayDevice->hasHLGSupport()) { return Dataspace::V0_SCRGB_LINEAR; } break; break; default: default: break; break; Loading Loading @@ -2030,6 +2040,11 @@ void SurfaceFlinger::setUpHWComposer() { !displayDevice->hasHDR10Support()) { !displayDevice->hasHDR10Support()) { layer->forceClientComposition(hwcId); layer->forceClientComposition(hwcId); } } if ((layer->getDataSpace() == Dataspace::BT2020_HLG || layer->getDataSpace() == Dataspace::BT2020_ITU_HLG) && !displayDevice->hasHLGSupport()) { layer->forceClientComposition(hwcId); } if (layer->getForceClientComposition(hwcId)) { if (layer->getForceClientComposition(hwcId)) { ALOGV("[%s] Requesting Client composition", layer->getName().string()); ALOGV("[%s] Requesting Client composition", layer->getName().string()); Loading