Merge "sdm: Drop skewed vsyncs."
diff --git a/config/talos.mk b/config/talos.mk
index 71d4d6b..9e269d7 100644
--- a/config/talos.mk
+++ b/config/talos.mk
@@ -40,6 +40,7 @@
     debug.egl.hw=0 \
     debug.sf.latch_unsignaled=1 \
     debug.mdpcomp.logs=0 \
+    debug.sf.enable_hwc_vds=1 \
     ro.vendor.display.cabl=2 \
     vendor.gralloc.disable_ubwc=0 \
     vendor.display.disable_scaler=0 \
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index 6bc5a51..d9b9b1c 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -434,6 +434,7 @@
 
   DisplayConfigFixedInfo fixed_info = {};
   display_intf_->GetConfig(&fixed_info);
+  is_cmd_mode_ = fixed_info.is_cmdmode;
   partial_update_enabled_ = fixed_info.partial_update;
   client_target_->SetPartialUpdate(partial_update_enabled_);
 
@@ -1012,7 +1013,7 @@
   }
 
   if (acquire_fence == 0) {
-    DLOGE("acquire_fence is zero");
+    DLOGW("acquire_fence is zero");
     return HWC2::Error::BadParameter;
   }
 
@@ -2126,9 +2127,7 @@
 }
 
 bool HWCDisplay::IsDisplayCommandMode() {
-  DisplayConfigFixedInfo display_config;
-  display_intf_->GetConfig(&display_config);
-  return display_config.is_cmdmode;
+  return is_cmd_mode_;
 }
 
 // Skip SDM prepare if all the layers in the current draw cycle are marked as Skip and
diff --git a/sdm/libs/hwc2/hwc_display.h b/sdm/libs/hwc2/hwc_display.h
index f14c79f..72ea0d7 100644
--- a/sdm/libs/hwc2/hwc_display.h
+++ b/sdm/libs/hwc2/hwc_display.h
@@ -368,6 +368,8 @@
   uint32_t display_config_ = 0;
   bool config_pending_ = false;
   bool pending_commit_ = false;
+  bool is_cmd_mode_ = false;
+  bool partial_update_enabled_ = false;
 
  private:
   void DumpInputBuffers(void);
@@ -380,7 +382,6 @@
   int null_display_mode_ = 0;
   bool has_client_composition_ = false;
   DisplayValidateState validate_state_ = kNormalValidate;
-  bool partial_update_enabled_ = false;
 };
 
 inline int HWCDisplay::Perform(uint32_t operation, ...) {
diff --git a/sdm/libs/hwc2/hwc_display_builtin.cpp b/sdm/libs/hwc2/hwc_display_builtin.cpp
index 106b147..df7271f 100644
--- a/sdm/libs/hwc2/hwc_display_builtin.cpp
+++ b/sdm/libs/hwc2/hwc_display_builtin.cpp
@@ -208,6 +208,7 @@
     // here in a subsequent draw round. Readback is not allowed for any secure use case.
     readback_configured_ = !layer_stack_.flags.secure_present;
     if (readback_configured_) {
+      DisablePartialUpdateOneFrame();
       layer_stack_.output_buffer = &output_buffer_;
       layer_stack_.flags.post_processed_output = post_processed_output_;
     }
@@ -366,7 +367,6 @@
   readback_configured_ = false;
   validated_ = false;
 
-  DisablePartialUpdateOneFrame();
   return HWC2::Error::None;
 }
 
@@ -476,6 +476,16 @@
 
   if (display_intf_) {
     error = display_intf_->SetDisplayMode(mode);
+    if (error == kErrorNone) {
+      DisplayConfigFixedInfo fixed_info = {};
+      display_intf_->GetConfig(&fixed_info);
+      is_cmd_mode_ = fixed_info.is_cmdmode;
+      partial_update_enabled_ = fixed_info.partial_update;
+      for (auto hwc_layer : layer_set_) {
+        hwc_layer->SetPartialUpdate(partial_update_enabled_);
+      }
+      client_target_->SetPartialUpdate(partial_update_enabled_);
+    }
   }
 
   return error;
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index 9ba14a9..71464c4 100644
--- a/sdm/libs/hwc2/hwc_layers.cpp
+++ b/sdm/libs/hwc2/hwc_layers.cpp
@@ -239,7 +239,7 @@
   }
 
   if (acquire_fence == 0) {
-    DLOGE("acquire_fence is zero");
+    DLOGW("acquire_fence is zero");
     return HWC2::Error::BadParameter;
   }