summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-06-17 02:31:28 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2026-05-11 15:56:34 +0300
commit1116fb3ba4531934980c3354ddadd50d2d151b1c (patch)
tree000afc024c2378f16ca423d524e2317ac94e1854
parentcf7eadd88eeeae3a21305272499676a2df67bb94 (diff)
card: Add support for writeback connectorswriteback
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>
-rw-r--r--kms++/inc/kms++/card.h2
-rw-r--r--kms++/src/card.cpp13
-rw-r--r--kms++util/meson.build2
-rw-r--r--kms++util/src/resourcemanager.cpp5
-rw-r--r--py/pykms/pykmsbase.cpp1
-rw-r--r--utils/kmsblank.cpp5
-rw-r--r--utils/kmstest.cpp4
-rw-r--r--utils/meson.build2
8 files changed, 32 insertions, 2 deletions
diff --git a/kms++/inc/kms++/card.h b/kms++/inc/kms++/card.h
index bf6f9bf..fc11e92 100644
--- a/kms++/inc/kms++/card.h
+++ b/kms++/inc/kms++/card.h
@@ -54,6 +54,7 @@ public:
bool has_universal_planes() const { return m_has_universal_planes; }
bool has_dumb_buffers() const { return m_has_dumb; }
bool has_kms() const;
+ bool has_writeback() const { return m_has_writeback; }
std::vector<Connector*> get_connectors() const { return m_connectors; }
std::vector<Encoder*> get_encoders() const { return m_encoders; }
@@ -92,6 +93,7 @@ private:
bool m_has_atomic;
bool m_has_universal_planes;
bool m_has_dumb;
+ bool m_has_writeback;
CardVersion m_version;
};
diff --git a/kms++/src/card.cpp b/kms++/src/card.cpp
index f67f8f8..0b5c716 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;
}
diff --git a/kms++util/meson.build b/kms++util/meson.build
index dcdae8f..241462f 100644
--- a/kms++util/meson.build
+++ b/kms++util/meson.build
@@ -43,7 +43,7 @@ pixpat_proj = subproject('pixpat',
default_options : ['config=pixpat-native/profiles/pattern_only.toml'])
libpixpat_dep = pixpat_proj.get_variable('libpixpat_static_dep')
-libkmsxxutil_deps = [ libkmsxx_dep, thread_dep, libpixpat_dep ]
+libkmsxxutil_deps = [ libkmsxx_dep, libdrm_dep, thread_dep, libpixpat_dep ]
libkmsxxutil = library('kms++util',
libkmsxxutil_sources,
diff --git a/kms++util/src/resourcemanager.cpp b/kms++util/src/resourcemanager.cpp
index 424c8f0..75b0766 100644
--- a/kms++util/src/resourcemanager.cpp
+++ b/kms++util/src/resourcemanager.cpp
@@ -2,6 +2,8 @@
#include <algorithm>
#include <kms++util/strhelpers.h>
+#include <xf86drmMode.h>
+
using namespace kms;
using namespace std;
@@ -20,6 +22,9 @@ void ResourceManager::reset()
static Connector* find_connector(Card& card, const set<Connector*>& reserved)
{
for (Connector* conn : card.get_connectors()) {
+ if (conn->connector_type() == DRM_MODE_CONNECTOR_WRITEBACK)
+ continue;
+
if (!conn->connected())
continue;
diff --git a/py/pykms/pykmsbase.cpp b/py/pykms/pykmsbase.cpp
index 8bf0f65..fca9374 100644
--- a/py/pykms/pykmsbase.cpp
+++ b/py/pykms/pykmsbase.cpp
@@ -51,6 +51,7 @@ void init_pykmsbase(py::module& m)
})
.def_property_readonly("has_atomic", &Card::has_atomic)
+ .def_property_readonly("has_writeback", &Card::has_writeback)
.def("get_prop", (Property * (Card::*)(uint32_t) const) & Card::get_prop)
.def_property_readonly("version_name", &Card::version_name);
diff --git a/utils/kmsblank.cpp b/utils/kmsblank.cpp
index 43bd2a2..2af5182 100644
--- a/utils/kmsblank.cpp
+++ b/utils/kmsblank.cpp
@@ -5,6 +5,8 @@
#include <kms++/kms++.h>
#include <kms++util/kms++util.h>
+#include <xf86drmMode.h>
+
using namespace std;
using namespace kms;
@@ -78,6 +80,9 @@ int main(int argc, char** argv)
while (true) {
for (Connector* conn : conns) {
+ if (conn->connector_type() == DRM_MODE_CONNECTOR_WRITEBACK)
+ continue;
+
if (!conn->connected()) {
printf("Connector %u not connected\n", conn->idx());
continue;
diff --git a/utils/kmstest.cpp b/utils/kmstest.cpp
index a5adbe2..cc77d14 100644
--- a/utils/kmstest.cpp
+++ b/utils/kmstest.cpp
@@ -18,6 +18,8 @@
#include <kms++util/kms++util.h>
+#include <xf86drmMode.h>
+
using namespace std;
using namespace kms;
@@ -679,6 +681,8 @@ static vector<OutputInfo> setups_to_outputs(Card& card, ResourceManager& resman,
if (outputs.empty()) {
// no outputs defined, show a pattern on all connected screens
for (Connector* conn : card.get_connectors()) {
+ if (conn->connector_type() == DRM_MODE_CONNECTOR_WRITEBACK)
+ continue;
if (!conn->connected())
continue;
diff --git a/utils/meson.build b/utils/meson.build
index 54021d3..0bf2af5 100644
--- a/utils/meson.build
+++ b/utils/meson.build
@@ -10,7 +10,7 @@ endif
utils_enabled = true
-common_deps = [ libkmsxx_dep, libkmsxxutil_dep ]
+common_deps = [ libkmsxx_dep, libkmsxxutil_dep, libdrm_dep ]
libevdev_dep = dependency('libevdev', required : false)