From 9bbcc746c63a4572b44083fb8e1d4bedbe682ee0 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Tue, 9 Jan 2024 11:20:43 +0200 Subject: [PATCH] scene: Fix clipping in software cursor --- src/scene/cursordelegate_opengl.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/scene/cursordelegate_opengl.cpp b/src/scene/cursordelegate_opengl.cpp index 2ce0926636..46b1b737df 100644 --- a/src/scene/cursordelegate_opengl.cpp +++ b/src/scene/cursordelegate_opengl.cpp @@ -32,7 +32,8 @@ CursorDelegateOpenGL::~CursorDelegateOpenGL() void CursorDelegateOpenGL::paint(const RenderTarget &renderTarget, const QRegion ®ion) { - if (!region.intersects(layer()->mapToGlobal(layer()->rect()).toAlignedRect())) { + const QRegion dirty = region.intersected(layer()->mapToGlobal(layer()->rect()).toAlignedRect()); + if (dirty.isEmpty()) { return; } @@ -64,6 +65,13 @@ void CursorDelegateOpenGL::paint(const RenderTarget &renderTarget, const QRegion GLFramebuffer *fbo = renderTarget.framebuffer(); GLFramebuffer::pushFramebuffer(fbo); + const bool clipping = region != infiniteRegion(); + const QRegion clipRegion = clipping ? RenderViewport(m_output->fractionalGeometry(), m_output->scale(), renderTarget).mapToRenderTarget(dirty) : infiniteRegion(); + + if (clipping) { + glEnable(GL_SCISSOR_TEST); + } + // Don't need to call GLVertexBuffer::beginFrame() and GLVertexBuffer::endOfFrame() because // the GLVertexBuffer::streamingBuffer() is not being used when painting cursor. glEnable(GL_BLEND); @@ -71,9 +79,13 @@ void CursorDelegateOpenGL::paint(const RenderTarget &renderTarget, const QRegion ShaderBinder binder(ShaderTrait::MapTexture); binder.shader()->setUniform(GLShader::ModelViewProjectionMatrix, mvp); - m_texture->render(region, cursorRect.size()); + m_texture->render(clipRegion, cursorRect.size(), clipping); glDisable(GL_BLEND); + if (clipping) { + glDisable(GL_SCISSOR_TEST); + } + GLFramebuffer::popFramebuffer(); }