diff --git a/autotests/integration/generic_scene_opengl_test.cpp b/autotests/integration/generic_scene_opengl_test.cpp --- a/autotests/integration/generic_scene_opengl_test.cpp +++ b/autotests/integration/generic_scene_opengl_test.cpp @@ -79,6 +79,7 @@ auto scene = KWin::Compositor::self()->scene(); QVERIFY(scene); QCOMPARE(scene->compositingType(), KWin::OpenGL2Compositing); + QCOMPARE(kwinApp()->platform()->selectedCompositor(), KWin::OpenGLCompositing); } void GenericSceneOpenGLTest::testRestart_data() @@ -109,6 +110,7 @@ auto scene = KWin::Compositor::self()->scene(); QVERIFY(scene); QCOMPARE(scene->compositingType(), KWin::OpenGL2Compositing); + QCOMPARE(kwinApp()->platform()->selectedCompositor(), KWin::OpenGLCompositing); // trigger a repaint KWin::Compositor::self()->addRepaintFull(); diff --git a/autotests/integration/scene_qpainter_test.cpp b/autotests/integration/scene_qpainter_test.cpp --- a/autotests/integration/scene_qpainter_test.cpp +++ b/autotests/integration/scene_qpainter_test.cpp @@ -108,6 +108,7 @@ Compositor::self()->addRepaintFull(); auto scene = Compositor::self()->scene(); QVERIFY(scene); + QCOMPARE(kwinApp()->platform()->selectedCompositor(), QPainterCompositing); QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered); QVERIFY(frameRenderedSpy.isValid()); QVERIFY(frameRenderedSpy.wait()); diff --git a/composite.cpp b/composite.cpp --- a/composite.cpp +++ b/composite.cpp @@ -260,6 +260,8 @@ return; } + kwinApp()->platform()->setSelectedCompositor(m_scene->compositingType() & OpenGLCompositing ? OpenGLCompositing : m_scene->compositingType()); + if (!Workspace::self() && m_scene && m_scene->compositingType() == QPainterCompositing) { // Force Software QtQuick on first startup with QPainter QQuickWindow::setSceneGraphBackend(QSGRendererInterface::Software); diff --git a/platform.h b/platform.h --- a/platform.h +++ b/platform.h @@ -430,6 +430,25 @@ **/ virtual QString supportInformation() const; + /** + * The compositor plugin which got selected from @link{supportedCompositors}. + * Prior to selecting a compositor this returns @c NoCompositing. + * + * This method allows the platforms to limit the offerings in @link{supportedCompositors} + * in case they do not support runtime compositor switching + **/ + CompositingType selectedCompositor() const + { + return m_selectedCompositor; + } + /** + * Used by Compositor to set the used compositor. + **/ + void setSelectedCompositor(CompositingType type) + { + m_selectedCompositor = type; + } + public Q_SLOTS: void pointerMotion(const QPointF &position, quint32 time); void pointerButtonPressed(quint32 button, quint32 time); @@ -531,6 +550,7 @@ int m_hideCursorCounter = 0; ColorCorrect::Manager *m_colorCorrect = nullptr; bool m_supportsGammaControl = false; + CompositingType m_selectedCompositor = NoCompositing; }; } diff --git a/plugins/platforms/drm/drm_backend.cpp b/plugins/platforms/drm/drm_backend.cpp --- a/plugins/platforms/drm/drm_backend.cpp +++ b/plugins/platforms/drm/drm_backend.cpp @@ -769,6 +769,9 @@ QVector DrmBackend::supportedCompositors() const { + if (selectedCompositor() != NoCompositing) { + return {selectedCompositor()}; + } #if HAVE_GBM return QVector{OpenGLCompositing, QPainterCompositing}; #else diff --git a/plugins/platforms/virtual/virtual_backend.h b/plugins/platforms/virtual/virtual_backend.h --- a/plugins/platforms/virtual/virtual_backend.h +++ b/plugins/platforms/virtual/virtual_backend.h @@ -58,6 +58,9 @@ Outputs enabledOutputs() const override; QVector supportedCompositors() const override { + if (selectedCompositor() != NoCompositing) { + return {selectedCompositor()}; + } return QVector{OpenGLCompositing, QPainterCompositing}; } diff --git a/plugins/platforms/wayland/wayland_backend.cpp b/plugins/platforms/wayland/wayland_backend.cpp --- a/plugins/platforms/wayland/wayland_backend.cpp +++ b/plugins/platforms/wayland/wayland_backend.cpp @@ -655,6 +655,9 @@ QVector WaylandBackend::supportedCompositors() const { + if (selectedCompositor() != NoCompositing) { + return {selectedCompositor()}; + } #if HAVE_WAYLAND_EGL return QVector{OpenGLCompositing, QPainterCompositing}; #else diff --git a/plugins/platforms/x11/windowed/x11windowed_backend.h b/plugins/platforms/x11/windowed/x11windowed_backend.h --- a/plugins/platforms/x11/windowed/x11windowed_backend.h +++ b/plugins/platforms/x11/windowed/x11windowed_backend.h @@ -70,6 +70,9 @@ void warpPointer(const QPointF &globalPos) override; QVector supportedCompositors() const override { + if (selectedCompositor() != NoCompositing) { + return {selectedCompositor()}; + } return QVector{OpenGLCompositing, QPainterCompositing}; }