diff --git a/autotests/libkwineffects/data/glplatform/virgl-3.1 b/autotests/libkwineffects/data/glplatform/virgl-3.1 new file mode 100644 --- /dev/null +++ b/autotests/libkwineffects/data/glplatform/virgl-3.1 @@ -0,0 +1,22 @@ +[Driver] +Vendor=Red Hat +Renderer=virgl +Version=3.1 Mesa 19.0.8 +ShadingLanguageVersion=1.40 + +[Settings] +LooseBinding=true +GLSL=true +TextureNPOT=true +Mesa=true +Gallium=true +Virgl=true +VirtualMachine=true +GLVersion=3,1 +GLSLVersion=1,40 +MesaVersion=19,0,8 +GalliumVersion=0,4 +DriverVersion=19,0,8 +Driver=17 +ChipClass=99999 +Compositor=9 diff --git a/autotests/libkwineffects/kwinglplatformtest.cpp b/autotests/libkwineffects/kwinglplatformtest.cpp --- a/autotests/libkwineffects/kwinglplatformtest.cpp +++ b/autotests/libkwineffects/kwinglplatformtest.cpp @@ -78,6 +78,7 @@ QTest::newRow("VirtualBox") << Driver_VirtualBox << QStringLiteral("VirtualBox (Chromium)"); QTest::newRow("VMware") << Driver_VMware << QStringLiteral("VMware (SVGA3D)"); QTest::newRow("Qualcomm") << Driver_Qualcomm << QStringLiteral("Qualcomm"); + QTest::newRow("Virgl") << Driver_Virgl << QStringLiteral("Virgl (virtio-gpu, Qemu/KVM guest)"); QTest::newRow("Unknown") << Driver_Unknown << QStringLiteral("Unknown"); } @@ -262,6 +263,7 @@ QCOMPARE(gl->isVirtualBox(), settingsGroup.readEntry("VirtualBox", false)); QCOMPARE(gl->isVMware(), settingsGroup.readEntry("VMware", false)); QCOMPARE(gl->isAdreno(), settingsGroup.readEntry("Adreno", false)); + QCOMPARE(gl->isVirgl(), settingsGroup.readEntry("Virgl", false)); QCOMPARE(gl->isSoftwareEmulation(), settingsGroup.readEntry("SoftwareEmulation", false)); QCOMPARE(gl->isVirtualMachine(), settingsGroup.readEntry("VirtualMachine", false)); diff --git a/libkwineffects/kwinglplatform.h b/libkwineffects/kwinglplatform.h --- a/libkwineffects/kwinglplatform.h +++ b/libkwineffects/kwinglplatform.h @@ -103,6 +103,7 @@ Driver_VMware, Driver_Qualcomm, Driver_RadeonSI, + Driver_Virgl, Driver_Unknown }; @@ -289,6 +290,12 @@ */ bool isAdreno() const; + /** + * @returns @c true if the "GPU" is a virtio-gpu (Qemu/KVM) + * @since 5.18 + **/ + bool isVirgl() const; + /** * @returns the GL_VERSION string as provided by the driver. * @since 4.9 diff --git a/libkwineffects/kwinglplatform.cpp b/libkwineffects/kwinglplatform.cpp --- a/libkwineffects/kwinglplatform.cpp +++ b/libkwineffects/kwinglplatform.cpp @@ -524,6 +524,8 @@ return QByteArrayLiteral("VMware (SVGA3D)"); case Driver_Qualcomm: return QByteArrayLiteral("Qualcomm"); + case Driver_Virgl: + return QByteArrayLiteral("Virgl (virtio-gpu, Qemu/KVM guest)"); default: return QByteArrayLiteral("Unknown"); @@ -899,6 +901,11 @@ else if (m_vendor == "VMware, Inc." && m_chipset.contains("SVGA3D")) { m_driver = Driver_VMware; } + + // virgl + else if (m_renderer == "virgl") { + m_driver = Driver_Virgl; + } } // Driver/GPU specific features @@ -1017,6 +1024,11 @@ m_recommendedCompositor = OpenGL2Compositing; } + if (m_driver == Driver_Virgl) { + m_virtualMachine = true; + m_recommendedCompositor = OpenGL2Compositing; + } + // and force back to shader supported on gles, we wouldn't have got a context if not supported if (isGLES()) { m_supportsGLSL = true; @@ -1171,6 +1183,11 @@ return m_driver == Driver_VMware; } +bool GLPlatform::isVirgl() const +{ + return m_driver == Driver_Virgl; +} + bool GLPlatform::isSoftwareEmulation() const { return m_driver == Driver_Softpipe || m_driver == Driver_Swrast || m_driver == Driver_Llvmpipe;