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);