diff --git a/CMakeLists.txt b/CMakeLists.txt
index 70eaef2d0e..8e03a2f0f2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -336,7 +336,6 @@ include(CMakeDependentOption)
option(KWIN_BUILD_DECORATIONS "Enable building of KWin decorations." ON)
option(KWIN_BUILD_KCMS "Enable building of KWin configuration modules." ON)
option(KWIN_BUILD_TABBOX "Enable building of KWin Tabbox functionality" ON)
-option(KWIN_BUILD_XRENDER_COMPOSITING "Enable building of KWin with XRender Compositing support" ON)
cmake_dependent_option(KWIN_BUILD_ACTIVITIES "Enable building of KWin with kactivities support" ON "KF5Activities_FOUND" OFF)
cmake_dependent_option(KWIN_BUILD_RUNNERS "Enable building of KWin with krunner support" ON "KF5Runner_FOUND" OFF)
cmake_dependent_option(KWIN_BUILD_CMS "Enable building of KWin with CMS" ON "lcms2_FOUND" OFF)
@@ -346,11 +345,6 @@ set(KWIN_NAME "kwin")
set(KWIN_INTERNAL_NAME_X11 "kwin_x11")
set(KWIN_INTERNAL_NAME_WAYLAND "kwin_wayland")
-# KWIN_HAVE_XRENDER_COMPOSITING - whether XRender-based compositing support is available: may be disabled
-if (KWIN_BUILD_XRENDER_COMPOSITING)
- set(KWIN_HAVE_XRENDER_COMPOSITING 1)
-endif()
-
include_directories(${XKB_INCLUDE_DIR})
set(HAVE_EPOXY_GLX ${epoxy_HAS_GLX})
diff --git a/autotests/libkwineffects/kwinglplatformtest.cpp b/autotests/libkwineffects/kwinglplatformtest.cpp
index 63ba823ed2..b776cfc74b 100644
--- a/autotests/libkwineffects/kwinglplatformtest.cpp
+++ b/autotests/libkwineffects/kwinglplatformtest.cpp
@@ -171,7 +171,7 @@ void GLPlatformTest::testPriorDetect()
QCOMPARE(gl->isLooseBinding(), false);
QCOMPARE(gl->isGLES(), false);
- QCOMPARE(gl->recommendedCompositor(), XRenderCompositing);
+ QCOMPARE(gl->recommendedCompositor(), QPainterCompositing);
QCOMPARE(gl->preferBufferSubData(), false);
QCOMPARE(gl->platformInterface(), NoOpenGLPlatformInterface);
}
diff --git a/autotests/mock_effectshandler.h b/autotests/mock_effectshandler.h
index 391fa07542..e8f46ad773 100644
--- a/autotests/mock_effectshandler.h
+++ b/autotests/mock_effectshandler.h
@@ -220,9 +220,6 @@ public:
int workspaceWidth() const override {
return 0;
}
- long unsigned int xrenderBufferPicture() override {
- return 0;
- }
xcb_connection_t *xcbConnection() const override {
return QX11Info::connection();
}
diff --git a/autotests/test_builtin_effectloader.cpp b/autotests/test_builtin_effectloader.cpp
index 64a94644a3..5bfecdd54e 100644
--- a/autotests/test_builtin_effectloader.cpp
+++ b/autotests/test_builtin_effectloader.cpp
@@ -170,62 +170,62 @@ void TestBuiltInEffectLoader::testSupported_data()
QTest::addColumn("type");
QTest::addColumn("animationsSupported");
- const KWin::CompositingType xc = KWin::XRenderCompositing;
+ const KWin::CompositingType qc = KWin::QPainterCompositing;
const KWin::CompositingType oc = KWin::OpenGL2Compositing;
- QTest::newRow("blur") << QStringLiteral("blur") << false << xc << true;
+ QTest::newRow("blur") << QStringLiteral("blur") << false << qc << true;
// fails for GL as it does proper tests on what's supported and doesn't just check whether it's GL
QTest::newRow("blur-GL") << QStringLiteral("blur") << false << oc << true;
- QTest::newRow("Colorpicker") << QStringLiteral("colorpicker") << false << xc << true;
+ QTest::newRow("Colorpicker") << QStringLiteral("colorpicker") << false << qc << true;
QTest::newRow("Colorpicker-GL") << QStringLiteral("colorpicker") << true << oc << true;
- QTest::newRow("Contrast") << QStringLiteral("contrast") << false << xc << true;
+ QTest::newRow("Contrast") << QStringLiteral("contrast") << false << qc << true;
// fails for GL as it does proper tests on what's supported and doesn't just check whether it's GL
QTest::newRow("Contrast-GL") << QStringLiteral("contrast") << false << oc << true;
- QTest::newRow("DesktopGrid") << QStringLiteral("desktopgrid") << true << xc << true;
- QTest::newRow("DimInactive") << QStringLiteral("diminactive") << true << xc << true;
- QTest::newRow("FallApart") << QStringLiteral("fallapart") << false << xc << true;
+ QTest::newRow("DesktopGrid") << QStringLiteral("desktopgrid") << true << qc << true;
+ QTest::newRow("DimInactive") << QStringLiteral("diminactive") << true << qc << true;
+ QTest::newRow("FallApart") << QStringLiteral("fallapart") << false << qc << true;
QTest::newRow("FallApart-GL") << QStringLiteral("fallapart") << true << oc << true;
- QTest::newRow("Glide") << QStringLiteral("glide") << false << xc << true;
+ QTest::newRow("Glide") << QStringLiteral("glide") << false << qc << true;
QTest::newRow("Glide-GL") << QStringLiteral("glide") << true << oc << true;
QTest::newRow("Glide-GL-no-anim") << QStringLiteral("glide") << false << oc << false;
- QTest::newRow("HighlightWindow") << QStringLiteral("highlightwindow") << true << xc << true;
- QTest::newRow("Invert") << QStringLiteral("invert") << false << xc << true;
+ QTest::newRow("HighlightWindow") << QStringLiteral("highlightwindow") << true << qc << true;
+ QTest::newRow("Invert") << QStringLiteral("invert") << false << qc << true;
QTest::newRow("Invert-GL") << QStringLiteral("invert") << true << oc << true;
- QTest::newRow("Kscreen") << QStringLiteral("kscreen") << true << xc << true;
- QTest::newRow("LookingGlass") << QStringLiteral("lookingglass") << false << xc << true;
+ QTest::newRow("Kscreen") << QStringLiteral("kscreen") << true << qc << true;
+ QTest::newRow("LookingGlass") << QStringLiteral("lookingglass") << false << qc << true;
QTest::newRow("LookingGlass-GL") << QStringLiteral("lookingglass") << true << oc << true;
- QTest::newRow("MagicLamp") << QStringLiteral("magiclamp") << false << xc << true;
+ QTest::newRow("MagicLamp") << QStringLiteral("magiclamp") << false << qc << true;
QTest::newRow("MagicLamp-GL") << QStringLiteral("magiclamp") << true << oc << true;
QTest::newRow("MagicLamp-GL-no-anim") << QStringLiteral("magiclamp") << false << oc << false;
- QTest::newRow("Magnifier") << QStringLiteral("magnifier") << true << xc << true;
- QTest::newRow("MouseClick") << QStringLiteral("mouseclick") << true << xc << true;
- QTest::newRow("MouseMark") << QStringLiteral("mousemark") << true << xc << true;
- QTest::newRow("PresentWindows") << QStringLiteral("presentwindows") << true << xc << true;
- QTest::newRow("Resize") << QStringLiteral("resize") << true << xc << true;
- QTest::newRow("ScreenEdge") << QStringLiteral("screenedge") << true << xc << true;
- QTest::newRow("ScreenShot") << QStringLiteral("screenshot") << true << xc << true;
- QTest::newRow("Sheet") << QStringLiteral("sheet") << false << xc << true;
+ QTest::newRow("Magnifier") << QStringLiteral("magnifier") << false << qc << false;
+ QTest::newRow("MouseClick") << QStringLiteral("mouseclick") << true << qc << true;
+ QTest::newRow("MouseMark") << QStringLiteral("mousemark") << true << qc << true;
+ QTest::newRow("PresentWindows") << QStringLiteral("presentwindows") << true << qc << true;
+ QTest::newRow("Resize") << QStringLiteral("resize") << true << qc << true;
+ QTest::newRow("ScreenEdge") << QStringLiteral("screenedge") << true << qc << true;
+ QTest::newRow("ScreenShot") << QStringLiteral("screenshot") << false << qc << false;
+ QTest::newRow("Sheet") << QStringLiteral("sheet") << false << qc << true;
QTest::newRow("Sheet-GL") << QStringLiteral("sheet") << true << oc << true;
QTest::newRow("Sheet-GL-no-anim") << QStringLiteral("sheet") << false << oc << false;
- QTest::newRow("ShowFps") << QStringLiteral("showfps") << true << xc << true;
- QTest::newRow("ShowPaint") << QStringLiteral("showpaint") << true << xc << true;
- QTest::newRow("Slide") << QStringLiteral("slide") << true << xc << true;
- QTest::newRow("SlideBack") << QStringLiteral("slideback") << true << xc << true;
- QTest::newRow("SlidingPopups") << QStringLiteral("slidingpopups") << true << xc << true;
- QTest::newRow("SnapHelper") << QStringLiteral("snaphelper") << true << xc << true;
- QTest::newRow("StartupFeedback") << QStringLiteral("startupfeedback") << false << xc << true;
+ QTest::newRow("ShowFps") << QStringLiteral("showfps") << true << qc << true;
+ QTest::newRow("ShowPaint") << QStringLiteral("showpaint") << true << qc << true;
+ QTest::newRow("Slide") << QStringLiteral("slide") << true << qc << true;
+ QTest::newRow("SlideBack") << QStringLiteral("slideback") << true << qc << true;
+ QTest::newRow("SlidingPopups") << QStringLiteral("slidingpopups") << true << qc << true;
+ QTest::newRow("SnapHelper") << QStringLiteral("snaphelper") << true << qc << true;
+ QTest::newRow("StartupFeedback") << QStringLiteral("startupfeedback") << false << qc << true;
QTest::newRow("StartupFeedback-GL") << QStringLiteral("startupfeedback") << true << oc << true;
- QTest::newRow("ThumbnailAside") << QStringLiteral("thumbnailaside") << true << xc << true;
- QTest::newRow("TouchPoints") << QStringLiteral("touchpoints") << true << xc << true;
- QTest::newRow("TrackMouse") << QStringLiteral("trackmouse") << true << xc << true;
- QTest::newRow("WindowGeometry") << QStringLiteral("windowgeometry") << true << xc << true;
- QTest::newRow("WobblyWindows") << QStringLiteral("wobblywindows") << false << xc << true;
+ QTest::newRow("ThumbnailAside") << QStringLiteral("thumbnailaside") << true << qc << true;
+ QTest::newRow("TouchPoints") << QStringLiteral("touchpoints") << true << qc << true;
+ QTest::newRow("TrackMouse") << QStringLiteral("trackmouse") << true << qc << true;
+ QTest::newRow("WindowGeometry") << QStringLiteral("windowgeometry") << true << qc << true;
+ QTest::newRow("WobblyWindows") << QStringLiteral("wobblywindows") << false << qc << true;
QTest::newRow("WobblyWindows-GL") << QStringLiteral("wobblywindows") << true << oc << true;
QTest::newRow("WobblyWindows-GL-no-anim") << QStringLiteral("wobblywindows") << false << oc << false;
- QTest::newRow("Zoom") << QStringLiteral("zoom") << true << xc << true;
- QTest::newRow("Non Existing") << QStringLiteral("InvalidName") << false << xc << true;
- QTest::newRow("Fade - Scripted") << QStringLiteral("fade") << false << xc << true;
- QTest::newRow("Fade - Scripted + kwin4_effect") << QStringLiteral("kwin4_effect_fade") << false << xc << true;
+ QTest::newRow("Zoom") << QStringLiteral("zoom") << true << qc << true;
+ QTest::newRow("Non Existing") << QStringLiteral("InvalidName") << false << qc << true;
+ QTest::newRow("Fade - Scripted") << QStringLiteral("fade") << false << qc << true;
+ QTest::newRow("Fade - Scripted + kwin4_effect") << QStringLiteral("kwin4_effect_fade") << false << qc << true;
}
void TestBuiltInEffectLoader::testSupported()
@@ -248,61 +248,61 @@ void TestBuiltInEffectLoader::testLoadEffect_data()
QTest::addColumn("expected");
QTest::addColumn("type");
- const KWin::CompositingType xc = KWin::XRenderCompositing;
+ const KWin::CompositingType qc = KWin::QPainterCompositing;
const KWin::CompositingType oc = KWin::OpenGL2Compositing;
- QTest::newRow("blur") << QStringLiteral("blur") << false << xc;
+ QTest::newRow("blur") << QStringLiteral("blur") << false << qc;
// fails for GL as it does proper tests on what's supported and doesn't just check whether it's GL
QTest::newRow("blur-GL") << QStringLiteral("blur") << false << oc;
- QTest::newRow("Colorpicker") << QStringLiteral("colorpicker") << false << xc;
+ QTest::newRow("Colorpicker") << QStringLiteral("colorpicker") << false << qc;
QTest::newRow("Colorpicker-GL") << QStringLiteral("colorpicker") << true << oc;
- QTest::newRow("Contrast") << QStringLiteral("contrast") << false << xc;
+ QTest::newRow("Contrast") << QStringLiteral("contrast") << false << qc;
// fails for GL as it does proper tests on what's supported and doesn't just check whether it's GL
QTest::newRow("Contrast-GL") << QStringLiteral("contrast") << false << oc;
- QTest::newRow("DesktopGrid") << QStringLiteral("desktopgrid") << true << xc;
- QTest::newRow("DimInactive") << QStringLiteral("diminactive") << true << xc;
- QTest::newRow("FallApart") << QStringLiteral("fallapart") << false << xc;
+ QTest::newRow("DesktopGrid") << QStringLiteral("desktopgrid") << true << qc;
+ QTest::newRow("DimInactive") << QStringLiteral("diminactive") << true << qc;
+ QTest::newRow("FallApart") << QStringLiteral("fallapart") << false << qc;
QTest::newRow("FallApart-GL") << QStringLiteral("fallapart") << true << oc;
- QTest::newRow("Glide") << QStringLiteral("glide") << false << xc;
+ QTest::newRow("Glide") << QStringLiteral("glide") << false << qc;
QTest::newRow("Glide-GL") << QStringLiteral("glide") << true << oc;
- QTest::newRow("HighlightWindow") << QStringLiteral("highlightwindow") << true << xc;
- QTest::newRow("Invert") << QStringLiteral("invert") << false << xc;
+ QTest::newRow("HighlightWindow") << QStringLiteral("highlightwindow") << true << qc;
+ QTest::newRow("Invert") << QStringLiteral("invert") << false << qc;
QTest::newRow("Invert-GL") << QStringLiteral("invert") << true << oc;
- QTest::newRow("Kscreen") << QStringLiteral("kscreen") << true << xc;
- QTest::newRow("LookingGlass") << QStringLiteral("lookingglass") << false << xc;
+ QTest::newRow("Kscreen") << QStringLiteral("kscreen") << true << qc;
+ QTest::newRow("LookingGlass") << QStringLiteral("lookingglass") << false << qc;
QTest::newRow("LookingGlass-GL") << QStringLiteral("lookingglass") << true << oc;
- QTest::newRow("MagicLamp") << QStringLiteral("magiclamp") << false << xc;
+ QTest::newRow("MagicLamp") << QStringLiteral("magiclamp") << false << qc;
QTest::newRow("MagicLamp-GL") << QStringLiteral("magiclamp") << true << oc;
- QTest::newRow("Magnifier") << QStringLiteral("magnifier") << true << xc;
- QTest::newRow("MouseClick") << QStringLiteral("mouseclick") << true << xc;
- QTest::newRow("MouseMark") << QStringLiteral("mousemark") << true << xc;
- QTest::newRow("PresentWindows") << QStringLiteral("presentwindows") << true << xc;
- QTest::newRow("Resize") << QStringLiteral("resize") << true << xc;
- QTest::newRow("ScreenEdge") << QStringLiteral("screenedge") << true << xc;
- QTest::newRow("ScreenShot") << QStringLiteral("screenshot") << true << xc;
- QTest::newRow("Sheet") << QStringLiteral("sheet") << false << xc;
+ QTest::newRow("Magnifier") << QStringLiteral("magnifier") << false << qc;
+ QTest::newRow("MouseClick") << QStringLiteral("mouseclick") << true << qc;
+ QTest::newRow("MouseMark") << QStringLiteral("mousemark") << true << qc;
+ QTest::newRow("PresentWindows") << QStringLiteral("presentwindows") << true << qc;
+ QTest::newRow("Resize") << QStringLiteral("resize") << true << qc;
+ QTest::newRow("ScreenEdge") << QStringLiteral("screenedge") << true << qc;
+ QTest::newRow("ScreenShot") << QStringLiteral("screenshot") << false << qc;
+ QTest::newRow("Sheet") << QStringLiteral("sheet") << false << qc;
QTest::newRow("Sheet-GL") << QStringLiteral("sheet") << true << oc;
// TODO: Accesses EffectFrame and crashes
// QTest::newRow("ShowFps") << QStringLiteral("showfps") << true << xc;
- QTest::newRow("ShowPaint") << QStringLiteral("showpaint") << true << xc;
- QTest::newRow("Slide") << QStringLiteral("slide") << true << xc;
- QTest::newRow("SlideBack") << QStringLiteral("slideback") << true << xc;
- QTest::newRow("SlidingPopups") << QStringLiteral("slidingpopups") << true << xc;
- QTest::newRow("SnapHelper") << QStringLiteral("snaphelper") << true << xc;
- QTest::newRow("StartupFeedback") << QStringLiteral("startupfeedback") << false << xc;
+ QTest::newRow("ShowPaint") << QStringLiteral("showpaint") << true << qc;
+ QTest::newRow("Slide") << QStringLiteral("slide") << true << qc;
+ QTest::newRow("SlideBack") << QStringLiteral("slideback") << true << qc;
+ QTest::newRow("SlidingPopups") << QStringLiteral("slidingpopups") << true << qc;
+ QTest::newRow("SnapHelper") << QStringLiteral("snaphelper") << true << qc;
+ QTest::newRow("StartupFeedback") << QStringLiteral("startupfeedback") << false << qc;
// Tries to load shader and makes our test abort
// QTest::newRow("StartupFeedback-GL") << QStringLiteral("startupfeedback") << true << oc;
- QTest::newRow("ThumbnailAside") << QStringLiteral("thumbnailaside") << true << xc;
- QTest::newRow("Touchpoints") << QStringLiteral("touchpoints") << true << xc;
- QTest::newRow("TrackMouse") << QStringLiteral("trackmouse") << true << xc;
+ QTest::newRow("ThumbnailAside") << QStringLiteral("thumbnailaside") << true << qc;
+ QTest::newRow("Touchpoints") << QStringLiteral("touchpoints") << true << qc;
+ QTest::newRow("TrackMouse") << QStringLiteral("trackmouse") << true << qc;
// TODO: Accesses EffectFrame and crashes
// QTest::newRow("WindowGeometry") << QStringLiteral("windowgeometry") << true << xc;
- QTest::newRow("WobblyWindows") << QStringLiteral("wobblywindows") << false << xc;
+ QTest::newRow("WobblyWindows") << QStringLiteral("wobblywindows") << false << qc;
QTest::newRow("WobblyWindows-GL") << QStringLiteral("wobblywindows") << true << oc;
- QTest::newRow("Zoom") << QStringLiteral("zoom") << true << xc;
- QTest::newRow("Non Existing") << QStringLiteral("InvalidName") << false << xc;
- QTest::newRow("Fade - Scripted") << QStringLiteral("fade") << false << xc;
- QTest::newRow("Fade - Scripted + kwin4_effect") << QStringLiteral("kwin4_effect_fade") << false << xc;
+ QTest::newRow("Zoom") << QStringLiteral("zoom") << true << qc;
+ QTest::newRow("Non Existing") << QStringLiteral("InvalidName") << false << qc;
+ QTest::newRow("Fade - Scripted") << QStringLiteral("fade") << false << qc;
+ QTest::newRow("Fade - Scripted + kwin4_effect") << QStringLiteral("kwin4_effect_fade") << false << qc;
}
void TestBuiltInEffectLoader::testLoadEffect()
@@ -365,7 +365,7 @@ void TestBuiltInEffectLoader::testLoadBuiltInEffect_data()
QTest::addColumn("type");
QTest::addColumn("loadFlags");
- const KWin::CompositingType xc = KWin::XRenderCompositing;
+ const KWin::CompositingType qc = KWin::QPainterCompositing;
const KWin::CompositingType oc = KWin::OpenGL2Compositing;
const KWin::LoadEffectFlags checkDefault = KWin::LoadEffectFlag::Load | KWin::LoadEffectFlag::CheckDefaultFunction;
@@ -375,21 +375,21 @@ void TestBuiltInEffectLoader::testLoadBuiltInEffect_data()
// enabled by default, but not supported
QTest::newRow("blur") << KWin::BuiltInEffect::Blur << QStringLiteral("blur") << false << oc << checkDefault;
// enabled by default
- QTest::newRow("HighlightWindow") << KWin::BuiltInEffect::HighlightWindow << QStringLiteral("highlightwindow") << true << xc << checkDefault;
+ QTest::newRow("HighlightWindow") << KWin::BuiltInEffect::HighlightWindow << QStringLiteral("highlightwindow") << true << qc << checkDefault;
// supported but not enabled by default
QTest::newRow("LookingGlass-GL") << KWin::BuiltInEffect::LookingGlass << QStringLiteral("lookingglass") << true << oc << checkDefault;
// not enabled by default
- QTest::newRow("MouseClick") << KWin::BuiltInEffect::MouseClick << QStringLiteral("mouseclick") << true << xc << checkDefault;
+ QTest::newRow("MouseClick") << KWin::BuiltInEffect::MouseClick << QStringLiteral("mouseclick") << true << qc << checkDefault;
// Force an Effect which will load
- QTest::newRow("MouseClick-Force") << KWin::BuiltInEffect::MouseClick << QStringLiteral("mouseclick") << true << xc << forceFlags;
+ QTest::newRow("MouseClick-Force") << KWin::BuiltInEffect::MouseClick << QStringLiteral("mouseclick") << true << qc << forceFlags;
// Force an Effect which is not supported
- QTest::newRow("LookingGlass-Force") << KWin::BuiltInEffect::LookingGlass << QStringLiteral("lookingglass") << false << xc << forceFlags;
+ QTest::newRow("LookingGlass-Force") << KWin::BuiltInEffect::LookingGlass << QStringLiteral("lookingglass") << false << qc << forceFlags;
// Force the Effect as supported
QTest::newRow("LookingGlass-Force-GL") << KWin::BuiltInEffect::LookingGlass << QStringLiteral("lookingglass") << true << oc << forceFlags;
// Enforce no load of effect which is enabled by default
- QTest::newRow("HighlightWindow-DontLoad") << KWin::BuiltInEffect::HighlightWindow << QStringLiteral("highlightwindow") << false << xc << dontLoadFlags;
+ QTest::newRow("HighlightWindow-DontLoad") << KWin::BuiltInEffect::HighlightWindow << QStringLiteral("highlightwindow") << false << qc << dontLoadFlags;
// Enforce no load of effect which is not enabled by default, but enforced
- QTest::newRow("MouseClick-DontLoad") << KWin::BuiltInEffect::MouseClick << QStringLiteral("mouseclick") << false << xc << dontLoadFlags;
+ QTest::newRow("MouseClick-DontLoad") << KWin::BuiltInEffect::MouseClick << QStringLiteral("mouseclick") << false << qc << dontLoadFlags;
}
void TestBuiltInEffectLoader::testLoadBuiltInEffect()
@@ -447,7 +447,7 @@ void TestBuiltInEffectLoader::testLoadBuiltInEffect()
void TestBuiltInEffectLoader::testLoadAllEffects()
{
- QScopedPointermockHandler(new MockEffectsHandler(KWin::XRenderCompositing));
+ QScopedPointermockHandler(new MockEffectsHandler(KWin::QPainterCompositing));
KWin::BuiltInEffectLoader loader;
KSharedConfig::Ptr config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig);
diff --git a/autotests/test_plugin_effectloader.cpp b/autotests/test_plugin_effectloader.cpp
index 2b1093739a..67c43a6603 100644
--- a/autotests/test_plugin_effectloader.cpp
+++ b/autotests/test_plugin_effectloader.cpp
@@ -147,14 +147,14 @@ void TestPluginEffectLoader::testSupported_data()
QTest::addColumn("expected");
QTest::addColumn("type");
- const KWin::CompositingType xc = KWin::XRenderCompositing;
+ const KWin::CompositingType qc = KWin::QPainterCompositing;
const KWin::CompositingType oc = KWin::OpenGL2Compositing;
- QTest::newRow("invalid") << QStringLiteral("blur") << false << xc;
- QTest::newRow("fake - xrender") << QStringLiteral("fakeeffectplugin") << false << xc;
+ QTest::newRow("invalid") << QStringLiteral("blur") << false << qc;
+ QTest::newRow("fake - qpainter") << QStringLiteral("fakeeffectplugin") << false << qc;
QTest::newRow("fake - opengl") << QStringLiteral("fakeeffectplugin") << true << oc;
QTest::newRow("fake - CS") << QStringLiteral("fakeEffectPlugin") << true << oc;
- QTest::newRow("version") << QStringLiteral("effectversion") << false << xc;
+ QTest::newRow("version") << QStringLiteral("effectversion") << false << qc;
}
void TestPluginEffectLoader::testSupported()
@@ -175,14 +175,14 @@ void TestPluginEffectLoader::testLoadEffect_data()
QTest::addColumn("expected");
QTest::addColumn("type");
- const KWin::CompositingType xc = KWin::XRenderCompositing;
+ const KWin::CompositingType qc = KWin::QPainterCompositing;
const KWin::CompositingType oc = KWin::OpenGL2Compositing;
- QTest::newRow("invalid") << QStringLiteral("slide") << false << xc;
- QTest::newRow("fake - xrender") << QStringLiteral("fakeeffectplugin") << false << xc;
+ QTest::newRow("invalid") << QStringLiteral("slide") << false << qc;
+ QTest::newRow("fake - qpainter") << QStringLiteral("fakeeffectplugin") << false << qc;
QTest::newRow("fake - opengl") << QStringLiteral("fakeeffectplugin") << true << oc;
QTest::newRow("fake - CS") << QStringLiteral("fakeEffectPlugin") << true << oc;
- QTest::newRow("version") << QStringLiteral("effectversion") << false << xc;
+ QTest::newRow("version") << QStringLiteral("effectversion") << false << qc;
}
void TestPluginEffectLoader::testLoadEffect()
@@ -246,7 +246,7 @@ void TestPluginEffectLoader::testLoadPluginEffect_data()
QTest::addColumn("loadFlags");
QTest::addColumn("enabledByDefault");
- const KWin::CompositingType xc = KWin::XRenderCompositing;
+ const KWin::CompositingType qc = KWin::QPainterCompositing;
const KWin::CompositingType oc = KWin::OpenGL2Compositing;
const KWin::LoadEffectFlags checkDefault = KWin::LoadEffectFlag::Load | KWin::LoadEffectFlag::CheckDefaultFunction;
@@ -254,7 +254,7 @@ void TestPluginEffectLoader::testLoadPluginEffect_data()
const KWin::LoadEffectFlags dontLoadFlags = KWin::LoadEffectFlags();
// enabled by default, but not supported
- QTest::newRow("fakeeffectplugin") << QStringLiteral("fakeeffectplugin") << false << xc << checkDefault << false;
+ QTest::newRow("fakeeffectplugin") << QStringLiteral("fakeeffectplugin") << false << qc << checkDefault << false;
// enabled by default, check default false
QTest::newRow("supported, check default error") << QStringLiteral("fakeeffectplugin") << false << oc << checkDefault << false;
// enabled by default, check default true
@@ -264,7 +264,7 @@ void TestPluginEffectLoader::testLoadPluginEffect_data()
// enabled by default, check default true
QTest::newRow("supported, check default, don't load") << QStringLiteral("fakeeffectplugin") << false << oc << dontLoadFlags << true;
// incorrect version
- QTest::newRow("Version") << QStringLiteral("effectversion") << false << xc << forceFlags << true;
+ QTest::newRow("Version") << QStringLiteral("effectversion") << false << qc << forceFlags << true;
}
void TestPluginEffectLoader::testLoadPluginEffect()
diff --git a/autotests/test_scripted_effectloader.cpp b/autotests/test_scripted_effectloader.cpp
index 24bbd16ec4..e9863cabe6 100644
--- a/autotests/test_scripted_effectloader.cpp
+++ b/autotests/test_scripted_effectloader.cpp
@@ -142,7 +142,7 @@ void TestScriptedEffectLoader::testHasEffect()
QFETCH(QString, name);
QFETCH(bool, expected);
- QScopedPointer mockHandler(new MockEffectsHandler(KWin::XRenderCompositing));
+ QScopedPointer mockHandler(new MockEffectsHandler(KWin::QPainterCompositing));
KWin::ScriptedEffectLoader loader;
QCOMPARE(loader.hasEffect(name), expected);
@@ -217,7 +217,7 @@ void TestScriptedEffectLoader::testLoadEffect()
QFETCH(QString, name);
QFETCH(bool, expected);
- QScopedPointer mockHandler(new MockEffectsHandler(KWin::XRenderCompositing));
+ QScopedPointer mockHandler(new MockEffectsHandler(KWin::QPainterCompositing));
KWin::ScriptedEffectLoader loader;
KSharedConfig::Ptr config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig);
loader.setConfig(config);
@@ -290,7 +290,7 @@ void TestScriptedEffectLoader::testLoadScriptedEffect()
QFETCH(bool, expected);
QFETCH(KWin::LoadEffectFlags, loadFlags);
- QScopedPointer mockHandler(new MockEffectsHandler(KWin::XRenderCompositing));
+ QScopedPointer mockHandler(new MockEffectsHandler(KWin::QPainterCompositing));
KWin::ScriptedEffectLoader loader;
KSharedConfig::Ptr config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig);
loader.setConfig(config);
@@ -344,7 +344,7 @@ void TestScriptedEffectLoader::testLoadScriptedEffect()
void TestScriptedEffectLoader::testLoadAllEffects()
{
- QScopedPointer mockHandler(new MockEffectsHandler(KWin::XRenderCompositing));
+ QScopedPointer mockHandler(new MockEffectsHandler(KWin::QPainterCompositing));
KWin::ScriptedEffectLoader loader;
KSharedConfig::Ptr config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig);
@@ -429,7 +429,7 @@ void TestScriptedEffectLoader::testLoadAllEffects()
void TestScriptedEffectLoader::testCancelLoadAllEffects()
{
// this test verifies that no test gets loaded when the loader gets cleared
- MockEffectsHandler mockHandler(KWin::XRenderCompositing);
+ MockEffectsHandler mockHandler(KWin::QPainterCompositing);
KWin::ScriptedEffectLoader loader;
// prepare the configuration to hard enable/disable the effects we want to load
diff --git a/data/org_kde_kwin.categories b/data/org_kde_kwin.categories
index 4f3428e740..dfc912053e 100644
--- a/data/org_kde_kwin.categories
+++ b/data/org_kde_kwin.categories
@@ -17,7 +17,6 @@ kwin_scripting KWin Scripting DEFAULT_SEVERITY [WARNING] IDENTIFIER [KWIN_SCRIPT
aurorae KWin Aurorae Window Decoration Engine DEFAULT_SEVERITY [WARNING] IDENTIFIER [AURORAE]
kwin_xkbcommon KWin xkbcommon integration DEFAULT_SEVERITY [WARNING] IDENTIFIER [KWIN_XKB]
kwin_qpa_plugin KWin QtPlatformAbstraction plugin DEFAULT_SEVERITY [WARNING] IDENTIFIER [KWIN_QPA]
-kwin_scene_xrender KWin XRender based compositor scene plugin DEFAULT_SEVERITY [WARNING] IDENTIFIER [KWIN_XRENDER]
kwin_scene_qpainter KWin QPainter based compositor scene plugin DEFAULT_SEVERITY [WARNING] IDENTIFIER [KWIN_QPAINTER]
kwin_scene_opengl KWin OpenGL based compositor scene plugins DEFAULT_SEVERITY [WARNING] IDENTIFIER [KWIN_OPENGL]
kwin_screencast KWin Screen Cast Service DEFAULT_SEVERITY [WARNING] IDENTIFIER [KWIN_SCREENCAST]
diff --git a/doc/kwineffects/index.docbook b/doc/kwineffects/index.docbook
index c97be9e30f..a659e7d009 100644
--- a/doc/kwineffects/index.docbook
+++ b/doc/kwineffects/index.docbook
@@ -69,7 +69,7 @@ effects can be activated.
All effects which are not supported by the currently used compositing backend
-are hidden by default (⪚ OpenGL effects when using XRender).
+are hidden by default (⪚ OpenGL effects when using software renderer).
Also all internal or helper effects are hidden by default. These are effects which replace
diff --git a/kconf_update/kwin-5.23-remove-xrender-backend.py b/kconf_update/kwin-5.23-remove-xrender-backend.py
new file mode 100644
index 0000000000..3a81292bcc
--- /dev/null
+++ b/kconf_update/kwin-5.23-remove-xrender-backend.py
@@ -0,0 +1,11 @@
+#!/usr/bin/env python3
+
+import fileinput
+
+for line in fileinput.input():
+ if not line.startswith("Backend="):
+ continue
+ value = line[len("Backend="):].strip()
+ if value != "XRender":
+ continue
+ print("# DELETE Backend") # will use the default compositing type
diff --git a/kconf_update/kwin.upd b/kconf_update/kwin.upd
index 54bb9e82b4..ef033cfb66 100644
--- a/kconf_update/kwin.upd
+++ b/kconf_update/kwin.upd
@@ -73,3 +73,9 @@ Id=remove-cubeslide-effect
File=kwinrc
Group=Plugins
Script=kwin-5.23-remove-cubeslide.py,python3
+
+# Remove Backend if it has a value of "XRender"
+Id=remove-xrender-backend
+File=kwinrc
+Group=Compositing
+Script=kwin-5.23-remove-xrender-backend.py,python3
diff --git a/src/composite.cpp b/src/composite.cpp
index 039291067f..6eb0a94fdc 100644
--- a/src/composite.cpp
+++ b/src/composite.cpp
@@ -205,9 +205,6 @@ bool Compositor::setupStart()
for (auto type : qAsConst(supportedCompositors)) {
switch (type) {
- case XRenderCompositing:
- qCDebug(KWIN_CORE) << "Attempting to load the XRender scene";
- break;
case OpenGLCompositing:
case OpenGL2Compositing:
qCDebug(KWIN_CORE) << "Attempting to load the OpenGL scene";
diff --git a/src/dbusinterface.cpp b/src/dbusinterface.cpp
index bf7fdb1600..5db107c2e6 100644
--- a/src/dbusinterface.cpp
+++ b/src/dbusinterface.cpp
@@ -277,8 +277,6 @@ QString CompositorDBusInterface::compositingType() const
return QStringLiteral("none");
}
switch (m_compositor->scene()->compositingType()) {
- case XRenderCompositing:
- return QStringLiteral("xrender");
case OpenGL2Compositing:
if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES) {
return QStringLiteral("gles");
diff --git a/src/dbusinterface.h b/src/dbusinterface.h
index 850176b674..73e5e362cc 100644
--- a/src/dbusinterface.h
+++ b/src/dbusinterface.h
@@ -97,7 +97,6 @@ class CompositorDBusInterface : public QObject
/**
* The type of the currently used Scene:
* @li @c none No Compositing
- * @li @c xrender XRender
* @li @c gl1 OpenGL 1
* @li @c gl2 OpenGL 2
* @li @c gles OpenGL ES 2
diff --git a/src/effects.cpp b/src/effects.cpp
index 578f3b2740..aabb21b50a 100644
--- a/src/effects.cpp
+++ b/src/effects.cpp
@@ -1347,11 +1347,6 @@ void EffectsHandlerImpl::unregisterTouchBorder(ElectricBorder border, QAction *a
ScreenEdges::self()->unreserveTouch(border, action);
}
-unsigned long EffectsHandlerImpl::xrenderBufferPicture()
-{
- return m_scene->xrenderBufferPicture();
-}
-
QPainter *EffectsHandlerImpl::scenePainter()
{
return m_scene->scenePainter();
diff --git a/src/effects.h b/src/effects.h
index fc826d1db8..c0ef80613b 100644
--- a/src/effects.h
+++ b/src/effects.h
@@ -165,7 +165,6 @@ public:
void registerTouchBorder(ElectricBorder border, QAction *action) override;
void unregisterTouchBorder(ElectricBorder border, QAction *action) override;
- unsigned long xrenderBufferPicture() override;
QPainter* scenePainter() override;
void reconfigure() override;
QByteArray readRootProperty(long atom, long type, int format) const override;
diff --git a/src/effects/CMakeLists.txt b/src/effects/CMakeLists.txt
index 72f6a05c66..ea7d6a9f64 100644
--- a/src/effects/CMakeLists.txt
+++ b/src/effects/CMakeLists.txt
@@ -11,10 +11,6 @@ set(kwin_effect_OWN_LIBS
kwineffects
)
-if (KWIN_HAVE_XRENDER_COMPOSITING)
- set(kwin_effect_OWN_LIBS ${kwin_effect_OWN_LIBS} kwinxrenderutils)
-endif()
-
set(kwin_effect_KDE_LIBS
KF5::ConfigGui
KF5::ConfigWidgets
@@ -47,10 +43,6 @@ set(kwin_effect_XCB_LIBS
XCB::XFIXES
)
-if (KWIN_HAVE_XRENDER_COMPOSITING)
- set(kwin_effect_XCB_LIBS ${kwin_effect_XCB_LIBS} XCB::RENDER)
-endif()
-
set(kwin_effect_OWN_LIBS ${kwin_effect_OWN_LIBS} kwinglutils)
macro(KWIN4_ADD_EFFECT_BACKEND name)
diff --git a/src/effects/desktopgrid/desktopgrid.cpp b/src/effects/desktopgrid/desktopgrid.cpp
index e3bdd5fe73..153da09939 100644
--- a/src/effects/desktopgrid/desktopgrid.cpp
+++ b/src/effects/desktopgrid/desktopgrid.cpp
@@ -348,27 +348,12 @@ void DesktopGridEffect::paintWindow(EffectWindow* w, int mask, QRegion region, W
d.multiplyOpacity(timeline.currentValue());
}
- if (effects->compositingType() == XRenderCompositing) {
- // More exact clipping as XRender displays the entire window instead of just the quad
- QPointF screenPosF = scalePos(screenGeom.topLeft(), paintingDesktop).toPoint();
- QPoint screenPos(
- qRound(screenPosF.x()),
- qRound(screenPosF.y())
- );
- QSize screenSize(
- qRound(interpolate(screenGeom.width(), scaledSize[screen].width(), progress)),
- qRound(interpolate(screenGeom.height(), scaledSize[screen].height(), progress))
- );
- PaintClipper pc(effects->clientArea(ScreenArea, screen, 0) & QRect(screenPos, screenSize));
- effects->paintWindow(w, mask, region, d);
- } else {
- if (w->isDesktop() && timeline.currentValue() == 1.0) {
- // desktop windows are not in a motion manager and can always be rendered with
- // lanczos sampling except for animations
- mask |= PAINT_WINDOW_LANCZOS;
- }
- effects->paintWindow(w, mask, effects->clientArea(ScreenArea, screen, 0), d);
+ if (w->isDesktop() && timeline.currentValue() == 1.0) {
+ // desktop windows are not in a motion manager and can always be rendered with
+ // lanczos sampling except for animations
+ mask |= PAINT_WINDOW_LANCZOS;
}
+ effects->paintWindow(w, mask, effects->clientArea(ScreenArea, screen, 0), d);
}
} else
effects->paintWindow(w, mask, region, data);
diff --git a/src/effects/magnifier/magnifier.cpp b/src/effects/magnifier/magnifier.cpp
index d1f55cdaa1..0feccdcad6 100644
--- a/src/effects/magnifier/magnifier.cpp
+++ b/src/effects/magnifier/magnifier.cpp
@@ -18,10 +18,6 @@
#include
#include
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-#include
-#include
-#endif
#include
namespace KWin
@@ -36,9 +32,6 @@ MagnifierEffect::MagnifierEffect()
, m_lastPresentTime(std::chrono::milliseconds::zero())
, m_texture(nullptr)
, m_fbo(nullptr)
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- , m_pixmap(XCB_PIXMAP_NONE)
-#endif
{
initConfig();
QAction* a;
@@ -67,30 +60,14 @@ MagnifierEffect::~MagnifierEffect()
{
delete m_fbo;
delete m_texture;
- destroyPixmap();
// Save the zoom value.
MagnifierConfig::setInitialZoom(target_zoom);
MagnifierConfig::self()->save();
}
-void MagnifierEffect::destroyPixmap()
-{
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (effects->compositingType() != XRenderCompositing) {
- return;
- }
- m_picture.reset();
- if (m_pixmap != XCB_PIXMAP_NONE) {
- xcb_free_pixmap(xcbConnection(), m_pixmap);
- m_pixmap = XCB_PIXMAP_NONE;
- }
-#endif
-}
-
bool MagnifierEffect::supported()
{
- return effects->compositingType() == XRenderCompositing ||
- (effects->isOpenGLCompositing() && GLRenderTarget::blitSupported());
+ return effects->isOpenGLCompositing() && GLRenderTarget::blitSupported();
}
void MagnifierEffect::reconfigure(ReconfigureFlags)
@@ -122,7 +99,6 @@ void MagnifierEffect::prePaintScreen(ScreenPrePaintData& data, std::chrono::mill
delete m_texture;
m_fbo = nullptr;
m_texture = nullptr;
- destroyPixmap();
}
}
}
@@ -201,48 +177,6 @@ void MagnifierEffect::paintScreen(int mask, const QRegion ®ion, ScreenPaintDa
binder.shader()->setUniform(GLShader::ModelViewProjectionMatrix, data.projectionMatrix());
vbo->render(GL_TRIANGLES);
}
- if (effects->compositingType() == XRenderCompositing) {
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (m_pixmap == XCB_PIXMAP_NONE || m_pixmapSize != srcArea.size()) {
- destroyPixmap();
- m_pixmap = xcb_generate_id(xcbConnection());
- m_pixmapSize = srcArea.size();
- xcb_create_pixmap(xcbConnection(), 32, m_pixmap, x11RootWindow(), m_pixmapSize.width(), m_pixmapSize.height());
- m_picture.reset(new XRenderPicture(m_pixmap, 32));
- }
-#define DOUBLE_TO_FIXED(d) ((xcb_render_fixed_t) ((d) * 65536))
- static const xcb_render_transform_t identity = {
- DOUBLE_TO_FIXED(1), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0),
- DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1), DOUBLE_TO_FIXED(0),
- DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1)
- };
- static xcb_render_transform_t xform = {
- DOUBLE_TO_FIXED(1), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0),
- DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1), DOUBLE_TO_FIXED(0),
- DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1)
- };
- xcb_render_composite(xcbConnection(), XCB_RENDER_PICT_OP_SRC, effects->xrenderBufferPicture(), 0, *m_picture,
- srcArea.x(), srcArea.y(), 0, 0, 0, 0, srcArea.width(), srcArea.height());
- xcb_flush(xcbConnection());
- xform.matrix11 = DOUBLE_TO_FIXED(1.0/zoom);
- xform.matrix22 = DOUBLE_TO_FIXED(1.0/zoom);
-#undef DOUBLE_TO_FIXED
- xcb_render_set_picture_transform(xcbConnection(), *m_picture, xform);
- xcb_render_set_picture_filter(xcbConnection(), *m_picture, 4, const_cast("good"), 0, nullptr);
- xcb_render_composite(xcbConnection(), XCB_RENDER_PICT_OP_SRC, *m_picture, 0, effects->xrenderBufferPicture(),
- 0, 0, 0, 0, area.x(), area.y(), area.width(), area.height() );
- xcb_render_set_picture_filter(xcbConnection(), *m_picture, 4, const_cast("fast"), 0, nullptr);
- xcb_render_set_picture_transform(xcbConnection(), *m_picture, identity);
- const xcb_rectangle_t rects[4] = {
- { int16_t(area.x()+FRAME_WIDTH), int16_t(area.y()), uint16_t(area.width()-FRAME_WIDTH), uint16_t(FRAME_WIDTH)},
- { int16_t(area.right()-FRAME_WIDTH), int16_t(area.y()+FRAME_WIDTH), uint16_t(FRAME_WIDTH), uint16_t(area.height()-FRAME_WIDTH)},
- { int16_t(area.x()), int16_t(area.bottom()-FRAME_WIDTH), uint16_t(area.width()-FRAME_WIDTH), uint16_t(FRAME_WIDTH)},
- { int16_t(area.x()), int16_t(area.y()), uint16_t(FRAME_WIDTH), uint16_t(area.height()-FRAME_WIDTH)}
- };
- xcb_render_fill_rectangles(xcbConnection(), XCB_RENDER_PICT_OP_SRC, effects->xrenderBufferPicture(),
- preMultiply(QColor(0,0,0,255)), 4, rects);
-#endif
- }
}
}
@@ -292,7 +226,6 @@ void MagnifierEffect::zoomOut()
delete m_texture;
m_fbo = nullptr;
m_texture = nullptr;
- destroyPixmap();
}
}
effects->addRepaint(magnifierArea().adjusted(-FRAME_WIDTH, -FRAME_WIDTH, FRAME_WIDTH, FRAME_WIDTH));
diff --git a/src/effects/magnifier/magnifier.h b/src/effects/magnifier/magnifier.h
index 00b3158297..f98cfd13e7 100644
--- a/src/effects/magnifier/magnifier.h
+++ b/src/effects/magnifier/magnifier.h
@@ -18,7 +18,6 @@ namespace KWin
class GLRenderTarget;
class GLTexture;
-class XRenderPicture;
class MagnifierEffect
: public Effect
@@ -51,7 +50,6 @@ private Q_SLOTS:
Qt::MouseButtons buttons, Qt::MouseButtons oldbuttons,
Qt::KeyboardModifiers modifiers, Qt::KeyboardModifiers oldmodifiers);
void slotWindowDamaged();
- void destroyPixmap();
private:
QRect magnifierArea(QPoint pos = cursorPos()) const;
double zoom;
@@ -61,11 +59,6 @@ private:
QSize magnifier_size;
GLTexture *m_texture;
GLRenderTarget *m_fbo;
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- xcb_pixmap_t m_pixmap;
- QSize m_pixmapSize;
- QScopedPointer m_picture;
-#endif
};
} // namespace
diff --git a/src/effects/mouseclick/mouseclick.cpp b/src/effects/mouseclick/mouseclick.cpp
index 349ec462d2..267f734178 100644
--- a/src/effects/mouseclick/mouseclick.cpp
+++ b/src/effects/mouseclick/mouseclick.cpp
@@ -13,11 +13,6 @@
#include
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-#include
-#include
-#endif
-
#include
#include
@@ -247,9 +242,7 @@ void MouseClickEffect::drawCircle(const QColor& color, float cx, float cy, float
{
if (effects->isOpenGLCompositing())
drawCircleGl(color, cx, cy, r);
- if (effects->compositingType() == XRenderCompositing)
- drawCircleXr(color, cx, cy, r);
- if (effects->compositingType() == QPainterCompositing)
+ else if (effects->compositingType() == QPainterCompositing)
drawCircleQPainter(color, cx, cy, r);
}
@@ -294,66 +287,6 @@ void MouseClickEffect::drawCircleGl(const QColor& color, float cx, float cy, flo
vbo->render(GL_LINE_LOOP);
}
-void MouseClickEffect::drawCircleXr(const QColor& color, float cx, float cy, float r)
-{
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (r <= m_lineWidth)
- return;
-
- int num_segments = r+8;
- float theta = 2.0 * 3.1415926 / num_segments;
- float cos = cosf(theta); //precalculate the sine and cosine
- float sin = sinf(theta);
- float x[2] = {r, r-m_lineWidth};
- float y[2] = {0, 0};
-
-#define DOUBLE_TO_FIXED(d) ((xcb_render_fixed_t) ((d) * 65536))
- QVector strip;
- strip.reserve(2*num_segments+2);
-
- xcb_render_pointfix_t point;
- point.x = DOUBLE_TO_FIXED(x[1]+cx);
- point.y = DOUBLE_TO_FIXED(y[1]+cy);
- strip << point;
-
- for (int i = 0; i < num_segments; ++i) {
- //apply the rotation matrix
- const float h[2] = {x[0], x[1]};
- x[0] = cos * x[0] - sin * y[0];
- x[1] = cos * x[1] - sin * y[1];
- y[0] = sin * h[0] + cos * y[0];
- y[1] = sin * h[1] + cos * y[1];
-
- point.x = DOUBLE_TO_FIXED(x[0]+cx);
- point.y = DOUBLE_TO_FIXED(y[0]+cy);
- strip << point;
-
- point.x = DOUBLE_TO_FIXED(x[1]+cx);
- point.y = DOUBLE_TO_FIXED(y[1]+cy);
- strip << point;
- }
-
- const float h = x[0];
- x[0] = cos * x[0] - sin * y[0];
- y[0] = sin * h + cos * y[0];
-
- point.x = DOUBLE_TO_FIXED(x[0]+cx);
- point.y = DOUBLE_TO_FIXED(y[0]+cy);
- strip << point;
-
- XRenderPicture fill = xRenderFill(color);
- xcb_render_tri_strip(xcbConnection(), XCB_RENDER_PICT_OP_OVER,
- fill, effects->xrenderBufferPicture(), 0,
- 0, 0, strip.count(), strip.constData());
-#undef DOUBLE_TO_FIXED
-#else
- Q_UNUSED(color)
- Q_UNUSED(cx)
- Q_UNUSED(cy)
- Q_UNUSED(r)
-#endif
-}
-
void MouseClickEffect::drawCircleQPainter(const QColor &color, float cx, float cy, float r)
{
QPainter *painter = effects->scenePainter();
diff --git a/src/effects/mouseclick/mouseclick.h b/src/effects/mouseclick/mouseclick.h
index b81a97d5af..f5e5d96b31 100644
--- a/src/effects/mouseclick/mouseclick.h
+++ b/src/effects/mouseclick/mouseclick.h
@@ -12,7 +12,6 @@
#include
#include
-#include
#include
#include
@@ -149,7 +148,6 @@ private:
void repaint();
void drawCircleGl(const QColor& color, float cx, float cy, float r);
- void drawCircleXr(const QColor& color, float cx, float cy, float r);
void drawCircleQPainter(const QColor& color, float cx, float cy, float r);
void paintScreenSetupGl(int mask, QRegion region, ScreenPaintData& data);
void paintScreenFinishGl(int mask, QRegion region, ScreenPaintData& data);
diff --git a/src/effects/mousemark/mousemark.cpp b/src/effects/mousemark/mousemark.cpp
index 6975217ad0..69fd9dcd30 100644
--- a/src/effects/mousemark/mousemark.cpp
+++ b/src/effects/mousemark/mousemark.cpp
@@ -23,10 +23,6 @@
#include
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-#include
-#endif
-
namespace KWin
{
@@ -72,33 +68,6 @@ void MouseMarkEffect::reconfigure(ReconfigureFlags)
color.setAlphaF(1.0);
}
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-void MouseMarkEffect::addRect(const QPoint &p1, const QPoint &p2, xcb_rectangle_t *r, xcb_render_color_t *c)
-{
- r->x = qMin(p1.x(), p2.x()) - width_2;
- r->y = qMin(p1.y(), p2.y()) - width_2;
- r->width = qAbs(p1.x()-p2.x()) + 1 + width_2;
- r->height = qAbs(p1.y()-p2.y()) + 1 + width_2;
- // fast move -> large rect, tess... interpolate a line
- if (r->width > 3*width/2 && r->height > 3*width/2) {
- const int n = sqrt(r->width*r->width + r->height*r->height) / width;
- xcb_rectangle_t *rects = new xcb_rectangle_t[n-1];
- const int w = p1.x() < p2.x() ? r->width : -r->width;
- const int h = p1.y() < p2.y() ? r->height : -r->height;
- for (int i = 1; i < n; ++i) {
- rects[i-1].x = p1.x() + i*w/n;
- rects[i-1].y = p1.y() + i*h/n;
- rects[i-1].width = rects[i-1].height = width;
- }
- xcb_render_fill_rectangles(xcbConnection(), XCB_RENDER_PICT_OP_SRC, effects->xrenderBufferPicture(), *c, n - 1, rects);
- delete [] rects;
- r->x = p1.x();
- r->y = p1.y();
- r->width = r->height = width;
- }
-}
-#endif
-
void MouseMarkEffect::paintScreen(int mask, const QRegion ®ion, ScreenPaintData& data)
{
effects->paintScreen(mask, region, data); // paint normal screen
@@ -143,32 +112,7 @@ void MouseMarkEffect::paintScreen(int mask, const QRegion ®ion, ScreenPaintDa
glDisable(GL_LINE_SMOOTH);
glDisable(GL_BLEND);
}
- }
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if ( effects->compositingType() == XRenderCompositing) {
- xcb_render_color_t c = preMultiply(color);
- for (int i = 0; i < marks.count(); ++i) {
- const int n = marks[i].count() - 1;
- if (n > 0) {
- xcb_rectangle_t *rects = new xcb_rectangle_t[n];
- for (int j = 0; j < marks[i].count()-1; ++j) {
- addRect(marks[i][j], marks[i][j+1], &rects[j], &c);
- }
- xcb_render_fill_rectangles(xcbConnection(), XCB_RENDER_PICT_OP_SRC, effects->xrenderBufferPicture(), c, n, rects);
- delete [] rects;
- }
- }
- const int n = drawing.count() - 1;
- if (n > 0) {
- xcb_rectangle_t *rects = new xcb_rectangle_t[n];
- for (int i = 0; i < n; ++i)
- addRect(drawing[i], drawing[i+1], &rects[i], &c);
- xcb_render_fill_rectangles(xcbConnection(), XCB_RENDER_PICT_OP_SRC, effects->xrenderBufferPicture(), c, n, rects);
- delete [] rects;
- }
- }
-#endif
- if (effects->compositingType() == QPainterCompositing) {
+ } else if (effects->compositingType() == QPainterCompositing) {
QPainter *painter = effects->scenePainter();
painter->save();
QPen pen(color);
diff --git a/src/effects/mousemark/mousemark.h b/src/effects/mousemark/mousemark.h
index e40e01472a..01577a279e 100644
--- a/src/effects/mousemark/mousemark.h
+++ b/src/effects/mousemark/mousemark.h
@@ -12,9 +12,6 @@
#include
#include
-#include
-
-struct xcb_render_color_t;
namespace KWin
{
@@ -50,9 +47,6 @@ private:
typedef QVector< QPoint > Mark;
void drawMark(QPainter *painter, const Mark &mark);
static Mark createArrow(QPoint arrow_start, QPoint arrow_end);
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- void addRect(const QPoint &p1, const QPoint &p2, xcb_rectangle_t *r, xcb_render_color_t *c);
-#endif
QVector< Mark > marks;
Mark drawing;
QPoint arrow_start;
diff --git a/src/effects/resize/resize.cpp b/src/effects/resize/resize.cpp
index 3807117645..9831b39349 100644
--- a/src/effects/resize/resize.cpp
+++ b/src/effects/resize/resize.cpp
@@ -12,9 +12,6 @@
#include "resizeconfig.h"
#include
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-#include "kwinxrenderutils.h"
-#endif
#include
@@ -94,21 +91,7 @@ void ResizeEffect::paintWindow(EffectWindow* w, int mask, QRegion region, Window
vbo->setData(verts.count() / 2, 2, verts.data(), nullptr);
vbo->render(GL_TRIANGLES);
glDisable(GL_BLEND);
- }
-
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (effects->compositingType() == XRenderCompositing) {
- QVector rects;
- for (const QRect &r : paintRegion) {
- xcb_rectangle_t rect = {int16_t(r.x()), int16_t(r.y()), uint16_t(r.width()), uint16_t(r.height())};
- rects << rect;
- }
- xcb_render_fill_rectangles(xcbConnection(), XCB_RENDER_PICT_OP_OVER,
- effects->xrenderBufferPicture(), preMultiply(color, alpha),
- rects.count(), rects.constData());
- }
-#endif
- if (effects->compositingType() == QPainterCompositing) {
+ } else if (effects->compositingType() == QPainterCompositing) {
QPainter *painter = effects->scenePainter();
painter->save();
color.setAlphaF(alpha);
diff --git a/src/effects/screenedge/screenedgeeffect.cpp b/src/effects/screenedge/screenedgeeffect.cpp
index 07662b7b16..3e5e14ee8b 100644
--- a/src/effects/screenedge/screenedgeeffect.cpp
+++ b/src/effects/screenedge/screenedgeeffect.cpp
@@ -10,17 +10,12 @@
// KWin
#include
#include
-#include
// KDE
#include
// Qt
#include
#include
#include
-// xcb
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-#include
-#endif
namespace KWin {
@@ -102,33 +97,6 @@ void ScreenEdgeEffect::paintScreen(int mask, const QRegion ®ion, ScreenPaintD
texture->render(infiniteRegion(), (*it)->geometry);
texture->unbind();
glDisable(GL_BLEND);
- } else if (effects->compositingType() == XRenderCompositing) {
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- const QRect &rect = (*it)->geometry;
- const QSize &size = (*it)->pictureSize;
- int x = rect.x();
- int y = rect.y();
- int width = rect.width();
- int height = rect.height();
- switch ((*it)->border) {
- case ElectricTopRight:
- x = rect.x() + rect.width() - size.width();
- break;
- case ElectricBottomRight:
- x = rect.x() + rect.width() - size.width();
- y = rect.y() + rect.height() - size.height();
- break;
- case ElectricBottomLeft:
- y = rect.y() + rect.height() - size.height();
- break;
- default:
- // nothing
- break;
- }
- xcb_render_composite(xcbConnection(), XCB_RENDER_PICT_OP_OVER, *(*it)->picture.data(),
- xRenderBlendPicture(opacity), effects->xrenderBufferPicture(),
- 0, 0, 0, 0, x, y, width, height);
-#endif
} else if (effects->compositingType() == QPainterCompositing) {
QImage tmp((*it)->image->size(), QImage::Format_ARGB32_Premultiplied);
tmp.fill(Qt::transparent);
@@ -178,10 +146,6 @@ void ScreenEdgeEffect::edgeApproaching(ElectricBorder border, qreal factor, cons
if (border == ElectricLeft || border == ElectricRight || border == ElectricTop || border == ElectricBottom) {
if (effects->isOpenGLCompositing()) {
(*it)->texture.reset(createEdgeGlow(border, geometry.size()));
- } else if (effects->compositingType() == XRenderCompositing) {
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- (*it)->picture.reset(createEdgeGlow(border, geometry.size()));
-#endif
} else if (effects->compositingType() == QPainterCompositing) {
(*it)->image.reset(createEdgeGlow(border, geometry.size()));
}
@@ -224,20 +188,6 @@ Glow *ScreenEdgeEffect::createGlow(ElectricBorder border, qreal factor, const QR
delete glow;
return nullptr;
}
- } else if (effects->compositingType() == XRenderCompositing) {
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (border == ElectricTopLeft || border == ElectricTopRight || border == ElectricBottomRight || border == ElectricBottomLeft) {
- glow->pictureSize = cornerGlowSize(border);
- glow->picture.reset(createCornerGlow(border));
- } else {
- glow->pictureSize = geometry.size();
- glow->picture.reset(createEdgeGlow(border, geometry.size()));
- }
- if (glow->picture.isNull()) {
- delete glow;
- return nullptr;
- }
-#endif
} else if (effects->compositingType() == QPainterCompositing) {
if (border == ElectricTopLeft || border == ElectricTopRight || border == ElectricBottomRight || border == ElectricBottomLeft) {
glow->image.reset(createCornerGlow(border));
diff --git a/src/effects/screenedge/screenedgeeffect.h b/src/effects/screenedge/screenedgeeffect.h
index 56544a4f7e..c9126573cc 100644
--- a/src/effects/screenedge/screenedgeeffect.h
+++ b/src/effects/screenedge/screenedgeeffect.h
@@ -54,9 +54,6 @@ class Glow
public:
QScopedPointer texture;
QScopedPointer image;
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- QScopedPointer picture;
-#endif
QSize pictureSize;
qreal strength;
QRect geometry;
diff --git a/src/effects/screenshot/screenshot.cpp b/src/effects/screenshot/screenshot.cpp
index 658b327640..20933d7cfc 100644
--- a/src/effects/screenshot/screenshot.cpp
+++ b/src/effects/screenshot/screenshot.cpp
@@ -17,11 +17,6 @@
#include
-#if defined(KWIN_HAVE_XRENDER_COMPOSITING)
-#include
-#include
-#endif
-
namespace KWin
{
@@ -79,35 +74,9 @@ static void convertFromGLImage(QImage &img, int w, int h)
img = img.mirrored();
}
-#if defined(KWIN_HAVE_XRENDER_COMPOSITING)
-static void xImageCleanup(void *data)
-{
- xcb_image_destroy(static_cast(data));
-}
-
-static QImage xPictureToImage(xcb_render_picture_t srcPic, const QRect &geometry)
-{
- xcb_connection_t *c = effects->xcbConnection();
- xcb_pixmap_t xpix = xcb_generate_id(c);
- xcb_create_pixmap(c, 32, xpix, effects->x11RootWindow(), geometry.width(), geometry.height());
- XRenderPicture pic(xpix, 32);
- xcb_render_composite(c, XCB_RENDER_PICT_OP_SRC, srcPic, XCB_RENDER_PICTURE_NONE, pic,
- geometry.x(), geometry.y(), 0, 0, 0, 0, geometry.width(), geometry.height());
- xcb_flush(c);
- xcb_image_t *xImage = xcb_image_get(c, xpix, 0, 0, geometry.width(), geometry.height(),
- ~0, XCB_IMAGE_FORMAT_Z_PIXMAP);
- QImage img(xImage->data, xImage->width, xImage->height, xImage->stride,
- QImage::Format_ARGB32_Premultiplied, xImageCleanup, xImage);
- // TODO: byte order might need swapping
- xcb_free_pixmap(c, xpix);
- return img.copy();
-}
-#endif
-
bool ScreenShotEffect::supported()
{
- return effects->compositingType() == XRenderCompositing ||
- (effects->isOpenGLCompositing() && GLRenderTarget::supported());
+ return effects->isOpenGLCompositing() && GLRenderTarget::supported();
}
ScreenShotEffect::ScreenShotEffect()
@@ -285,17 +254,6 @@ void ScreenShotEffect::takeScreenShot(ScreenShotWindowData *screenshot)
GLRenderTarget::popRenderTarget();
convertFromGLImage(img, img.width(), img.height());
}
-#if defined(KWIN_HAVE_XRENDER_COMPOSITING)
- if (effects->compositingType() == XRenderCompositing) {
- setXRenderOffscreen(true);
- effects->drawWindow(window, mask, QRegion(0, 0, geometry.width(), geometry.height()), d);
- if (xRenderOffscreenTarget()) {
- img = xPictureToImage(xRenderOffscreenTarget(),
- QRect(0, 0, geometry.width(), geometry.height()));
- }
- setXRenderOffscreen(false);
- }
-#endif
if (screenshot->flags & ScreenShotIncludeCursor) {
grabPointerImage(img, geometry.x(), geometry.y());
@@ -420,12 +378,6 @@ QImage ScreenShotEffect::blitScreenshot(const QRect &geometry, qreal devicePixel
convertFromGLImage(image, nativeSize.width(), nativeSize.height());
}
-#if defined(KWIN_HAVE_XRENDER_COMPOSITING)
- if (effects->compositingType() == XRenderCompositing) {
- image = xPictureToImage(effects->xrenderBufferPicture(), geometry);
- }
-#endif
-
image.setDevicePixelRatio(devicePixelRatio);
return image;
}
diff --git a/src/effects/showfps/showfps.cpp b/src/effects/showfps/showfps.cpp
index 181c8490a5..f15145c750 100644
--- a/src/effects/showfps/showfps.cpp
+++ b/src/effects/showfps/showfps.cpp
@@ -15,10 +15,6 @@
#include
#include
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-#include
-#include
-#endif
#include
@@ -155,14 +151,7 @@ void ShowFpsEffect::paintScreen(int mask, const QRegion ®ion, ScreenPaintData
if (effects->isOpenGLCompositing()) {
paintGL(fps, data.projectionMatrix());
glFinish(); // make sure all rendering is done
- }
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (effects->compositingType() == XRenderCompositing) {
- paintXrender(fps);
- xcb_flush(xcbConnection()); // make sure all rendering is done
- }
-#endif
- if (effects->compositingType() == QPainterCompositing) {
+ } else if (effects->compositingType() == QPainterCompositing) {
paintQPainter(fps);
}
m_noBenchmark->render(infiniteRegion(), 1.0, alpha);
@@ -245,64 +234,6 @@ void ShowFpsEffect::paintGL(int fps, const QMatrix4x4 &projectionMatrix)
glDisable(GL_BLEND);
}
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-/*
- Differences between OpenGL and XRender:
- - differently specified rectangles (X: width/height, O: x2,y2)
- - XRender uses pre-multiplied alpha
-*/
-void ShowFpsEffect::paintXrender(int fps)
-{
- xcb_pixmap_t pixmap = xcb_generate_id(xcbConnection());
- xcb_create_pixmap(xcbConnection(), 32, pixmap, x11RootWindow(), FPS_WIDTH, MAX_TIME);
- XRenderPicture p(pixmap, 32);
- xcb_free_pixmap(xcbConnection(), pixmap);
- xcb_render_color_t col;
- col.alpha = int(alpha * 0xffff);
- col.red = int(alpha * 0xffff); // white
- col.green = int(alpha * 0xffff);
- col.blue = int(alpha * 0xffff);
- xcb_rectangle_t rect = {0, 0, FPS_WIDTH, MAX_TIME};
- xcb_render_fill_rectangles(xcbConnection(), XCB_RENDER_PICT_OP_SRC, p, col, 1, &rect);
- col.red = 0; // blue
- col.green = 0;
- col.blue = int(alpha * 0xffff);
- rect.y = MAX_TIME - fps;
- rect.width = FPS_WIDTH;
- rect.height = fps;
- xcb_render_fill_rectangles(xcbConnection(), XCB_RENDER_PICT_OP_SRC, p, col, 1, &rect);
- col.red = 0; // black
- col.green = 0;
- col.blue = 0;
- QVector rects;
- for (int i = 10;
- i < MAX_TIME;
- i += 10) {
- xcb_rectangle_t rect = {0, int16_t(MAX_TIME - i), uint16_t(FPS_WIDTH), 1};
- rects << rect;
- }
- xcb_render_fill_rectangles(xcbConnection(), XCB_RENDER_PICT_OP_SRC, p, col, rects.count(), rects.constData());
- xcb_render_composite(xcbConnection(), alpha != 1.0 ? XCB_RENDER_PICT_OP_OVER : XCB_RENDER_PICT_OP_SRC, p, XCB_RENDER_PICTURE_NONE,
- effects->xrenderBufferPicture(), 0, 0, 0, 0, x, y, FPS_WIDTH, MAX_TIME);
-
-
- // Paint FPS graph
- paintFPSGraph(x + FPS_WIDTH, y);
-
- // Paint amount of rendered pixels graph
- paintDrawSizeGraph(x + FPS_WIDTH + MAX_TIME, y);
-
- // Paint FPS numerical value
- if (fpsTextRect.isValid()) {
- QImage textImg(fpsTextImage(fps));
- XRenderPicture textPic(textImg);
- xcb_render_composite(xcbConnection(), XCB_RENDER_PICT_OP_OVER, textPic, XCB_RENDER_PICTURE_NONE,
- effects->xrenderBufferPicture(), 0, 0, 0, 0, fpsTextRect.x(), fpsTextRect.y(), textImg.width(), textImg.height());
- effects->addRepaint(fpsTextRect);
- }
-}
-#endif
-
void ShowFpsEffect::paintQPainter(int fps)
{
QPainter *painter = effects->scenePainter();
@@ -428,67 +359,7 @@ void ShowFpsEffect::paintGraph(int x, int y, QList values, QList lines
vbo->setData(verts.size() / 2, 2, verts.constData(), nullptr);
vbo->render(GL_LINES);
}
- }
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (effects->compositingType() == XRenderCompositing) {
- xcb_pixmap_t pixmap = xcb_generate_id(xcbConnection());
- xcb_create_pixmap(xcbConnection(), 32, pixmap, x11RootWindow(), values.count(), MAX_TIME);
- XRenderPicture p(pixmap, 32);
- xcb_free_pixmap(xcbConnection(), pixmap);
- xcb_render_color_t col;
- col.alpha = int(alpha * 0xffff);
-
- // Draw background
- col.red = col.green = col.blue = int(alpha * 0xffff); // white
- xcb_rectangle_t rect = {0, 0, uint16_t(values.count()), uint16_t(MAX_TIME)};
- xcb_render_fill_rectangles(xcbConnection(), XCB_RENDER_PICT_OP_SRC, p, col, 1, &rect);
-
- // Then the values
- col.red = col.green = col.blue = int(alpha * 0x8000); // grey
- for (int i = 0; i < values.count(); i++) {
- int value = values[ i ];
- if (colorize) {
- if (value <= 10) {
- // green
- col.red = 0;
- col.green = int(alpha * 0xffff);
- col.blue = 0;
- } else if (value <= 20) {
- // yellow
- col.red = int(alpha * 0xffff);
- col.green = int(alpha * 0xffff);
- col.blue = 0;
- } else if (value <= 50) {
- // red
- col.red = int(alpha * 0xffff);
- col.green = 0;
- col.blue = 0;
- } else {
- // black
- col.red = 0;
- col.green = 0;
- col.blue = 0;
- }
- }
- xcb_rectangle_t rect = {int16_t(values.count() - i), int16_t(MAX_TIME - value), 1, uint16_t(value)};
- xcb_render_fill_rectangles(xcbConnection(), XCB_RENDER_PICT_OP_SRC, p, col, 1, &rect);
- }
-
- // Then the lines
- col.red = col.green = col.blue = 0; // black
- QVector rects;
- Q_FOREACH (int h, lines) {
- xcb_rectangle_t rect = {0, int16_t(MAX_TIME - h), uint16_t(values.count()), 1};
- rects << rect;
- }
- xcb_render_fill_rectangles(xcbConnection(), XCB_RENDER_PICT_OP_SRC, p, col, rects.count(), rects.constData());
-
- // Finally render the pixmap onto screen
- xcb_render_composite(xcbConnection(), alpha != 1.0 ? XCB_RENDER_PICT_OP_OVER : XCB_RENDER_PICT_OP_SRC, p,
- XCB_RENDER_PICTURE_NONE, effects->xrenderBufferPicture(), 0, 0, 0, 0, x, y, values.count(), MAX_TIME);
- }
-#endif
- if (effects->compositingType() == QPainterCompositing) {
+ } else if (effects->compositingType() == QPainterCompositing) {
QPainter *painter = effects->scenePainter();
painter->setPen(Qt::black);
// First draw the lines
diff --git a/src/effects/showfps/showfps.h b/src/effects/showfps/showfps.h
index ec33fd36e0..859ae726f0 100644
--- a/src/effects/showfps/showfps.h
+++ b/src/effects/showfps/showfps.h
@@ -71,9 +71,6 @@ public:
}
private:
void paintGL(int fps, const QMatrix4x4 &projectionMatrix);
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- void paintXrender(int fps);
-#endif
void paintQPainter(int fps);
void paintFPSGraph(int x, int y);
void paintDrawSizeGraph(int x, int y);
diff --git a/src/effects/showpaint/showpaint.cpp b/src/effects/showpaint/showpaint.cpp
index ad8cc5afc8..6286ca876e 100644
--- a/src/effects/showpaint/showpaint.cpp
+++ b/src/effects/showpaint/showpaint.cpp
@@ -11,9 +11,6 @@
#include "showpaint.h"
#include
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-#include
-#endif
#include
#include
@@ -53,13 +50,7 @@ void ShowPaintEffect::paintScreen(int mask, const QRegion ®ion, ScreenPaintDa
effects->paintScreen(mask, region, data);
if (effects->isOpenGLCompositing()) {
paintGL(data.projectionMatrix());
- }
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (effects->compositingType() == XRenderCompositing) {
- paintXrender();
- }
-#endif
- if (effects->compositingType() == QPainterCompositing) {
+ } else if (effects->compositingType() == QPainterCompositing) {
paintQPainter();
}
if (++m_colorIndex == s_colors.count()) {
@@ -100,25 +91,6 @@ void ShowPaintEffect::paintGL(const QMatrix4x4 &projection)
glDisable(GL_BLEND);
}
-void ShowPaintEffect::paintXrender()
-{
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- xcb_render_color_t col;
- const QColor &color = s_colors[m_colorIndex];
- col.alpha = int(s_alpha * 0xffff);
- col.red = int(s_alpha * 0xffff * color.red() / 255);
- col.green = int(s_alpha * 0xffff * color.green() / 255);
- col.blue = int(s_alpha * 0xffff * color.blue() / 255);
- QVector rects;
- rects.reserve(m_painted.rectCount());
- for (const QRect &r : m_painted) {
- xcb_rectangle_t rect = {int16_t(r.x()), int16_t(r.y()), uint16_t(r.width()), uint16_t(r.height())};
- rects << rect;
- }
- xcb_render_fill_rectangles(xcbConnection(), XCB_RENDER_PICT_OP_OVER, effects->xrenderBufferPicture(), col, rects.count(), rects.constData());
-#endif
-}
-
void ShowPaintEffect::paintQPainter()
{
QColor color = s_colors[m_colorIndex];
diff --git a/src/effects/showpaint/showpaint.h b/src/effects/showpaint/showpaint.h
index eac9a0f2b7..7e88204120 100644
--- a/src/effects/showpaint/showpaint.h
+++ b/src/effects/showpaint/showpaint.h
@@ -32,7 +32,6 @@ private Q_SLOTS:
private:
void paintGL(const QMatrix4x4 &projection);
- void paintXrender();
void paintQPainter();
bool m_active = false;
diff --git a/src/effects/snaphelper/snaphelper.cpp b/src/effects/snaphelper/snaphelper.cpp
index bf802eced5..c966c3dfff 100644
--- a/src/effects/snaphelper/snaphelper.cpp
+++ b/src/effects/snaphelper/snaphelper.cpp
@@ -12,11 +12,6 @@
#include
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-#include
-#include
-#endif
-
#include
namespace KWin
@@ -161,63 +156,7 @@ void SnapHelperEffect::paintScreen(int mask, const QRegion ®ion, ScreenPaintD
glDisable(GL_BLEND);
glLineWidth(1.0);
- }
- if (effects->compositingType() == XRenderCompositing) {
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- for (int i = 0; i < effects->numScreens(); ++i) {
- const QRect rect = effects->clientArea(ScreenArea, i, 0);
- const int midX = rect.x() + rect.width() / 2;
- const int midY = rect.y() + rect.height() / 2 ;
- const int halfWidth = m_geometry.width() / 2;
- const int halfHeight = m_geometry.height() / 2;
-
- xcb_rectangle_t rects[6];
-
- // Center vertical line.
- rects[0].x = rect.x() + rect.width() / 2 - s_lineWidth / 2;
- rects[0].y = rect.y();
- rects[0].width = s_lineWidth;
- rects[0].height = rect.height();
-
- // Center horizontal line.
- rects[1].x = rect.x();
- rects[1].y = rect.y() + rect.height() / 2 - s_lineWidth / 2;
- rects[1].width = rect.width();
- rects[1].height = s_lineWidth;
-
- // Top edge of the window outline.
- rects[2].x = midX - halfWidth - s_lineWidth / 2;
- rects[2].y = midY - halfHeight - s_lineWidth / 2;
- rects[2].width = 2 * halfWidth + s_lineWidth;
- rects[2].height = s_lineWidth;
-
- // Right edge of the window outline.
- rects[3].x = midX + halfWidth - s_lineWidth / 2;
- rects[3].y = midY - halfHeight + s_lineWidth / 2;
- rects[3].width = s_lineWidth;
- rects[3].height = 2 * halfHeight - s_lineWidth;
-
- // Bottom edge of the window outline.
- rects[4].x = midX - halfWidth - s_lineWidth / 2;
- rects[4].y = midY + halfHeight - s_lineWidth / 2;
- rects[4].width = 2 * halfWidth + s_lineWidth;
- rects[4].height = s_lineWidth;
-
- // Left edge of the window outline.
- rects[5].x = midX - halfWidth - s_lineWidth / 2;
- rects[5].y = midY - halfHeight + s_lineWidth / 2;
- rects[5].width = s_lineWidth;
- rects[5].height = 2 * halfHeight - s_lineWidth;
-
- QColor color = s_lineColor;
- color.setAlphaF(color.alphaF() * opacityFactor);
-
- xcb_render_fill_rectangles(xcbConnection(), XCB_RENDER_PICT_OP_OVER, effects->xrenderBufferPicture(),
- preMultiply(color), 6, rects);
- }
-#endif
- }
- if (effects->compositingType() == QPainterCompositing) {
+ } else if (effects->compositingType() == QPainterCompositing) {
QPainter *painter = effects->scenePainter();
painter->save();
QColor color = s_lineColor;
diff --git a/src/effects/touchpoints/touchpoints.cpp b/src/effects/touchpoints/touchpoints.cpp
index 1673c2e192..6965e6c9e9 100644
--- a/src/effects/touchpoints/touchpoints.cpp
+++ b/src/effects/touchpoints/touchpoints.cpp
@@ -13,12 +13,6 @@
#include
#include
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-#include
-#include
-#include
-#endif
-
#include
#include
@@ -188,9 +182,7 @@ void TouchPointsEffect::drawCircle(const QColor& color, float cx, float cy, floa
{
if (effects->isOpenGLCompositing())
drawCircleGl(color, cx, cy, r);
- if (effects->compositingType() == XRenderCompositing)
- drawCircleXr(color, cx, cy, r);
- if (effects->compositingType() == QPainterCompositing)
+ else if (effects->compositingType() == QPainterCompositing)
drawCircleQPainter(color, cx, cy, r);
}
@@ -235,66 +227,6 @@ void TouchPointsEffect::drawCircleGl(const QColor& color, float cx, float cy, fl
vbo->render(GL_LINE_LOOP);
}
-void TouchPointsEffect::drawCircleXr(const QColor& color, float cx, float cy, float r)
-{
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (r <= m_lineWidth)
- return;
-
- int num_segments = r+8;
- float theta = 2.0 * 3.1415926 / num_segments;
- float cos = cosf(theta); //precalculate the sine and cosine
- float sin = sinf(theta);
- float x[2] = {r, r-m_lineWidth};
- float y[2] = {0, 0};
-
-#define DOUBLE_TO_FIXED(d) ((xcb_render_fixed_t) ((d) * 65536))
- QVector strip;
- strip.reserve(2*num_segments+2);
-
- xcb_render_pointfix_t point;
- point.x = DOUBLE_TO_FIXED(x[1]+cx);
- point.y = DOUBLE_TO_FIXED(y[1]+cy);
- strip << point;
-
- for (int i = 0; i < num_segments; ++i) {
- //apply the rotation matrix
- const float h[2] = {x[0], x[1]};
- x[0] = cos * x[0] - sin * y[0];
- x[1] = cos * x[1] - sin * y[1];
- y[0] = sin * h[0] + cos * y[0];
- y[1] = sin * h[1] + cos * y[1];
-
- point.x = DOUBLE_TO_FIXED(x[0]+cx);
- point.y = DOUBLE_TO_FIXED(y[0]+cy);
- strip << point;
-
- point.x = DOUBLE_TO_FIXED(x[1]+cx);
- point.y = DOUBLE_TO_FIXED(y[1]+cy);
- strip << point;
- }
-
- const float h = x[0];
- x[0] = cos * x[0] - sin * y[0];
- y[0] = sin * h + cos * y[0];
-
- point.x = DOUBLE_TO_FIXED(x[0]+cx);
- point.y = DOUBLE_TO_FIXED(y[0]+cy);
- strip << point;
-
- XRenderPicture fill = xRenderFill(color);
- xcb_render_tri_strip(xcbConnection(), XCB_RENDER_PICT_OP_OVER,
- fill, effects->xrenderBufferPicture(), 0,
- 0, 0, strip.count(), strip.constData());
-#undef DOUBLE_TO_FIXED
-#else
- Q_UNUSED(color)
- Q_UNUSED(cx)
- Q_UNUSED(cy)
- Q_UNUSED(r)
-#endif
-}
-
void TouchPointsEffect::drawCircleQPainter(const QColor &color, float cx, float cy, float r)
{
QPainter *painter = effects->scenePainter();
diff --git a/src/effects/touchpoints/touchpoints.h b/src/effects/touchpoints/touchpoints.h
index 13117c6c99..35cc23f048 100644
--- a/src/effects/touchpoints/touchpoints.h
+++ b/src/effects/touchpoints/touchpoints.h
@@ -59,7 +59,6 @@ private:
float computeAlpha(int time, int ring);
float computeRadius(int time, bool press, int ring);
void drawCircleGl(const QColor& color, float cx, float cy, float r);
- void drawCircleXr(const QColor& color, float cx, float cy, float r);
void drawCircleQPainter(const QColor& color, float cx, float cy, float r);
void paintScreenSetupGl(int mask, QRegion region, ScreenPaintData& data);
void paintScreenFinishGl(int mask, QRegion region, ScreenPaintData& data);
diff --git a/src/effects/trackmouse/trackmouse.cpp b/src/effects/trackmouse/trackmouse.cpp
index 496528afc4..439d415b10 100644
--- a/src/effects/trackmouse/trackmouse.cpp
+++ b/src/effects/trackmouse/trackmouse.cpp
@@ -21,7 +21,6 @@
#include
#include
-#include
#include
#include
@@ -36,11 +35,6 @@ TrackMouseEffect::TrackMouseEffect()
{
initConfig();
m_texture[0] = m_texture[1] = nullptr;
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- m_picture[0] = m_picture[1] = nullptr;
- if ( effects->compositingType() == XRenderCompositing)
- m_angleBase = 1.57079632679489661923; // Pi/2
-#endif
if ( effects->isOpenGLCompositing() || effects->compositingType() == QPainterCompositing)
m_angleBase = 90.0;
m_mousePolling = false;
@@ -64,9 +58,6 @@ TrackMouseEffect::~TrackMouseEffect()
effects->stopMousePolling();
for (int i = 0; i < 2; ++i) {
delete m_texture[i]; m_texture[i] = nullptr;
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- delete m_picture[i]; m_picture[i] = nullptr;
-#endif
}
}
@@ -132,35 +123,7 @@ void TrackMouseEffect::paintScreen(int mask, const QRegion ®ion, ScreenPaintD
m_texture[i]->unbind();
}
glDisable(GL_BLEND);
- }
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if ( effects->compositingType() == XRenderCompositing && m_picture[0] && m_picture[1]) {
- float sine = sin(m_angle);
- const float cosine = cos(m_angle);
- for (int i = 0; i < 2; ++i) {
- if (i) sine = -sine;
- const float dx = m_size[i].width()/2.0;
- const float dy = m_size[i].height()/2.0;
- const xcb_render_picture_t picture = *m_picture[i];
-#define DOUBLE_TO_FIXED(d) ((xcb_render_fixed_t) ((d) * 65536))
- xcb_render_transform_t xform = {
- DOUBLE_TO_FIXED( cosine ), DOUBLE_TO_FIXED( -sine ), DOUBLE_TO_FIXED( dx - cosine*dx + sine*dy ),
- DOUBLE_TO_FIXED( sine ), DOUBLE_TO_FIXED( cosine ), DOUBLE_TO_FIXED( dy - sine*dx - cosine*dy ),
- DOUBLE_TO_FIXED( 0.0 ), DOUBLE_TO_FIXED( 0.0 ), DOUBLE_TO_FIXED( 1.0 )
- };
-#undef DOUBLE_TO_FIXED
- xcb_render_set_picture_transform(xcbConnection(), picture, xform);
- xcb_render_set_picture_filter(xcbConnection(), picture, 8, "bilinear", 0, nullptr);
- const QRect &rect = m_lastRect[i];
- xcb_render_composite(xcbConnection(), XCB_RENDER_PICT_OP_OVER, picture, XCB_RENDER_PICTURE_NONE,
- effects->xrenderBufferPicture(), 0, 0, 0, 0,
- qRound((rect.x()+rect.width()/2.0)*data.xScale() - rect.width()/2.0 + data.xTranslation()),
- qRound((rect.y()+rect.height()/2.0)*data.yScale() - rect.height()/2.0 + data.yTranslation()),
- rect.width(), rect.height());
- }
- }
-#endif
- if (effects->compositingType() == QPainterCompositing && !m_image[0].isNull() && !m_image[1].isNull()) {
+ } else if (effects->compositingType() == QPainterCompositing && !m_image[0].isNull() && !m_image[1].isNull()) {
QPainter *painter = effects->scenePainter();
const QPointF p = m_lastRect[0].topLeft() + QPoint(m_lastRect[0].width()/2.0, m_lastRect[0].height()/2.0);
for (int i = 0; i < 2; ++i) {
@@ -183,19 +146,11 @@ void TrackMouseEffect::postPaintScreen()
bool TrackMouseEffect::init()
{
effects->makeOpenGLContextCurrent();
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (!(m_texture[0] || m_picture[0] || !m_image[0].isNull())) {
- loadTexture();
- if (!(m_texture[0] || m_picture[0] || !m_image[0].isNull()))
- return false;
- }
-#else
if (!m_texture[0] || m_image[0].isNull()) {
loadTexture();
if (!m_texture[0] || m_image[0].isNull())
return false;
}
-#endif
m_lastRect[0].moveCenter(cursorPos());
m_lastRect[1].moveCenter(cursorPos());
m_angle = 0;
@@ -278,14 +233,6 @@ void TrackMouseEffect::loadTexture()
m_texture[i] = new GLTexture(img);
m_lastRect[i].setSize(img.size());
}
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if ( effects->compositingType() == XRenderCompositing) {
- QImage pixmap(f[i]);
- m_picture[i] = new XRenderPicture(pixmap);
- m_size[i] = pixmap.size();
- m_lastRect[i].setSize(pixmap.size());
- }
-#endif
if (effects->compositingType() == QPainterCompositing) {
m_image[i] = QImage(f[i]);
m_lastRect[i].setSize(m_image[i].size());
diff --git a/src/effects/trackmouse/trackmouse.h b/src/effects/trackmouse/trackmouse.h
index 386635a125..cf96456a1c 100644
--- a/src/effects/trackmouse/trackmouse.h
+++ b/src/effects/trackmouse/trackmouse.h
@@ -55,10 +55,6 @@ private:
float m_angle;
float m_angleBase;
GLTexture* m_texture[2];
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- QSize m_size[2];
- XRenderPicture *m_picture[2];
-#endif
QAction* m_action;
QImage m_image[2];
Qt::KeyboardModifiers m_modifiers;
diff --git a/src/effects/zoom/zoom.cpp b/src/effects/zoom/zoom.cpp
index b0687dcfdb..3b74e970c3 100644
--- a/src/effects/zoom/zoom.cpp
+++ b/src/effects/zoom/zoom.cpp
@@ -26,10 +26,6 @@
#include
#include
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-#include
-#include
-#endif
namespace KWin
{
@@ -168,9 +164,6 @@ void ZoomEffect::showCursor()
// show the previously hidden mouse-pointer again and free the loaded texture/picture.
effects->showCursor();
texture.reset();
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- xrenderPicture.reset();
-#endif
isMouseHidden = false;
}
}
@@ -185,10 +178,6 @@ void ZoomEffect::hideCursor()
bool shouldHide = false;
if (effects->isOpenGLCompositing()) {
shouldHide = !texture.isNull();
- } else if (effects->compositingType() == XRenderCompositing) {
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- shouldHide = !xrenderPicture.isNull();
-#endif
}
if (shouldHide) {
effects->hideCursor();
@@ -210,10 +199,6 @@ void ZoomEffect::recreateTexture()
texture.reset(new GLTexture(cursor.image()));
texture->setWrapMode(GL_CLAMP_TO_EDGE);
}
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (effects->compositingType() == XRenderCompositing)
- xrenderPicture.reset(new XRenderPicture(cursor.image()));
-#endif
}
else {
qCDebug(KWINEFFECTS) << "Falling back to proportional mouse tracking!";
@@ -365,30 +350,6 @@ void ZoomEffect::paintScreen(int mask, const QRegion ®ion, ScreenPaintData& d
texture->unbind();
glDisable(GL_BLEND);
}
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (xrenderPicture) {
-#define DOUBLE_TO_FIXED(d) ((xcb_render_fixed_t) ((d) * 65536))
- static const xcb_render_transform_t xrenderIdentity = {
- DOUBLE_TO_FIXED(1), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0),
- DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1), DOUBLE_TO_FIXED(0),
- DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1)
- };
- if (mousePointer == MousePointerScale) {
- xcb_render_set_picture_filter(xcbConnection(), *xrenderPicture, 4, const_cast("good"), 0, nullptr);
- const xcb_render_transform_t xform = {
- DOUBLE_TO_FIXED(1.0 / zoom), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0),
- DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1.0 / zoom), DOUBLE_TO_FIXED(0),
- DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1)
- };
- xcb_render_set_picture_transform(xcbConnection(), *xrenderPicture, xform);
- }
- xcb_render_composite(xcbConnection(), XCB_RENDER_PICT_OP_OVER, *xrenderPicture, XCB_RENDER_PICTURE_NONE,
- effects->xrenderBufferPicture(), 0, 0, 0, 0, rect.x(), rect.y(), rect.width(), rect.height());
- if (mousePointer == MousePointerScale)
- xcb_render_set_picture_transform(xcbConnection(), *xrenderPicture, xrenderIdentity);
-#undef DOUBLE_TO_FIXED
- }
-#endif
}
}
diff --git a/src/effects/zoom/zoom.h b/src/effects/zoom/zoom.h
index 48263409d1..887ccd7808 100644
--- a/src/effects/zoom/zoom.h
+++ b/src/effects/zoom/zoom.h
@@ -25,7 +25,6 @@ class ZoomAccessibilityIntegration;
#endif
class GLTexture;
-class XRenderPicture;
class ZoomEffect
: public Effect
@@ -120,9 +119,6 @@ private:
QTime lastMouseEvent;
QTime lastFocusEvent;
QScopedPointer texture;
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- QScopedPointer xrenderPicture;
-#endif
int imageWidth;
int imageHeight;
bool isMouseHidden;
diff --git a/src/kcmkwin/kwincompositing/compositing.ui b/src/kcmkwin/kwincompositing/compositing.ui
index 398043fa00..c2c84be575 100644
--- a/src/kcmkwin/kwincompositing/compositing.ui
+++ b/src/kcmkwin/kwincompositing/compositing.ui
@@ -28,8 +28,7 @@
OpenGL compositing (the default) has crashed KWin in the past.
This was most likely due to a driver bug.
If you think that you have meanwhile upgraded to a stable driver,
-you can reset this protection but be aware that this might result in an immediate crash!
-Alternatively, you might want to use the XRender backend instead.
+you can reset this protection but be aware that this might result in an immediate crash!
true
@@ -159,20 +158,6 @@ Alternatively, you might want to use the XRender backend instead.
-
-
-
-
-
-
-
- Crisp
-
-
- -
-
- Smooth (slower)
-
-
-
-
-
-
diff --git a/src/kcmkwin/kwincompositing/kwincompositing_setting.kcfg b/src/kcmkwin/kwincompositing/kwincompositing_setting.kcfg
index 7278d09b7a..6acc02e433 100644
--- a/src/kcmkwin/kwincompositing/kwincompositing_setting.kcfg
+++ b/src/kcmkwin/kwincompositing/kwincompositing_setting.kcfg
@@ -26,14 +26,6 @@
2
-
- Crisp
-
-
-
-
-
-
true
@@ -56,7 +48,6 @@
OpenGL
-
diff --git a/src/kcmkwin/kwincompositing/main.cpp b/src/kcmkwin/kwincompositing/main.cpp
index 2dec410b9e..a1cade857a 100644
--- a/src/kcmkwin/kwincompositing/main.cpp
+++ b/src/kcmkwin/kwincompositing/main.cpp
@@ -37,7 +37,6 @@ public:
enum CompositingTypeIndex {
OPENGL31_INDEX = 0,
OPENGL20_INDEX,
- XRENDER_INDEX
};
explicit KWinCompositingKCM(QWidget *parent = nullptr, const QVariantList &args = QVariantList());
@@ -162,7 +161,6 @@ void KWinCompositingKCM::init()
// compositing type
m_form.backend->addItem(i18n("OpenGL 3.1"), CompositingTypeIndex::OPENGL31_INDEX);
m_form.backend->addItem(i18n("OpenGL 2.0"), CompositingTypeIndex::OPENGL20_INDEX);
- m_form.backend->addItem(i18n("XRender"), CompositingTypeIndex::XRENDER_INDEX);
connect(m_form.backend, currentIndexChangedSignal, this, &KWinCompositingKCM::onBackendChanged);
@@ -175,8 +173,8 @@ void KWinCompositingKCM::onBackendChanged()
{
const int currentType = m_form.backend->currentData().toInt();
- m_form.kcfg_glTextureFilter->setVisible(currentType != CompositingTypeIndex::XRENDER_INDEX);
- m_form.kcfg_XRenderSmoothScale->setVisible(currentType == CompositingTypeIndex::XRENDER_INDEX);
+ m_form.kcfg_glTextureFilter->setVisible(currentType == CompositingTypeIndex::OPENGL31_INDEX ||
+ currentType == CompositingTypeIndex::OPENGL20_INDEX);
updateUnmanagedItemStatus();
}
@@ -193,10 +191,6 @@ void KWinCompositingKCM::updateUnmanagedItemStatus()
case CompositingTypeIndex::OPENGL20_INDEX:
glCore = false;
break;
- case CompositingTypeIndex::XRENDER_INDEX:
- backend = KWinCompositingSetting::EnumBackend::XRender;
- glCore = false;
- break;
}
const auto animationDuration = s_animationMultipliers[m_form.animationDurationFactor->value()];
@@ -242,8 +236,6 @@ void KWinCompositingKCM::load()
} else {
m_form.backend->setCurrentIndex(CompositingTypeIndex::OPENGL20_INDEX);
}
- } else {
- m_form.backend->setCurrentIndex(CompositingTypeIndex::XRENDER_INDEX);
}
m_form.backend->setDisabled(m_settings->isBackendImmutable());
@@ -273,10 +265,6 @@ void KWinCompositingKCM::save()
backend = KWinCompositingSetting::EnumBackend::OpenGL;
glCore = false;
break;
- case CompositingTypeIndex::XRENDER_INDEX:
- backend = KWinCompositingSetting::EnumBackend::XRender;
- glCore = false;
- break;
}
m_settings->setBackend(backend);
m_settings->setGlCore(glCore);
diff --git a/src/kwin.kcfg b/src/kwin.kcfg
index f3c15583f6..99b2d5f50e 100644
--- a/src/kwin.kcfg
+++ b/src/kwin.kcfg
@@ -231,9 +231,6 @@
false
-
- false
-
5
4
diff --git a/src/libkwineffects/CMakeLists.txt b/src/libkwineffects/CMakeLists.txt
index 436551ef0c..86266f0b7f 100644
--- a/src/libkwineffects/CMakeLists.txt
+++ b/src/libkwineffects/CMakeLists.txt
@@ -58,9 +58,6 @@ target_link_libraries(kwineffects
KF5::Declarative
kwinglutils
)
-if (KWIN_HAVE_XRENDER_COMPOSITING)
- target_link_libraries(kwineffects PRIVATE kwinxrenderutils XCB::XFIXES)
-endif()
set_target_properties(kwineffects PROPERTIES
VERSION ${KWINEFFECTS_VERSION}
SOVERSION ${KWINEFFECTS_SOVERSION}
diff --git a/src/libkwineffects/kwinconfig.h.cmake b/src/libkwineffects/kwinconfig.h.cmake
index d457649472..0f65da0bdc 100644
--- a/src/libkwineffects/kwinconfig.h.cmake
+++ b/src/libkwineffects/kwinconfig.h.cmake
@@ -18,9 +18,6 @@
*/
-/* KWIN_HAVE_XRENDER_COMPOSITING - whether XRender-based compositing support is available */
-#cmakedefine KWIN_HAVE_XRENDER_COMPOSITING
-
#cmakedefine01 HAVE_EPOXY_GLX
#cmakedefine01 HAVE_DL_LIBRARY
diff --git a/src/libkwineffects/kwineffects.cpp b/src/libkwineffects/kwineffects.cpp
index b06d689b48..31dc8cf44d 100644
--- a/src/libkwineffects/kwineffects.cpp
+++ b/src/libkwineffects/kwineffects.cpp
@@ -12,9 +12,6 @@
#include "kwineffects.h"
#include "config-kwin.h"
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-#include "kwinxrenderutils.h"
-#endif
#include
#include
@@ -28,10 +25,6 @@
#include
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-#include
-#endif
-
#if defined(__SSE2__)
# include
#endif
@@ -1376,20 +1369,10 @@ PaintClipper::Iterator::Iterator()
data->index = -1;
next(); // move to the first one
}
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (clip() && effects->compositingType() == XRenderCompositing) {
- XFixesRegion region(paintArea());
- xcb_xfixes_set_picture_clip_region(connection(), effects->xrenderBufferPicture(), region, 0, 0);
- }
-#endif
}
PaintClipper::Iterator::~Iterator()
{
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (clip() && effects->compositingType() == XRenderCompositing)
- xcb_xfixes_set_picture_clip_region(connection(), effects->xrenderBufferPicture(), XCB_XFIXES_REGION_NONE, 0, 0);
-#endif
delete data;
}
@@ -1399,10 +1382,6 @@ bool PaintClipper::Iterator::isDone()
return data->index == 1; // run once
if (effects->isOpenGLCompositing())
return data->index >= data->region.rectCount(); // run once per each area
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (effects->compositingType() == XRenderCompositing)
- return data->index == 1; // run once
-#endif
abort();
}
@@ -1417,10 +1396,6 @@ QRect PaintClipper::Iterator::boundingRect() const
return infiniteRegion();
if (effects->isOpenGLCompositing())
return *(data->region.begin() + data->index);
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (effects->compositingType() == XRenderCompositing)
- return data->region.boundingRect();
-#endif
abort();
return infiniteRegion();
}
diff --git a/src/libkwineffects/kwineffects.h b/src/libkwineffects/kwineffects.h
index 2b7378d158..d812cc62a7 100644
--- a/src/libkwineffects/kwineffects.h
+++ b/src/libkwineffects/kwineffects.h
@@ -73,7 +73,6 @@ class EffectScreen;
class Effect;
class WindowQuad;
class GLShader;
-class XRenderPicture;
class WindowQuadList;
class WindowPrePaintData;
class WindowPaintData;
@@ -1135,7 +1134,6 @@ public:
* @return bool @c true in case of OpenGL based Compositor, @c false otherwise
*/
bool isOpenGLCompositing() const;
- virtual unsigned long xrenderBufferPicture() = 0;
/**
* @brief Provides access to the QPainter which is rendering to the back buffer.
*
diff --git a/src/libkwineffects/kwinglobals.h b/src/libkwineffects/kwinglobals.h
index d61479fef1..a2b64f4320 100644
--- a/src/libkwineffects/kwinglobals.h
+++ b/src/libkwineffects/kwinglobals.h
@@ -37,7 +37,7 @@ enum CompositingType {
* use EffectsHandler::isOpenGLCompositing().
*/
OpenGLCompositing = 1,
- XRenderCompositing = 1<<1,
+ /* XRenderCompositing = 1<<1, */
QPainterCompositing = 1<< 2,
OpenGL2Compositing = 1<<3 | OpenGLCompositing,
};
diff --git a/src/libkwineffects/kwinglplatform.cpp b/src/libkwineffects/kwinglplatform.cpp
index 792fe15138..b733eb0b56 100644
--- a/src/libkwineffects/kwinglplatform.cpp
+++ b/src/libkwineffects/kwinglplatform.cpp
@@ -708,7 +708,7 @@ QByteArray GLPlatform::chipClassToString8(ChipClass chipClass)
GLPlatform::GLPlatform()
: m_driver(Driver_Unknown),
m_chipClass(UnknownChipClass),
- m_recommendedCompositor(XRenderCompositing),
+ m_recommendedCompositor(QPainterCompositing),
m_glVersion(0),
m_glslVersion(0),
m_mesaVersion(0),
@@ -1030,11 +1030,11 @@ void GLPlatform::detect(OpenGLPlatformInterface platformInterface)
}
if (m_chipClass < R300) {
- // fallback to XRender for R100 and R200
- m_recommendedCompositor = XRenderCompositing;
+ // fallback to NoCompositing for R100 and R200
+ m_recommendedCompositor = NoCompositing;
} else if (m_chipClass < R600) {
- // XRender due to NPOT limitations not supported by KWin's shaders
- m_recommendedCompositor = XRenderCompositing;
+ // NoCompositing due to NPOT limitations not supported by KWin's shaders
+ m_recommendedCompositor = NoCompositing;
} else {
m_recommendedCompositor = OpenGL2Compositing;
}
@@ -1055,7 +1055,7 @@ void GLPlatform::detect(OpenGLPlatformInterface platformInterface)
}
if (m_chipClass < NV40) {
- m_recommendedCompositor = XRenderCompositing;
+ m_recommendedCompositor = NoCompositing;
} else {
m_recommendedCompositor = OpenGL2Compositing;
}
@@ -1073,7 +1073,7 @@ void GLPlatform::detect(OpenGLPlatformInterface platformInterface)
m_looseBinding = false;
if (m_chipClass < I915) {
- m_recommendedCompositor = XRenderCompositing;
+ m_recommendedCompositor = NoCompositing;
} else {
m_recommendedCompositor = OpenGL2Compositing;
}
@@ -1092,8 +1092,8 @@ void GLPlatform::detect(OpenGLPlatformInterface platformInterface)
if (isSoftwareEmulation()) {
if (m_driver < Driver_Llvmpipe) {
- // we recommend XRender
- m_recommendedCompositor = XRenderCompositing;
+ // we recommend QPainter
+ m_recommendedCompositor = QPainterCompositing;
// Software emulation does not provide GLSL
m_limitedGLSL = m_supportsGLSL = false;
} else {
diff --git a/src/options.cpp b/src/options.cpp
index 32a93cec6e..877862dee4 100644
--- a/src/options.cpp
+++ b/src/options.cpp
@@ -59,7 +59,6 @@ Options::Options(QObject *parent)
, m_useCompositing(Options::defaultUseCompositing())
, m_hiddenPreviews(Options::defaultHiddenPreviews())
, m_glSmoothScale(Options::defaultGlSmoothScale())
- , m_xrenderSmoothScale(Options::defaultXrenderSmoothScale())
, m_glStrictBinding(Options::defaultGlStrictBinding())
, m_glStrictBindingFollowsDriver(Options::defaultGlStrictBindingFollowsDriver())
, m_glCoreProfile(Options::defaultGLCoreProfile())
@@ -563,15 +562,6 @@ void Options::setGlSmoothScale(int glSmoothScale)
Q_EMIT glSmoothScaleChanged();
}
-void Options::setXrenderSmoothScale(bool xrenderSmoothScale)
-{
- if (m_xrenderSmoothScale == xrenderSmoothScale) {
- return;
- }
- m_xrenderSmoothScale = xrenderSmoothScale;
- Q_EMIT xrenderSmoothScaleChanged();
-}
-
void Options::setGlStrictBinding(bool glStrictBinding)
{
if (m_glStrictBinding == glStrictBinding) {
@@ -821,9 +811,7 @@ bool Options::loadCompositingConfig (bool force)
bool useCompositing = false;
CompositingType compositingMode = NoCompositing;
QString compositingBackend = config.readEntry("Backend", "OpenGL");
- if (compositingBackend == QStringLiteral("XRender"))
- compositingMode = XRenderCompositing;
- else if (compositingBackend == "QPainter")
+ if (compositingBackend == "QPainter")
compositingMode = QPainterCompositing;
else
compositingMode = OpenGLCompositing;
@@ -835,11 +823,6 @@ bool Options::loadCompositingConfig (bool force)
compositingMode = OpenGLCompositing;
useCompositing = true;
break;
- case 'X':
- qCDebug(KWIN_CORE) << "Compositing forced to XRender mode by environment variable";
- compositingMode = XRenderCompositing;
- useCompositing = true;
- break;
case 'Q':
qCDebug(KWIN_CORE) << "Compositing forced to QPainter mode by environment variable";
compositingMode = QPainterCompositing;
@@ -899,8 +882,6 @@ void Options::reloadCompositingSettings(bool force)
c = Options::defaultGlPreferBufferSwap();
setGlPreferBufferSwap(c);
- m_xrenderSmoothScale = config.readEntry("XRenderSmoothScale", false);
-
HiddenPreviews previews = Options::defaultHiddenPreviews();
// 4 - off, 5 - shown, 6 - always, other are old values
int hps = config.readEntry("HiddenPreviews", 5);
diff --git a/src/options.h b/src/options.h
index ee47210535..c3bd7100f9 100644
--- a/src/options.h
+++ b/src/options.h
@@ -185,7 +185,6 @@ class KWIN_EXPORT Options : public QObject
* -1 = auto
*/
Q_PROPERTY(int glSmoothScale READ glSmoothScale WRITE setGlSmoothScale NOTIFY glSmoothScaleChanged)
- Q_PROPERTY(bool xrenderSmoothScale READ isXrenderSmoothScale WRITE setXrenderSmoothScale NOTIFY xrenderSmoothScaleChanged)
Q_PROPERTY(bool glStrictBinding READ isGlStrictBinding WRITE setGlStrictBinding NOTIFY glStrictBindingChanged)
/**
* Whether strict binding follows the driver or has been overwritten by a user defined config value.
@@ -571,10 +570,6 @@ public:
int glSmoothScale() const {
return m_glSmoothScale;
}
- // XRender
- bool isXrenderSmoothScale() const {
- return m_xrenderSmoothScale;
- }
// Settings that should be auto-detected
bool isGlStrictBinding() const {
@@ -663,7 +658,6 @@ public:
void setUseCompositing(bool useCompositing);
void setHiddenPreviews(int hiddenPreviews);
void setGlSmoothScale(int glSmoothScale);
- void setXrenderSmoothScale(bool xrenderSmoothScale);
void setGlStrictBinding(bool glStrictBinding);
void setGlStrictBindingFollowsDriver(bool glStrictBindingFollowsDriver);
void setGLCoreProfile(bool glCoreProfile);
@@ -747,9 +741,6 @@ public:
static int defaultGlSmoothScale() {
return 2;
}
- static bool defaultXrenderSmoothScale() {
- return false;
- }
static bool defaultGlStrictBinding() {
return true;
}
@@ -839,7 +830,6 @@ Q_SIGNALS:
void useCompositingChanged();
void hiddenPreviewsChanged();
void glSmoothScaleChanged();
- void xrenderSmoothScaleChanged();
void glStrictBindingChanged();
void glStrictBindingFollowsDriverChanged();
void glCoreProfileChanged();
@@ -884,7 +874,6 @@ private:
bool m_useCompositing;
HiddenPreviews m_hiddenPreviews;
int m_glSmoothScale;
- bool m_xrenderSmoothScale;
// Settings that should be auto-detected
bool m_glStrictBinding;
bool m_glStrictBindingFollowsDriver;
diff --git a/src/platform.cpp b/src/platform.cpp
index ecb41534bf..2368cc9081 100644
--- a/src/platform.cpp
+++ b/src/platform.cpp
@@ -84,13 +84,6 @@ QPainterBackend *Platform::createQPainterBackend()
return nullptr;
}
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-XRenderBackend *Platform::createXRenderBackend()
-{
- return nullptr;
-}
-#endif
-
Edge *Platform::createScreenEdge(ScreenEdges *edges)
{
return new Edge(edges);
diff --git a/src/platform.h b/src/platform.h
index 50a68670d9..413572bb28 100644
--- a/src/platform.h
+++ b/src/platform.h
@@ -41,9 +41,6 @@ class Scene;
class ScreenEdges;
class Session;
class Toplevel;
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-class XRenderBackend;
-#endif
class KWIN_EXPORT Outputs : public QVector
{
@@ -66,9 +63,6 @@ public:
virtual bool initialize() = 0;
virtual OpenGLBackend *createOpenGLBackend();
virtual QPainterBackend *createQPainterBackend();
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- virtual XRenderBackend *createXRenderBackend();
-#endif
virtual DmaBufTexture *createDmaBufTexture(const QSize &size) {
Q_UNUSED(size);
return nullptr;
diff --git a/src/platformsupport/scenes/CMakeLists.txt b/src/platformsupport/scenes/CMakeLists.txt
index 50a2aac8ca..6e560cbcda 100644
--- a/src/platformsupport/scenes/CMakeLists.txt
+++ b/src/platformsupport/scenes/CMakeLists.txt
@@ -1,5 +1,2 @@
add_subdirectory(qpainter)
add_subdirectory(opengl)
-if (KWIN_BUILD_XRENDER_COMPOSITING)
- add_subdirectory(xrender)
-endif()
diff --git a/src/platformsupport/scenes/xrender/CMakeLists.txt b/src/platformsupport/scenes/xrender/CMakeLists.txt
deleted file mode 100644
index 41f737bd5c..0000000000
--- a/src/platformsupport/scenes/xrender/CMakeLists.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-set(xrenderbackend_SOURCES
- platformxrendersurfacetexture_x11.cpp
- xrenderbackend.cpp
-)
-
-ecm_qt_declare_logging_category(xrenderbackend_SOURCES
- HEADER logging.h
- IDENTIFIER KWIN_XRENDER
- CATEGORY_NAME kwin_scene_xrender
- DEFAULT_SEVERITY Critical
-)
-
-add_library(SceneXRenderBackend STATIC ${xrenderbackend_SOURCES})
-target_link_libraries(SceneXRenderBackend kwin Qt::Core Qt::Gui)
-target_include_directories(SceneXRenderBackend PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
diff --git a/src/platformsupport/scenes/xrender/platformxrendersurfacetexture_x11.cpp b/src/platformsupport/scenes/xrender/platformxrendersurfacetexture_x11.cpp
deleted file mode 100644
index 85496c0d4d..0000000000
--- a/src/platformsupport/scenes/xrender/platformxrendersurfacetexture_x11.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- SPDX-FileCopyrightText: 2021 Vlad Zahorodnii
-
- SPDX-License-Identifier: GPL-2.0-or-later
-*/
-
-#include "platformxrendersurfacetexture_x11.h"
-#include "main.h"
-#include "surfaceitem_x11.h"
-
-#include
-
-namespace KWin
-{
-
-PlatformXrenderSurfaceTextureX11::PlatformXrenderSurfaceTextureX11(SurfacePixmapX11 *pixmap)
- : m_pixmap(pixmap)
-{
-}
-
-PlatformXrenderSurfaceTextureX11::~PlatformXrenderSurfaceTextureX11()
-{
- if (m_picture != XCB_RENDER_PICTURE_NONE) {
- xcb_render_free_picture(kwinApp()->x11Connection(), m_picture);
- }
-}
-
-bool PlatformXrenderSurfaceTextureX11::isValid() const
-{
- return m_picture != XCB_RENDER_PICTURE_NONE;
-}
-
-xcb_render_picture_t PlatformXrenderSurfaceTextureX11::picture() const
-{
- return m_picture;
-}
-
-bool PlatformXrenderSurfaceTextureX11::create()
-{
- if (m_picture != XCB_RENDER_PICTURE_NONE) {
- return true;
- }
-
- const xcb_pixmap_t pixmap = m_pixmap->pixmap();
- if (pixmap == XCB_PIXMAP_NONE) {
- return false;
- }
-
- xcb_render_pictformat_t format = XRenderUtils::findPictFormat(m_pixmap->visual());
- if (format == XCB_NONE) {
- return false;
- }
-
- m_picture = xcb_generate_id(kwinApp()->x11Connection());
- xcb_render_create_picture(kwinApp()->x11Connection(), m_picture, pixmap, format, 0, nullptr);
- return true;
-}
-
-} // namespace KWin
diff --git a/src/platformsupport/scenes/xrender/platformxrendersurfacetexture_x11.h b/src/platformsupport/scenes/xrender/platformxrendersurfacetexture_x11.h
deleted file mode 100644
index ced97a4d01..0000000000
--- a/src/platformsupport/scenes/xrender/platformxrendersurfacetexture_x11.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- SPDX-FileCopyrightText: 2021 Vlad Zahorodnii
-
- SPDX-License-Identifier: GPL-2.0-or-later
-*/
-
-#pragma once
-
-#include "surfaceitem_x11.h"
-
-#include
-
-namespace KWin
-{
-
-class KWIN_EXPORT PlatformXrenderSurfaceTextureX11 : public PlatformSurfaceTexture
-{
-public:
- explicit PlatformXrenderSurfaceTextureX11(SurfacePixmapX11 *pixmap);
- ~PlatformXrenderSurfaceTextureX11() override;
-
- bool isValid() const override;
-
- bool create();
- xcb_render_picture_t picture() const;
-
-private:
- SurfacePixmapX11 *m_pixmap;
- xcb_render_picture_t m_picture = XCB_RENDER_PICTURE_NONE;
-};
-
-} // namespace KWin
diff --git a/src/platformsupport/scenes/xrender/xrenderbackend.cpp b/src/platformsupport/scenes/xrender/xrenderbackend.cpp
deleted file mode 100644
index b9042f3e93..0000000000
--- a/src/platformsupport/scenes/xrender/xrenderbackend.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- KWin - the KDE window manager
- This file is part of the KDE project.
-
- SPDX-FileCopyrightText: 2006 Lubos Lunak
- SPDX-FileCopyrightText: 2009 Fredrik Höglund
- SPDX-FileCopyrightText: 2013 Martin Gräßlin
-
- SPDX-License-Identifier: GPL-2.0-or-later
-*/
-
-#include "xrenderbackend.h"
-#include "logging.h"
-#include "xcbutils.h"
-
-namespace KWin
-{
-
-XRenderBackend::XRenderBackend()
- : m_buffer(XCB_RENDER_PICTURE_NONE)
- , m_failed(false)
-{
- if (!Xcb::Extensions::self()->isRenderAvailable()) {
- setFailed("No XRender extension available");
- return;
- }
- if (!Xcb::Extensions::self()->isFixesRegionAvailable()) {
- setFailed("No XFixes v3+ extension available");
- return;
- }
-}
-
-XRenderBackend::~XRenderBackend()
-{
- if (m_buffer) {
- xcb_render_free_picture(connection(), m_buffer);
- }
-}
-
-OverlayWindow *XRenderBackend::overlayWindow()
-{
- return nullptr;
-}
-
-void XRenderBackend::showOverlay()
-{
-}
-
-xcb_render_picture_t XRenderBackend::buffer() const
-{
- return m_buffer;
-}
-
-void XRenderBackend::setBuffer(xcb_render_picture_t buffer)
-{
- if (m_buffer != XCB_RENDER_PICTURE_NONE) {
- xcb_render_free_picture(connection(), m_buffer);
- }
- m_buffer = buffer;
-}
-
-bool XRenderBackend::isFailed() const
-{
- return m_failed;
-}
-
-void XRenderBackend::setFailed(const QString &reason)
-{
- qCCritical(KWIN_XRENDER) << "Creating the XRender backend failed: " << reason;
- m_failed = true;
-}
-
-void XRenderBackend::screenGeometryChanged(const QSize &size)
-{
- Q_UNUSED(size)
-}
-
-} // namespace KWin
diff --git a/src/platformsupport/scenes/xrender/xrenderbackend.h b/src/platformsupport/scenes/xrender/xrenderbackend.h
deleted file mode 100644
index 6bfaae1503..0000000000
--- a/src/platformsupport/scenes/xrender/xrenderbackend.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- KWin - the KDE window manager
- This file is part of the KDE project.
-
- SPDX-FileCopyrightText: 2006 Lubos Lunak
-
- SPDX-License-Identifier: GPL-2.0-or-later
-*/
-
-#pragma once
-
-#include
-#include
-
-#include
-
-namespace KWin
-{
-
-class OverlayWindow;
-
-/**
- * @brief Backend for the SceneXRender to hold the compositing buffer and take care of buffer
- * swapping.
- *
- * This class is intended as a small abstraction to support multiple compositing backends in the
- * SceneXRender.
- */
-class XRenderBackend
-{
-public:
- virtual ~XRenderBackend();
- virtual void present(int mask, const QRegion &damage) = 0;
-
- /**
- * @brief Returns the OverlayWindow used by the backend.
- *
- * A backend does not have to use an OverlayWindow, this is mostly for the X world.
- * In case the backend does not use an OverlayWindow it is allowed to return @c null.
- * It's the task of the caller to check whether it is @c null.
- *
- * @return :OverlayWindow*
- */
- virtual OverlayWindow *overlayWindow();
- /**
- * @brief Shows the Overlay Window
- *
- * Default implementation does nothing.
- */
- virtual void showOverlay();
- /**
- * @brief React on screen geometry changes.
- *
- * Default implementation does nothing. Override if specific functionality is required.
- *
- * @param size The new screen size
- */
- virtual void screenGeometryChanged(const QSize &size);
- /**
- * @brief The compositing buffer hold by this backend.
- *
- * The Scene composites the new frame into this buffer.
- *
- * @return xcb_render_picture_t
- */
- xcb_render_picture_t buffer() const;
- /**
- * @brief Whether the creation of the Backend failed.
- *
- * The SceneXRender should test whether the Backend got constructed correctly. If this method
- * returns @c true, the SceneXRender should not try to start the rendering.
- *
- * @return bool @c true if the creation of the Backend failed, @c false otherwise.
- */
- bool isFailed() const;
-
-protected:
- XRenderBackend();
- /**
- * @brief A subclass needs to call this method once it created the compositing back buffer.
- *
- * @param buffer The buffer to use for compositing
- * @return void
- */
- void setBuffer(xcb_render_picture_t buffer);
- /**
- * @brief Sets the backend initialization to failed.
- *
- * This method should be called by the concrete subclass in case the initialization failed.
- * The given @p reason is logged as a warning.
- *
- * @param reason The reason why the initialization failed.
- */
- void setFailed(const QString &reason);
-
-private:
- // Create the compositing buffer. The root window is not double-buffered,
- // so it is done manually using this buffer,
- xcb_render_picture_t m_buffer;
- bool m_failed;
-};
-
-} // namespace KWin
diff --git a/src/plugins/platforms/x11/standalone/CMakeLists.txt b/src/plugins/platforms/x11/standalone/CMakeLists.txt
index 38b16fec68..fc17a5374d 100644
--- a/src/plugins/platforms/x11/standalone/CMakeLists.txt
+++ b/src/plugins/platforms/x11/standalone/CMakeLists.txt
@@ -33,11 +33,6 @@ if (HAVE_EPOXY_GLX)
)
endif()
-if (KWIN_BUILD_XRENDER_COMPOSITING)
- target_sources(KWinX11Platform PRIVATE x11xrenderbackend.cpp)
- target_link_libraries(KWinX11Platform SceneXRenderBackend)
-endif()
-
if (HAVE_DL_LIBRARY)
target_link_libraries(KWinX11Platform ${DL_LIBRARY})
endif()
diff --git a/src/plugins/platforms/x11/standalone/x11_platform.cpp b/src/plugins/platforms/x11/standalone/x11_platform.cpp
index c661191969..73ff872ab1 100644
--- a/src/plugins/platforms/x11/standalone/x11_platform.cpp
+++ b/src/plugins/platforms/x11/standalone/x11_platform.cpp
@@ -12,9 +12,6 @@
#include "edge.h"
#include "session.h"
#include "windowselector.h"
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-#include "x11xrenderbackend.h"
-#endif
#include
#include
#if HAVE_EPOXY_GLX
@@ -174,13 +171,6 @@ OpenGLBackend *X11StandalonePlatform::createOpenGLBackend()
}
}
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-XRenderBackend *X11StandalonePlatform::createXRenderBackend()
-{
- return new X11XRenderBackend(this);
-}
-#endif
-
Edge *X11StandalonePlatform::createScreenEdge(ScreenEdges *edges)
{
if (m_screenEdgesFilter.isNull()) {
@@ -224,21 +214,14 @@ QString X11StandalonePlatform::compositingNotPossibleReason() const
return i18n("OpenGL compositing (the default) has crashed KWin in the past.
"
"This was most likely due to a driver bug."
"If you think that you have meanwhile upgraded to a stable driver,
"
- "you can reset this protection but be aware that this might result in an immediate crash!
"
- "Alternatively, you might want to use the XRender backend instead.
");
+ "you can reset this protection but be aware that this might result in an immediate crash!
");
if (!Xcb::Extensions::self()->isCompositeAvailable() || !Xcb::Extensions::self()->isDamageAvailable()) {
return i18n("Required X extensions (XComposite and XDamage) are not available.");
}
-#if !defined( KWIN_HAVE_XRENDER_COMPOSITING )
- if (!hasGlx())
- return i18n("GLX/OpenGL are not available and only OpenGL support is compiled.");
-#else
- if (!(hasGlx()
- || (Xcb::Extensions::self()->isRenderAvailable() && Xcb::Extensions::self()->isFixesAvailable()))) {
- return i18n("GLX/OpenGL and XRender/XFixes are not available.");
+ if (!hasGlx()) {
+ return i18n("GLX/OpenGL is not available.");
}
-#endif
return QString();
}
@@ -262,16 +245,12 @@ bool X11StandalonePlatform::compositingPossible() const
}
if (hasGlx())
return true;
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- if (Xcb::Extensions::self()->isRenderAvailable() && Xcb::Extensions::self()->isFixesAvailable())
- return true;
-#endif
if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES) {
return true;
} else if (qstrcmp(qgetenv("KWIN_COMPOSE"), "O2ES") == 0) {
return true;
}
- qCDebug(KWIN_X11STANDALONE) << "No OpenGL or XRender/XFixes support";
+ qCDebug(KWIN_X11STANDALONE) << "No OpenGL support";
return false;
}
@@ -457,9 +436,6 @@ QVector X11StandalonePlatform::supportedCompositors() const
QVector compositors;
#if HAVE_EPOXY_GLX
compositors << OpenGLCompositing;
-#endif
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- compositors << XRenderCompositing;
#endif
compositors << NoCompositing;
return compositors;
diff --git a/src/plugins/platforms/x11/standalone/x11_platform.h b/src/plugins/platforms/x11/standalone/x11_platform.h
index 541eddd8f8..9e8bf92d52 100644
--- a/src/plugins/platforms/x11/standalone/x11_platform.h
+++ b/src/plugins/platforms/x11/standalone/x11_platform.h
@@ -38,9 +38,6 @@ public:
Session *session() const override;
OpenGLBackend *createOpenGLBackend() override;
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
- XRenderBackend *createXRenderBackend() override;
-#endif
Edge *createScreenEdge(ScreenEdges *parent) override;
void createPlatformCursor(QObject *parent = nullptr) override;
bool requiresCompositing() const override;
diff --git a/src/plugins/platforms/x11/standalone/x11xrenderbackend.cpp b/src/plugins/platforms/x11/standalone/x11xrenderbackend.cpp
deleted file mode 100644
index 0e5194ee55..0000000000
--- a/src/plugins/platforms/x11/standalone/x11xrenderbackend.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- KWin - the KDE window manager
- This file is part of the KDE project.
-
- SPDX-FileCopyrightText: 2006 Lubos Lunak
- SPDX-FileCopyrightText: 2009 Fredrik Höglund
- SPDX-FileCopyrightText: 2013 Martin Gräßlin
-
- SPDX-License-Identifier: GPL-2.0-or-later
-*/
-
-#include "x11xrenderbackend.h"
-#include "main.h"
-#include "platform.h"
-#include "overlaywindow.h"
-#include "renderloop_p.h"
-#include "scene.h"
-#include "screens.h"
-#include "softwarevsyncmonitor.h"
-#include "utils.h"
-#include "x11_platform.h"
-
-#include "kwinxrenderutils.h"
-
-namespace KWin
-{
-
-X11XRenderBackend::X11XRenderBackend(X11StandalonePlatform *backend)
- : XRenderBackend()
- , m_backend(backend)
- , m_overlayWindow(backend->createOverlayWindow())
- , m_front(XCB_RENDER_PICTURE_NONE)
- , m_format(0)
-{
- // Fallback to software vblank events for now. Maybe use the Present extension or
- // something to get notified when the overlay window is actually presented?
- m_vsyncMonitor = SoftwareVsyncMonitor::create(this);
- connect(backend->renderLoop(), &RenderLoop::refreshRateChanged, this, [this, backend]() {
- m_vsyncMonitor->setRefreshRate(backend->renderLoop()->refreshRate());
- });
- m_vsyncMonitor->setRefreshRate(backend->renderLoop()->refreshRate());
-
- connect(m_vsyncMonitor, &VsyncMonitor::vblankOccurred, this, &X11XRenderBackend::vblank);
-
- init(true);
-}
-
-X11XRenderBackend::~X11XRenderBackend()
-{
- // No completion events will be received for in-flight frames, this may lock the
- // render loop. We need to ensure that the render loop is back to its initial state
- // if the render backend is about to be destroyed.
- RenderLoopPrivate::get(kwinApp()->platform()->renderLoop())->invalidate();
-
- if (m_front) {
- xcb_render_free_picture(connection(), m_front);
- }
- m_overlayWindow->destroy();
-}
-
-OverlayWindow *X11XRenderBackend::overlayWindow()
-{
- return m_overlayWindow.data();
-}
-
-void X11XRenderBackend::showOverlay()
-{
- if (m_overlayWindow->window()) { // show the window only after the first pass, since
- m_overlayWindow->show(); // that pass may take long
- }
-}
-
-void X11XRenderBackend::init(bool createOverlay)
-{
- if (m_front != XCB_RENDER_PICTURE_NONE)
- xcb_render_free_picture(connection(), m_front);
- bool haveOverlay = createOverlay ? m_overlayWindow->create() : (m_overlayWindow->window() != XCB_WINDOW_NONE);
- if (haveOverlay) {
- m_overlayWindow->setup(XCB_WINDOW_NONE);
- ScopedCPointer attribs(xcb_get_window_attributes_reply(connection(),
- xcb_get_window_attributes_unchecked(connection(), m_overlayWindow->window()), nullptr));
- if (!attribs) {
- setFailed("Failed getting window attributes for overlay window");
- return;
- }
- m_format = XRenderUtils::findPictFormat(attribs->visual);
- if (m_format == 0) {
- setFailed("Failed to find XRender format for overlay window");
- return;
- }
- m_front = xcb_generate_id(connection());
- xcb_render_create_picture(connection(), m_front, m_overlayWindow->window(), m_format, 0, nullptr);
- } else {
- // create XRender picture for the root window
- m_format = XRenderUtils::findPictFormat(kwinApp()->x11DefaultScreen()->root_visual);
- if (m_format == 0) {
- setFailed("Failed to find XRender format for root window");
- return; // error
- }
- m_front = xcb_generate_id(connection());
- const uint32_t values[] = {XCB_SUBWINDOW_MODE_INCLUDE_INFERIORS};
- xcb_render_create_picture(connection(), m_front, rootWindow(), m_format, XCB_RENDER_CP_SUBWINDOW_MODE, values);
- }
- createBuffer();
-}
-
-void X11XRenderBackend::createBuffer()
-{
- xcb_pixmap_t pixmap = xcb_generate_id(connection());
- const auto displaySize = screens()->displaySize();
- xcb_create_pixmap(connection(), Xcb::defaultDepth(), pixmap, rootWindow(), displaySize.width(), displaySize.height());
- xcb_render_picture_t b = xcb_generate_id(connection());
- xcb_render_create_picture(connection(), b, pixmap, m_format, 0, nullptr);
- xcb_free_pixmap(connection(), pixmap); // The picture owns the pixmap now
- setBuffer(b);
-}
-
-void X11XRenderBackend::present(int mask, const QRegion &damage)
-{
- m_vsyncMonitor->arm();
-
- const auto displaySize = screens()->displaySize();
- if (mask & Scene::PAINT_SCREEN_REGION) {
- // Use the damage region as the clip region for the root window
- XFixesRegion frontRegion(damage);
- xcb_xfixes_set_picture_clip_region(connection(), m_front, frontRegion, 0, 0);
- // copy composed buffer to the root window
- xcb_xfixes_set_picture_clip_region(connection(), buffer(), XCB_XFIXES_REGION_NONE, 0, 0);
- xcb_render_composite(connection(), XCB_RENDER_PICT_OP_SRC, buffer(), XCB_RENDER_PICTURE_NONE,
- m_front, 0, 0, 0, 0, 0, 0, displaySize.width(), displaySize.height());
- xcb_xfixes_set_picture_clip_region(connection(), m_front, XCB_XFIXES_REGION_NONE, 0, 0);
- } else {
- // copy composed buffer to the root window
- xcb_render_composite(connection(), XCB_RENDER_PICT_OP_SRC, buffer(), XCB_RENDER_PICTURE_NONE,
- m_front, 0, 0, 0, 0, 0, 0, displaySize.width(), displaySize.height());
- }
-
- xcb_flush(connection());
-}
-
-void X11XRenderBackend::vblank(std::chrono::nanoseconds timestamp)
-{
- RenderLoopPrivate *renderLoopPrivate = RenderLoopPrivate::get(m_backend->renderLoop());
- renderLoopPrivate->notifyFrameCompleted(timestamp);
-}
-
-void X11XRenderBackend::screenGeometryChanged(const QSize &size)
-{
- Q_UNUSED(size)
- init(false);
-}
-
-} // namespace KWin
diff --git a/src/plugins/platforms/x11/standalone/x11xrenderbackend.h b/src/plugins/platforms/x11/standalone/x11xrenderbackend.h
deleted file mode 100644
index 432ee89e93..0000000000
--- a/src/plugins/platforms/x11/standalone/x11xrenderbackend.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- KWin - the KDE window manager
- This file is part of the KDE project.
-
- SPDX-FileCopyrightText: 2006 Lubos Lunak
-
- SPDX-License-Identifier: GPL-2.0-or-later
-*/
-
-#pragma once
-
-#include "xrenderbackend.h"
-
-namespace KWin
-{
-
-class SoftwareVsyncMonitor;
-class X11StandalonePlatform;
-
-/**
- * @brief XRenderBackend using an X11 Overlay Window as compositing target.
- */
-class X11XRenderBackend : public QObject, public XRenderBackend
-{
- Q_OBJECT
-
-public:
- explicit X11XRenderBackend(X11StandalonePlatform *backend);
- ~X11XRenderBackend() override;
-
- void present(int mask, const QRegion &damage) override;
- OverlayWindow *overlayWindow() override;
- void showOverlay() override;
- void screenGeometryChanged(const QSize &size) override;
-
-private:
- void init(bool createOverlay);
- void createBuffer();
- void vblank(std::chrono::nanoseconds timestamp);
-
- X11StandalonePlatform *m_backend;
- SoftwareVsyncMonitor *m_vsyncMonitor;
- QScopedPointer m_overlayWindow;
- xcb_render_picture_t m_front;
- xcb_render_pictformat_t m_format;
-};
-
-} // namespace KWin
diff --git a/src/plugins/scenes/CMakeLists.txt b/src/plugins/scenes/CMakeLists.txt
index 5c55688e87..1a52054539 100644
--- a/src/plugins/scenes/CMakeLists.txt
+++ b/src/plugins/scenes/CMakeLists.txt
@@ -1,5 +1,2 @@
add_subdirectory(opengl)
add_subdirectory(qpainter)
-if (KWIN_BUILD_XRENDER_COMPOSITING)
- add_subdirectory(xrender)
-endif()
diff --git a/src/plugins/scenes/opengl/scene_opengl.cpp b/src/plugins/scenes/opengl/scene_opengl.cpp
index dce9458b11..11173ae13c 100644
--- a/src/plugins/scenes/opengl/scene_opengl.cpp
+++ b/src/plugins/scenes/opengl/scene_opengl.cpp
@@ -466,8 +466,8 @@ SceneOpenGL *SceneOpenGL::createScene(QObject *parent)
}
}
if (!scene) {
- if (GLPlatform::instance()->recommendedCompositor() == XRenderCompositing) {
- qCCritical(KWIN_OPENGL) << "OpenGL driver recommends XRender based compositing. Falling back to XRender.";
+ if (GLPlatform::instance()->recommendedCompositor() == QPainterCompositing) {
+ qCCritical(KWIN_OPENGL) << "OpenGL driver recommends QPainter based compositing. Falling back to QPainter.";
qCCritical(KWIN_OPENGL) << "To overwrite the detection use the environment variable KWIN_COMPOSE";
qCCritical(KWIN_OPENGL) << "For more information see https://community.kde.org/KWin/Environment_Variables#KWIN_COMPOSE";
}
diff --git a/src/plugins/scenes/xrender/CMakeLists.txt b/src/plugins/scenes/xrender/CMakeLists.txt
deleted file mode 100644
index 15a4439228..0000000000
--- a/src/plugins/scenes/xrender/CMakeLists.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-set(SCENE_XRENDER_SRCS scene_xrender.cpp)
-
-include(ECMQtDeclareLoggingCategory)
-ecm_qt_declare_logging_category(
- SCENE_XRENDER_SRCS HEADER
- logging.h
- IDENTIFIER
- KWIN_XRENDER
- CATEGORY_NAME
- kwin_scene_xrender
- DEFAULT_SEVERITY
- Critical
-)
-
-add_library(KWinSceneXRender MODULE ${SCENE_XRENDER_SRCS})
-set_target_properties(KWinSceneXRender PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/org.kde.kwin.scenes/")
-target_link_libraries(KWinSceneXRender kwin kwinxrenderutils SceneXRenderBackend)
-
-install(
- TARGETS
- KWinSceneXRender
- DESTINATION
- ${KDE_INSTALL_PLUGINDIR}/org.kde.kwin.scenes/
-)
diff --git a/src/plugins/scenes/xrender/scene_xrender.cpp b/src/plugins/scenes/xrender/scene_xrender.cpp
deleted file mode 100644
index 7d27f34090..0000000000
--- a/src/plugins/scenes/xrender/scene_xrender.cpp
+++ /dev/null
@@ -1,1150 +0,0 @@
-/*
- KWin - the KDE window manager
- This file is part of the KDE project.
-
- SPDX-FileCopyrightText: 2006 Lubos Lunak
- SPDX-FileCopyrightText: 2009 Fredrik Höglund
- SPDX-FileCopyrightText: 2013 Martin Gräßlin
-
- SPDX-License-Identifier: GPL-2.0-or-later
-*/
-#include "scene_xrender.h"
-#include "platformxrendersurfacetexture_x11.h"
-#include "utils.h"
-#include "xrenderbackend.h"
-
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-
-#include "logging.h"
-#include "toplevel.h"
-#include "x11client.h"
-#include "composite.h"
-#include "deleted.h"
-#include "effects.h"
-#include "main.h"
-#include "overlaywindow.h"
-#include "platform.h"
-#include "renderloop.h"
-#include "screens.h"
-#include "shadowitem.h"
-#include "surfaceitem_x11.h"
-#include "windowitem.h"
-#include "xcbutils.h"
-#include "decorations/decoratedclient.h"
-
-#include
-#include
-
-#include
-
-#include
-#include
-#include
-
-namespace KWin
-{
-
-ScreenPaintData SceneXrender::screen_paint;
-
-#define DOUBLE_TO_FIXED(d) ((xcb_render_fixed_t) ((d) * 65536))
-#define FIXED_TO_DOUBLE(f) ((double) ((f) / 65536.0))
-
-//****************************************
-// SceneXrender
-//****************************************
-
-SceneXrender* SceneXrender::createScene(QObject *parent)
-{
- QScopedPointer backend(kwinApp()->platform()->createXRenderBackend());
- if (!backend || backend->isFailed()) {
- return nullptr;
- }
- return new SceneXrender(backend.take(), parent);
-}
-
-SceneXrender::SceneXrender(XRenderBackend *backend, QObject *parent)
- : Scene(parent)
- , m_backend(backend)
-{
-}
-
-SceneXrender::~SceneXrender()
-{
- SceneXrender::Window::cleanup();
- SceneXrender::EffectFrame::cleanup();
-}
-
-bool SceneXrender::initFailed() const
-{
- return false;
-}
-
-// the entry point for painting
-void SceneXrender::paint(int screenId, const QRegion &damage, const QList &toplevels,
- RenderLoop *renderLoop)
-{
- painted_screen = screenId;
-
- createStackingOrder(toplevels);
-
- int mask = 0;
- QRegion updateRegion, validRegion;
- renderLoop->beginFrame();
- paintScreen(&mask, damage, QRegion(), &updateRegion, &validRegion, renderLoop);
- renderLoop->endFrame();
-
- m_backend->showOverlay();
-
- m_backend->present(mask, updateRegion);
- // do cleanup
- clearStackingOrder();
-}
-
-void SceneXrender::paintGenericScreen(int mask, const ScreenPaintData &data)
-{
- screen_paint = data; // save, transformations will be done when painting windows
- Scene::paintGenericScreen(mask, data);
-}
-
-void SceneXrender::paintDesktop(int desktop, int mask, const QRegion ®ion, ScreenPaintData &data)
-{
- PaintClipper::push(region);
- KWin::Scene::paintDesktop(desktop, mask, region, data);
- PaintClipper::pop(region);
-}
-
-// fill the screen background
-void SceneXrender::paintBackground(const QRegion ®ion)
-{
- xcb_render_color_t col = { 0, 0, 0, 0xffff }; // black
- const QVector &rects = Xcb::regionToRects(region);
- xcb_render_fill_rectangles(connection(), XCB_RENDER_PICT_OP_SRC, xrenderBufferPicture(), col, rects.count(), rects.data());
-}
-
-Scene::Window *SceneXrender::createWindow(Toplevel *toplevel)
-{
- return new Window(toplevel, this);
-}
-
-Scene::EffectFrame *SceneXrender::createEffectFrame(EffectFrameImpl *frame)
-{
- return new SceneXrender::EffectFrame(frame);
-}
-
-Shadow *SceneXrender::createShadow(Toplevel *toplevel)
-{
- return new SceneXRenderShadow(toplevel);
-}
-
-DecorationRenderer *SceneXrender::createDecorationRenderer(Decoration::DecoratedClientImpl *client)
-{
- return new SceneXRenderDecorationRenderer(client);
-}
-
-PlatformSurfaceTexture *SceneXrender::createPlatformSurfaceTextureX11(SurfacePixmapX11 *pixmap)
-{
- return new PlatformXrenderSurfaceTextureX11(pixmap);
-}
-
-//****************************************
-// SceneXrender::Window
-//****************************************
-
-XRenderPicture *SceneXrender::Window::s_tempPicture = nullptr;
-QRect SceneXrender::Window::temp_visibleRect;
-XRenderPicture *SceneXrender::Window::s_fadeAlphaPicture = nullptr;
-
-SceneXrender::Window::Window(Toplevel* c, SceneXrender *scene)
- : Scene::Window(c)
- , m_scene(scene)
-{
-}
-
-SceneXrender::Window::~Window()
-{
-}
-
-void SceneXrender::Window::cleanup()
-{
- delete s_tempPicture;
- s_tempPicture = nullptr;
- delete s_fadeAlphaPicture;
- s_fadeAlphaPicture = nullptr;
-}
-
-// Maps window coordinates to screen coordinates
-QRect SceneXrender::Window::mapToScreen(int mask, const WindowPaintData &data, const QRect &rect) const
-{
- QRect r = rect;
-
- if (mask & PAINT_WINDOW_TRANSFORMED) {
- // Apply the window transformation
- r.moveTo(r.x() * data.xScale() + data.xTranslation(),
- r.y() * data.yScale() + data.yTranslation());
- r.setWidth(r.width() * data.xScale());
- r.setHeight(r.height() * data.yScale());
- }
-
- // Move the rectangle to the screen position
- r.translate(x(), y());
-
- if (mask & PAINT_SCREEN_TRANSFORMED) {
- // Apply the screen transformation
- r.moveTo(r.x() * screen_paint.xScale() + screen_paint.xTranslation(),
- r.y() * screen_paint.yScale() + screen_paint.yTranslation());
- r.setWidth(r.width() * screen_paint.xScale());
- r.setHeight(r.height() * screen_paint.yScale());
- }
-
- return r;
-}
-
-// Maps window coordinates to screen coordinates
-QPoint SceneXrender::Window::mapToScreen(int mask, const WindowPaintData &data, const QPoint &point) const
-{
- QPoint pt = point;
-
- if (mask & PAINT_WINDOW_TRANSFORMED) {
- // Apply the window transformation
- pt.rx() = pt.x() * data.xScale() + data.xTranslation();
- pt.ry() = pt.y() * data.yScale() + data.yTranslation();
- }
-
- // Move the point to the screen position
- pt += QPoint(x(), y());
-
- if (mask & PAINT_SCREEN_TRANSFORMED) {
- // Apply the screen transformation
- pt.rx() = pt.x() * screen_paint.xScale() + screen_paint.xTranslation();
- pt.ry() = pt.y() * screen_paint.yScale() + screen_paint.yTranslation();
- }
-
- return pt;
-}
-
-QRect SceneXrender::Window::bufferToWindowRect(const QRect &rect) const
-{
- return rect.translated(surfaceItem()->position());
-}
-
-QRegion SceneXrender::Window::bufferToWindowRegion(const QRegion ®ion) const
-{
- return region.translated(surfaceItem()->position());
-}
-
-void SceneXrender::Window::prepareTempPixmap()
-{
- const QSize oldSize = temp_visibleRect.size();
- temp_visibleRect = toplevel->visibleGeometry().translated(-toplevel->pos());
- if (s_tempPicture && (oldSize.width() < temp_visibleRect.width() || oldSize.height() < temp_visibleRect.height())) {
- delete s_tempPicture;
- s_tempPicture = nullptr;
- scene_setXRenderOffscreenTarget(0); // invalidate, better crash than cause weird results for developers
- }
- if (!s_tempPicture) {
- xcb_pixmap_t pix = xcb_generate_id(connection());
- xcb_create_pixmap(connection(), 32, pix, rootWindow(), temp_visibleRect.width(), temp_visibleRect.height());
- s_tempPicture = new XRenderPicture(pix, 32);
- xcb_free_pixmap(connection(), pix);
- }
- const xcb_render_color_t transparent = {0, 0, 0, 0};
- const xcb_rectangle_t rect = {0, 0, uint16_t(temp_visibleRect.width()), uint16_t(temp_visibleRect.height())};
- xcb_render_fill_rectangles(connection(), XCB_RENDER_PICT_OP_SRC, *s_tempPicture, transparent, 1, &rect);
-}
-
-// paint the window
-void SceneXrender::Window::performPaint(int mask, const QRegion &_region, const WindowPaintData &data)
-{
- QRegion region = _region;
- setTransformedShape(QRegion()); // maybe nothing will be painted
- // check if there is something to paint
- bool opaque = isOpaque() && qFuzzyCompare(data.opacity(), 1.0);
- /* HACK: It seems this causes painting glitches, disable temporarily
- if (( mask & PAINT_WINDOW_OPAQUE ) ^ ( mask & PAINT_WINDOW_TRANSLUCENT ))
- { // We are only painting either opaque OR translucent windows, not both
- if ( mask & PAINT_WINDOW_OPAQUE && !opaque )
- return; // Only painting opaque and window is translucent
- if ( mask & PAINT_WINDOW_TRANSLUCENT && opaque )
- return; // Only painting translucent and window is opaque
- }*/
- // Intersect the clip region with the rectangle the window occupies on the screen
- if (!(mask & (PAINT_WINDOW_TRANSFORMED | PAINT_SCREEN_TRANSFORMED)))
- region &= toplevel->visibleGeometry();
-
- if (region.isEmpty())
- return;
- SurfacePixmap *surfaceTexture = surfaceItem()->pixmap();
- if (!surfaceTexture || !surfaceTexture->isValid()) {
- return;
- }
- PlatformXrenderSurfaceTextureX11 *platformSurfaceTexture =
- static_cast(surfaceTexture->platformTexture());
- if (platformSurfaceTexture->picture() == XCB_RENDER_PICTURE_NONE) {
- if (!platformSurfaceTexture->create()) {
- qCWarning(KWIN_XRENDER, "Failed to create platform surface texture for window 0x%x",
- window()->frameId());
- return;
- }
- }
- xcb_render_picture_t pic = platformSurfaceTexture->picture();
- if (pic == XCB_RENDER_PICTURE_NONE) // The render format can be null for GL and/or Xv visuals
- return;
- surfaceItem()->resetDamage();
- // set picture filter
- if (options->isXrenderSmoothScale()) { // only when forced, it's slow
- if (mask & PAINT_WINDOW_TRANSFORMED)
- filter = ImageFilterGood;
- else if (mask & PAINT_SCREEN_TRANSFORMED)
- filter = ImageFilterGood;
- else
- filter = ImageFilterFast;
- } else
- filter = ImageFilterFast;
- // do required transformations
- const QRect wr = mapToScreen(mask, data, QRect(0, 0, width(), height()));
- QRect cr = QRect(toplevel->clientPos(), toplevel->clientSize()); // Content rect (in the buffer)
- qreal xscale = 1;
- qreal yscale = 1;
- bool scaled = false;
-
- X11Client *client = dynamic_cast(toplevel);
- Deleted *deleted = dynamic_cast(toplevel);
- const QRect decorationRect = toplevel->rect();
- const DecorationItem *decorationItem = windowItem()->decorationItem();
- if (decorationItem) {
- // decorated client
- transformed_shape = decorationRect;
- if (toplevel->shape()) {
- // "xeyes" + decoration
- transformed_shape -= bufferToWindowRect(cr);
- transformed_shape += bufferToWindowRegion(surfaceItem()->shape());
- }
- } else {
- transformed_shape = bufferToWindowRegion(surfaceItem()->shape());
- }
- if (shadowItem()) {
- transformed_shape |= shadowItem()->shadow()->shadowRegion();
- }
-
- xcb_render_transform_t xform = {
- DOUBLE_TO_FIXED(1), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0),
- DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1), DOUBLE_TO_FIXED(0),
- DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1)
- };
- static const xcb_render_transform_t identity = {
- DOUBLE_TO_FIXED(1), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0),
- DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1), DOUBLE_TO_FIXED(0),
- DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1)
- };
-
- if (mask & PAINT_WINDOW_TRANSFORMED) {
- xscale = data.xScale();
- yscale = data.yScale();
- }
- if (mask & PAINT_SCREEN_TRANSFORMED) {
- xscale *= screen_paint.xScale();
- yscale *= screen_paint.yScale();
- }
- if (!qFuzzyCompare(xscale, 1.0) || !qFuzzyCompare(yscale, 1.0)) {
- scaled = true;
- xform.matrix11 = DOUBLE_TO_FIXED(1.0 / xscale);
- xform.matrix22 = DOUBLE_TO_FIXED(1.0 / yscale);
-
- // transform the shape for clipping in paintTransformedScreen()
- QVector rects;
- rects.reserve(transformed_shape.rectCount());
- for (const QRect &rect : transformed_shape) {
- const QRect transformedRect(
- qRound(rect.x() * xscale),
- qRound(rect.y() * yscale),
- qRound(rect.width() * xscale),
- qRound(rect.height() * yscale)
- );
- rects.append(transformedRect);
- }
- transformed_shape.setRects(rects.constData(), rects.count());
- }
-
- transformed_shape.translate(mapToScreen(mask, data, QPoint(0, 0)));
- PaintClipper pcreg(region); // clip by the region to paint
- PaintClipper pc(transformed_shape); // clip by window's shape
-
- const bool wantShadow = shadowItem() && !shadowItem()->shadow()->shadowRegion().isEmpty();
-
- // In order to obtain a pixel perfect rescaling
- // we need to blit the window content togheter with
- // decorations in a temporary pixmap and scale
- // the temporary pixmap at the end.
- // We should do this only if there is scaling and
- // the window has border
- // This solves a number of glitches and on top of this
- // it optimizes painting quite a bit
- const bool blitInTempPixmap = xRenderOffscreen() || (data.crossFadeProgress() < 1.0 && !opaque) ||
- (scaled && (wantShadow || decorationItem));
-
- xcb_render_picture_t renderTarget = m_scene->xrenderBufferPicture();
- if (blitInTempPixmap) {
- if (scene_xRenderOffscreenTarget()) {
- temp_visibleRect = toplevel->visibleGeometry().translated(-toplevel->pos());
- renderTarget = *scene_xRenderOffscreenTarget();
- } else {
- prepareTempPixmap();
- renderTarget = *s_tempPicture;
- }
- } else {
- xcb_render_set_picture_transform(connection(), pic, xform);
- if (filter == ImageFilterGood) {
- setPictureFilter(pic, KWin::Scene::ImageFilterGood);
- }
-
- //BEGIN OF STUPID RADEON HACK
- // This is needed to avoid hitting a fallback in the radeon driver.
- // The Render specification states that sampling pixels outside the
- // source picture results in alpha=0 pixels. This can be achieved by
- // setting the border color to transparent black, but since the border
- // color has the same format as the texture, it only works when the
- // texture has an alpha channel. So the driver falls back to software
- // when the repeat mode is RepeatNone, the picture has a non-identity
- // transformation matrix, and doesn't have an alpha channel.
- // Since we only scale the picture, we can work around this by setting
- // the repeat mode to RepeatPad.
- if (!window()->hasAlpha()) {
- const uint32_t values[] = {XCB_RENDER_REPEAT_PAD};
- xcb_render_change_picture(connection(), pic, XCB_RENDER_CP_REPEAT, values);
- }
- //END OF STUPID RADEON HACK
- }
-#define MAP_RECT_TO_TARGET(_RECT_) \
- if (blitInTempPixmap) _RECT_.translate(-temp_visibleRect.topLeft()); else _RECT_ = mapToScreen(mask, data, _RECT_)
-
- //BEGIN deco preparations
- bool noBorder = true;
- xcb_render_picture_t left = XCB_RENDER_PICTURE_NONE;
- xcb_render_picture_t top = XCB_RENDER_PICTURE_NONE;
- xcb_render_picture_t right = XCB_RENDER_PICTURE_NONE;
- xcb_render_picture_t bottom = XCB_RENDER_PICTURE_NONE;
- QRect dtr, dlr, drr, dbr;
- const SceneXRenderDecorationRenderer *renderer = nullptr;
- if (decorationItem) {
- renderer = static_cast(decorationItem->renderer());
- noBorder = false;
-
- if (client) {
- client->layoutDecorationRects(dlr, dtr, drr, dbr);
- } else if (deleted) {
- deleted->layoutDecorationRects(dlr, dtr, drr, dbr);
- }
- }
- if (renderer) {
- left = renderer->picture(SceneXRenderDecorationRenderer::DecorationPart::Left);
- top = renderer->picture(SceneXRenderDecorationRenderer::DecorationPart::Top);
- right = renderer->picture(SceneXRenderDecorationRenderer::DecorationPart::Right);
- bottom = renderer->picture(SceneXRenderDecorationRenderer::DecorationPart::Bottom);
- }
- if (!noBorder) {
- MAP_RECT_TO_TARGET(dtr);
- MAP_RECT_TO_TARGET(dlr);
- MAP_RECT_TO_TARGET(drr);
- MAP_RECT_TO_TARGET(dbr);
- }
- //END deco preparations
-
- //BEGIN shadow preparations
- QRect stlr, str, strr, srr, sbrr, sbr, sblr, slr;
-
- if (wantShadow) {
- SceneXRenderShadow *m_xrenderShadow = static_cast(shadowItem()->shadow());
- m_xrenderShadow->layoutShadowRects(str, strr, srr, sbrr, sbr, sblr, slr, stlr);
- MAP_RECT_TO_TARGET(stlr);
- MAP_RECT_TO_TARGET(str);
- MAP_RECT_TO_TARGET(strr);
- MAP_RECT_TO_TARGET(srr);
- MAP_RECT_TO_TARGET(sbrr);
- MAP_RECT_TO_TARGET(sbr);
- MAP_RECT_TO_TARGET(sblr);
- MAP_RECT_TO_TARGET(slr);
- }
- //BEGIN end preparations
-
- //BEGIN client preparations
- QRect dr = cr;
- if (blitInTempPixmap) {
- dr.translate(-temp_visibleRect.topLeft());
- } else {
- dr = mapToScreen(mask, data, bufferToWindowRect(dr)); // Destination rect
- if (scaled) {
- cr.moveLeft(cr.x() * xscale);
- cr.moveTop(cr.y() * yscale);
- }
- }
-
- const int clientRenderOp = (opaque || blitInTempPixmap) ? XCB_RENDER_PICT_OP_SRC : XCB_RENDER_PICT_OP_OVER;
- //END client preparations
-
-#undef MAP_RECT_TO_TARGET
-
- for (PaintClipper::Iterator iterator; !iterator.isDone(); iterator.next()) {
-
-#define RENDER_SHADOW_TILE(_TILE_, _RECT_) \
-xcb_render_composite(connection(), XCB_RENDER_PICT_OP_OVER, m_xrenderShadow->picture(SceneXRenderShadow::ShadowElement##_TILE_), \
- shadowAlpha, renderTarget, 0, 0, 0, 0, _RECT_.x(), _RECT_.y(), _RECT_.width(), _RECT_.height())
-
- //shadow
- if (wantShadow) {
- SceneXRenderShadow *m_xrenderShadow = static_cast(shadowItem()->shadow());
- xcb_render_picture_t shadowAlpha = XCB_RENDER_PICTURE_NONE;
- if (!opaque) {
- shadowAlpha = xRenderBlendPicture(data.opacity());
- }
- RENDER_SHADOW_TILE(TopLeft, stlr);
- RENDER_SHADOW_TILE(Top, str);
- RENDER_SHADOW_TILE(TopRight, strr);
- RENDER_SHADOW_TILE(Left, slr);
- RENDER_SHADOW_TILE(Right, srr);
- RENDER_SHADOW_TILE(BottomLeft, sblr);
- RENDER_SHADOW_TILE(Bottom, sbr);
- RENDER_SHADOW_TILE(BottomRight, sbrr);
- }
-#undef RENDER_SHADOW_TILE
-
- // Paint the window contents
- if (!(client && client->isShade())) {
- xcb_render_picture_t clientAlpha = XCB_RENDER_PICTURE_NONE;
- if (!opaque) {
- clientAlpha = xRenderBlendPicture(data.opacity());
- }
- xcb_render_composite(connection(), clientRenderOp, pic, clientAlpha, renderTarget,
- cr.x(), cr.y(), 0, 0, dr.x(), dr.y(), dr.width(), dr.height());
- if (data.crossFadeProgress() < 1.0 && data.crossFadeProgress() > 0.0) {
- SurfacePixmap *previous = surfaceItem()->previousPixmap();
- if (previous && previous != surfaceTexture) {
- auto previousPlatformTexture =
- static_cast(previous->platformTexture());
-
- static xcb_render_color_t cFadeColor = {0, 0, 0, 0};
- cFadeColor.alpha = uint16_t((1.0 - data.crossFadeProgress()) * 0xffff);
- if (!s_fadeAlphaPicture) {
- s_fadeAlphaPicture = new XRenderPicture(xRenderFill(cFadeColor));
- } else {
- xcb_rectangle_t rect = {0, 0, 1, 1};
- xcb_render_fill_rectangles(connection(), XCB_RENDER_PICT_OP_SRC, *s_fadeAlphaPicture, cFadeColor , 1, &rect);
- }
- if (previous->size() != surfaceTexture->size()) {
- xcb_render_transform_t xform2 = {
- DOUBLE_TO_FIXED(FIXED_TO_DOUBLE(xform.matrix11) * previous->size().width() / surfaceTexture->size().width()), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0),
- DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(FIXED_TO_DOUBLE(xform.matrix22) * previous->size().height() / surfaceTexture->size().height()), DOUBLE_TO_FIXED(0),
- DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(0), DOUBLE_TO_FIXED(1)
- };
- xcb_render_set_picture_transform(connection(), previousPlatformTexture->picture(), xform2);
- }
-
- xcb_render_composite(connection(), opaque ? XCB_RENDER_PICT_OP_OVER : XCB_RENDER_PICT_OP_ATOP,
- previousPlatformTexture->picture(), *s_fadeAlphaPicture,
- renderTarget,
- cr.x(), cr.y(), 0, 0, dr.x(), dr.y(), dr.width(), dr.height());
-
- if (previous->size() != surfaceTexture->size()) {
- xcb_render_set_picture_transform(connection(),
- previousPlatformTexture->picture(),
- identity);
- }
- }
- }
- if (!opaque)
- transformed_shape = QRegion();
- }
-
- if (client || deleted) {
- if (!noBorder) {
- xcb_render_picture_t decorationAlpha = xRenderBlendPicture(data.opacity());
- auto renderDeco = [decorationAlpha, renderTarget](xcb_render_picture_t deco, const QRect &rect) {
- if (deco == XCB_RENDER_PICTURE_NONE) {
- return;
- }
- xcb_render_composite(connection(), XCB_RENDER_PICT_OP_OVER, deco, decorationAlpha, renderTarget,
- 0, 0, 0, 0, rect.x(), rect.y(), rect.width(), rect.height());
- };
- renderDeco(top, dtr);
- renderDeco(left, dlr);
- renderDeco(right, drr);
- renderDeco(bottom, dbr);
- }
- }
-
- if (data.brightness() != 1.0) {
- // fake brightness change by overlaying black
- const float alpha = (1 - data.brightness()) * data.opacity();
- xcb_rectangle_t rect;
- if (blitInTempPixmap) {
- rect.x = -temp_visibleRect.left();
- rect.y = -temp_visibleRect.top();
- rect.width = width();
- rect.height = height();
- } else {
- rect.x = wr.x();
- rect.y = wr.y();
- rect.width = wr.width();
- rect.height = wr.height();
- }
- xcb_render_fill_rectangles(connection(), XCB_RENDER_PICT_OP_OVER, renderTarget,
- preMultiply(data.brightness() < 1.0 ? QColor(0,0,0,255*alpha) : QColor(255,255,255,-alpha*255)),
- 1, &rect);
- }
- if (blitInTempPixmap) {
- const QRect r = mapToScreen(mask, data, temp_visibleRect);
- xcb_render_set_picture_transform(connection(), *s_tempPicture, xform);
- setPictureFilter(*s_tempPicture, filter);
- xcb_render_composite(connection(), XCB_RENDER_PICT_OP_OVER, *s_tempPicture,
- XCB_RENDER_PICTURE_NONE, m_scene->xrenderBufferPicture(),
- 0, 0, 0, 0, r.x(), r.y(), r.width(), r.height());
- xcb_render_set_picture_transform(connection(), *s_tempPicture, identity);
- }
- }
- if (scaled && !blitInTempPixmap) {
- xcb_render_set_picture_transform(connection(), pic, identity);
- if (filter == ImageFilterGood)
- setPictureFilter(pic, KWin::Scene::ImageFilterFast);
- if (!window()->hasAlpha()) {
- const uint32_t values[] = {XCB_RENDER_REPEAT_NONE};
- xcb_render_change_picture(connection(), pic, XCB_RENDER_CP_REPEAT, values);
- }
- }
- if (xRenderOffscreen())
- scene_setXRenderOffscreenTarget(*s_tempPicture);
-}
-
-void SceneXrender::Window::setPictureFilter(xcb_render_picture_t pic, Scene::ImageFilterType filter)
-{
- QByteArray filterName;
- switch (filter) {
- case KWin::Scene::ImageFilterFast:
- filterName = QByteArray("fast");
- break;
- case KWin::Scene::ImageFilterGood:
- filterName = QByteArray("good");
- break;
- }
- xcb_render_set_picture_filter(connection(), pic, filterName.length(), filterName.constData(), 0, nullptr);
-}
-
-void SceneXrender::screenGeometryChanged(const QSize &size)
-{
- Scene::screenGeometryChanged(size);
- m_backend->screenGeometryChanged(size);
-}
-
-xcb_render_picture_t SceneXrender::xrenderBufferPicture() const
-{
- return m_backend->buffer();
-}
-
-OverlayWindow *SceneXrender::overlayWindow() const
-{
- return m_backend->overlayWindow();
-}
-
-//****************************************
-// SceneXrender::EffectFrame
-//****************************************
-
-XRenderPicture *SceneXrender::EffectFrame::s_effectFrameCircle = nullptr;
-
-SceneXrender::EffectFrame::EffectFrame(EffectFrameImpl* frame)
- : Scene::EffectFrame(frame)
-{
- m_picture = nullptr;
- m_textPicture = nullptr;
- m_iconPicture = nullptr;
- m_selectionPicture = nullptr;
-}
-
-SceneXrender::EffectFrame::~EffectFrame()
-{
- delete m_picture;
- delete m_textPicture;
- delete m_iconPicture;
- delete m_selectionPicture;
-}
-
-void SceneXrender::EffectFrame::cleanup()
-{
- delete s_effectFrameCircle;
- s_effectFrameCircle = nullptr;
-}
-
-void SceneXrender::EffectFrame::free()
-{
- delete m_picture;
- m_picture = nullptr;
- delete m_textPicture;
- m_textPicture = nullptr;
- delete m_iconPicture;
- m_iconPicture = nullptr;
- delete m_selectionPicture;
- m_selectionPicture = nullptr;
-}
-
-void SceneXrender::EffectFrame::freeIconFrame()
-{
- delete m_iconPicture;
- m_iconPicture = nullptr;
-}
-
-void SceneXrender::EffectFrame::freeTextFrame()
-{
- delete m_textPicture;
- m_textPicture = nullptr;
-}
-
-void SceneXrender::EffectFrame::freeSelection()
-{
- delete m_selectionPicture;
- m_selectionPicture = nullptr;
-}
-
-void SceneXrender::EffectFrame::crossFadeIcon()
-{
- // TODO: implement me
-}
-
-void SceneXrender::EffectFrame::crossFadeText()
-{
- // TODO: implement me
-}
-
-void SceneXrender::EffectFrame::render(const QRegion ®ion, double opacity, double frameOpacity)
-{
- Q_UNUSED(region)
- if (m_effectFrame->geometry().isEmpty()) {
- return; // Nothing to display
- }
-
- // Render the actual frame
- if (m_effectFrame->style() == EffectFrameUnstyled) {
- renderUnstyled(effects->xrenderBufferPicture(), m_effectFrame->geometry(), opacity * frameOpacity);
- } else if (m_effectFrame->style() == EffectFrameStyled) {
- if (!m_picture) { // Lazy creation
- updatePicture();
- }
- if (m_picture) {
- qreal left, top, right, bottom;
- m_effectFrame->frame().getMargins(left, top, right, bottom); // m_geometry is the inner geometry
- QRect geom = m_effectFrame->geometry().adjusted(-left, -top, right, bottom);
- xcb_render_composite(connection(), XCB_RENDER_PICT_OP_OVER, *m_picture,
- XCB_RENDER_PICTURE_NONE, effects->xrenderBufferPicture(),
- 0, 0, 0, 0, geom.x(), geom.y(), geom.width(), geom.height());
- }
- }
- if (!m_effectFrame->selection().isNull()) {
- if (!m_selectionPicture) { // Lazy creation
- const QPixmap pix = m_effectFrame->selectionFrame().framePixmap();
- if (!pix.isNull()) // don't try if there's no content
- m_selectionPicture = new XRenderPicture(m_effectFrame->selectionFrame().framePixmap().toImage());
- }
- if (m_selectionPicture) {
- const QRect geom = m_effectFrame->selection();
- xcb_render_composite(connection(), XCB_RENDER_PICT_OP_OVER, *m_selectionPicture,
- XCB_RENDER_PICTURE_NONE, effects->xrenderBufferPicture(),
- 0, 0, 0, 0, geom.x(), geom.y(), geom.width(), geom.height());
- }
- }
-
- XRenderPicture fill = xRenderBlendPicture(opacity);
-
- // Render icon
- if (!m_effectFrame->icon().isNull() && !m_effectFrame->iconSize().isEmpty()) {
- QPoint topLeft(m_effectFrame->geometry().x(), m_effectFrame->geometry().center().y() - m_effectFrame->iconSize().height() / 2);
-
- if (!m_iconPicture) // lazy creation
- m_iconPicture = new XRenderPicture(m_effectFrame->icon().pixmap(m_effectFrame->iconSize()).toImage());
- QRect geom = QRect(topLeft, m_effectFrame->iconSize());
- xcb_render_composite(connection(), XCB_RENDER_PICT_OP_OVER, *m_iconPicture, fill,
- effects->xrenderBufferPicture(),
- 0, 0, 0, 0, geom.x(), geom.y(), geom.width(), geom.height());
- }
-
- // Render text
- if (!m_effectFrame->text().isEmpty()) {
- if (!m_textPicture) { // Lazy creation
- updateTextPicture();
- }
-
- if (m_textPicture) {
- xcb_render_composite(connection(), XCB_RENDER_PICT_OP_OVER, *m_textPicture, fill, effects->xrenderBufferPicture(),
- 0, 0, 0, 0, m_effectFrame->geometry().x(), m_effectFrame->geometry().y(),
- m_effectFrame->geometry().width(), m_effectFrame->geometry().height());
- }
- }
-}
-
-void SceneXrender::EffectFrame::renderUnstyled(xcb_render_picture_t pict, const QRect &rect, qreal opacity)
-{
- const int roundness = 5;
- const QRect area = rect.adjusted(-roundness, -roundness, roundness, roundness);
- xcb_rectangle_t rects[3];
- // center
- rects[0].x = area.left();
- rects[0].y = area.top() + roundness;
- rects[0].width = area.width();
- rects[0].height = area.height() - roundness * 2;
- // top
- rects[1].x = area.left() + roundness;
- rects[1].y = area.top();
- rects[1].width = area.width() - roundness * 2;
- rects[1].height = roundness;
- // bottom
- rects[2].x = area.left() + roundness;
- rects[2].y = area.top() + area.height() - roundness;
- rects[2].width = area.width() - roundness * 2;
- rects[2].height = roundness;
- xcb_render_color_t color = {0, 0, 0, uint16_t(opacity * 0xffff)};
- xcb_render_fill_rectangles(connection(), XCB_RENDER_PICT_OP_OVER, pict, color, 3, rects);
-
- if (!s_effectFrameCircle) {
- // create the circle
- const int diameter = roundness * 2;
- xcb_pixmap_t pix = xcb_generate_id(connection());
- xcb_create_pixmap(connection(), 32, pix, rootWindow(), diameter, diameter);
- s_effectFrameCircle = new XRenderPicture(pix, 32);
- xcb_free_pixmap(connection(), pix);
-
- // clear it with transparent
- xcb_rectangle_t xrect = {0, 0, diameter, diameter};
- xcb_render_color_t tranparent = {0, 0, 0, 0};
- xcb_render_fill_rectangles(connection(), XCB_RENDER_PICT_OP_SRC, *s_effectFrameCircle, tranparent, 1, &xrect);
-
- static const int num_segments = 80;
- static const qreal theta = 2 * M_PI / qreal(num_segments);
- static const qreal c = qCos(theta); //precalculate the sine and cosine
- static const qreal s = qSin(theta);
- qreal t;
-
- qreal x = roundness;//we start at angle = 0
- qreal y = 0;
-
- QVector points;
- xcb_render_pointfix_t point;
- point.x = DOUBLE_TO_FIXED(roundness);
- point.y = DOUBLE_TO_FIXED(roundness);
- points << point;
- for (int ii = 0; ii <= num_segments; ++ii) {
- point.x = DOUBLE_TO_FIXED(x + roundness);
- point.y = DOUBLE_TO_FIXED(y + roundness);
- points << point;
- //apply the rotation matrix
- t = x;
- x = c * x - s * y;
- y = s * t + c * y;
- }
- XRenderPicture fill = xRenderFill(Qt::black);
- xcb_render_tri_fan(connection(), XCB_RENDER_PICT_OP_OVER, fill, *s_effectFrameCircle,
- 0, 0, 0, points.count(), points.constData());
- }
- // TODO: merge alpha mask with SceneXrender::Window::alphaMask
- // alpha mask
- xcb_pixmap_t pix = xcb_generate_id(connection());
- xcb_create_pixmap(connection(), 8, pix, rootWindow(), 1, 1);
- XRenderPicture alphaMask(pix, 8);
- xcb_free_pixmap(connection(), pix);
- const uint32_t values[] = {true};
- xcb_render_change_picture(connection(), alphaMask, XCB_RENDER_CP_REPEAT, values);
- color.alpha = int(opacity * 0xffff);
- xcb_rectangle_t xrect = {0, 0, 1, 1};
- xcb_render_fill_rectangles(connection(), XCB_RENDER_PICT_OP_SRC, alphaMask, color, 1, &xrect);
-
- // TODO: replace by lambda
-#define RENDER_CIRCLE(srcX, srcY, destX, destY) \
-xcb_render_composite(connection(), XCB_RENDER_PICT_OP_OVER, *s_effectFrameCircle, alphaMask, \
- pict, srcX, srcY, 0, 0, destX, destY, roundness, roundness)
-
- RENDER_CIRCLE(0, 0, area.left(), area.top());
- RENDER_CIRCLE(0, roundness, area.left(), area.top() + area.height() - roundness);
- RENDER_CIRCLE(roundness, 0, area.left() + area.width() - roundness, area.top());
- RENDER_CIRCLE(roundness, roundness,
- area.left() + area.width() - roundness, area.top() + area.height() - roundness);
-#undef RENDER_CIRCLE
-}
-
-void SceneXrender::EffectFrame::updatePicture()
-{
- delete m_picture;
- m_picture = nullptr;
- if (m_effectFrame->style() == EffectFrameStyled) {
- const QPixmap pix = m_effectFrame->frame().framePixmap();
- if (!pix.isNull())
- m_picture = new XRenderPicture(pix.toImage());
- }
-}
-
-void SceneXrender::EffectFrame::updateTextPicture()
-{
- // Mostly copied from SceneOpenGL::EffectFrame::updateTextTexture() above
- delete m_textPicture;
- m_textPicture = nullptr;
-
- if (m_effectFrame->text().isEmpty()) {
- return;
- }
-
- // Determine position on texture to paint text
- QRect rect(QPoint(0, 0), m_effectFrame->geometry().size());
- if (!m_effectFrame->icon().isNull() && !m_effectFrame->iconSize().isEmpty()) {
- rect.setLeft(m_effectFrame->iconSize().width());
- }
-
- // If static size elide text as required
- QString text = m_effectFrame->text();
- if (m_effectFrame->isStatic()) {
- QFontMetrics metrics(m_effectFrame->text());
- text = metrics.elidedText(text, Qt::ElideRight, rect.width());
- }
-
- QPixmap pixmap(m_effectFrame->geometry().size());
- pixmap.fill(Qt::transparent);
- QPainter p(&pixmap);
- p.setFont(m_effectFrame->font());
- if (m_effectFrame->style() == EffectFrameStyled) {
- p.setPen(m_effectFrame->styledTextColor());
- } else {
- // TODO: What about no frame? Custom color setting required
- p.setPen(Qt::white);
- }
- p.drawText(rect, m_effectFrame->alignment(), text);
- p.end();
- m_textPicture = new XRenderPicture(pixmap.toImage());
-}
-
-SceneXRenderShadow::SceneXRenderShadow(Toplevel *toplevel)
- :Shadow(toplevel)
-{
- for (int i=0; iclient()->layoutDecorationRects(left, top, right, bottom);
-
- xcb_connection_t *c = connection();
- auto checkAndCreate = [this, c](int border, const QRect &rect) {
- const QSize size = rect.size();
- if (m_sizes[border] != size) {
- m_sizes[border] = size;
- if (m_pixmaps[border] != XCB_PIXMAP_NONE) {
- xcb_free_pixmap(c, m_pixmaps[border]);
- }
- delete m_pictures[border];
- if (!size.isEmpty()) {
- m_pixmaps[border] = xcb_generate_id(connection());
- xcb_create_pixmap(connection(), 32, m_pixmaps[border], rootWindow(), size.width(), size.height());
- m_pictures[border] = new XRenderPicture(m_pixmaps[border], 32);
- } else {
- m_pixmaps[border] = XCB_PIXMAP_NONE;
- m_pictures[border] = nullptr;
- }
- }
- if (!m_pictures[border]) {
- return;
- }
- // fill transparent
- xcb_rectangle_t r = {0, 0, uint16_t(size.width()), uint16_t(size.height())};
- xcb_render_fill_rectangles(connection(), XCB_RENDER_PICT_OP_SRC, *m_pictures[border], preMultiply(Qt::transparent), 1, &r);
- };
-
- checkAndCreate(int(DecorationPart::Left), left);
- checkAndCreate(int(DecorationPart::Top), top);
- checkAndCreate(int(DecorationPart::Right), right);
- checkAndCreate(int(DecorationPart::Bottom), bottom);
-}
-
-xcb_render_picture_t SceneXRenderDecorationRenderer::picture(SceneXRenderDecorationRenderer::DecorationPart part) const
-{
- Q_ASSERT(part != DecorationPart::Count);
- XRenderPicture *picture = m_pictures[int(part)];
- if (!picture) {
- return XCB_RENDER_PICTURE_NONE;
- }
- return *picture;
-}
-
-#undef DOUBLE_TO_FIXED
-#undef FIXED_TO_DOUBLE
-
-XRenderFactory::XRenderFactory(QObject *parent)
- : SceneFactory(parent)
-{
-}
-
-XRenderFactory::~XRenderFactory() = default;
-
-Scene *XRenderFactory::create(QObject *parent) const
-{
- auto s = SceneXrender::createScene(parent);
- if (s && s->initFailed()) {
- delete s;
- s = nullptr;
- }
- return s;
-}
-
-} // namespace
-#endif
-
-
-void KWin::SceneXrender::paintCursor(const QRegion ®ion)
-{
- Q_UNUSED(region)
-}
-
-void KWin::SceneXrender::paintEffectQuickView(KWin::EffectQuickView *w)
-{
- const QImage buffer = w->bufferAsImage();
- if (buffer.isNull()) {
- return;
- }
- XRenderPicture picture(buffer);
- xcb_render_composite(connection(), XCB_RENDER_PICT_OP_OVER, picture, XCB_RENDER_PICTURE_NONE,
- effects->xrenderBufferPicture(),
- 0, 0, 0, 0, w->geometry().x(), w->geometry().y(),
- w->geometry().width(), w->geometry().height());
-}
diff --git a/src/plugins/scenes/xrender/scene_xrender.h b/src/plugins/scenes/xrender/scene_xrender.h
deleted file mode 100644
index 896755b116..0000000000
--- a/src/plugins/scenes/xrender/scene_xrender.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- KWin - the KDE window manager
- This file is part of the KDE project.
-
- SPDX-FileCopyrightText: 2006 Lubos Lunak
-
- SPDX-License-Identifier: GPL-2.0-or-later
-*/
-
-#ifndef KWIN_SCENE_XRENDER_H
-#define KWIN_SCENE_XRENDER_H
-
-#include "decorationitem.h"
-#include "scene.h"
-#include "shadow.h"
-
-#ifdef KWIN_HAVE_XRENDER_COMPOSITING
-
-namespace KWin
-{
-
-class XRenderBackend;
-
-class SceneXrender
- : public Scene
-{
- Q_OBJECT
-public:
- class EffectFrame;
- ~SceneXrender() override;
- bool initFailed() const override;
- CompositingType compositingType() const override {
- return XRenderCompositing;
- }
- void paint(int screenId, const QRegion &damage, const QList &windows,
- RenderLoop *renderLoop) override;
- Scene::EffectFrame *createEffectFrame(EffectFrameImpl *frame) override;
- Shadow *createShadow(Toplevel *toplevel) override;
- void screenGeometryChanged(const QSize &size) override;
- xcb_render_picture_t xrenderBufferPicture() const override;
- OverlayWindow *overlayWindow() const override;
- DecorationRenderer *createDecorationRenderer(Decoration::DecoratedClientImpl *client) override;
- PlatformSurfaceTexture *createPlatformSurfaceTextureX11(SurfacePixmapX11 *pixmap) override;
-
- bool animationsSupported() const override {
- return true;
- }
-
- static SceneXrender *createScene(QObject *parent);
-protected:
- Scene::Window *createWindow(Toplevel *toplevel) override;
- void paintBackground(const QRegion ®ion) override;
- void paintGenericScreen(int mask, const ScreenPaintData &data) override;
- void paintDesktop(int desktop, int mask, const QRegion ®ion, ScreenPaintData &data) override;
- void paintCursor(const QRegion ®ion) override;
- void paintEffectQuickView(EffectQuickView *w) override;
-private:
- explicit SceneXrender(XRenderBackend *backend, QObject *parent = nullptr);
- static ScreenPaintData screen_paint;
- class Window;
- QScopedPointer m_backend;
-};
-
-class SceneXrender::Window : public Scene::Window
-{
- Q_OBJECT
-
-public:
- Window(Toplevel* c, SceneXrender *scene);
- ~Window() override;
- void performPaint(int mask, const QRegion ®ion, const WindowPaintData &data) override;
- QRegion transformedShape() const;
- void setTransformedShape(const QRegion& shape);
- static void cleanup();
-private:
- QRect mapToScreen(int mask, const WindowPaintData &data, const QRect &rect) const;
- QPoint mapToScreen(int mask, const WindowPaintData &data, const QPoint &point) const;
- QRect bufferToWindowRect(const QRect &rect) const;
- QRegion bufferToWindowRegion(const QRegion ®ion) const;
- void prepareTempPixmap();
- void setPictureFilter(xcb_render_picture_t pic, ImageFilterType filter);
- SceneXrender *m_scene;
- QRegion transformed_shape;
- static QRect temp_visibleRect;
- static XRenderPicture *s_tempPicture;
- static XRenderPicture *s_fadeAlphaPicture;
-};
-
-class SceneXrender::EffectFrame
- : public Scene::EffectFrame
-{
-public:
- EffectFrame(EffectFrameImpl* frame);
- ~EffectFrame() override;
-
- void free() override;
- void freeIconFrame() override;
- void freeTextFrame() override;
- void freeSelection() override;
- void crossFadeIcon() override;
- void crossFadeText() override;
- void render(const QRegion ®ion, double opacity, double frameOpacity) override;
- static void cleanup();
-
-private:
- void updatePicture();
- void updateTextPicture();
- void renderUnstyled(xcb_render_picture_t pict, const QRect &rect, qreal opacity);
-
- XRenderPicture* m_picture;
- XRenderPicture* m_textPicture;
- XRenderPicture* m_iconPicture;
- XRenderPicture* m_selectionPicture;
- static XRenderPicture* s_effectFrameCircle;
-};
-
-inline
-QRegion SceneXrender::Window::transformedShape() const
-{
- return transformed_shape;
-}
-
-inline
-void SceneXrender::Window::setTransformedShape(const QRegion& shape)
-{
- transformed_shape = shape;
-}
-
-/**
- * @short XRender implementation of Shadow.
- *
- * This class extends Shadow by the elements required for XRender rendering.
- * @author Jacopo De Simoi
- */
-class SceneXRenderShadow
- : public Shadow
-{
-public:
- explicit SceneXRenderShadow(Toplevel *toplevel);
- using Shadow::ShadowElements;
- using Shadow::ShadowElementTop;
- using Shadow::ShadowElementTopRight;
- using Shadow::ShadowElementRight;
- using Shadow::ShadowElementBottomRight;
- using Shadow::ShadowElementBottom;
- using Shadow::ShadowElementBottomLeft;
- using Shadow::ShadowElementLeft;
- using Shadow::ShadowElementTopLeft;
- using Shadow::ShadowElementsCount;
- using Shadow::shadowPixmap;
- ~SceneXRenderShadow() override;
-
- void layoutShadowRects(QRect& top, QRect& topRight,
- QRect& right, QRect& bottomRight,
- QRect& bottom, QRect& bottomLeft,
- QRect& Left, QRect& topLeft);
- xcb_render_picture_t picture(ShadowElements element) const;
-
-protected:
- bool prepareBackend() override;
-private:
- XRenderPicture* m_pictures[ShadowElementsCount];
-};
-
-class SceneXRenderDecorationRenderer : public DecorationRenderer
-{
- Q_OBJECT
-public:
- enum class DecorationPart : int {
- Left,
- Top,
- Right,
- Bottom,
- Count
- };
- explicit SceneXRenderDecorationRenderer(Decoration::DecoratedClientImpl *client);
- ~SceneXRenderDecorationRenderer() override;
-
- void render(const QRegion ®ion) override;
-
- xcb_render_picture_t picture(DecorationPart part) const;
-
-private:
- void resizePixmaps();
- QSize m_sizes[int(DecorationPart::Count)];
- xcb_pixmap_t m_pixmaps[int(DecorationPart::Count)];
- xcb_gcontext_t m_gc;
- XRenderPicture* m_pictures[int(DecorationPart::Count)];
-};
-
-class KWIN_EXPORT XRenderFactory : public SceneFactory
-{
- Q_OBJECT
- Q_INTERFACES(KWin::SceneFactory)
- Q_PLUGIN_METADATA(IID "org.kde.kwin.Scene" FILE "xrender.json")
-
-public:
- explicit XRenderFactory(QObject *parent = nullptr);
- ~XRenderFactory() override;
-
- Scene *create(QObject *parent = nullptr) const override;
-};
-
-} // namespace
-
-#endif
-
-#endif
diff --git a/src/plugins/scenes/xrender/xrender.json b/src/plugins/scenes/xrender/xrender.json
deleted file mode 100644
index 5cccbca56f..0000000000
--- a/src/plugins/scenes/xrender/xrender.json
+++ /dev/null
@@ -1,83 +0,0 @@
-{
- "CompositingType": 2,
- "KPlugin": {
- "Description": "KWin Compositor plugin rendering through XRender",
- "Description[az]": "XRender avsitəsi ilə KWin birləşdirici əlavəsini formalaşdırmaq",
- "Description[ca@valencia]": "Connector del Compositor de KWin que renderitza a través de XRender",
- "Description[ca]": "Connector del Compositor del KWin que renderitza a través del XRender",
- "Description[da]": "KWin-compositorplugin som renderer igennem XRender",
- "Description[de]": "KWin-Compositor-Modul zum Rendern mit XRender",
- "Description[el]": "Αποτύπωση πρσοθέτου συνθέτη KWin μέσω XRender",
- "Description[en_GB]": "KWin Compositor plugin rendering through XRender",
- "Description[es]": "Complemento compositor de KWin renderizando mediante XRender",
- "Description[et]": "KWini komposiitori plugin renderdamiseks XRender'i abil",
- "Description[eu]": "Kwin konposatzailearen plugina XRender bidez errendatzen",
- "Description[fi]": "XRenderillä hahmontava KWin-koostajaliitännäinen",
- "Description[fr]": "Module du compositeur KWin effectuant le rendu avec XRender",
- "Description[gl]": "Complemento de compositor de KWin que renderiza a través de XRender.",
- "Description[hu]": "KWin összeállító bővítmény XRender leképezéssel",
- "Description[id]": "Plugin KWin Compositor perenderan melalui XRender",
- "Description[it]": "Estensione del compositore di KWin per la resa tramite XRender",
- "Description[ko]": "XRender로 렌더링하는 KWin 컴포지터 플러그인",
- "Description[lt]": "KWin kompozitoriaus priedas atvaizdavimui per XRender",
- "Description[nl]": "KWin-compositor-plug-in rendering via XRender",
- "Description[nn]": "KWin-samansetjartillegg som brukar XRender",
- "Description[pl]": "Wtyczka kompozytora KWin wyświetlająca przez XRender",
- "Description[pt]": "'Plugin' de Composição do KWin com desenho via XRender",
- "Description[pt_BR]": "Plugin do compositor KWin renderizando pelo XRender",
- "Description[ru]": "Отрисовка подключаемым модулем компоновщика KWin через XRender",
- "Description[sk]": "Renderovací plugin kompozítora KWin cez XRender",
- "Description[sl]": "Izrisovanje vstavka upravljalnika skladnje KWin preko XRender-ja",
- "Description[sr@ijekavian]": "К‑винов прикључак слагача за рендеровање кроз Икс‑рендер",
- "Description[sr@ijekavianlatin]": "KWinov priključak slagača za renderovanje kroz XRender",
- "Description[sr@latin]": "KWinov priključak slagača za renderovanje kroz XRender",
- "Description[sr]": "К‑винов прикључак слагача за рендеровање кроз Икс‑рендер",
- "Description[sv]": "Kwin sammansättningsinsticksprogram återger via XRender",
- "Description[tr]": "XRender üzerinden KWin Dizgici eklentisi oluşturma",
- "Description[uk]": "Додаток засобу композиції KWin для обробки з використанням XRender",
- "Description[x-test]": "xxKWin Compositor plugin rendering through XRenderxx",
- "Description[zh_CN]": "使用 XRender 渲染的 KWin 显示特效混合器插件",
- "Description[zh_TW]": "透過 XRender 繪製 KWin 合成器附加元件",
- "Id": "KWinSceneXRender",
- "Name": "SceneXRender",
- "Name[az]": "SceneXRender",
- "Name[ca@valencia]": "SceneXRender",
- "Name[ca]": "SceneXRender",
- "Name[cs]": "SceneXRender",
- "Name[da]": "SceneXRender",
- "Name[de]": "SceneXRender",
- "Name[el]": "SceneXRender",
- "Name[en_GB]": "SceneXRender",
- "Name[es]": "SceneXRender",
- "Name[et]": "SceneXRender",
- "Name[eu]": "SceneXRender",
- "Name[fi]": "SceneXRender",
- "Name[fr]": "SceneXRender",
- "Name[gl]": "SceneXRender",
- "Name[hu]": "SceneXRender",
- "Name[id]": "SceneXRender",
- "Name[it]": "SceneXRender",
- "Name[ko]": "SceneXRender",
- "Name[lt]": "SceneXRender",
- "Name[nl]": "SceneXRender",
- "Name[nn]": "SceneXRender",
- "Name[pa]": "ਸੀਨ-ਐਕਸ-ਰੈਂਡਰ",
- "Name[pl]": "XRender sceny",
- "Name[pt]": "SceneXRender",
- "Name[pt_BR]": "SceneXRender",
- "Name[ro]": "SceneXRender",
- "Name[ru]": "SceneXRender",
- "Name[sk]": "SceneXRender",
- "Name[sl]": "SceneXRender",
- "Name[sr@ijekavian]": "Икс‑рендер-сцена",
- "Name[sr@ijekavianlatin]": "XRender-scena",
- "Name[sr@latin]": "XRender-scena",
- "Name[sr]": "Икс‑рендер-сцена",
- "Name[sv]": "Scen XRender",
- "Name[tr]": "SceneXRender",
- "Name[uk]": "SceneXRender",
- "Name[x-test]": "xxSceneXRenderxx",
- "Name[zh_CN]": "SceneXRender",
- "Name[zh_TW]": "SceneXRender"
- }
-}
diff --git a/src/scene.cpp b/src/scene.cpp
index b7305c7ea7..ae6309063c 100644
--- a/src/scene.cpp
+++ b/src/scene.cpp
@@ -8,9 +8,6 @@
*/
/*
- The base class for compositing, implementing shared functionality
- between the OpenGL and XRender backends.
-
Design:
When compositing is turned on, XComposite extension is used to redirect
@@ -715,11 +712,6 @@ QMatrix4x4 Scene::screenProjectionMatrix() const
return QMatrix4x4();
}
-xcb_render_picture_t Scene::xrenderBufferPicture() const
-{
- return XCB_RENDER_PICTURE_NONE;
-}
-
QPainter *Scene::scenePainter() const
{
return nullptr;
diff --git a/src/scene.h b/src/scene.h
index bc714424b2..aa82b27444 100644
--- a/src/scene.h
+++ b/src/scene.h
@@ -165,12 +165,6 @@ public:
*/
virtual bool animationsSupported() const = 0;
- /**
- * The render buffer used by an XRender based compositor scene.
- * Default implementation returns XCB_RENDER_PICTURE_NONE
- */
- virtual xcb_render_picture_t xrenderBufferPicture() const;
-
/**
* The QPainter used by a QPainter based compositor scene.
* Default implementation returns @c nullptr;
diff --git a/src/workspace.cpp b/src/workspace.cpp
index d1a5adc9f2..0760de36e5 100644
--- a/src/workspace.cpp
+++ b/src/workspace.cpp
@@ -1725,15 +1725,12 @@ QString Workspace::supportInformation() const
support.append(QStringLiteral("OpenGL 2 Shaders are used\n"));
break;
}
- case XRenderCompositing:
- support.append(QStringLiteral("Compositing Type: XRender\n"));
- break;
case QPainterCompositing:
support.append("Compositing Type: QPainter\n");
break;
case NoCompositing:
default:
- support.append(QStringLiteral("Something is really broken, neither OpenGL nor XRender is used"));
+ support.append(QStringLiteral("Something is really broken, neither OpenGL nor QPainter is used"));
}
support.append(QStringLiteral("\nLoaded Effects:\n"));
support.append(QStringLiteral( "---------------\n"));