sdm: Add support for secondary vsync
Add support for enabling secondary vsync
Change-Id: Ia2231a19292314513d613efbb6953b1943530af0
CRs-fixed: 2184506
diff --git a/libdrmutils/drm_interface.h b/libdrmutils/drm_interface.h
index 97660ea..c25832c 100644
--- a/libdrmutils/drm_interface.h
+++ b/libdrmutils/drm_interface.h
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2017, The Linux Foundation. All rights reserved.
+* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -498,6 +498,7 @@
struct DRMDisplayToken {
uint32_t conn_id;
uint32_t crtc_id;
+ uint32_t crtc_index;
};
enum DRMPPFeatureID {
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index c734f4c..791eaa3 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -1,5 +1,5 @@
/*
-* Copyright (c) 2017, The Linux Foundation. All rights reserved.
+* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -1484,8 +1484,7 @@
}
void HWDeviceDRM::GetDRMDisplayToken(sde_drm::DRMDisplayToken *token) const {
- token->conn_id = token_.conn_id;
- token->crtc_id = token_.crtc_id;
+ *token = token_;
}
void HWDeviceDRM::UpdateMixerAttributes() {
diff --git a/sdm/libs/core/drm/hw_events_drm.cpp b/sdm/libs/core/drm/hw_events_drm.cpp
index 86a3f54..4d1eea9 100644
--- a/sdm/libs/core/drm/hw_events_drm.cpp
+++ b/sdm/libs/core/drm/hw_events_drm.cpp
@@ -64,19 +64,18 @@
switch (event_data.event_type) {
case HWEvent::VSYNC: {
- if (!is_primary_) {
- // TODO(user): Once secondary support is added, use a different fd by calling drmOpen
- break;
- }
-
poll_fds_[i].events = POLLIN | POLLPRI | POLLERR;
- DRMMaster *master = nullptr;
- int ret = DRMMaster::GetInstance(&master);
- if (ret < 0) {
- DLOGE("Failed to acquire DRMMaster instance");
- return kErrorNotSupported;
+ if (is_primary_) {
+ DRMMaster *master = nullptr;
+ int ret = DRMMaster::GetInstance(&master);
+ if (ret < 0) {
+ DLOGE("Failed to acquire DRMMaster instance");
+ return kErrorNotSupported;
+ }
+ master->GetHandle(&poll_fds_[i].fd);
+ } else {
+ poll_fds_[i].fd = drmOpen("msm_drm", nullptr);
}
- master->GetHandle(&poll_fds_[i].fd);
vsync_index_ = i;
} break;
case HWEvent::EXIT: {
@@ -197,11 +196,8 @@
return kErrorResources;
}
- if (is_primary_) {
- RegisterVSync();
- vsync_registered_ = true;
- }
-
+ RegisterVSync();
+ vsync_registered_ = true;
RegisterPanelDead(true);
RegisterIdleNotify(true);
RegisterIdlePowerCollapse(true);
@@ -226,9 +222,6 @@
switch (event) {
case HWEvent::VSYNC: {
std::lock_guard<std::mutex> lock(vsync_mutex_);
- if (!is_primary_) {
- break;
- }
vsync_enabled_ = enable;
if (vsync_enabled_ && !vsync_registered_) {
RegisterVSync();
@@ -261,7 +254,9 @@
for (uint32_t i = 0; i < event_data_list_.size(); i++) {
switch (event_data_list_[i].event_type) {
case HWEvent::VSYNC:
- // TODO(user): close for secondary
+ if (!is_primary_) {
+ Sys::close_(poll_fds_[i].fd);
+ }
poll_fds_[i].fd = -1;
break;
case HWEvent::EXIT:
@@ -347,9 +342,10 @@
}
DisplayError HWEventsDRM::RegisterVSync() {
- // TODO(user): For secondary use DRM_VBLANK_HIGH_CRTC_MASK and DRM_VBLANK_HIGH_CRTC_SHIFT
- drmVBlank vblank{};
- vblank.request.type = (drmVBlankSeqType)(DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT);
+ drmVBlank vblank {};
+ uint32_t high_crtc = token_.crtc_index << DRM_VBLANK_HIGH_CRTC_SHIFT;
+ vblank.request.type = (drmVBlankSeqType)(DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT |
+ (high_crtc & DRM_VBLANK_HIGH_CRTC_MASK));
vblank.request.sequence = 1;
// DRM hack to pass in context to unused field signal. Driver will write this to the node being
// polled on, and will be read as part of drm event handling and sent to handler