summaryrefslogtreecommitdiff
path: root/libhwc2.1/libmaindisplay
diff options
context:
space:
mode:
authorLong Ling <longling@google.com>2020-11-24 19:19:16 -0800
committerLong Ling <longling@google.com>2020-11-25 13:41:41 -0800
commite30a2c2ddd2ea5d1ff70a5941428495a815cd56c (patch)
treeb5edb163a2267b268b3d0610f20cc3769f2d004f /libhwc2.1/libmaindisplay
parent2051c83dbba22f3a5ffe3f99d7576b4494519012 (diff)
downloadgs101-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.cpp18
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h25
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