diff --git a/src/backends/drm/drm_gpu.cpp b/src/backends/drm/drm_gpu.cpp index 0fb82824ba..9e86ea03a6 100644 --- a/src/backends/drm/drm_gpu.cpp +++ b/src/backends/drm/drm_gpu.cpp @@ -24,17 +24,17 @@ #include "drm_output.h" #include "drm_pipeline.h" #include "drm_plane.h" -// system + +#include #include +#include #include #include +#include +#include #include #include #include -// drm -#include -#include -#include #include #include @@ -86,6 +86,12 @@ DrmGpu::DrmGpu(DrmBackend *backend, int fd, std::unique_ptr &&device) m_isVmwgfx = strstr(version->name, "vmwgfx"); m_isVirtualMachine = strstr(version->name, "virtio") || strstr(version->name, "qxl") || strstr(version->name, "vmwgfx") || strstr(version->name, "vboxvideo"); + if (m_isNVidia) { + QFile moduleVersion("/sys/module/nvidia_drm/version"); + if (moduleVersion.open(QIODeviceBase::OpenModeFlag::ReadOnly)) { + m_nvidiaDriverVersion = Version::parseString(moduleVersion.readLine(100)); + } + } m_socketNotifier = std::make_unique(fd, QSocketNotifier::Read); connect(m_socketNotifier.get(), &QSocketNotifier::activated, this, &DrmGpu::dispatchEvents); @@ -676,6 +682,11 @@ bool DrmGpu::isVirtualMachine() const return m_isVirtualMachine; } +std::optional DrmGpu::nvidiaDriverVersion() const +{ + return m_nvidiaDriverVersion; +} + bool DrmGpu::isRemoved() const { return m_isRemoved; diff --git a/src/backends/drm/drm_gpu.h b/src/backends/drm/drm_gpu.h index c7858cffab..53e413143b 100644 --- a/src/backends/drm/drm_gpu.h +++ b/src/backends/drm/drm_gpu.h @@ -11,6 +11,7 @@ #include "core/drmdevice.h" #include "drm_pipeline.h" #include "utils/filedescriptor.h" +#include "utils/version.h" #include #include @@ -87,6 +88,7 @@ public: bool isAmdgpu() const; bool isVmwgfx() const; bool isVirtualMachine() const; + std::optional nvidiaDriverVersion() const; EglDisplay *eglDisplay() const; DrmBackend *platform() const; /** @@ -150,6 +152,7 @@ private: clockid_t m_presentationClock; std::unique_ptr m_eglDisplay; DrmBackend *const m_platform; + std::optional m_nvidiaDriverVersion; std::vector> m_planes; std::vector> m_crtcs; diff --git a/src/backends/drm/drm_output.cpp b/src/backends/drm/drm_output.cpp index bbcc7eebb0..d1ab39d713 100644 --- a/src/backends/drm/drm_output.cpp +++ b/src/backends/drm/drm_output.cpp @@ -259,7 +259,7 @@ Output::Capabilities DrmOutput::computeCapabilities() const if (m_gpu->isI915()) { allowColorspace &= s_allowColorspaceIntel || linuxKernelVersion() >= Version(6, 11); } else if (m_gpu->isNVidia()) { - allowColorspace &= s_allowColorspaceNVidia; + allowColorspace &= s_allowColorspaceNVidia || m_gpu->nvidiaDriverVersion() >= Version(565, 57, 1); } if (allowColorspace) { capabilities |= Capability::WideColorGamut;