parent
567a2e879f
commit
8c1b9d5778
@ -1,63 +0,0 @@
|
|||||||
From e686da9ddedd820d3a7c3c21033c48276c251636 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Xaver Hugl <xaver.hugl@gmail.com>
|
|
||||||
Date: Sun, 20 Mar 2022 05:12:48 +0100
|
|
||||||
Subject: [PATCH] backends/drm: fall back to legacy mode in virtual machines
|
|
||||||
|
|
||||||
Virtual machines aren't properly supporting atomic mode setting yet, which
|
|
||||||
causes the cursor to be offset, and will cause more issues with overlay
|
|
||||||
planes. In order to prevent that from impacting users, fall back to legacy,
|
|
||||||
unless KWIN_DRM_NO_AMS is set.
|
|
||||||
|
|
||||||
BUG: 427060
|
|
||||||
FIXED-IN: 5.24.4
|
|
||||||
---
|
|
||||||
src/backends/drm/drm_gpu.cpp | 11 +++++++----
|
|
||||||
src/backends/drm/drm_gpu.h | 1 +
|
|
||||||
2 files changed, 8 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/backends/drm/drm_gpu.cpp b/src/backends/drm/drm_gpu.cpp
|
|
||||||
index 51b8719f57..26d6b27b04 100644
|
|
||||||
--- a/src/backends/drm/drm_gpu.cpp
|
|
||||||
+++ b/src/backends/drm/drm_gpu.cpp
|
|
||||||
@@ -75,9 +75,10 @@ DrmGpu::DrmGpu(DrmBackend *backend, const QString &devNode, int fd, dev_t device
|
|
||||||
m_addFB2ModifiersSupported = drmGetCap(fd, DRM_CAP_ADDFB2_MODIFIERS, &capability) == 0 && capability == 1;
|
|
||||||
qCDebug(KWIN_DRM) << "drmModeAddFB2WithModifiers is" << (m_addFB2ModifiersSupported ? "supported" : "not supported") << "on GPU" << m_devNode;
|
|
||||||
|
|
||||||
- // find out if this GPU is using the NVidia proprietary driver
|
|
||||||
+ // find out what driver this kms device is using
|
|
||||||
DrmScopedPointer<drmVersion> version(drmGetVersion(fd));
|
|
||||||
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");
|
|
||||||
m_gbmDevice = gbm_create_device(m_fd);
|
|
||||||
|
|
||||||
m_socketNotifier = new QSocketNotifier(fd, QSocketNotifier::Read, this);
|
|
||||||
@@ -148,9 +149,11 @@ clockid_t DrmGpu::presentationClock() const
|
|
||||||
void DrmGpu::initDrmResources()
|
|
||||||
{
|
|
||||||
// try atomic mode setting
|
|
||||||
- bool tmp = false;
|
|
||||||
- bool noAMS = qEnvironmentVariableIntValue("KWIN_DRM_NO_AMS", &tmp) != 0 && tmp;
|
|
||||||
- if (noAMS) {
|
|
||||||
+ bool isEnvVarSet = false;
|
|
||||||
+ bool noAMS = qEnvironmentVariableIntValue("KWIN_DRM_NO_AMS", &isEnvVarSet) != 0 && isEnvVarSet;
|
|
||||||
+ if (m_isVirtualMachine && !isEnvVarSet) {
|
|
||||||
+ qCWarning(KWIN_DRM, "Atomic Mode Setting disabled on GPU %s because of cursor offset issues in virtual machines", qPrintable(m_devNode));
|
|
||||||
+ } else if (noAMS) {
|
|
||||||
qCWarning(KWIN_DRM) << "Atomic Mode Setting requested off via environment variable. Using legacy mode on GPU" << m_devNode;
|
|
||||||
} else if(drmSetClientCap(m_fd, DRM_CLIENT_CAP_ATOMIC, 1) != 0) {
|
|
||||||
qCWarning(KWIN_DRM) << "drmSetClientCap for Atomic Mode Setting failed. Using legacy mode on GPU" << m_devNode;
|
|
||||||
diff --git a/src/backends/drm/drm_gpu.h b/src/backends/drm/drm_gpu.h
|
|
||||||
index 97c2d8ddc2..1e1f7e3b15 100644
|
|
||||||
--- a/src/backends/drm/drm_gpu.h
|
|
||||||
+++ b/src/backends/drm/drm_gpu.h
|
|
||||||
@@ -118,6 +118,7 @@ private:
|
|
||||||
bool m_atomicModeSetting;
|
|
||||||
bool m_addFB2ModifiersSupported = false;
|
|
||||||
bool m_isNVidia;
|
|
||||||
+ bool m_isVirtualMachine;
|
|
||||||
clockid_t m_presentationClock;
|
|
||||||
gbm_device* m_gbmDevice;
|
|
||||||
EGLDisplay m_eglDisplay = EGL_NO_DISPLAY;
|
|
||||||
--
|
|
||||||
GitLab
|
|
||||||
|
|
Loading…
Reference in new issue