summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdrmutils/drm_interface.h12
-rw-r--r--sdm/include/private/hw_info_types.h4
-rw-r--r--sdm/libs/core/display_primary.cpp6
-rw-r--r--sdm/libs/core/drm/hw_device_drm.cpp10
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) {