summaryrefslogtreecommitdiff
path: root/src/protocols
diff options
context:
space:
mode:
Diffstat (limited to 'src/protocols')
-rw-r--r--src/protocols/DRMSyncobj.cpp14
-rw-r--r--src/protocols/LinuxDMABUF.cpp15
-rw-r--r--src/protocols/MesaDRM.cpp24
3 files changed, 37 insertions, 16 deletions
diff --git a/src/protocols/DRMSyncobj.cpp b/src/protocols/DRMSyncobj.cpp
index bedec422..0896b904 100644
--- a/src/protocols/DRMSyncobj.cpp
+++ b/src/protocols/DRMSyncobj.cpp
@@ -199,8 +199,18 @@ bool CDRMSyncobjManagerResource::good() {
return m_resource->resource();
}
-CDRMSyncobjProtocol::CDRMSyncobjProtocol(const wl_interface* iface, const int& ver, const std::string& name) :
- IWaylandProtocol(iface, ver, name), m_drmFD(g_pCompositor->m_drmFD) {}
+CDRMSyncobjProtocol::CDRMSyncobjProtocol(const wl_interface* iface, const int& ver, const std::string& name) : IWaylandProtocol(iface, ver, name) {
+ if (g_pCompositor->m_drmRenderNode.syncObjSupport)
+ m_drmFD = g_pCompositor->m_drmRenderNode.fd;
+ else if (g_pCompositor->m_drm.syncobjSupport)
+ m_drmFD = g_pCompositor->m_drm.fd;
+ else {
+ LOGM(ERR, "CDRMSyncobjProtocol: no nodes support explicit sync?");
+ return;
+ }
+
+ LOGM(LOG, "CDRMSyncobjProtocol: using fd {}", m_drmFD);
+}
void CDRMSyncobjProtocol::bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id) {
const auto& RESOURCE = m_managers.emplace_back(makeUnique<CDRMSyncobjManagerResource>(makeUnique<CWpLinuxDrmSyncobjManagerV1>(client, ver, id)));
diff --git a/src/protocols/LinuxDMABUF.cpp b/src/protocols/LinuxDMABUF.cpp
index 24cf2951..c7de03a2 100644
--- a/src/protocols/LinuxDMABUF.cpp
+++ b/src/protocols/LinuxDMABUF.cpp
@@ -408,7 +408,7 @@ void CLinuxDMABUFResource::sendMods() {
CLinuxDMABufV1Protocol::CLinuxDMABufV1Protocol(const wl_interface* iface, const int& ver, const std::string& name) : IWaylandProtocol(iface, ver, name) {
static auto P = g_pHookSystem->hookDynamic("ready", [this](void* self, SCallbackInfo& info, std::any d) {
- int rendererFD = g_pCompositor->m_drmFD;
+ int rendererFD = g_pCompositor->m_drmRenderNode.fd >= 0 ? g_pCompositor->m_drmRenderNode.fd : g_pCompositor->m_drm.fd;
auto dev = devIDFromFD(rendererFD);
if (!dev.has_value()) {
@@ -467,6 +467,19 @@ CLinuxDMABufV1Protocol::CLinuxDMABufV1Protocol(const wl_interface* iface, const
return;
}
+ if (g_pCompositor->m_drmRenderNode.fd >= 0 && rendererFD == g_pCompositor->m_drmRenderNode.fd) {
+ // Already using the compositor's render node, reuse it.
+ m_mainDeviceFD = CFileDescriptor{fcntl(g_pCompositor->m_drmRenderNode.fd, F_DUPFD_CLOEXEC, 0)};
+ drmFreeDevice(&device);
+ if (!m_mainDeviceFD.isValid()) {
+ LOGM(ERR, "failed to open rendernode, disabling linux dmabuf");
+ removeGlobal();
+ return;
+ }
+
+ return; // already using rendernode.
+ }
+
if (device->available_nodes & (1 << DRM_NODE_RENDER)) {
const char* name = device->nodes[DRM_NODE_RENDER];
m_mainDeviceFD = CFileDescriptor{open(name, O_RDWR | O_CLOEXEC)};
diff --git a/src/protocols/MesaDRM.cpp b/src/protocols/MesaDRM.cpp
index 45ee24c5..789f90b6 100644
--- a/src/protocols/MesaDRM.cpp
+++ b/src/protocols/MesaDRM.cpp
@@ -113,28 +113,26 @@ bool CMesaDRMResource::good() {
CMesaDRMProtocol::CMesaDRMProtocol(const wl_interface* iface, const int& ver, const std::string& name) : IWaylandProtocol(iface, ver, name) {
drmDevice* dev = nullptr;
- int drmFD = g_pCompositor->m_drmFD;
+ int drmFD = g_pCompositor->m_drmRenderNode.fd >= 0 ? g_pCompositor->m_drmRenderNode.fd : g_pCompositor->m_drm.fd;
+
if (drmGetDevice2(drmFD, 0, &dev) != 0) {
- LOGM(ERR, "Failed to get device, disabling MesaDRM");
+ LOGM(ERR, "Failed to get device from fd {}, disabling MesaDRM", drmFD);
removeGlobal();
return;
}
- if (dev->available_nodes & (1 << DRM_NODE_RENDER)) {
+ if (dev->available_nodes & (1 << DRM_NODE_RENDER) && dev->nodes[DRM_NODE_RENDER]) {
m_nodeName = dev->nodes[DRM_NODE_RENDER];
- } else {
- ASSERT(dev->available_nodes & (1 << DRM_NODE_PRIMARY));
-
- if (!dev->nodes[DRM_NODE_PRIMARY]) {
- LOGM(ERR, "No DRM render node available, both render and primary are null, disabling MesaDRM");
- drmFreeDevice(&dev);
- removeGlobal();
- return;
- }
-
+ } else if (dev->available_nodes & (1 << DRM_NODE_PRIMARY) && dev->nodes[DRM_NODE_PRIMARY]) {
LOGM(WARN, "No DRM render node, falling back to primary {}", dev->nodes[DRM_NODE_PRIMARY]);
m_nodeName = dev->nodes[DRM_NODE_PRIMARY];
+ } else {
+ LOGM(ERR, "No usable DRM node (render or primary) found, disabling MesaDRM");
+ drmFreeDevice(&dev);
+ removeGlobal();
+ return;
}
+
drmFreeDevice(&dev);
}