parent
dca8947ec6
commit
5f0002c6c6
@ -0,0 +1,63 @@
|
||||
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