summaryrefslogtreecommitdiff
path: root/src/Compositor.cpp
diff options
context:
space:
mode:
authormavonarx <75391689+mavonarx@users.noreply.github.com>2025-07-23 23:11:07 +0200
committerGitHub <noreply@github.com>2025-07-23 23:11:07 +0200
commitecc04e8ba7469fb01c5a066bf1c48d5cd58d1a18 (patch)
treec6d86285afe39f3d8fbbf63d33ed62e065713e91 /src/Compositor.cpp
parentc51c6e38ac04295a4a6ad45b19bef1dbcdd6478f (diff)
drm: check syncobj timeline support before advertising protocol (#11117)
Prevents crashes on systems where DRM driver lacks syncobj timeline support (e.g., Apple Silicon with Honeykrisp driver). Applications like Zed and WezTerm would crash with 'Timeline failed importing' when trying to use explicit sync. Fixes #8158 #8803 --------- Co-authored-by: mvonarx <matthias.vonarx@sitrox.com>
Diffstat (limited to 'src/Compositor.cpp')
-rw-r--r--src/Compositor.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index 53f79012..58292c8a 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -73,6 +73,7 @@
#include <sys/resource.h>
#include <malloc.h>
#include <unistd.h>
+#include <xf86drm.h>
using namespace Hyprutils::String;
using namespace Aquamarine;
@@ -167,6 +168,10 @@ void CCompositor::restoreNofile() {
Debug::log(ERR, "Failed restoring NOFILE limits");
}
+bool CCompositor::supportsDrmSyncobjTimeline() const {
+ return m_bDrmSyncobjTimelineSupported;
+}
+
void CCompositor::setMallocThreshold() {
#ifdef M_TRIM_THRESHOLD
// The default is 128 pages,
@@ -354,6 +359,16 @@ void CCompositor::initServer(std::string socketName, int socketFd) {
m_drmFD = m_aqBackend->drmFD();
Debug::log(LOG, "Running on DRMFD: {}", m_drmFD);
+ if (m_drmFD >= 0) {
+ uint64_t cap = 0;
+ int ret = drmGetCap(m_drmFD, DRM_CAP_SYNCOBJ_TIMELINE, &cap);
+ m_bDrmSyncobjTimelineSupported = (ret == 0 && cap != 0);
+ Debug::log(LOG, "DRM syncobj timeline support: {}", m_bDrmSyncobjTimelineSupported ? "yes" : "no");
+ } else {
+ m_bDrmSyncobjTimelineSupported = false;
+ Debug::log(LOG, "DRM syncobj timeline support: no (no DRM FD)");
+ }
+
if (!socketName.empty() && socketFd != -1) {
fcntl(socketFd, F_SETFD, FD_CLOEXEC);
const auto RETVAL = wl_display_add_socket_fd(m_wlDisplay, socketFd);