From 1854224c17db6df7b340d12f971ffddddbbe59c5 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Fri, 24 Feb 2023 23:56:20 +0200 Subject: [PATCH] effects/zoom: Fix crash on X11 On X11, the painted screen is meaningless, so the zoom effect doesn't use it to store offscreen data. It can create problems when iterating over offscreen data map. The painted screen can't be used to determine the necessary offscreen texture size too. X11 requires some special care. This change adds explicit wayland checks. BUG: 466376 --- src/effects/zoom/zoom.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/effects/zoom/zoom.cpp b/src/effects/zoom/zoom.cpp index 8cd276de7a..9783344677 100644 --- a/src/effects/zoom/zoom.cpp +++ b/src/effects/zoom/zoom.cpp @@ -255,11 +255,13 @@ void ZoomEffect::prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseco ZoomEffect::OffscreenData *ZoomEffect::ensureOffscreenData(EffectScreen *screen) { - const QRect rect = screen->geometry(); - const qreal devicePixelRatio = screen->devicePixelRatio(); + const QRect rect = effects->waylandDisplay() ? screen->geometry() : effects->virtualScreenGeometry(); + const qreal devicePixelRatio = effects->waylandDisplay() ? screen->devicePixelRatio() : 1; const QSize nativeSize = rect.size() * devicePixelRatio; OffscreenData &data = m_offscreenData[effects->waylandDisplay() ? screen : nullptr]; + data.viewport = rect; + if (!data.texture || data.texture->size() != nativeSize) { data.texture.reset(new GLTexture(GL_RGBA8, nativeSize)); data.texture->setFilter(GL_LINEAR); @@ -348,17 +350,15 @@ void ZoomEffect::paintScreen(int mask, const QRegion ®ion, ScreenPaintData &d auto shader = ShaderManager::instance()->pushShader(ShaderTrait::MapTexture); for (auto &[screen, offscreen] : m_offscreenData) { - const QRect geometry = screen->geometry(); - QMatrix4x4 matrix; matrix.translate(xTranslation * scale, yTranslation * scale); matrix.scale(zoom, zoom); - matrix.translate(geometry.x() * scale, geometry.y() * scale); + matrix.translate(offscreen.viewport.x() * scale, offscreen.viewport.y() * scale); shader->setUniform(GLShader::ModelViewProjectionMatrix, data.projectionMatrix() * matrix); offscreen.texture->bind(); - offscreen.texture->render(geometry.size(), scale); + offscreen.texture->render(offscreen.viewport.size(), scale); offscreen.texture->unbind(); } ShaderManager::instance()->popShader();