diff options
Diffstat (limited to 'sdm/libs/hwc2/hwc_display_builtin.cpp')
-rw-r--r-- | sdm/libs/hwc2/hwc_display_builtin.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/sdm/libs/hwc2/hwc_display_builtin.cpp b/sdm/libs/hwc2/hwc_display_builtin.cpp index d440893a..e25e40c5 100644 --- a/sdm/libs/hwc2/hwc_display_builtin.cpp +++ b/sdm/libs/hwc2/hwc_display_builtin.cpp @@ -310,6 +310,28 @@ bool HWCDisplayBuiltIn::CanSkipCommit() { return skip_commit; } +void HWCDisplayBuiltIn::SetPartialUpdate(DisplayConfigFixedInfo fixed_info) { + partial_update_enabled_ = fixed_info.partial_update || (!fixed_info.is_cmdmode); + for (auto hwc_layer : layer_set_) { + hwc_layer->SetPartialUpdate(partial_update_enabled_); + } + client_target_->SetPartialUpdate(partial_update_enabled_); +} + +HWC2::Error HWCDisplayBuiltIn::SetPowerMode(HWC2::PowerMode mode, bool teardown) { + DisplayConfigFixedInfo fixed_info = {}; + display_intf_->GetConfig(&fixed_info); + bool command_mode = fixed_info.is_cmdmode; + + display_intf_->GetConfig(&fixed_info); + is_cmd_mode_ = fixed_info.is_cmdmode; + if (is_cmd_mode_ != command_mode) { + SetPartialUpdate(fixed_info); + } + + return HWC2::Error::None; +} + HWC2::Error HWCDisplayBuiltIn::Present(int32_t *out_retire_fence) { auto status = HWC2::Error::None; @@ -329,12 +351,24 @@ HWC2::Error HWCDisplayBuiltIn::Present(int32_t *out_retire_fence) { DLOGE("Flush failed. Error = %d", error); } } else { + DisplayConfigFixedInfo fixed_info = {}; + display_intf_->GetConfig(&fixed_info); + bool command_mode = fixed_info.is_cmdmode; + status = CommitLayerStack(); if (status == HWC2::Error::None) { HandleFrameOutput(); SolidFillCommit(); status = PostCommitLayerStack(out_retire_fence); } + + if (status == HWC2::Error::None) { + display_intf_->GetConfig(&fixed_info); + is_cmd_mode_ = fixed_info.is_cmdmode; + if (is_cmd_mode_ != command_mode) { + SetPartialUpdate(fixed_info); + } + } } CloseFd(&output_buffer_.acquire_fence_fd); |