From 2a23652bbbba8def270b78d76c91a5a96d391106 Mon Sep 17 00:00:00 2001 From: Mikolaj Boc Date: Tue, 16 Aug 2022 16:45:07 +0200 Subject: [PATCH] Avoid image format conversion when drawing window nonclient area MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This radically speeds up window resizing and dragging. Fixes: QTBUG-105709 Pick-to: 6.4 Change-Id: I844601a5b139d21024db0c373482af18f350d0eb Reviewed-by: Lorn Potter Reviewed-by: Tor Arne Vestbø --- src/plugins/platforms/wasm/qwasmcompositor.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforms/wasm/qwasmcompositor.cpp b/src/plugins/platforms/wasm/qwasmcompositor.cpp index 53daa62bedd..30c61d26686 100644 --- a/src/plugins/platforms/wasm/qwasmcompositor.cpp +++ b/src/plugins/platforms/wasm/qwasmcompositor.cpp @@ -488,7 +488,7 @@ void QWasmCompositor::drawWindowDecorations(QOpenGLTextureBlitter *blitter, QWas int height = window->windowFrameGeometry().height(); qreal dpr = window->devicePixelRatio(); - QImage image(QSize(width * dpr, height * dpr), QImage::Format_RGB32); + QImage image(QSize(width * dpr, height * dpr), QImage::Format_ARGB32_Premultiplied); image.setDevicePixelRatio(dpr); QPainter painter(&image); painter.fillRect(QRect(0, 0, width, height), painter.background()); @@ -509,12 +509,19 @@ void QWasmCompositor::drawWindowDecorations(QOpenGLTextureBlitter *blitter, QWas texture.setMinificationFilter(QOpenGLTexture::Nearest); texture.setMagnificationFilter(QOpenGLTexture::Nearest); texture.setWrapMode(QOpenGLTexture::ClampToEdge); - texture.setData(image, QOpenGLTexture::DontGenerateMipMaps); + texture.setFormat(QOpenGLTexture::RGBAFormat); + texture.setSize(image.width(), image.height()); + texture.setMipLevels(1); + texture.allocateStorage(QOpenGLTexture::RGBA, QOpenGLTexture::UInt8); + + QOpenGLPixelTransferOptions uploadOptions; + uploadOptions.setAlignment(1); + texture.create(); texture.bind(); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, image.width(), image.height(), GL_RGBA, GL_UNSIGNED_BYTE, - image.constScanLine(0)); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, image.width(), image.height(), GL_RGBA, + GL_UNSIGNED_BYTE, image.constScanLine(0)); QRect windowCanvasGeometry = window->windowFrameGeometry().translated(-screen->geometry().topLeft()); blit(blitter, screen, &texture, windowCanvasGeometry);