From kde-commits Wed Aug 09 05:07:54 2017 From: =?utf-8?q?Martin_Fl=C3=B6ser?= Date: Wed, 09 Aug 2017 05:07:54 +0000 To: kde-commits Subject: [kwin] /: Add virtual Scene::xrenderBufferPicture method Message-Id: X-MARC-Message: https://marc.info/?l=kde-commits&m=150225528523873 Git commit c1892e6c0fd4ccf2309aed8e2c194b7b8ba70aa3 by Martin Fl=C3=B6ser. Committed on 09/08/2017 at 05:07. Pushed by graesslin into branch 'master'. Add virtual Scene::xrenderBufferPicture method Summary: So far EffectsHandlerImpl directly accessed SceneXrender::bufferPicture through a dynamic cast. If in future the XRender based compositor should be moved into a plugin we cannot access it through a dynamic cast. To solve this problem the bufferPicture method is moved into Scene as a virtual method returning a sane default value. Reviewers: #kwin, #plasma Subscribers: plasma-devel, kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D7207 M +1 -6 effects.cpp M +5 -0 scene.cpp M +6 -0 scene.h M +3 -3 scene_xrender.cpp M +2 -2 scene_xrender.h https://commits.kde.org/kwin/c1892e6c0fd4ccf2309aed8e2c194b7b8ba70aa3 diff --git a/effects.cpp b/effects.cpp index 8155de6b3..4454c61e4 100644 --- a/effects.cpp +++ b/effects.cpp @@ -32,7 +32,6 @@ along with this program. If not, see . #include "group.h" #include "osd.h" #include "pointer_input.h" -#include "scene_xrender.h" #include "scene_qpainter.h" #include "unmanaged.h" #ifdef KWIN_BUILD_TABBOX @@ -1324,11 +1323,7 @@ void EffectsHandlerImpl::unregisterTouchBorder(Elect= ricBorder border, QAction *a = unsigned long EffectsHandlerImpl::xrenderBufferPicture() { -#ifdef KWIN_HAVE_XRENDER_COMPOSITING - if (SceneXrender* s =3D dynamic_cast< SceneXrender* >(m_scene)) - return s->bufferPicture(); -#endif - return None; + return m_scene->xrenderBufferPicture(); } = QPainter *EffectsHandlerImpl::scenePainter() diff --git a/scene.cpp b/scene.cpp index c4b372757..4b95cf603 100644 --- a/scene.cpp +++ b/scene.cpp @@ -652,6 +652,11 @@ QMatrix4x4 Scene::screenProjectionMatrix() const return QMatrix4x4(); } = +xcb_render_picture_t Scene::xrenderBufferPicture() const +{ + return XCB_RENDER_PICTURE_NONE; +} + //**************************************** // Scene::Window //**************************************** diff --git a/scene.h b/scene.h index 29a5dceb4..c1fc0d6eb 100644 --- a/scene.h +++ b/scene.h @@ -157,6 +157,12 @@ public: **/ virtual bool animationsSupported() const =3D 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; + Q_SIGNALS: void frameRendered(); = diff --git a/scene_xrender.cpp b/scene_xrender.cpp index 98295f054..263c75f14 100644 --- a/scene_xrender.cpp +++ b/scene_xrender.cpp @@ -280,7 +280,7 @@ void SceneXrender::paintBackground(QRegion region) { xcb_render_color_t col =3D { 0, 0, 0, 0xffff }; // black const QVector &rects =3D Xcb::regionToRects(region); - xcb_render_fill_rectangles(connection(), XCB_RENDER_PICT_OP_SRC, buffe= rPicture(), col, rects.count(), rects.data()); + xcb_render_fill_rectangles(connection(), XCB_RENDER_PICT_OP_SRC, xrend= erBufferPicture(), col, rects.count(), rects.data()); } = Scene::Window *SceneXrender::createWindow(Toplevel *toplevel) @@ -515,7 +515,7 @@ void SceneXrender::Window::performPaint(int mask, QRegi= on region, WindowPaintDat const bool blitInTempPixmap =3D xRenderOffscreen() || (data.crossFadeP= rogress() < 1.0 && !opaque) || (scaled && (wantShadow || (client && !cli= ent->noBorder()) || (deleted && !deleted->noBorder()))); = - xcb_render_picture_t renderTarget =3D m_scene->bufferPicture(); + xcb_render_picture_t renderTarget =3D m_scene->xrenderBufferPicture(); if (blitInTempPixmap) { if (scene_xRenderOffscreenTarget()) { temp_visibleRect =3D toplevel->visibleRect().translated(-tople= vel->pos()); @@ -729,7 +729,7 @@ xcb_render_composite(connection(), XCB_RENDER_PICT_OP_O= VER, m_xrenderShadow->pic 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->bufferP= icture(), + XCB_RENDER_PICTURE_NONE, m_scene->xrender= BufferPicture(), 0, 0, 0, 0, r.x(), r.y(), r.width(), r.he= ight()); xcb_render_set_picture_transform(connection(), *s_tempPicture,= identity); } diff --git a/scene_xrender.h b/scene_xrender.h index a9eee6bf1..d4dacd361 100644 --- a/scene_xrender.h +++ b/scene_xrender.h @@ -160,7 +160,7 @@ public: virtual Scene::EffectFrame *createEffectFrame(EffectFrameImpl *frame); virtual Shadow *createShadow(Toplevel *toplevel); virtual void screenGeometryChanged(const QSize &size); - xcb_render_picture_t bufferPicture(); + xcb_render_picture_t xrenderBufferPicture() const override; virtual OverlayWindow *overlayWindow() { return m_backend->overlayWindow(); } @@ -253,7 +253,7 @@ private: }; = inline -xcb_render_picture_t SceneXrender::bufferPicture() +xcb_render_picture_t SceneXrender::xrenderBufferPicture() const { return m_backend->buffer(); }