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
master
Vlad Zahorodnii 2 years ago
parent a6df113690
commit 1854224c17

@ -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 &region, 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();

Loading…
Cancel
Save