summaryrefslogtreecommitdiff
path: root/sdm/libs/hwc2/hwc_display_builtin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sdm/libs/hwc2/hwc_display_builtin.cpp')
-rw-r--r--sdm/libs/hwc2/hwc_display_builtin.cpp34
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);