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;