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;