From 0f1afdbdc0c494a89e06549486cf35630d35b3ef Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Wed, 3 Feb 2021 22:34:14 +0200 Subject: [PATCH] scene: Pass dirty region to SceneOpenGLTexture::updateTexture --- .../scenes/opengl/abstract_egl_backend.cpp | 8 ++++---- src/platformsupport/scenes/opengl/abstract_egl_backend.h | 4 ++-- src/platformsupport/scenes/opengl/texture.cpp | 7 ++++--- src/platformsupport/scenes/opengl/texture.h | 4 ++-- src/plugins/platforms/drm/egl_stream_backend.cpp | 4 ++-- src/plugins/platforms/drm/egl_stream_backend.h | 2 +- src/plugins/scenes/opengl/scene_opengl.cpp | 2 +- 7 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/platformsupport/scenes/opengl/abstract_egl_backend.cpp b/src/platformsupport/scenes/opengl/abstract_egl_backend.cpp index be690bb121..c8d773f71f 100644 --- a/src/platformsupport/scenes/opengl/abstract_egl_backend.cpp +++ b/src/platformsupport/scenes/opengl/abstract_egl_backend.cpp @@ -435,7 +435,7 @@ bool AbstractEglTexture::loadTexture(WindowPixmap *pixmap) return loadEglTexture(buffer); } -void AbstractEglTexture::updateTexture(WindowPixmap *pixmap) +void AbstractEglTexture::updateTexture(WindowPixmap *pixmap, const QRegion ®ion) { // FIXME: Refactor this method. @@ -444,7 +444,7 @@ void AbstractEglTexture::updateTexture(WindowPixmap *pixmap) if (updateFromFBO(pixmap->fbo())) { return; } - if (updateFromInternalImageObject(pixmap)) { + if (updateFromInternalImageObject(pixmap, region)) { return; } return; @@ -681,7 +681,7 @@ static QRegion scale(const QRegion ®ion, qreal scaleFactor) return scaled; } -bool AbstractEglTexture::updateFromInternalImageObject(WindowPixmap *pixmap) +bool AbstractEglTexture::updateFromInternalImageObject(WindowPixmap *pixmap, const QRegion ®ion) { const QImage image = pixmap->internalImage(); if (image.isNull()) { @@ -693,7 +693,7 @@ bool AbstractEglTexture::updateFromInternalImageObject(WindowPixmap *pixmap) return loadInternalImageObject(pixmap); } - createTextureSubImage(image, scale(pixmap->toplevel()->damage(), image.devicePixelRatio())); + createTextureSubImage(image, scale(region, image.devicePixelRatio())); return true; } diff --git a/src/platformsupport/scenes/opengl/abstract_egl_backend.h b/src/platformsupport/scenes/opengl/abstract_egl_backend.h index 10e2af0249..b47d02fbd4 100644 --- a/src/platformsupport/scenes/opengl/abstract_egl_backend.h +++ b/src/platformsupport/scenes/opengl/abstract_egl_backend.h @@ -96,7 +96,7 @@ class KWIN_EXPORT AbstractEglTexture : public SceneOpenGLTexturePrivate public: ~AbstractEglTexture() override; bool loadTexture(WindowPixmap *pixmap) override; - void updateTexture(WindowPixmap *pixmap) override; + void updateTexture(WindowPixmap *pixmap, const QRegion ®ion) override; OpenGLBackend *backend() override; protected: @@ -120,7 +120,7 @@ private: bool loadInternalImageObject(WindowPixmap *pixmap); EGLImageKHR attach(const QPointer &buffer); bool updateFromFBO(const QSharedPointer &fbo); - bool updateFromInternalImageObject(WindowPixmap *pixmap); + bool updateFromInternalImageObject(WindowPixmap *pixmap, const QRegion ®ion); SceneOpenGLTexture *q; AbstractEglBackend *m_backend; EGLImageKHR m_image; diff --git a/src/platformsupport/scenes/opengl/texture.cpp b/src/platformsupport/scenes/opengl/texture.cpp index 1808be0f6d..b52a928ca6 100644 --- a/src/platformsupport/scenes/opengl/texture.cpp +++ b/src/platformsupport/scenes/opengl/texture.cpp @@ -47,10 +47,10 @@ bool SceneOpenGLTexture::load(WindowPixmap *pixmap) return d->loadTexture(pixmap); } -void SceneOpenGLTexture::updateFromPixmap(WindowPixmap *pixmap) +void SceneOpenGLTexture::updateFromPixmap(WindowPixmap *pixmap, const QRegion ®ion) { Q_D(SceneOpenGLTexture); - d->updateTexture(pixmap); + d->updateTexture(pixmap, region); } SceneOpenGLTexturePrivate::SceneOpenGLTexturePrivate() @@ -61,9 +61,10 @@ SceneOpenGLTexturePrivate::~SceneOpenGLTexturePrivate() { } -void SceneOpenGLTexturePrivate::updateTexture(WindowPixmap *pixmap) +void SceneOpenGLTexturePrivate::updateTexture(WindowPixmap *pixmap, const QRegion ®ion) { Q_UNUSED(pixmap) + Q_UNUSED(region) } } diff --git a/src/platformsupport/scenes/opengl/texture.h b/src/platformsupport/scenes/opengl/texture.h index ae40cb08da..68ab0ee892 100644 --- a/src/platformsupport/scenes/opengl/texture.h +++ b/src/platformsupport/scenes/opengl/texture.h @@ -33,7 +33,7 @@ private: SceneOpenGLTexture(SceneOpenGLTexturePrivate& dd); bool load(WindowPixmap *pixmap); - void updateFromPixmap(WindowPixmap *pixmap); + void updateFromPixmap(WindowPixmap *pixmap, const QRegion ®ion); Q_DECLARE_PRIVATE(SceneOpenGLTexture) @@ -46,7 +46,7 @@ public: ~SceneOpenGLTexturePrivate() override; virtual bool loadTexture(WindowPixmap *pixmap) = 0; - virtual void updateTexture(WindowPixmap *pixmap); + virtual void updateTexture(WindowPixmap *pixmap, const QRegion ®ion); virtual OpenGLBackend *backend() = 0; protected: diff --git a/src/plugins/platforms/drm/egl_stream_backend.cpp b/src/plugins/platforms/drm/egl_stream_backend.cpp index 8d664b0b59..316affb26d 100644 --- a/src/plugins/platforms/drm/egl_stream_backend.cpp +++ b/src/plugins/platforms/drm/egl_stream_backend.cpp @@ -614,7 +614,7 @@ bool EglStreamTexture::loadTexture(WindowPixmap *pixmap) } } -void EglStreamTexture::updateTexture(WindowPixmap *pixmap) +void EglStreamTexture::updateTexture(WindowPixmap *pixmap, const QRegion ®ion) { using namespace KWaylandServer; SurfaceInterface *surface = pixmap->surface(); @@ -634,7 +634,7 @@ void EglStreamTexture::updateTexture(WindowPixmap *pixmap) } } else { // Not an EGLStream surface - AbstractEglTexture::updateTexture(pixmap); + AbstractEglTexture::updateTexture(pixmap, region); } } diff --git a/src/plugins/platforms/drm/egl_stream_backend.h b/src/plugins/platforms/drm/egl_stream_backend.h index 76177c2cde..6ceb1baf4e 100644 --- a/src/plugins/platforms/drm/egl_stream_backend.h +++ b/src/plugins/platforms/drm/egl_stream_backend.h @@ -82,7 +82,7 @@ class EglStreamTexture : public AbstractEglTexture public: ~EglStreamTexture() override; bool loadTexture(WindowPixmap *pixmap) override; - void updateTexture(WindowPixmap *pixmap) override; + void updateTexture(WindowPixmap *pixmap, const QRegion ®ion) override; private: EglStreamTexture(SceneOpenGLTexture *texture, EglStreamBackend *backend); diff --git a/src/plugins/scenes/opengl/scene_opengl.cpp b/src/plugins/scenes/opengl/scene_opengl.cpp index 1a13c8b18e..39e7161b87 100644 --- a/src/plugins/scenes/opengl/scene_opengl.cpp +++ b/src/plugins/scenes/opengl/scene_opengl.cpp @@ -1629,7 +1629,7 @@ bool OpenGLWindowPixmap::bind() { if (!m_texture->isNull()) { if (needsPixmapUpdate(this)) { - m_texture->updateFromPixmap(this); + m_texture->updateFromPixmap(this, toplevel->damage()); // mipmaps need to be updated m_texture->setDirty(); }