From d2fcccd3f1c5e3729c280a6f0a3e12dc9835477b Mon Sep 17 00:00:00 2001 From: Marcus Comstedt Date: Sun, 24 Jul 2022 23:15:42 +0200 Subject: Fix composition of render-to-texture widgets on big endian Converting from QImage::Format_ARGB32 to QRhiTexture::RGBA8 requires texture swizzling also on big endian. But unlike on little endian it is not a red/blue swap that is needed, but a rather rotation of the alpha channel from the first component to the last. Add a new swizzling mode to the backingstorecompose fragment shader, and rename the uniform to reflect that it no longer covers only red/blue swapping. Pick-to: 6.4 Change-Id: I001d275abdc88faaadea16e396ebe032b34e83f0 Reviewed-by: Laszlo Agocs --- src/gui/painting/qbackingstoredefaultcompositor.cpp | 18 ++++++++++-------- src/gui/painting/qbackingstoredefaultcompositor_p.h | 8 +++++++- src/gui/painting/shaders/backingstorecompose.frag | 8 +++++--- src/gui/painting/shaders/backingstorecompose.frag.qsb | Bin 1759 -> 1657 bytes src/gui/painting/shaders/backingstorecompose.vert | 2 +- src/gui/painting/shaders/backingstorecompose.vert.qsb | Bin 1627 -> 1408 bytes 6 files changed, 23 insertions(+), 13 deletions(-) (limited to 'src/gui/painting') diff --git a/src/gui/painting/qbackingstoredefaultcompositor.cpp b/src/gui/painting/qbackingstoredefaultcompositor.cpp index bb5fe58aa8..913afed846 100644 --- a/src/gui/painting/qbackingstoredefaultcompositor.cpp +++ b/src/gui/painting/qbackingstoredefaultcompositor.cpp @@ -71,9 +71,7 @@ QRhiTexture *QBackingStoreDefaultCompositor::toTexture(const QImage &sourceImage Q_FALLTHROUGH(); case QImage::Format_RGB32: case QImage::Format_ARGB32: -#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN *flags |= QPlatformBackingStore::TextureSwizzle; -#endif break; case QImage::Format_RGBA8888_Premultiplied: *flags |= QPlatformBackingStore::TexturePremultiplied; @@ -378,14 +376,14 @@ void QBackingStoreDefaultCompositor::updatePerQuadData(PerQuadData *d, QRhiTextu } void QBackingStoreDefaultCompositor::updateUniforms(PerQuadData *d, QRhiResourceUpdateBatch *resourceUpdates, - const QMatrix4x4 &target, const QMatrix3x3 &source, bool needsRedBlueSwap) + const QMatrix4x4 &target, const QMatrix3x3 &source, UpdateUniformOption option) { resourceUpdates->updateDynamicBuffer(d->ubuf, 0, 64, target.constData()); updateMatrix3x3(resourceUpdates, d->ubuf, source); float opacity = 1.0f; resourceUpdates->updateDynamicBuffer(d->ubuf, 112, 4, &opacity); - qint32 swapRedBlue = needsRedBlueSwap ? 1 : 0; - resourceUpdates->updateDynamicBuffer(d->ubuf, 116, 4, &swapRedBlue); + qint32 textureSwizzle = static_cast(option); + resourceUpdates->updateDynamicBuffer(d->ubuf, 116, 4, &textureSwizzle); } void QBackingStoreDefaultCompositor::ensureResources(QRhiSwapChain *swapchain, QRhiResourceUpdateBatch *resourceUpdates) @@ -491,7 +489,11 @@ QPlatformBackingStore::FlushResult QBackingStoreDefaultCompositor::flush(QPlatfo ensureResources(swapchain, resourceUpdates); - const bool needsRedBlueSwap = (flags & QPlatformBackingStore::TextureSwizzle) != 0; +#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN + const UpdateUniformOption uniformOption = (flags & QPlatformBackingStore::TextureSwizzle) != 0? NeedsRedBlueSwap : NoOption; +#else + const UpdateUniformOption uniformOption = (flags & QPlatformBackingStore::TextureSwizzle) != 0? NeedsAlphaRotate : NoOption; +#endif const bool premultiplied = (flags & QPlatformBackingStore::TexturePremultiplied) != 0; SourceTransformOrigin origin = SourceTransformOrigin::TopLeft; if (flags & QPlatformBackingStore::TextureFlip) @@ -512,7 +514,7 @@ QPlatformBackingStore::FlushResult QBackingStoreDefaultCompositor::flush(QPlatfo QMatrix4x4 target; // identity if (invertTargetY) target.data()[5] = -1.0f; - updateUniforms(&m_widgetQuadData, resourceUpdates, target, source, needsRedBlueSwap); + updateUniforms(&m_widgetQuadData, resourceUpdates, target, source, uniformOption); } const int textureWidgetCount = textures->count(); @@ -538,7 +540,7 @@ QPlatformBackingStore::FlushResult QBackingStoreDefaultCompositor::flush(QPlatfo m_textureQuadData[i] = createPerQuadData(t); else updatePerQuadData(&m_textureQuadData[i], t); - updateUniforms(&m_textureQuadData[i], resourceUpdates, target, source, false); + updateUniforms(&m_textureQuadData[i], resourceUpdates, target, source, NoOption); } else { m_textureQuadData[i].reset(); } diff --git a/src/gui/painting/qbackingstoredefaultcompositor_p.h b/src/gui/painting/qbackingstoredefaultcompositor_p.h index d3b91674a6..75080f6994 100644 --- a/src/gui/painting/qbackingstoredefaultcompositor_p.h +++ b/src/gui/painting/qbackingstoredefaultcompositor_p.h @@ -44,6 +44,12 @@ public: bool translucentBackground); private: + enum UpdateUniformOption { + NoOption = 0x00, + NeedsRedBlueSwap = 0x01, + NeedsAlphaRotate = 0x02, + }; + void ensureResources(QRhiSwapChain *swapchain, QRhiResourceUpdateBatch *resourceUpdates); QRhiTexture *toTexture(const QImage &image, QRhi *rhi, @@ -80,7 +86,7 @@ private: PerQuadData createPerQuadData(QRhiTexture *texture); void updatePerQuadData(PerQuadData *d, QRhiTexture *texture); void updateUniforms(PerQuadData *d, QRhiResourceUpdateBatch *resourceUpdates, - const QMatrix4x4 &target, const QMatrix3x3 &source, bool needsRedBlueSwap); + const QMatrix4x4 &target, const QMatrix3x3 &source, UpdateUniformOption option); }; QT_END_NAMESPACE diff --git a/src/gui/painting/shaders/backingstorecompose.frag b/src/gui/painting/shaders/backingstorecompose.frag index e0c419840e..3b08ade035 100644 --- a/src/gui/painting/shaders/backingstorecompose.frag +++ b/src/gui/painting/shaders/backingstorecompose.frag @@ -7,7 +7,7 @@ layout(std140, binding = 0) uniform buf { mat4 vertexTransform; mat3 textureTransform; float opacity; - int swapRedBlue; + int textureSwizzle; }; layout(binding = 1) uniform sampler2D textureSampler; @@ -16,8 +16,10 @@ void main() { vec4 tmpFragColor = texture(textureSampler, v_texcoord); tmpFragColor.a *= opacity; - if (swapRedBlue == 0) + if (textureSwizzle == 0) fragColor = tmpFragColor; + else if(textureSwizzle == 2) + fragColor.argb = tmpFragColor; else - fragColor = tmpFragColor.bgra; + fragColor.bgra = tmpFragColor; } diff --git a/src/gui/painting/shaders/backingstorecompose.frag.qsb b/src/gui/painting/shaders/backingstorecompose.frag.qsb index a7c2dfebce..63ba55eed8 100644 Binary files a/src/gui/painting/shaders/backingstorecompose.frag.qsb and b/src/gui/painting/shaders/backingstorecompose.frag.qsb differ diff --git a/src/gui/painting/shaders/backingstorecompose.vert b/src/gui/painting/shaders/backingstorecompose.vert index bb8444ade5..0c72c97419 100644 --- a/src/gui/painting/shaders/backingstorecompose.vert +++ b/src/gui/painting/shaders/backingstorecompose.vert @@ -9,7 +9,7 @@ layout(std140, binding = 0) uniform buf { mat4 vertexTransform; mat3 textureTransform; float opacity; - int swapRedBlue; + int textureSwizzle; }; void main() diff --git a/src/gui/painting/shaders/backingstorecompose.vert.qsb b/src/gui/painting/shaders/backingstorecompose.vert.qsb index 1f464516fe..1aa6e661f8 100644 Binary files a/src/gui/painting/shaders/backingstorecompose.vert.qsb and b/src/gui/painting/shaders/backingstorecompose.vert.qsb differ -- cgit v1.2.3