From df0b1836b5b7c14095258a510ec27758a921eb0a Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 8 Oct 2019 11:55:56 +0200 Subject: [PATCH] rhi: Autotest rendering with uniform buffer Change-Id: I4251f31494680c78e90a08a2b471cb1af08ecd81 Reviewed-by: Paul Olav Tvete --- tests/auto/gui/rhi/qrhi/data/compile.bat | 2 + tests/auto/gui/rhi/qrhi/data/simple.frag.qsb | Bin 899 -> 908 bytes tests/auto/gui/rhi/qrhi/data/simple.vert.qsb | Bin 961 -> 958 bytes .../gui/rhi/qrhi/data/simpletextured.frag.qsb | Bin 1487 -> 1479 bytes tests/auto/gui/rhi/qrhi/data/textured.frag | 19 ++ .../auto/gui/rhi/qrhi/data/textured.frag.qsb | Bin 0 -> 1997 bytes tests/auto/gui/rhi/qrhi/data/textured.vert | 19 ++ .../auto/gui/rhi/qrhi/data/textured.vert.qsb | Bin 0 -> 1708 bytes tests/auto/gui/rhi/qrhi/tst_qrhi.cpp | 206 ++++++++++++++++++ 9 files changed, 246 insertions(+) create mode 100644 tests/auto/gui/rhi/qrhi/data/textured.frag create mode 100644 tests/auto/gui/rhi/qrhi/data/textured.frag.qsb create mode 100644 tests/auto/gui/rhi/qrhi/data/textured.vert create mode 100644 tests/auto/gui/rhi/qrhi/data/textured.vert.qsb diff --git a/tests/auto/gui/rhi/qrhi/data/compile.bat b/tests/auto/gui/rhi/qrhi/data/compile.bat index 3dafa33eab7..5b8a77b8337 100644 --- a/tests/auto/gui/rhi/qrhi/data/compile.bat +++ b/tests/auto/gui/rhi/qrhi/data/compile.bat @@ -44,3 +44,5 @@ qsb --glsl "150,120,100 es" --hlsl 50 -c --msl 12 -o simple.vert.qsb simple.vert qsb --glsl "150,120,100 es" --hlsl 50 -c --msl 12 -o simple.frag.qsb simple.frag qsb --glsl "150,120,100 es" --hlsl 50 -c --msl 12 -o simpletextured.vert.qsb simpletextured.vert qsb --glsl "150,120,100 es" --hlsl 50 -c --msl 12 -o simpletextured.frag.qsb simpletextured.frag +qsb --glsl "150,120,100 es" --hlsl 50 -c --msl 12 -o textured.vert.qsb textured.vert +qsb --glsl "150,120,100 es" --hlsl 50 -c --msl 12 -o textured.frag.qsb textured.frag diff --git a/tests/auto/gui/rhi/qrhi/data/simple.frag.qsb b/tests/auto/gui/rhi/qrhi/data/simple.frag.qsb index 0b46de14537252a4b852d82052b416831cfa344e..264b71ec0f52a346e22efda1ea21e0116560c7b5 100644 GIT binary patch literal 908 zcmV;719SWU00>=poZVGTYurW{e%HJHlJnuV&=vw^8t1U4X00{0DYauau^p$xO@h}H zgJV=#JG(1aD{Z7%lO_~Qpgr^$OwYZRTuM&;0Xg*8Q^*hSEjjfR0wsCg(X6$xorFM6 z9r0-9edqm}XGS9;$`MfkczknfJ7M7;pcnWX*vk_QQV@A=Q1Nd|vZ3n(&e7}JT?Dz? z1HgB0h^U{UwraIig1G>|6g7Yw#B)T~fqSqW(0P;}g;}gKeOz4VHYL|li{1J{6htwd z8Dzcsu_d|Rk=`WH2~*cB@N+JeSJE(jCR{a(ocliCGt$q???>j7M*9J(V-AMk!u|3} zWu=s;YH4zcmrkcBpLzqQVN)>VHCI=+1Aq0cjr6ukjXa& zFZMfOY=#VYJdJvLOdc}vo~?9Om*7x5kK^Tc2$bmrc`d= zfa1X4nzJ%};y0_~{3~Yo z<sA-%?>lYXPxVLd- z{lTN9r~dxdlV5)sXG$OD(w`FUdHNmr6W9le(625oUFy2ob(_^U?28w?A3R=NESI_e z)LfiJN`DreTj^Whi=!l}DN$S<6_;`Ci;Ct!EJV$gA7D_nOJ(||vV3*G_;7y>@|fB7 z0Ta8^@}@rxRK9c8+_)|k-M?SCytK}>TsL#u1C+ymEdQ?<*7nl~)fxAE&F|g$Eb8w3 i9MV=poZVDQYZOZqK9k8~(#gHPKm|cc<6?qg>f#S@cU`#>LG(M_HR&-%MQ~*`Uss(| z=ha`GE+WbhQ77=``tnM|!fT)lcm=FyiF(Nk9NR0owqD#O-*yiFq$_@N9*1m2o&bRB5>!^fwbu#dRkoNVmUfpa+ zo>!$aLe#J88UyZS5_vWW!zCjF4X2SaFQ*pHOg?$I_|L-g|EAx$ZkqFE@?`O?h4Iqk#qMaV;x99T}rZjG#-w*jTg*1R27rJ|=# zOXsE+#x%#gx00g_D9gSV+hhA<2-RA5oZ|P|L>hH%VjSs8^QY(6^|@`Zw~2$z^3TSv z+W%m5)@`@dF>Obaxti@5=;2H~VCyff-GQ&*+`dc%}d)r{c zKL(?f18qm!VZ%D^-7FsF?2m zz@GDT>pBG9IZDo(^`lzu)w;uw+17}ouT8Y%KAmp}UhLPeZTd8LeGK(>=scw3eSn7l zg>gu|+V2zCIi8$gi~CMW+ndM70oQlDW?71{x>UAjfnv{H9yd~bHAA1>kl0`%yW-HgiypPL zA5pjgew3XSf1@yn|4)NBf}=BxMmE<8%p}I*H28v z2^4d^>4p+ce%Y;TP9Yn1Xe${9kf9YUuSiElTV>eV^4kOkbH~?jdKTb*HE_!@zZ+z? z6UydW)0xoMYO0L>p<8#wt&}~}G#a6F+*qo))mkGtrqOTIuCKN%sOni~QPY&I>_v0w Z7puC_cBVVis)qlNGyPp`eF3+bn-)~E*H!=k diff --git a/tests/auto/gui/rhi/qrhi/data/simple.vert.qsb b/tests/auto/gui/rhi/qrhi/data/simple.vert.qsb index 8e44f2a1e307890e3cca3a81c00f57f0e611d302..59080b60c696a01fa13278ef898e8f138ac8f8d6 100644 GIT binary patch literal 958 zcmV;v13~-%00}a9oZVGVZxcrpe~#@qOrSBLrLB0CcR4t%F0NZ$=2Y4qn#kX-%H6}0Y%<^;e=v_FqLh5QQ^@njg_gpTRe<&Od? zKy?_KchMgD?O}m?SrhMPBPO>T7?GvS?5OmcUhE1!)e*|^8j*56xjDm9c_cgTW%^g% znqe%Cq~GTBEm7BL3a-5-8H-dHHx=(V(yugvSg{9;BelH1Q4_rFHCF9s^SgHw1U5D% z*-yuPrGM15oBBCQg>o}iqEs16e0M~s#BQ3`>`F;2F3B-cPFvtww^ic`H(K}cJ!Xz|76#%%3+ zBieFYgtFl|emkb}CdMm>=sh+nc9rn8*LzI)H(1R5ScU?fd{?%Prx0Bybd=BmMA!&6 zw?$J$Z_Ds@%YP?eh$mfCo?^mw0_kc%O9{G15ll@DTsg9}Xt|L7?!HUWs#F*|?Dj`Z zxZBg7FVlqM|C9E7e9&-)z<3X62lMOK=l*>3)$97DSI?$?zjv_z@cdtd>_Ns%OB`bG z8;w!q0hFyG*X9>)xW}dxO*qK^^P1X1``Uc9O6wQM9JyqtTr#e1$z~WtK}+#cZHzB1 z*Oz%+!@=i*PFH%ksaDEWxLIGkebIJ%z{W}_YuBM6fVGA7xs{dLJnZl9ue`%2)9Zs= zzjFu~)Rz|4zXh8787ShqJph>on!hL(wS5~ge8G!{ajxRmCg&R?W}QJ*eQkE_378ip zq27Js{~`3D_Wwc2Js|37VdiDFZ?r&}3W(USm7d1RDfb{gHnc8cm&*90lqasxe1uOd znxq@j@1}W@k{nFi5awBp!5{ig<&N0oF*fyxuCEC1==o3bek%v7OZt?@Sj@`v_($>6 zHyB_EWr^RQT^G@ZWPN&{(>^0scLt>-|5{gRY|i42o>z|iIocN>eQrl=tb*3(@HIDg zie!`a%&hD)JP+D9gwX|iPJRRAf6D3#*8h~nEMxUW8;kT;@!R@r9bn}zQ9{4dX9B(g&l zsYKSsJ9Z{r@4CCQQJ~@y!4VFq;>?9pz5pM9V~@S?3Ap6cQ-uWWdo#1yO=&@udSasI z*?I5%-h10N)u1vJZnu8vDgFq*q@J1={ zk#cJ@*C;)_0eOQ)8P~g~`T+)x)VpTd2hc08dHOX+JQhy*6ft%g=f2n35aDeRDsf6+39yQ~1UF{qCSuCAS53@Lm`m37CTdClfv(c{T);0PiKD!O z{v}IVLE}uUlC~GHC!lepo3(3Zb#LQ(%*G*(KD6tzHaFqVSzF2C&solL)?Tr($bKF7 zHe%}ltABzTI-B#h&T)%hL~TX)(9}aY7Z7pY`uv3%ZkVH9u)Qc`N}~!EC#B!@Vps6F zfl!Xu!Pa|nXMv^qNDkbO=%=>3z*rnfzt8D>M?Xb0_KL_Vz6M=6S62PeX?(&QU6qJFybg`c#75*QY7XYrd*UEG`KcDW@-R zwY@!MgQxx^^ZY)>B0a8Z*<$B0KrJc3xP(H*p--Mz0VCdvI+|_hPZ@S6Cb7JT;xw++ zkl_V%TOT5cV+MS z6k_OvjuJY62s^>fp6IIRMHyb~`OgFl`J~H>r<}0;K)RaHYQpYm22)ou+lnWsn(di9|A_fu*MeYchy4VvGzw`mp3%a>eN zpUG|*L_tsSYHNzG;ycCLnhw4c42IIfk4C-LfKS`a&#%~Smu;+M2O*3$ZV zYZ;D?j@Dm-$z?Gp?c3=q)m~lM`UL2|ft-W!^gaG66ZSZHd)`g jWab4lwKo?xAAot4l9ByR@UJpn)&F0HJ_pYL6v)IIupRhm diff --git a/tests/auto/gui/rhi/qrhi/data/simpletextured.frag.qsb b/tests/auto/gui/rhi/qrhi/data/simpletextured.frag.qsb index 876290cbc72b5897191aceef71c5dc9e9b3d6f86..f302702aa99bf01f67e0422b4f96a57ef29abe6c 100644 GIT binary patch literal 1479 zcmV;&1vvTu01nM~oZVMTZyQwZ`SO9_riueI6sz~_*-60|V1mX`Mb%QE|x`oChGIm0c>D&YJ4rMMx=3}Z(Hfa#kwGQ822Q66 z=scb^YETulO%7~73qsJRm@WmeN|@iqiF#?xv`VH`q4pT=VE~q1Gl=5k8XIhzWZE&@ zsNFucb2l3X$8_{sqiWc>8F~r2*D=py&SQQK+=q@4^^j>bJl81+o|~9U#2ARK3Z5iY z>qXr)>(<_QV&pZ4lkIi8sc95*)LL^~*4s`oCXQ9jn|BP#60aZFJZ)^jZwtV-fMYw$ zxaywEfT61j=5@>)g87{n#N0<^Tdz#lt96@(`#P|Xx3OOo?9BhfdjakG4d6pZPxvYs zUB8Z)R{G~;Dql)xpN7l zq1(D^_yG*NP+z-c6kTVp7527#asjQXZ(`>u`7R+V*-_JFc ztj49>!AY5r!}xd16ofbUV1s;dW_Ip=6EK?>pDZ{9MCcHOC$U6ooKRafWp^D6HbR87}w4U^7O*O;tcyNyns(XX8zs6l5SUU$=cn`U!7gv zq2Q8n8uM0?y548=n*+Z6@({Mx2C)1+rwm~S8Vcf|BzP(6bG2<#bqc>7fNo0R?VJPOpB=sRl_^23OS z{}X&W_7C4-mQ4u1Uu3*qzr>4){Xi?vf&GBwmt}+C4^jJldPDd@3f?RBKP*^#B>qvM zL;XpidnNu!iN~^Y$azfmP9l2*NkVKn7k%P837+?KK=v~!dwE&#z6Y;fKj(oB%crF7 zEV~5#VIN}ob{^>ZA^jzx0MxW7S6)*ly}p-7BZTQT~4{)EVm h%YGA)JcT$MAL5+0ml8OKels<}vQZmkpuic^S4 zBX_f2J6r5scP}Ps0ig&U0Ko%__yIgrk@5%nhJ^SNh(CbT7gQnC7gWxfIqO~AD-S%t zB;%QLoo~)LyE6*_JphmbNMvuV-}H!p1VA4Szaf#z0u12X00)||4i?y8LKUter9&O( zWgMH(f(FiA@KE-0N8rd1W1B!Zjx@6=AP-t z_4bjTztu9yr>8et4bv^nz}e9p$U!i3+07^=T{43=O_el5VJ^)WQWia3r+T>ZrREnKw$4j zy%g^=iGQ^BduWtKZd^Z&GO8zo=Lc}4ilI6A3fja^OP^5`5EptO-4J(3pN`RFe=;H;PNA4UBP2QDRfDU6cZ5A|b+T4Q-nR~>}(5c>NJkPNIQ|ym; z=P~99-a9bwA#&2JOR?x<+exHpPX~EFlf0Lg8Si^&m60)5I>eviyc6#d%8y8l%I5(4 zAgqJTpX7WTXPreva7@Nn@s7u0Pq@E9pCmuQI)gDEuXcR&N%|!7PVj!yu{eb|PsZ#| zvpvZK(|_X17gXj`T-)R-OgSO@b=b0vMo=}yMAP*3MgoSM-$j;4M+FKMCU0HtE&c$x#Gy$+PL;{ zx20vr4ND?uqebAEZVq2Zc4R~jo2DIGP|b3o8-f3;tDdjdO{CV=@&cb=KXA=bbwc`{ zA_l53TLQ`pe&Lg>j5ET^EU7TU=%Q7rPl`K;DYjh$S?HmlOmm^LJc23&?U9)7Sy3rn zKy9P2xpiBd!SO>SB^SzD4mAp!c~UHFso{2>6xk0VC`9o^SBmYLxGkHc7%`0=_q0UK z_4r+^2<{HIP1nO$y%;@L#LU;KW=+g5R4y%Du6P?dourk9Zr1|}=2)qSiT^+w#<-cb zw0e%JxQJkG1(s`~5uVGn?j_8Y?&`iN9hh##S-)u-zW1aRo~-%!0$M}g!ky>%9)M9P zj)=gvYL43!okN{+gtdf~Lgy{k+PFsPqysFfSX5{`R#m1v7v^88aF%8D;FuSk)S~#A zi6!&rrL`-iDuv-=Oc|^~^j3cuWw2P(TCQnWlG?E98!c5wW#`AMr20!_0{6q(_*q2tLiVKn3Vn}RsFOI{tsn|&aYCGrNr*c z%H`>!-{*IKSUNj+>zDgGKi@BEl*-+NI`ruB`#bg=GOyD`68TFrvvc<#<^|M66Vi_! zQ5}2@q%%4?!G|mzhDHAVM^j;d3I%badBye zY!+X@hAueecPq=fTgQ)@y}k04*_B;Tm-;iEi$Z diff --git a/tests/auto/gui/rhi/qrhi/data/textured.frag b/tests/auto/gui/rhi/qrhi/data/textured.frag new file mode 100644 index 00000000000..605410b0283 --- /dev/null +++ b/tests/auto/gui/rhi/qrhi/data/textured.frag @@ -0,0 +1,19 @@ +#version 440 + +layout(location = 0) in vec2 uv; +layout(location = 0) out vec4 fragColor; + +layout(std140, binding = 0) uniform buf { + mat4 matrix; + float opacity; +} ubuf; + +layout(binding = 1) uniform sampler2D tex; + +void main() +{ + vec4 c = texture(tex, uv); + c.a *= ubuf.opacity; + c.rgb *= c.a; + fragColor = c; +} diff --git a/tests/auto/gui/rhi/qrhi/data/textured.frag.qsb b/tests/auto/gui/rhi/qrhi/data/textured.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..0a039137ec436807ee374cfb2736fb786b7c93a6 GIT binary patch literal 1997 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 C6;~tx literal 0 HcmV?d00001 diff --git a/tests/auto/gui/rhi/qrhi/tst_qrhi.cpp b/tests/auto/gui/rhi/qrhi/tst_qrhi.cpp index ddead9aa447..73043dde8a9 100644 --- a/tests/auto/gui/rhi/qrhi/tst_qrhi.cpp +++ b/tests/auto/gui/rhi/qrhi/tst_qrhi.cpp @@ -87,6 +87,8 @@ private slots: void renderToTextureSimple(); void renderToTextureTexturedQuad_data(); void renderToTextureTexturedQuad(); + void renderToTextureTexturedQuadAndUniformBuffer_data(); + void renderToTextureTexturedQuadAndUniformBuffer(); private: struct { @@ -1360,5 +1362,209 @@ void tst_QRhi::renderToTextureTexturedQuad() QVERIFY(qGreen(result.pixel(214, 191)) > 2 * qBlue(result.pixel(214, 191))); } +void tst_QRhi::renderToTextureTexturedQuadAndUniformBuffer_data() +{ + rhiTestData(); +} + +void tst_QRhi::renderToTextureTexturedQuadAndUniformBuffer() +{ + QFETCH(QRhi::Implementation, impl); + QFETCH(QRhiInitParams *, initParams); + + QScopedPointer rhi(QRhi::create(impl, initParams, QRhi::Flags(), nullptr)); + if (!rhi) + QSKIP("QRhi could not be created, skipping testing rendering"); + + QImage inputImage; + inputImage.load(QLatin1String(":/data/qt256.png")); + QVERIFY(!inputImage.isNull()); + + QScopedPointer texture(rhi->newTexture(QRhiTexture::RGBA8, inputImage.size(), 1, + QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource)); + QVERIFY(texture->build()); + + QScopedPointer rt(rhi->newTextureRenderTarget({ texture.data() })); + QScopedPointer rpDesc(rt->newCompatibleRenderPassDescriptor()); + rt->setRenderPassDescriptor(rpDesc.data()); + QVERIFY(rt->build()); + + QRhiCommandBuffer *cb = nullptr; + QVERIFY(rhi->beginOffscreenFrame(&cb) == QRhi::FrameOpSuccess); + QVERIFY(cb); + + QRhiResourceUpdateBatch *updates = rhi->nextResourceUpdateBatch(); + + static const float verticesUvs[] = { + -1.0f, -1.0f, 0.0f, 0.0f, + 1.0f, -1.0f, 1.0f, 0.0f, + -1.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 1.0f, 1.0f + }; + QScopedPointer vbuf(rhi->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::VertexBuffer, sizeof(verticesUvs))); + QVERIFY(vbuf->build()); + updates->uploadStaticBuffer(vbuf.data(), verticesUvs); + + // There will be two renderpasses. One renders with no transformation and + // an opacity of 0.5, the second has a rotation. Bake the uniform data for + // both into a single buffer. + + const int UNIFORM_BLOCK_SIZE = 64 + 4; // matrix + opacity + const int secondUbufOffset = rhi->ubufAligned(UNIFORM_BLOCK_SIZE); + const int UBUF_SIZE = secondUbufOffset + UNIFORM_BLOCK_SIZE; + + QScopedPointer ubuf(rhi->newBuffer(QRhiBuffer::Dynamic, QRhiBuffer::UniformBuffer, UBUF_SIZE)); + QVERIFY(ubuf->build()); + + QMatrix4x4 matrix; + updates->updateDynamicBuffer(ubuf.data(), 0, 64, matrix.constData()); + float opacity = 0.5f; + updates->updateDynamicBuffer(ubuf.data(), 64, 4, &opacity); + + // rotation by 45 degrees around the Z axis + matrix.rotate(45, 0, 0, 1); + updates->updateDynamicBuffer(ubuf.data(), secondUbufOffset, 64, matrix.constData()); + updates->updateDynamicBuffer(ubuf.data(), secondUbufOffset + 64, 4, &opacity); + + QScopedPointer inputTexture(rhi->newTexture(QRhiTexture::RGBA8, inputImage.size())); + QVERIFY(inputTexture->build()); + updates->uploadTexture(inputTexture.data(), inputImage); + + QScopedPointer sampler(rhi->newSampler(QRhiSampler::Nearest, QRhiSampler::Nearest, QRhiSampler::None, + QRhiSampler::ClampToEdge, QRhiSampler::ClampToEdge)); + QVERIFY(sampler->build()); + + const QRhiShaderResourceBinding::StageFlags commonVisibility = QRhiShaderResourceBinding::VertexStage | QRhiShaderResourceBinding::FragmentStage; + QScopedPointer srb0(rhi->newShaderResourceBindings()); + srb0->setBindings({ + QRhiShaderResourceBinding::uniformBuffer(0, commonVisibility, ubuf.data(), 0, UNIFORM_BLOCK_SIZE), + QRhiShaderResourceBinding::sampledTexture(1, QRhiShaderResourceBinding::FragmentStage, inputTexture.data(), sampler.data()) + }); + QVERIFY(srb0->build()); + + QScopedPointer srb1(rhi->newShaderResourceBindings()); + srb1->setBindings({ + QRhiShaderResourceBinding::uniformBuffer(0, commonVisibility, ubuf.data(), secondUbufOffset, UNIFORM_BLOCK_SIZE), + QRhiShaderResourceBinding::sampledTexture(1, QRhiShaderResourceBinding::FragmentStage, inputTexture.data(), sampler.data()) + }); + QVERIFY(srb1->build()); + QVERIFY(srb1->isLayoutCompatible(srb0.data())); // hence no need for a second pipeline + + QScopedPointer pipeline(rhi->newGraphicsPipeline()); + pipeline->setTopology(QRhiGraphicsPipeline::TriangleStrip); + QShader vs = loadShader(":/data/textured.vert.qsb"); + QVERIFY(vs.isValid()); + QShaderDescription shaderDesc = vs.description(); + QVERIFY(!shaderDesc.uniformBlocks().isEmpty()); + QCOMPARE(shaderDesc.uniformBlocks().first().size, UNIFORM_BLOCK_SIZE); + + QShader fs = loadShader(":/data/textured.frag.qsb"); + QVERIFY(fs.isValid()); + shaderDesc = fs.description(); + QVERIFY(!shaderDesc.uniformBlocks().isEmpty()); + QCOMPARE(shaderDesc.uniformBlocks().first().size, UNIFORM_BLOCK_SIZE); + + pipeline->setShaderStages({ { QRhiShaderStage::Vertex, vs }, { QRhiShaderStage::Fragment, fs } }); + QRhiVertexInputLayout inputLayout; + inputLayout.setBindings({ { 4 * sizeof(float) } }); + inputLayout.setAttributes({ + { 0, 0, QRhiVertexInputAttribute::Float2, 0 }, + { 0, 1, QRhiVertexInputAttribute::Float2, 2 * sizeof(float) } + }); + pipeline->setVertexInputLayout(inputLayout); + pipeline->setShaderResourceBindings(srb0.data()); + pipeline->setRenderPassDescriptor(rpDesc.data()); + + QVERIFY(pipeline->build()); + + cb->beginPass(rt.data(), Qt::black, { 1.0f, 0 }, updates); + cb->setGraphicsPipeline(pipeline.data()); + cb->setShaderResources(); + cb->setViewport({ 0, 0, float(texture->pixelSize().width()), float(texture->pixelSize().height()) }); + QRhiCommandBuffer::VertexInput vbindings(vbuf.data(), 0); + cb->setVertexInput(0, 1, &vbindings); + cb->draw(4); + + QRhiReadbackResult readResult0; + QImage result0; + readResult0.completed = [&readResult0, &result0] { + result0 = QImage(reinterpret_cast(readResult0.data.constData()), + readResult0.pixelSize.width(), readResult0.pixelSize.height(), + QImage::Format_RGBA8888_Premultiplied); + }; + QRhiResourceUpdateBatch *readbackBatch = rhi->nextResourceUpdateBatch(); + readbackBatch->readBackTexture({ texture.data() }, &readResult0); + cb->endPass(readbackBatch); + + // second pass (rotated) + cb->beginPass(rt.data(), Qt::black, { 1.0f, 0 }); + cb->setGraphicsPipeline(pipeline.data()); + cb->setShaderResources(srb1.data()); // sources data from a different offset in ubuf + cb->setViewport({ 0, 0, float(texture->pixelSize().width()), float(texture->pixelSize().height()) }); + cb->setVertexInput(0, 1, &vbindings); + cb->draw(4); + + QRhiReadbackResult readResult1; + QImage result1; + readResult1.completed = [&readResult1, &result1] { + result1 = QImage(reinterpret_cast(readResult1.data.constData()), + readResult1.pixelSize.width(), readResult1.pixelSize.height(), + QImage::Format_RGBA8888_Premultiplied); + }; + readbackBatch = rhi->nextResourceUpdateBatch(); + readbackBatch->readBackTexture({ texture.data() }, &readResult1); + cb->endPass(readbackBatch); + + rhi->endOffscreenFrame(); + + QVERIFY(!result0.isNull()); + QVERIFY(!result1.isNull()); + + if (rhi->isYUpInFramebuffer() != rhi->isYUpInNDC()) { + result0 = std::move(result0).mirrored(); + result1 = std::move(result1).mirrored(); + } + + if (impl == QRhi::Null) + return; + + // opacity 0.5 (premultiplied) + static const auto checkSemiWhite = [](const QRgb &c) { + QRgb semiWhite127 = qPremultiply(qRgba(255, 255, 255, 127)); + QRgb semiWhite128 = qPremultiply(qRgba(255, 255, 255, 128)); + return c == semiWhite127 || c == semiWhite128; + }; + QVERIFY(checkSemiWhite(result0.pixel(79, 77))); + QVERIFY(checkSemiWhite(result0.pixel(124, 81))); + QVERIFY(checkSemiWhite(result0.pixel(128, 149))); + QVERIFY(checkSemiWhite(result0.pixel(120, 189))); + QVERIFY(checkSemiWhite(result0.pixel(116, 185))); + QVERIFY(checkSemiWhite(result0.pixel(191, 172))); + + QRgb empty = qRgba(0, 0, 0, 0); + QCOMPARE(result0.pixel(11, 45), empty); + QCOMPARE(result0.pixel(246, 202), empty); + QCOMPARE(result0.pixel(130, 18), empty); + QCOMPARE(result0.pixel(4, 227), empty); + + // also rotated 45 degrees around Z + QRgb black = qRgba(0, 0, 0, 255); + QCOMPARE(result1.pixel(20, 23), black); + QCOMPARE(result1.pixel(47, 5), black); + QCOMPARE(result1.pixel(238, 22), black); + QCOMPARE(result1.pixel(250, 203), black); + QCOMPARE(result1.pixel(224, 237), black); + QCOMPARE(result1.pixel(12, 221), black); + + QVERIFY(checkSemiWhite(result1.pixel(142, 67))); + QVERIFY(checkSemiWhite(result1.pixel(81, 79))); + QVERIFY(checkSemiWhite(result1.pixel(79, 168))); + QVERIFY(checkSemiWhite(result1.pixel(146, 204))); + QVERIFY(checkSemiWhite(result1.pixel(186, 156))); + + QCOMPARE(result1.pixel(204, 45), empty); + QCOMPARE(result1.pixel(28, 178), empty); +} + #include QTEST_MAIN(tst_QRhi)