sdm: Disable dynamic destination scalar for multi-display
Disable dynamic destination scalar when more than one display is
active. Dynamic destination scalar introduce the demand for
scaling, and since built-in displays do not have dedicate VIG
pipes, lead to composition strategies exhausted.
Change-Id: Id79851fe964d5eea8b8dad32149f29a4db2842cc
diff --git a/sdm/libs/core/comp_manager.cpp b/sdm/libs/core/comp_manager.cpp
old mode 100644
new mode 100755
index e9152eb..3038c81
--- a/sdm/libs/core/comp_manager.cpp
+++ b/sdm/libs/core/comp_manager.cpp
@@ -688,6 +688,10 @@
return kErrorNone;
}
+uint32_t CompManager::GetActiveDisplayCount() {
+ return powered_on_displays_.size();
+}
+
bool CompManager::SetDisplayState(Handle display_ctx, DisplayState state,
const SyncPoints &sync_points) {
std::lock_guard<std::recursive_mutex> obj(comp_mgr_mutex_);
diff --git a/sdm/libs/core/comp_manager.h b/sdm/libs/core/comp_manager.h
old mode 100644
new mode 100755
index bcc14aa..107921b
--- a/sdm/libs/core/comp_manager.h
+++ b/sdm/libs/core/comp_manager.h
@@ -162,6 +162,7 @@
virtual void TriggerRefresh(int32_t display_id);
std::string Dump();
uint32_t GetMixerCount();
+ uint32_t GetActiveDisplayCount();
private:
static const int kMaxThermalLevel = 3;
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 2161fed..0d182fe 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -2948,9 +2948,14 @@
}
DLOGV_IF(kTagDisplay, "Max area layer at index : %d", max_area_layer_index);
+ uint32_t num_active_displays = comp_manager_->GetActiveDisplayCount();
+
// TODO(user): Mark layer which needs downscaling on GPU fallback as priority layer and use MDP
// for composition to avoid quality mismatch between GPU and MDP switch(idle timeout usecase).
- if (max_layer_area >= fb_area) {
+ if ((max_layer_area > fb_area && (num_active_displays == 1)) || max_layer_area == fb_area) {
+ // Disable dynamic destination scalar when more than one display is active
+ // Dynamic destination scalar introduce the demand for scaling, and since built-in displays
+ // do not have dedicate VIG pipes, lead to composition strategies exhausted.
Layer *layer = layers.at(max_area_layer_index);
bool needs_rotation = (layer->transform.rotation == 90.0f);