From 5d6bc9140ed53eb59e28410e0900f8e07f46d4bd Mon Sep 17 00:00:00 2001 From: Marcus Comstedt Date: Sun, 24 Jul 2022 23:15:42 +0200 Subject: [PATCH] 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. Change-Id: I001d275abdc88faaadea16e396ebe032b34e83f0 Reviewed-by: Laszlo Agocs (cherry picked from commit d2fcccd3f1c5e3729c280a6f0a3e12dc9835477b) Reviewed-by: Qt Cherry-pick Bot --- .../qbackingstoredefaultcompositor.cpp | 18 ++++++++++-------- .../qbackingstoredefaultcompositor_p.h | 8 +++++++- .../painting/shaders/backingstorecompose.frag | 8 +++++--- .../shaders/backingstorecompose.frag.qsb | Bin 1759 -> 1657 bytes .../painting/shaders/backingstorecompose.vert | 2 +- .../shaders/backingstorecompose.vert.qsb | Bin 1627 -> 1408 bytes 6 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/gui/painting/qbackingstoredefaultcompositor.cpp b/src/gui/painting/qbackingstoredefaultcompositor.cpp index bb5fe58aa81..913afed846f 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 d3b91674a63..75080f69946 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 e0c419840e4..3b08ade0352 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 a7c2dfebceffa150b9148b55641b4174bc5112cb..63ba55eed8d5a664fe0f91e42ded127150130c37 100644 GIT binary patch literal 1657 zcmV-<28Q_n02+sQob6d{Zxcrl-q=YD2FhC?K!6^kP#c0d94Db9PN|Z)eaW0zjdU4p^KZ>&FuEO!T4=Fa$?FyrmHwBe0%E z@D7-D0b(%+NOmalZZtdfx~llAv26hE!e1LCq+>9)4_MC4Fp&wtb~z2^wm>-@IfzKP z#_8FJRbxM9Gt)Vw$wMAKB<)#Pa3nqf5PW|6wDzVP8UhZ4gx*Ra(p&;cTC3> zc#+LBV2An~a=_auc-|x*k$i)AP)6K!8vhLBOHq_u9vjHh1DjZvV`9}J+=zl3A>3m{ z7vqF3Lv~$BmnB`uA_oS_eghL!rhW^==&Dg;W*~2K)!DiFXpUB`tQI7b2dXd%;itOQKH=Z3idd5 z5AHJM=^pXmydRKn^sAHn3)qy%wk*Xln-WKb^idphq?@8R7Nj`l_}bwb3GR6*j)xRS zB!58by#`v8ACV62#;Crc{Sn3fh+&W~*y=D7>qTF zYMZ@g{$*Z+t7C>04d_C&`YbiOwrdB{@a*|rL zs_8{;AOgXw)i#iA)eOzLzJZZQ^nz`Vf7J2d{XbRfZ>#)mmA^`re=Ak_ z_i>fa{coz=afb`s>xH7Cn{n0ry`ulOOTHKViL*yD32sJCH0uv=TDwJH&%Qv2#hCgw-?e{3~_F zBgMm^`i98N8|)lu0US~97%n97r7={Z8dP=5HXM8(e51sLT9wC3@@|MGL)9h}DQ*Sc zDN<65U z!NI#B`t?w|uGgbeim;D5a?-2@pJ+>?+_pG4$wk59UDaOhEgrt*3Bp2(w;7mh={28} zJf-ws?`cW(_C`A2VS+e{?kBYlPjn1y8DqRy=qRNer?@=y4+#3lgwkUUv}Jz*LP;JU D-#0pO literal 1759 zcmV<51|azW02PFIob6Z5ZyQAve_rRS+pn}unl$}jn$Y63sp~jtDY%K!=A%U_1jT6y zl*nxCwX?|Hwbtu=Pz6;;Js}|>Ax<1B4n2@7e*xuyP!C9)DskXYapBejUlM}%cHYL5 ztz)%CAdpyVyz}1te!qG1X2vrHfMx(_!VZ62+?Tj8% znC(GDFww(~T&&d-Xk&7sp1>}Im64JK3q@8r@^Ub`@UtJ4ml0lu8SE_w7cm)CtdS6) zz!o$$D~CcMr%|qif<-?M05Q&Hq>&ImE&R^aT+JO(t*@2nI*$Add-vcJli+rw(EHMr z^p$wU%f*M!BxD+*8v*WyR(}*!N`_@izRX`c;>h1h8d%$j?_TaBu#d71*~B}-?U&K+ z4x;q!<_)`V15@+0f}E#-7YXqq%o_{&YCP%F7*|$&QTBO$oY4&&#oQAbQxA_RuoKFd z_9092+oQfF)%RnKCPrZCLVPPvRFm&(^4DW4mjkd3=SjAQCp@qZq8@Dmo%uW1Prek} zJK0D5?PfiV@$C@ItHhJNhke~>cW^9C%2-&tHQ8q{_*`F=r9Gh=Bkw=s7FZJLu^JRc)G7kfG1uOW+Y`xrz1QB>T< zz6;n+IXKLDI>;I=AlKVr#?ZKXxnH4R`q+O9F=Ri>z9S0nn8KsJk1>wgDPJ+}`#9@T z&idK^8Dc1B1MH(*{)`%N&dqO#r?yjAlANbgtV81-(_n8z6}{n*9=(4@hdK8B4a@@?Oe=~gVq7K3LJx?b_zYSt4A)x3T~ z7x;5Vx0DK6h6K93s%wUt@k3o5OB${a)O2(>*vAv5U*683Q%Gs(2s5IXF!qfmm^Sl@nvyhghGyQ9%Np`$f*oe zjEsmxzuzij@bjbgugFT3HUHZzR?Nqw#ot+7Sq`{sx~@!jlvg7^P4_0|E{@+%!ka&Q zTIl_7?x$?=&W~Tynz+{_j~7}--{Bf-N9F{U1o~$tCZ}#|a_xM@qUTAj8INjou4sfA z93)>iZ?70{t>EYS6Xu1V2$#=!X$SYU;8I0x^mB5z4p-%8HqT#%7Z7ZA1Fke!zsr4m zkL9MKb(8ni7~8km4q^%3Uq&QmfN>ADz_n?$yA+M>kX9czrqwP_1ex6ehf6CH+KS+B zwc(XvSYKb){OifqSFn#FQX{-+rO43A5J-(^-If-WV^KS@*I6AWPK5nL2*n1y#EC*$MLJ3@Q^R-Q;eT_ zmoM+EeGa>OkNGb$R=+9Zprhk?G-tT|+O3-ZPMh?#X!4E!PMUie*TXuan3nYHh1ril z?#p17)FTL>@m;-MTVxCWQ#|UimaEBXTJ2a%B=oXtW-Z@ZvFUaLI62ExYjOY4~I(UvlCfJ^Kp93`tEGo^d@f|6~VXLvDjpkXD8A*E{k}ZFMC7 z8<(E{=lXHynvTC6wYiS=^jUVcSk0N@e982TVg~>B7p;X+z2>i2rQB)yiZ71hY*Z-G zwox)GIA&A$ta`r-!O>fPr37c{UtBHRD-AA@!E5fOzLgu{_3K%B#}fVX^L3b(trFEG zgv@HibYn#)YuCsmTrzE?V_Ay@au_W#E1pp>(VCwh5Lw4Y)AloToYoAsV>NHepawS9 zVD7vh#As-hBRsf^OFVCf5G;+~gymKr+rP1IgJ7wQh#PAuHCy%f1nb77V60AW131|D z-?>jP+W1rcCul_7v`gsQHF0P*aZ4J`_D@I^_OXYG BeLw&J diff --git a/src/gui/painting/shaders/backingstorecompose.vert b/src/gui/painting/shaders/backingstorecompose.vert index bb8444ade57..0c72c974196 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 1f464516fe982a6ecefd6de7337f7bae3f9c7bf9..1aa6e661f8e9383739882675a516918150f1bb96 100644 GIT binary patch literal 1408 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 ZK^+k7e=*?`l75%9{q}9;{{^21P4L*YB}xDQ