diff options
author | Long Ling <longling@google.com> | 2020-11-24 19:19:16 -0800 |
---|---|---|
committer | Long Ling <longling@google.com> | 2020-11-25 13:41:41 -0800 |
commit | e30a2c2ddd2ea5d1ff70a5941428495a815cd56c (patch) | |
tree | b5edb163a2267b268b3d0610f20cc3769f2d004f /libhwc2.1/libmaindisplay | |
parent | 2051c83dbba22f3a5ffe3f99d7576b4494519012 (diff) | |
download | gs101-e30a2c2ddd2ea5d1ff70a5941428495a815cd56c.tar.gz |
libhwc2.1 force layer color update if assigned plane changes
If a layer's assigned plane has changed, force to update the DPP's color
settings.
Bug: 174193808
Change-Id: Ie29f7865afec795de4a4196739946ccd6af15aa6
Diffstat (limited to 'libhwc2.1/libmaindisplay')
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp | 18 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h | 25 |
2 files changed, 34 insertions, 9 deletions
diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp index 1ef6c05..6a8aa80 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp @@ -32,6 +32,12 @@ mpp_phycal_type_t getMPPTypeFromDPPChannel(uint32_t channel) { return MPP_P_TYPE_MAX; } +// enable map layerDataMappingInfo comparison in needDisplayColorSetting() +inline bool operator==(const ExynosPrimaryDisplayModule::DisplaySceneInfo::LayerMappingInfo &lm1, + const ExynosPrimaryDisplayModule::DisplaySceneInfo::LayerMappingInfo &lm2) { + return lm1.dppIdx == lm2.dppIdx && lm1.planeId == lm2.planeId; +} + ExynosPrimaryDisplayModule::ExynosPrimaryDisplayModule(uint32_t __unused type, ExynosDevice *device) : ExynosPrimaryDisplay(HWC_DISPLAY_PRIMARY, device), mDisplayColorLoader(DISPLAY_COLOR_LIB) { @@ -288,7 +294,7 @@ bool ExynosPrimaryDisplayModule::hasDppForLayer(ExynosLayer* layer) if (mDisplaySceneInfo.layerDataMappingInfo.count(layer) == 0) return false; - uint32_t index = mDisplaySceneInfo.layerDataMappingInfo[layer]; + uint32_t index = mDisplaySceneInfo.layerDataMappingInfo[layer].dppIdx; auto size = mDisplayColorInterface->GetPipelineData(DisplayType::DISPLAY_PRIMARY)->Dpp().size(); if (index >= size) { DISPLAY_LOGE("%s: invalid dpp index(%d) dpp size(%zu)", __func__, index, size); @@ -300,7 +306,7 @@ bool ExynosPrimaryDisplayModule::hasDppForLayer(ExynosLayer* layer) const IDisplayColorGS101::IDpp& ExynosPrimaryDisplayModule::getDppForLayer(ExynosLayer* layer) { - uint32_t index = mDisplaySceneInfo.layerDataMappingInfo[layer]; + uint32_t index = mDisplaySceneInfo.layerDataMappingInfo[layer].dppIdx; return mDisplayColorInterface->GetPipelineData(DisplayType::DISPLAY_PRIMARY)->Dpp()[index].get(); } @@ -308,7 +314,7 @@ int32_t ExynosPrimaryDisplayModule::getDppIndexForLayer(ExynosLayer* layer) { if (mDisplaySceneInfo.layerDataMappingInfo.count(layer) == 0) return -1; - uint32_t index = mDisplaySceneInfo.layerDataMappingInfo[layer]; + uint32_t index = mDisplaySceneInfo.layerDataMappingInfo[layer].dppIdx; return static_cast<int32_t>(index); } @@ -346,7 +352,9 @@ int32_t ExynosPrimaryDisplayModule::DisplaySceneInfo::setLayerDataMappingInfo( layer, index); return -EINVAL; } - layerDataMappingInfo.insert(std::make_pair(layer, index)); + uint32_t oldPlaneId = prev_layerDataMappingInfo.count(layer) != 0 ? + prev_layerDataMappingInfo[layer].planeId : UINT_MAX; + layerDataMappingInfo.insert(std::make_pair(layer, LayerMappingInfo{ index, oldPlaneId })); return NO_ERROR; } @@ -557,7 +565,7 @@ void ExynosPrimaryDisplayModule::DisplaySceneInfo::printDisplayScene() ALOGD("layerDataMappingInfo: %zu ++++++", layerDataMappingInfo.size()); for (auto layer : layerDataMappingInfo) { - ALOGD("[layer: %p] %d", layer.first, layer.second); + ALOGD("[layer: %p] [%d, %d]", layer.first, layer.second.dppIdx, layer.second.planeId); } } diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h index 73792a8..4baa6a9 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h @@ -46,17 +46,24 @@ class ExynosPrimaryDisplayModule : public ExynosPrimaryDisplay { class DisplaySceneInfo { public: + struct LayerMappingInfo { + // index in DisplayScene::layer_data + uint32_t dppIdx; + // assigned drm plane id in last color setting update + uint32_t planeId; + }; bool colorSettingChanged = false; DisplayScene displayScene; /* - * Index of LayerColorData in displayScene.layer_data[] + * Index of LayerColorData in DisplayScene::layer_data + * and assigned plane id in last color setting update. * for each layer * key: ExynosLayer* - * data: index in displayScene.layer_data[] + * data: LayerMappingInfo */ - std::map<ExynosLayer*, uint32_t> layerDataMappingInfo; - std::map<ExynosLayer*, uint32_t> prev_layerDataMappingInfo; + std::map<ExynosLayer*, LayerMappingInfo> layerDataMappingInfo; + std::map<ExynosLayer*, LayerMappingInfo> prev_layerDataMappingInfo; void reset() { colorSettingChanged = false; @@ -124,6 +131,15 @@ class ExynosPrimaryDisplayModule : public ExynosPrimaryDisplay { bool hasDppForLayer(ExynosLayer* layer); const IDisplayColorGS101::IDpp& getDppForLayer(ExynosLayer* layer); int32_t getDppIndexForLayer(ExynosLayer* layer); + /* Check if layer's assigned plane id has changed, save the new planeId. + * call only if hasDppForLayer is true */ + bool checkAndSaveLayerPlaneId(ExynosLayer* layer, uint32_t planeId) { + auto &info = mDisplaySceneInfo.layerDataMappingInfo[layer]; + bool change = info.planeId != planeId; + info.planeId = planeId; + return change; + } + size_t getNumOfDpp() { return mDisplayColorInterface->GetPipelineData(DisplayType::DISPLAY_PRIMARY)->Dpp().size(); }; @@ -139,4 +155,5 @@ class ExynosPrimaryDisplayModule : public ExynosPrimaryDisplay { DisplaySceneInfo mDisplaySceneInfo; DisplayColorLoader mDisplayColorLoader; }; + #endif |