Index: effects/blur/blur.cpp =================================================================== --- effects/blur/blur.cpp +++ effects/blur/blur.cpp @@ -464,6 +464,10 @@ if (w->isFullScreen() && GLRenderTarget::blitSupported() && m_simpleShader->isValid() && !GLPlatform::instance()->supports(LimitedNPOT) && shape.boundingRect() == w->geometry()) { doSimpleBlur(w, data.opacity(), data.screenProjectionMatrix()); + } else if (GLRenderTarget::virtualScreenScale() > 1.0) { + if (GLRenderTarget::blitSupported()) { + doBlur(shape, screen, data.opacity(), data.screenProjectionMatrix()); + } } else if (m_shouldCache && !translated && !w->isDeleted()) { doCachedBlur(w, region, data.opacity(), data.screenProjectionMatrix()); } else { @@ -529,9 +533,15 @@ scratch.setWrapMode(GL_CLAMP_TO_EDGE); scratch.bind(); - const QRect sg = GLRenderTarget::virtualScreenGeometry(); - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, r.x() - sg.x(), sg.height() - sg.y() - r.y() - r.height(), - r.width(), r.height()); + //if the framebuffer is scaled, blit to downsample everything into standard resolution + if (GLRenderTarget::virtualScreenScale() > 1.0) { + target->attachTexture(scratch); + target->blitFromFramebuffer(r, QRect(0, 0, r.width(), r.height())); + } else { + const QRect sg = GLRenderTarget::virtualScreenGeometry(); + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, (r.x() - sg.x()), (sg.height() - sg.y() - r.y() - r.height()), + scratch.width(), scratch.height()); + } // Draw the texture on the offscreen framebuffer object, while blurring it horizontally target->attachTexture(tex);