diff options
-rw-r--r-- | libdrmutils/drm_interface.h | 12 | ||||
-rw-r--r-- | sdm/include/private/hw_info_types.h | 4 | ||||
-rw-r--r-- | sdm/libs/core/display_primary.cpp | 6 | ||||
-rw-r--r-- | sdm/libs/core/drm/hw_device_drm.cpp | 10 |
4 files changed, 29 insertions, 3 deletions
diff --git a/libdrmutils/drm_interface.h b/libdrmutils/drm_interface.h index 73e530bb..a83632ee 100644 --- a/libdrmutils/drm_interface.h +++ b/libdrmutils/drm_interface.h @@ -376,6 +376,12 @@ enum struct DRMOps { * Arg: drmModeAtomicReq - Atomic request */ DPPS_COMMIT_FEATURE, + /* + * Op: Sets qsync mode on connector + * Arg: uint32_t - Connector ID + * uint32_t - qsync mode + */ + CONNECTOR_SET_QSYNC_MODE, }; enum struct DRMRotation { @@ -576,6 +582,7 @@ struct DRMConnectorInfo { drm_panel_hdr_properties panel_hdr_prop; uint32_t transfer_time_us; drm_msm_ext_hdr_properties ext_hdr_prop; + bool qsync_support; }; /* Identifier token for a display */ @@ -720,6 +727,11 @@ enum struct DRMCWbCaptureMode { DSPP_OUT = 1, }; +enum struct DRMQsyncMode { + NONE = 0, + CONTINUOUS, +}; + struct DRMSolidfillStage { DRMRect bounding_rect {}; bool is_exclusion_rect = false; diff --git a/sdm/include/private/hw_info_types.h b/sdm/include/private/hw_info_types.h index 2f594cbc..c142a05f 100644 --- a/sdm/include/private/hw_info_types.h +++ b/sdm/include/private/hw_info_types.h @@ -366,6 +366,7 @@ struct HWPanelInfo { HWColorPrimaries primaries = {}; // WRGB color primaries HWPanelOrientation panel_orientation = {}; // Panel Orientation uint32_t transfer_time_us = 0; // transfer time in micro seconds to panel's active region + bool qsync_support = false; // Specifies panel supports qsync feature or not. bool operator !=(const HWPanelInfo &panel_info) { return ((port != panel_info.port) || (mode != panel_info.mode) || @@ -382,7 +383,8 @@ struct HWPanelInfo { (split_info != panel_info.split_info) || (s3d_mode != panel_info.s3d_mode) || (left_roi_count != panel_info.left_roi_count) || (right_roi_count != panel_info.right_roi_count) || - (transfer_time_us != panel_info.transfer_time_us)); + (transfer_time_us != panel_info.transfer_time_us) || + (qsync_support != panel_info.qsync_support)); } bool operator ==(const HWPanelInfo &panel_info) { diff --git a/sdm/libs/core/display_primary.cpp b/sdm/libs/core/display_primary.cpp index f7da4ded..49d4146a 100644 --- a/sdm/libs/core/display_primary.cpp +++ b/sdm/libs/core/display_primary.cpp @@ -25,6 +25,8 @@ #include <utils/constants.h> #include <utils/debug.h> #include <utils/rect.h> +#include <utils/utils.h> + #include <map> #include <algorithm> #include <functional> @@ -402,6 +404,10 @@ bool DisplayPrimary::NeedsAVREnable() { return false; } + if (GetDriverType() == DriverType::DRM) { + return hw_panel_info_.qsync_support; + } + return (hw_panel_info_.mode == kModeVideo && ((hw_panel_info_.dynamic_fps && hw_panel_info_.dfps_porch_mode) || (!hw_panel_info_.dynamic_fps && hw_panel_info_.min_fps != hw_panel_info_.max_fps))); diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp index dca25db6..29ac24f5 100644 --- a/sdm/libs/core/drm/hw_device_drm.cpp +++ b/sdm/libs/core/drm/hw_device_drm.cpp @@ -581,6 +581,7 @@ void HWDeviceDRM::PopulateHWPanelInfo() { hw_panel_info_.min_roi_height = connector_info_.modes[index].hmin; hw_panel_info_.needs_roi_merge = connector_info_.modes[index].roi_merge; hw_panel_info_.dynamic_fps = connector_info_.dynamic_fps; + hw_panel_info_.qsync_support = connector_info_.qsync_support; drmModeModeInfo current_mode = connector_info_.modes[current_mode_index_].mode; if (hw_panel_info_.dynamic_fps) { uint32_t min_fps = current_mode.vrefresh; @@ -633,8 +634,9 @@ void HWDeviceDRM::PopulateHWPanelInfo() { DLOGI("%s, Panel Interface = %s, Panel Mode = %s, Is Primary = %d", device_name_, interface_str_.c_str(), hw_panel_info_.mode == kModeVideo ? "Video" : "Command", hw_panel_info_.is_primary_panel); - DLOGI("Partial Update = %d, Dynamic FPS = %d, HDR Panel = %d", hw_panel_info_.partial_update, - hw_panel_info_.dynamic_fps, hw_panel_info_.hdr_enabled); + DLOGI("Partial Update = %d, Dynamic FPS = %d, HDR Panel = %d QSync = %d", + hw_panel_info_.partial_update, hw_panel_info_.dynamic_fps, hw_panel_info_.hdr_enabled, + hw_panel_info_.qsync_support); DLOGI("Align: left = %d, width = %d, top = %d, height = %d", hw_panel_info_.left_align, hw_panel_info_.width_align, hw_panel_info_.top_align, hw_panel_info_.height_align); DLOGI("ROI: min_width = %d, min_height = %d, need_merge = %d", hw_panel_info_.min_roi_width, @@ -1069,6 +1071,10 @@ void HWDeviceDRM::SetupAtomic(HWLayers *hw_layers, bool validate) { if (hw_panel_info_.mode == kModeCommand) { drm_atomic_intf_->Perform(DRMOps::CONNECTOR_SET_AUTOREFRESH, token_.conn_id, autorefresh_); } + + sde_drm::DRMQsyncMode mode = hw_layers->hw_avr_info.enable ? sde_drm::DRMQsyncMode::CONTINUOUS : + sde_drm::DRMQsyncMode::NONE; + drm_atomic_intf_->Perform(DRMOps::CONNECTOR_SET_QSYNC_MODE, token_.conn_id, mode); } void HWDeviceDRM::AddSolidfillStage(const HWSolidfillStage &sf, uint32_t plane_alpha) { |