summaryrefslogtreecommitdiff
path: root/sdm
diff options
context:
space:
mode:
authorAnjaneya Prasad Musunuri <aprasad@codeaurora.org>2017-05-18 19:11:28 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2017-05-25 06:42:12 -0700
commit4d65df7ae4320814dbc643b79c65ed6d59152e2f (patch)
tree7d1f29d87bd4133c7a6a06f689a4d0ba587e400a /sdm
parent61f6095acb7d0c4e22059605465ae8002bd63673 (diff)
downloaddisplay-4d65df7ae4320814dbc643b79c65ed6d59152e2f.tar.gz
sdm: Decouple refresh and idle fall back handling
Refresh can be called from SDM for multiple events. Refresh should not be coupled with idle fall back. CRs-Fixed: 2050936 Change-Id: I1d88f93ce81ef190dce396819896a249e5bad847
Diffstat (limited to 'sdm')
-rw-r--r--sdm/include/core/display_interface.h6
-rw-r--r--sdm/libs/core/display_hdmi.cpp13
-rw-r--r--sdm/libs/core/display_hdmi.h3
-rw-r--r--sdm/libs/core/display_primary.cpp21
-rw-r--r--sdm/libs/core/display_primary.h4
-rw-r--r--sdm/libs/core/display_virtual.h2
-rw-r--r--sdm/libs/hwc/hwc_display_external.cpp11
-rw-r--r--sdm/libs/hwc/hwc_display_primary.cpp15
-rw-r--r--sdm/libs/hwc/hwc_display_primary.h1
-rw-r--r--sdm/libs/hwc2/hwc_display_external.cpp2
-rw-r--r--sdm/libs/hwc2/hwc_display_primary.cpp13
-rw-r--r--sdm/libs/hwc2/hwc_display_primary.h1
12 files changed, 47 insertions, 45 deletions
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h
index f4054bb5..524141ec 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -455,11 +455,13 @@ class DisplayInterface {
/*! @brief Method to set the refresh rate of a display.
- @param[in] new refresh rate of the display.
+ @param[in] refresh_rate new refresh rate of the display.
+
+ @param[in] final_rate indicates whether refresh rate is final rate or can be changed by sdm
@return \link DisplayError \endlink
*/
- virtual DisplayError SetRefreshRate(uint32_t refresh_rate) = 0;
+ virtual DisplayError SetRefreshRate(uint32_t refresh_rate, bool final_rate) = 0;
/*! @brief Method to query whether scanning is support for the HDMI display.
diff --git a/sdm/libs/core/display_hdmi.cpp b/sdm/libs/core/display_hdmi.cpp
index 2ee863c0..b31ac94d 100644
--- a/sdm/libs/core/display_hdmi.cpp
+++ b/sdm/libs/core/display_hdmi.cpp
@@ -94,6 +94,8 @@ DisplayError DisplayHDMI::Init() {
DLOGE("Failed to create hardware events interface. Error = %d", error);
}
+ current_refresh_rate_ = hw_panel_info_.max_fps;
+
return error;
}
@@ -135,18 +137,21 @@ DisplayError DisplayHDMI::GetRefreshRateRange(uint32_t *min_refresh_rate,
return error;
}
-DisplayError DisplayHDMI::SetRefreshRate(uint32_t refresh_rate) {
+DisplayError DisplayHDMI::SetRefreshRate(uint32_t refresh_rate, bool final_rate) {
lock_guard<recursive_mutex> obj(recursive_mutex_);
if (!active_) {
return kErrorPermission;
}
- DisplayError error = hw_intf_->SetRefreshRate(refresh_rate);
- if (error != kErrorNone) {
- return error;
+ if (current_refresh_rate_ != refresh_rate) {
+ DisplayError error = hw_intf_->SetRefreshRate(refresh_rate);
+ if (error != kErrorNone) {
+ return error;
+ }
}
+ current_refresh_rate_ = refresh_rate;
return DisplayBase::ReconfigureDisplay();
}
diff --git a/sdm/libs/core/display_hdmi.h b/sdm/libs/core/display_hdmi.h
index a6c1f517..ca09ce36 100644
--- a/sdm/libs/core/display_hdmi.h
+++ b/sdm/libs/core/display_hdmi.h
@@ -44,7 +44,7 @@ class DisplayHDMI : public DisplayBase, HWEventHandler {
virtual DisplayError Init();
virtual DisplayError Prepare(LayerStack *layer_stack);
virtual DisplayError GetRefreshRateRange(uint32_t *min_refresh_rate, uint32_t *max_refresh_rate);
- virtual DisplayError SetRefreshRate(uint32_t refresh_rate);
+ virtual DisplayError SetRefreshRate(uint32_t refresh_rate, bool final_rate);
virtual bool IsUnderscanSupported();
virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level);
@@ -66,6 +66,7 @@ class DisplayHDMI : public DisplayBase, HWEventHandler {
std::map<LayerBufferS3DFormat, HWS3DMode> s3d_format_to_mode_;
std::vector<HWEvent> event_list_ = { HWEvent::VSYNC, HWEvent::IDLE_NOTIFY, HWEvent::EXIT,
HWEvent::CEC_READ_MESSAGE };
+ uint32_t current_refresh_rate_ = 0;
};
} // namespace sdm
diff --git a/sdm/libs/core/display_primary.cpp b/sdm/libs/core/display_primary.cpp
index d89e9db1..53a4fd9d 100644
--- a/sdm/libs/core/display_primary.cpp
+++ b/sdm/libs/core/display_primary.cpp
@@ -77,6 +77,8 @@ DisplayError DisplayPrimary::Init() {
HWInterface::Destroy(hw_intf_);
}
+ current_refresh_rate_ = hw_panel_info_.max_fps;
+
return error;
}
@@ -262,7 +264,7 @@ DisplayError DisplayPrimary::GetRefreshRateRange(uint32_t *min_refresh_rate,
return error;
}
-DisplayError DisplayPrimary::SetRefreshRate(uint32_t refresh_rate) {
+DisplayError DisplayPrimary::SetRefreshRate(uint32_t refresh_rate, bool final_rate) {
lock_guard<recursive_mutex> obj(recursive_mutex_);
if (!active_ || !hw_panel_info_.dynamic_fps) {
@@ -274,11 +276,21 @@ DisplayError DisplayPrimary::SetRefreshRate(uint32_t refresh_rate) {
return kErrorParameters;
}
- DisplayError error = hw_intf_->SetRefreshRate(refresh_rate);
- if (error != kErrorNone) {
- return error;
+ if (handle_idle_timeout_ && !final_rate) {
+ refresh_rate = hw_panel_info_.min_fps;
}
+ if ((current_refresh_rate_ != refresh_rate) || handle_idle_timeout_) {
+ DisplayError error = hw_intf_->SetRefreshRate(refresh_rate);
+ if (error != kErrorNone) {
+ return error;
+ }
+ }
+
+ // On success, set current refresh rate to new refresh rate
+ current_refresh_rate_ = refresh_rate;
+ handle_idle_timeout_ = false;
+
return DisplayBase::ReconfigureDisplay();
}
@@ -293,6 +305,7 @@ DisplayError DisplayPrimary::VSync(int64_t timestamp) {
}
void DisplayPrimary::IdleTimeout() {
+ handle_idle_timeout_ = true;
event_handler_->Refresh();
comp_manager_->ProcessIdleTimeout(display_comp_ctx_);
}
diff --git a/sdm/libs/core/display_primary.h b/sdm/libs/core/display_primary.h
index 5578f368..314964a4 100644
--- a/sdm/libs/core/display_primary.h
+++ b/sdm/libs/core/display_primary.h
@@ -49,7 +49,7 @@ class DisplayPrimary : public DisplayBase, HWEventHandler {
virtual void SetIdleTimeoutMs(uint32_t active_ms);
virtual DisplayError SetDisplayMode(uint32_t mode);
virtual DisplayError GetRefreshRateRange(uint32_t *min_refresh_rate, uint32_t *max_refresh_rate);
- virtual DisplayError SetRefreshRate(uint32_t refresh_rate);
+ virtual DisplayError SetRefreshRate(uint32_t refresh_rate, bool final_rate);
virtual DisplayError SetPanelBrightness(int level);
virtual DisplayError GetPanelBrightness(int *level);
virtual DisplayError CachePanelBrightness(int level);
@@ -69,6 +69,8 @@ class DisplayPrimary : public DisplayBase, HWEventHandler {
HWEvent::SHOW_BLANK_EVENT, HWEvent::THERMAL_LEVEL, HWEvent::IDLE_POWER_COLLAPSE };
bool avr_prop_disabled_ = false;
bool switch_to_cmd_ = false;
+ bool handle_idle_timeout_ = false;
+ uint32_t current_refresh_rate_ = 0;
};
} // namespace sdm
diff --git a/sdm/libs/core/display_virtual.h b/sdm/libs/core/display_virtual.h
index aaebf46d..185366cd 100644
--- a/sdm/libs/core/display_virtual.h
+++ b/sdm/libs/core/display_virtual.h
@@ -53,7 +53,7 @@ class DisplayVirtual : public DisplayBase {
virtual DisplayError SetVSyncState(bool enable) {
return kErrorNotSupported;
}
- virtual DisplayError SetRefreshRate(uint32_t refresh_rate) {
+ virtual DisplayError SetRefreshRate(uint32_t refresh_rate, bool final_rate) {
return kErrorNotSupported;
}
virtual DisplayError GetMixerResolution(uint32_t *width, uint32_t *height) {
diff --git a/sdm/libs/hwc/hwc_display_external.cpp b/sdm/libs/hwc/hwc_display_external.cpp
index a5358190..da216f7b 100644
--- a/sdm/libs/hwc/hwc_display_external.cpp
+++ b/sdm/libs/hwc/hwc_display_external.cpp
@@ -137,12 +137,11 @@ int HWCDisplayExternal::Prepare(hwc_display_contents_1_t *content_list) {
bool one_video_updating_layer = SingleVideoLayerUpdating(UINT32(content_list->numHwLayers - 1));
uint32_t refresh_rate = GetOptimalRefreshRate(one_video_updating_layer);
- if (current_refresh_rate_ != refresh_rate) {
- error = display_intf_->SetRefreshRate(refresh_rate);
- if (error == kErrorNone) {
- // On success, set current refresh rate to new refresh rate
- current_refresh_rate_ = refresh_rate;
- }
+ bool final_rate = force_refresh_rate_ ? true : false;
+ error = display_intf_->SetRefreshRate(refresh_rate, final_rate);
+ if (error == kErrorNone) {
+ // On success, set current refresh rate to new refresh rate
+ current_refresh_rate_ = refresh_rate;
}
status = PrepareLayerStack(content_list);
diff --git a/sdm/libs/hwc/hwc_display_primary.cpp b/sdm/libs/hwc/hwc_display_primary.cpp
index ba351b5b..8d6f31b3 100644
--- a/sdm/libs/hwc/hwc_display_primary.cpp
+++ b/sdm/libs/hwc/hwc_display_primary.cpp
@@ -192,21 +192,13 @@ int HWCDisplayPrimary::Prepare(hwc_display_contents_1_t *content_list) {
}
uint32_t refresh_rate = GetOptimalRefreshRate(one_updating_layer);
- // TODO(user): Need to read current refresh rate to avoid
- // redundant calls to set refresh rate during idle fall back.
- if ((current_refresh_rate_ != refresh_rate) || (handle_idle_timeout_)) {
- error = display_intf_->SetRefreshRate(refresh_rate);
- }
-
+ bool final_rate = force_refresh_rate_ ? true : false;
+ error = display_intf_->SetRefreshRate(refresh_rate, final_rate);
if (error == kErrorNone) {
// On success, set current refresh rate to new refresh rate
current_refresh_rate_ = refresh_rate;
}
- if (handle_idle_timeout_) {
- handle_idle_timeout_ = false;
- }
-
if (content_list->numHwLayers <= 1) {
flush_ = true;
}
@@ -370,8 +362,6 @@ void HWCDisplayPrimary::ForceRefreshRate(uint32_t refresh_rate) {
uint32_t HWCDisplayPrimary::GetOptimalRefreshRate(bool one_updating_layer) {
if (force_refresh_rate_) {
return force_refresh_rate_;
- } else if (handle_idle_timeout_) {
- return min_refresh_rate_;
} else if (use_metadata_refresh_rate_ && one_updating_layer && metadata_refresh_rate_) {
return metadata_refresh_rate_;
}
@@ -388,7 +378,6 @@ DisplayError HWCDisplayPrimary::Refresh() {
}
hwc_procs->invalidate(hwc_procs);
- handle_idle_timeout_ = true;
return error;
}
diff --git a/sdm/libs/hwc/hwc_display_primary.h b/sdm/libs/hwc/hwc_display_primary.h
index 8a2ff87c..e937980d 100644
--- a/sdm/libs/hwc/hwc_display_primary.h
+++ b/sdm/libs/hwc/hwc_display_primary.h
@@ -69,7 +69,6 @@ class HWCDisplayPrimary : public HWCDisplay {
BufferAllocator *buffer_allocator_ = nullptr;
CPUHint cpu_hint_;
- bool handle_idle_timeout_ = false;
// Primary output buffer configuration
LayerBuffer output_buffer_ = {};
diff --git a/sdm/libs/hwc2/hwc_display_external.cpp b/sdm/libs/hwc2/hwc_display_external.cpp
index 39d46712..a8f8480f 100644
--- a/sdm/libs/hwc2/hwc_display_external.cpp
+++ b/sdm/libs/hwc2/hwc_display_external.cpp
@@ -121,6 +121,8 @@ HWC2::Error HWCDisplayExternal::Validate(uint32_t *out_num_types, uint32_t *out_
return status;
}
+ // TODO(user): SetRefreshRate need to follow new interface when added.
+
status = PrepareLayerStack(out_num_types, out_num_requests);
return status;
}
diff --git a/sdm/libs/hwc2/hwc_display_primary.cpp b/sdm/libs/hwc2/hwc_display_primary.cpp
index d78207b2..2fcf2a98 100644
--- a/sdm/libs/hwc2/hwc_display_primary.cpp
+++ b/sdm/libs/hwc2/hwc_display_primary.cpp
@@ -188,19 +188,13 @@ HWC2::Error HWCDisplayPrimary::Validate(uint32_t *out_num_types, uint32_t *out_n
ToggleCPUHint(one_updating_layer);
uint32_t refresh_rate = GetOptimalRefreshRate(one_updating_layer);
- if (current_refresh_rate_ != refresh_rate) {
- error = display_intf_->SetRefreshRate(refresh_rate);
- }
-
+ bool final_rate = force_refresh_rate_ ? true : false;
+ error = display_intf_->SetRefreshRate(refresh_rate, final_rate);
if (error == kErrorNone) {
// On success, set current refresh rate to new refresh rate
current_refresh_rate_ = refresh_rate;
}
- if (handle_idle_timeout_) {
- handle_idle_timeout_ = false;
- }
-
if (layer_set_.empty()) {
flush_ = true;
return status;
@@ -393,8 +387,6 @@ void HWCDisplayPrimary::ForceRefreshRate(uint32_t refresh_rate) {
uint32_t HWCDisplayPrimary::GetOptimalRefreshRate(bool one_updating_layer) {
if (force_refresh_rate_) {
return force_refresh_rate_;
- } else if (handle_idle_timeout_) {
- return min_refresh_rate_;
} else if (use_metadata_refresh_rate_ && one_updating_layer && metadata_refresh_rate_) {
return metadata_refresh_rate_;
}
@@ -406,7 +398,6 @@ DisplayError HWCDisplayPrimary::Refresh() {
DisplayError error = kErrorNone;
callbacks_->Refresh(HWC_DISPLAY_PRIMARY);
- handle_idle_timeout_ = true;
return error;
}
diff --git a/sdm/libs/hwc2/hwc_display_primary.h b/sdm/libs/hwc2/hwc_display_primary.h
index b98de2bc..4df65b30 100644
--- a/sdm/libs/hwc2/hwc_display_primary.h
+++ b/sdm/libs/hwc2/hwc_display_primary.h
@@ -88,7 +88,6 @@ class HWCDisplayPrimary : public HWCDisplay {
BufferAllocator *buffer_allocator_ = nullptr;
CPUHint *cpu_hint_ = nullptr;
- bool handle_idle_timeout_ = false;
// Primary output buffer configuration
LayerBuffer output_buffer_ = {};