diff options
author | Anjaneya Prasad Musunuri <aprasad@codeaurora.org> | 2017-05-18 19:11:28 +0530 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-05-25 06:42:12 -0700 |
commit | 4d65df7ae4320814dbc643b79c65ed6d59152e2f (patch) | |
tree | 7d1f29d87bd4133c7a6a06f689a4d0ba587e400a /sdm | |
parent | 61f6095acb7d0c4e22059605465ae8002bd63673 (diff) | |
download | display-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.h | 6 | ||||
-rw-r--r-- | sdm/libs/core/display_hdmi.cpp | 13 | ||||
-rw-r--r-- | sdm/libs/core/display_hdmi.h | 3 | ||||
-rw-r--r-- | sdm/libs/core/display_primary.cpp | 21 | ||||
-rw-r--r-- | sdm/libs/core/display_primary.h | 4 | ||||
-rw-r--r-- | sdm/libs/core/display_virtual.h | 2 | ||||
-rw-r--r-- | sdm/libs/hwc/hwc_display_external.cpp | 11 | ||||
-rw-r--r-- | sdm/libs/hwc/hwc_display_primary.cpp | 15 | ||||
-rw-r--r-- | sdm/libs/hwc/hwc_display_primary.h | 1 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_display_external.cpp | 2 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_display_primary.cpp | 13 | ||||
-rw-r--r-- | sdm/libs/hwc2/hwc_display_primary.h | 1 |
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_ = {}; |