diff --git a/src/backends/drm/drm_commit.cpp b/src/backends/drm/drm_commit.cpp index ff86a0f3e8..ec4915091b 100644 --- a/src/backends/drm/drm_commit.cpp +++ b/src/backends/drm/drm_commit.cpp @@ -57,7 +57,8 @@ void DrmAtomicCommit::addBuffer(DrmPlane *plane, const std::shared_ptr<DrmFrameb { addProperty(plane->fbId, buffer ? buffer->framebufferId() : 0); m_buffers[plane] = buffer; - if (plane->inFenceFd.isValid()) { + // atomic commits with IN_FENCE_FD fail with NVidia + if (plane->inFenceFd.isValid() && !plane->gpu()->isNVidia()) { addProperty(plane->inFenceFd, buffer ? buffer->syncFd().get() : -1); } m_planes.emplace(plane); diff --git a/src/backends/drm/drm_gpu.cpp b/src/backends/drm/drm_gpu.cpp index bc6a3d8818..d2411d3f66 100644 --- a/src/backends/drm/drm_gpu.cpp +++ b/src/backends/drm/drm_gpu.cpp @@ -79,6 +79,7 @@ DrmGpu::DrmGpu(DrmBackend *backend, const QString &devNode, int fd, dev_t device // find out what driver this kms device is using DrmUniquePtr<drmVersion> version(drmGetVersion(fd)); m_isI915 = strstr(version->name, "i915"); + m_isNVidia = strstr(version->name, "nvidia-drm"); m_isVirtualMachine = strstr(version->name, "virtio") || strstr(version->name, "qxl") || strstr(version->name, "vmwgfx") || strstr(version->name, "vboxvideo"); @@ -695,6 +696,11 @@ bool DrmGpu::isI915() const return m_isI915; } +bool DrmGpu::isNVidia() const +{ + return m_isNVidia; +} + bool DrmGpu::isRemoved() const { return m_isRemoved; diff --git a/src/backends/drm/drm_gpu.h b/src/backends/drm/drm_gpu.h index 8a83375479..f870140167 100644 --- a/src/backends/drm/drm_gpu.h +++ b/src/backends/drm/drm_gpu.h @@ -78,6 +78,7 @@ public: bool addFB2ModifiersSupported() const; bool asyncPageflipSupported() const; bool isI915() const; + bool isNVidia() const; gbm_device *gbmDevice() const; EglDisplay *eglDisplay() const; DrmBackend *platform() const;