summaryrefslogtreecommitdiff
path: root/kms++/src/card.cpp
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-06-17 02:31:28 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-09-05 00:54:49 +0300
commit70ed259ba057e629ad22ac93168a438dbd93113f (patch)
tree91df416b0d08c6231975e94a96da84a9c0df4ebc /kms++/src/card.cpp
parent77eedf7574809ce5edf4d4ea6aa55542b3045c02 (diff)
card: Add support for writeback connectors
Enable enumeration of writeback connectors if both libdrm and the device support it. The new Card::has_writeback() method report if the card support writeback connectors. Existing code that expect all connectors to model an output may be confused by the sudden availability of new connectors. To handle this issue, - add a KMSXX_DISABLE_WRITEBACK_CONNECTORS environment variable to disable enumeration of writeback connectors, similarly to universal planes ; and - ignore writeback connectors where no specific connector is requested (Card::get_first_connected_connector(), ResourceManager::reserve_connector() if no connector name is specified, and applications that use all connected outputs). Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'kms++/src/card.cpp')
-rw-r--r--kms++/src/card.cpp13
1 files changed, 13 insertions, 0 deletions
diff --git a/kms++/src/card.cpp b/kms++/src/card.cpp
index 935969d..6ad922a 100644
--- a/kms++/src/card.cpp
+++ b/kms++/src/card.cpp
@@ -216,6 +216,17 @@ void Card::setup()
m_has_atomic = false;
#endif
+#ifdef DRM_CLIENT_CAP_WRITEBACK_CONNECTORS
+ if (getenv("KMSXX_DISABLE_WRITEBACK_CONNECTORS") == 0) {
+ r = drmSetClientCap(m_fd, DRM_CLIENT_CAP_WRITEBACK_CONNECTORS, 1);
+ m_has_writeback = r == 0;
+ } else {
+ m_has_writeback = false;
+ }
+#else
+ m_has_writeback = false;
+#endif
+
uint64_t has_dumb;
r = drmGetCap(m_fd, DRM_CAP_DUMB_BUFFER, &has_dumb);
m_has_dumb = r == 0 && has_dumb;
@@ -315,6 +326,8 @@ void Card::restore_modes()
Connector* Card::get_first_connected_connector() const
{
for (auto c : m_connectors) {
+ if (c->connector_type() == DRM_MODE_CONNECTOR_WRITEBACK)
+ continue;
if (c->connected())
return c;
}