Merge "composer: enable POMS during Doze switch based on a property"
diff --git a/composer/hwc_display.cpp b/composer/hwc_display.cpp
index de51272..bc36454 100644
--- a/composer/hwc_display.cpp
+++ b/composer/hwc_display.cpp
@@ -568,6 +568,10 @@
}
}
+ if (num_configs_ != 0) {
+ SetActiveConfigIndex(hwc_config_map_.at(0));
+ }
+
// Update num config count.
num_configs_ = UINT32(variable_config_map_.size());
DLOGI("num_configs = %d", num_configs_);
@@ -2214,8 +2218,13 @@
}
validated_ = false;
- display_intf_->SetActiveConfig(config);
+ DisplayError error = display_intf_->SetActiveConfig(config);
+ if (error != kErrorNone) {
+ DLOGE("Failed to set %d config! Error: %d", config, error);
+ return -EINVAL;
+ }
+ SetActiveConfigIndex(config);
return 0;
}
@@ -2528,6 +2537,8 @@
DisplayError error = display_intf_->SetActiveConfig(pending_config_index_);
if (error != kErrorNone) {
DLOGI("Failed to set %d config", INT(pending_config_index_));
+ } else {
+ SetActiveConfigIndex(pending_config_index_);
}
// Reset pending config.
@@ -2594,7 +2605,7 @@
HWC2::Error HWCDisplay::GetVsyncPeriodByActiveConfig(VsyncPeriodNanos *vsync_period) {
hwc2_config_t active_config;
- auto error = GetActiveConfig(&active_config);
+ auto error = GetCachedActiveConfig(&active_config);
if (error != HWC2::Error::None) {
DLOGE("Failed to get active config!");
return error;
@@ -2708,7 +2719,7 @@
bool HWCDisplay::AllowSeamless(hwc2_config_t config) {
hwc2_config_t active_config;
- auto error = GetActiveConfig(&active_config);
+ auto error = GetCachedActiveConfig(&active_config);
if (error != HWC2::Error::None) {
DLOGE("Failed to get active config!");
return false;
@@ -2733,9 +2744,30 @@
}
validated_ = false;
+ SetActiveConfigIndex(config);
DLOGI("Active configuration changed to: %d", config);
return HWC2::Error::None;
}
+HWC2::Error HWCDisplay::GetCachedActiveConfig(hwc2_config_t *active_config) {
+ int config_index = GetActiveConfigIndex();
+ if ((config_index < 0) || (config_index >= hwc_config_map_.size())) {
+ return GetActiveConfig(active_config);
+ }
+
+ *active_config = static_cast<hwc2_config_t>(hwc_config_map_.at(config_index));
+ return HWC2::Error::None;
+}
+
+void HWCDisplay::SetActiveConfigIndex(int index) {
+ std::lock_guard<std::mutex> lock(active_config_lock_);
+ active_config_index_ = index;
+}
+
+int HWCDisplay::GetActiveConfigIndex() {
+ std::lock_guard<std::mutex> lock(active_config_lock_);
+ return active_config_index_;
+}
+
} // namespace sdm
diff --git a/composer/hwc_display.h b/composer/hwc_display.h
index c082578..54124c9 100644
--- a/composer/hwc_display.h
+++ b/composer/hwc_display.h
@@ -464,6 +464,9 @@
bool AllowSeamless(hwc2_config_t request_config);
void SetVsyncsApplyRateChange(uint32_t vsyncs) { vsyncs_to_apply_rate_change_ = vsyncs; }
HWC2::Error SubmitDisplayConfig(hwc2_config_t config);
+ HWC2::Error GetCachedActiveConfig(hwc2_config_t *config);
+ void SetActiveConfigIndex(int active_config_index);
+ int GetActiveConfigIndex();
bool validated_ = false;
bool layer_stack_invalid_ = true;
@@ -525,6 +528,8 @@
int64_t pending_refresh_rate_applied_time_ = INT64_MAX;
std::deque<TransientRefreshRateInfo> transient_refresh_rate_info_;
std::mutex transient_refresh_rate_lock_;
+ std::mutex active_config_lock_;
+ int active_config_index_ = -1;
LayerRect window_rect_ = {};
bool windowed_display_ = false;
uint32_t active_refresh_rate_ = 0;