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
This commit is contained in:
parent
a6df113690
commit
1854224c17
1 changed files with 6 additions and 6 deletions
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue