sdm: Enable vsync after doze mode is set

Setting doze mode is deferred to next commit, so wait for doze mode
to be set before enabling the vsync.

Change-Id: Ief1b422a68fd574950d38fca4cec9a6b182c7eed
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index a13445d..4284f2e 100755
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -436,7 +436,20 @@
   DLOGI_IF(kTagDisplay, "Exiting commit for display: %d-%d", display_id_, display_type_);
 
   // Handle pending vsync enable if any after the commit
-  return HandlePendingVSyncEnable(layer_stack->retire_fence_fd);
+  error = HandlePendingVSyncEnable(layer_stack->retire_fence_fd);
+  if (error != kErrorNone) {
+    return error;
+  }
+
+  // Reset pending vsync enable if any after the commit
+  error = ResetPendingDoze(layer_stack->retire_fence_fd);
+  if (error != kErrorNone) {
+    return error;
+  }
+
+  DLOGI_IF(kTagDisplay, "Exiting commit for display: %d-%d", display_id_, display_type_);
+
+  return error;
 }
 
 DisplayError DisplayBase::Flush(LayerStack *layer_stack) {
@@ -587,6 +600,10 @@
 
   case kStateDoze:
     error = hw_intf_->Doze(default_qos_data_, release_fence);
+    if (error == kErrorDeferred) {
+      pending_doze_ = true;
+      error = kErrorNone;
+    }
     active = true;
     break;
 
@@ -1150,9 +1167,11 @@
 
 DisplayError DisplayBase::SetVSyncState(bool enable) {
   lock_guard<recursive_mutex> obj(recursive_mutex_);
-  if (state_ == kStateOff && enable) {
-    DLOGW("Can't enable vsync when power state is off for display %d-%d," \
-          "Defer it when display is active", display_id_, display_type_);
+
+  if ((state_ == kStateOff || pending_doze_) && enable) {
+    DLOGW("Can't enable vsync when power state is off or doze pending for display %d-%d," \
+          "Defer it when display is active state %d pending_doze_ %d", display_id_, display_type_,
+          state_, pending_doze_);
     vsync_enable_pending_ = true;
     return kErrorNone;
   }
@@ -1974,4 +1993,15 @@
   return;
 }
 
+DisplayError DisplayBase::ResetPendingDoze(int32_t retire_fence) {
+  if (pending_doze_) {
+    // Retire fence signalling confirms that CRTC enabled, hence wait for retire fence before
+    // we enable vsync
+    buffer_sync_handler_->SyncWait(retire_fence);
+
+    pending_doze_ = false;
+  }
+  return kErrorNone;
+}
+
 }  // namespace sdm
diff --git a/sdm/libs/core/display_base.h b/sdm/libs/core/display_base.h
index ea407bb..8f3172d 100644
--- a/sdm/libs/core/display_base.h
+++ b/sdm/libs/core/display_base.h
@@ -184,6 +184,7 @@
   bool IsHdrMode(const AttrVal &attr);
   void InsertBT2020PqHlgModes();
   DisplayError HandlePendingVSyncEnable(int32_t retire_fence);
+  DisplayError ResetPendingDoze(int32_t retire_fence);
 
   recursive_mutex recursive_mutex_;
   int32_t display_id_ = -1;
@@ -239,6 +240,7 @@
   QSyncMode qsync_mode_ = kQSyncModeNone;
   bool needs_avr_update_ = false;
   bool safe_mode_in_fast_path_ = false;
+  bool pending_doze_ = false;
 
   static Locker display_power_reset_lock_;
   static bool display_power_reset_pending_;
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index a21f0f6..b0c3e91 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -969,7 +969,7 @@
 
   if (first_cycle_ || last_power_mode_ != DRMPowerMode::OFF) {
     pending_doze_ = true;
-    return kErrorNone;
+    return kErrorDeferred;
   }
 
   SetQOSData(qos_data);