backends/drm: re-allow HDR on NVidia with driver version 565.57.01+

The bug that made me disable it by default was fixed in that version

CCBUG: 488941
wilder/Plasma/6.3
Xaver Hugl 1 year ago
parent 3e267091b1
commit cb9d538948
  1. 21
      src/backends/drm/drm_gpu.cpp
  2. 3
      src/backends/drm/drm_gpu.h
  3. 2
      src/backends/drm/drm_output.cpp

@ -24,17 +24,17 @@
#include "drm_output.h"
#include "drm_pipeline.h"
#include "drm_plane.h"
// system
#include <QFile>
#include <algorithm>
#include <drm_fourcc.h>
#include <errno.h>
#include <fcntl.h>
#include <gbm.h>
#include <libdrm/drm_mode.h>
#include <poll.h>
#include <ranges>
#include <unistd.h>
// drm
#include <drm_fourcc.h>
#include <gbm.h>
#include <libdrm/drm_mode.h>
#include <xf86drm.h>
#include <xf86drmMode.h>
@ -86,6 +86,12 @@ DrmGpu::DrmGpu(DrmBackend *backend, int fd, std::unique_ptr<DrmDevice> &&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<QSocketNotifier>(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<Version> DrmGpu::nvidiaDriverVersion() const
{
return m_nvidiaDriverVersion;
}
bool DrmGpu::isRemoved() const
{
return m_isRemoved;

@ -11,6 +11,7 @@
#include "core/drmdevice.h"
#include "drm_pipeline.h"
#include "utils/filedescriptor.h"
#include "utils/version.h"
#include <QList>
#include <QPointer>
@ -87,6 +88,7 @@ public:
bool isAmdgpu() const;
bool isVmwgfx() const;
bool isVirtualMachine() const;
std::optional<Version> nvidiaDriverVersion() const;
EglDisplay *eglDisplay() const;
DrmBackend *platform() const;
/**
@ -150,6 +152,7 @@ private:
clockid_t m_presentationClock;
std::unique_ptr<EglDisplay> m_eglDisplay;
DrmBackend *const m_platform;
std::optional<Version> m_nvidiaDriverVersion;
std::vector<std::unique_ptr<DrmPlane>> m_planes;
std::vector<std::unique_ptr<DrmCrtc>> m_crtcs;

@ -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;

Loading…
Cancel
Save