From b2de7f8583a9a2e73f0de507534158354a86ce7d Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Mon, 7 Oct 2019 17:12:59 +0200 Subject: [PATCH] rhi: Autotest rendering a textured quad Task-number: QTBUG-78971 Change-Id: I0e7e0f3c00f9509031f7b4a8a389e51c915f01c2 Reviewed-by: Paul Olav Tvete --- src/gui/rhi/qrhinull.cpp | 2 + tests/auto/gui/rhi/qrhi/data/compile.bat | 2 + tests/auto/gui/rhi/qrhi/data/qt256.png | Bin 0 -> 6208 bytes tests/auto/gui/rhi/qrhi/data/simple.frag.qsb | Bin 908 -> 899 bytes tests/auto/gui/rhi/qrhi/data/simple.vert.qsb | Bin 967 -> 961 bytes .../gui/rhi/qrhi/data/simpletextured.frag | 13 ++ .../gui/rhi/qrhi/data/simpletextured.frag.qsb | Bin 0 -> 1487 bytes .../gui/rhi/qrhi/data/simpletextured.vert | 14 ++ .../gui/rhi/qrhi/data/simpletextured.vert.qsb | Bin 0 -> 1195 bytes tests/auto/gui/rhi/qrhi/tst_qrhi.cpp | 159 ++++++++++++++++++ 10 files changed, 190 insertions(+) create mode 100644 tests/auto/gui/rhi/qrhi/data/qt256.png create mode 100644 tests/auto/gui/rhi/qrhi/data/simpletextured.frag create mode 100644 tests/auto/gui/rhi/qrhi/data/simpletextured.frag.qsb create mode 100644 tests/auto/gui/rhi/qrhi/data/simpletextured.vert create mode 100644 tests/auto/gui/rhi/qrhi/data/simpletextured.vert.qsb diff --git a/src/gui/rhi/qrhinull.cpp b/src/gui/rhi/qrhinull.cpp index 2eb55e705b8..3027faa397b 100644 --- a/src/gui/rhi/qrhinull.cpp +++ b/src/gui/rhi/qrhinull.cpp @@ -397,6 +397,7 @@ void QRhiNull::simulateTextureUpload(const QRhiResourceUpdateBatchPrivate::Textu QPainter painter(&texD->image[layer][level]); const QSize srcSize = subresDesc.sourceSize().isEmpty() ? src.size() : subresDesc.sourceSize(); + painter.setCompositionMode(QPainter::CompositionMode_Source); painter.drawImage(subresDesc.destinationTopLeft(), src, QRect(subresDesc.sourceTopLeft(), srcSize)); } else if (!subresDesc.data().isEmpty()) { @@ -435,6 +436,7 @@ void QRhiNull::simulateTextureCopy(const QRhiResourceUpdateBatchPrivate::Texture const QPoint srcPos = u.desc.sourceTopLeft(); QPainter painter(&dstImage); + painter.setCompositionMode(QPainter::CompositionMode_Source); painter.drawImage(QRect(dstPos, size), srcImage, QRect(srcPos, size)); } diff --git a/tests/auto/gui/rhi/qrhi/data/compile.bat b/tests/auto/gui/rhi/qrhi/data/compile.bat index 2c97b02180f..3dafa33eab7 100644 --- a/tests/auto/gui/rhi/qrhi/data/compile.bat +++ b/tests/auto/gui/rhi/qrhi/data/compile.bat @@ -42,3 +42,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 diff --git a/tests/auto/gui/rhi/qrhi/data/qt256.png b/tests/auto/gui/rhi/qrhi/data/qt256.png new file mode 100644 index 0000000000000000000000000000000000000000..30c621c9c669457e8fb338a79d25a86501916de1 GIT binary patch literal 6208 zcmcIoc|4Tu*S`tb5sqpy7(Sg#a0NJG&vw5YDbd-%f-Y z0GzmjvarTm!;Ms2Fy2zm$2?L2-ab@m08oPl_&B?GBJiMF2sacOBDhxHEC@omLIkbA za2dFd7Q!8+e;bQ1zin*ca@*5I*;Np#4pIwHp#pd#@XnwBZ!a`XB>*D$2d)a0J|319 z1pUE+_k;-kODSvkb&wVYivWS86eL|_ugZZGm8E3C%5qBb5+FGlSp{hsd1+Z?N!hC^ z)LUK#^yei=oek@XR58=m{c|qr8${3@kM~iLmL?DgQiQ8g7_1vrR#{nEMowBzPLj$Y zi6f%%&H<8WoX}qg+6bHr7UhFSVbGvsMCV%=KRiT`s_DN>@b>u|7LEJUO;m?T2RQpk z%Sy={oAehW9R9zvdVBxPjl-KE{#)OF3yiZM`XHpu5IBq<)`hxoNTK7Yd{nfs2xmM7 zYk|Rd{pH2$?if4<=Z^6KX=xpM4J-u)U4}cmpwP#|Vt>fN;VK4b9Nro2f-umA2vU)x zP$*Xw9bI`HSzWL$SVl`hR#rzrNm*M-Q%PP%39O;5ET=2~m#j9%#m^go#{VVj`nRlt z%s34lOTqaI5QZ;vxWLjb^8W}vNM5iq`z#gt|_Oe8ml{0a^`m*Sl2 z&93pd24L`c9><{hmx&3pN>U2n)k#M?YoZ8*sz(l-@!nITos)>r4cDIF)f zYs8paT5!%zVDlpnCRta8rjR+QHP!y3`(N|sn<*1}jg(AW|BkURZ!9x#H&LnNk5s1x z06G9*1ORpb0096D0LavgrPhG|(1&T0-+px6k@)D-$I1KIhWSE{At&W%bL5>GKLJGmRyrrir6`ixaqWZnwxi z=`+C*V&w5)LkFuy3&Lu0Nu0;n&`qiQzWL1&>C6zTYlyHcfblR)=&HI_ftzuB@uCh^ zTQ~mxHGauXUjx~r&voStJ7tJ_ULNCu=N~C_r_A+dj%X?J(6QM9TXZ37XTPa+&d>M7 zE05`Q%Zn~-6+_><$9$QLpv?Bx`E4K%R2CN&ziDdZ(6Q(9vVG8t?(iK85pbK6PO`Dl zs|^X{;x`FEtl8R_ZiTLRP4>P$LFeYL_{8_EmX+c@;_r?Cb*i*3=I}-*)5xC7l zdm|VS?Ck$bqSmABZ4>MM0kM!2HsM&IZ8+Xt^MVYpwN1CF)sj9WqZ6U}cwN=m9~-k9 z);k!8s#6h0|H75Jy@%a9-m{w(Jv*>9{aj{J|3s$CH@&>__@2A>Te9qK37bk?@NeRK z1kqakNUYwo9q?>ZhH52joUYB3p0|NvmLV%}(ENO0t8`KbAHf_H7UFm*KQ{H`rK6ah zp3L^F(~Ka21W@&Zdeg((3(Aj`-GVg_z4o6~$Y9h7(7RRu?>>~DBBZQ7|8d>nr+(&s zK+jZX`c5G`4I?PC_t380{(Q}wrY7w7j&8)wRj(%i&D|Jr=A(%7N8%heMa>6A&oD89 z_}mkZK56yMbcGCaMW=phpS(QA)We_$(CAHVPRZ}?*>4?mnD7ZJ#x-R`Gk!e*G7=4J zEh-g(sC&bj?06QF{48p&1%C=uc?ua{Jsjb>yXcEb__p77t;csN{B+yx6AsgOv(JjI ze&3h1>1i1+h<@u!cBydt*-bz>HBW8F2TfG!R8@H;CRE84FHS6%Q;s&_8+7MV>_K_v zx=O*D26951jOl6q*3Enru#i-I_3~)FI4cbeUBtH<*II0wj_gr3g;zc42Kaf0sxf;p z9UDV0tHp%n66tf19p%R8Y+J+E*`7CrO4ze!UVR^WA?lesAbx&We-}1KqTp@%f+x6j4R)`SN1m6G*m7|D<=|w>}3-T1tBI zLopmK?vf@u89IQ!IdqjxQQRc#FwTK+&C}$OXup+t2*hsd$&NL((1s`+ZO&z+R5y4e zdwK3m49)L5ExJ@xzv?S%NVlOnh=vRVz1!!jA12iyM)PL7)k6AI*j`j(^KFPKBFgu7 z&alIPj3XCwy>#`1<$B&A-_`L`@3$B%dpgr~lBn>$M!$?+Rn+B8ZWzs8naZq>GcA+h zV^O+-D^X464K)B2(q8nu3{3i$w!59jHd*YI*vqe|C06{rkt?M?IGPizk$9hTOJE>! zxG8$Kah^L9eX~%~n6ea}0cLF36y-E{SiG3n+Z8x)kEgM$@pp%)qDLvVxft`^E5M{K z+&rG5_^Kif4;`_z|MAN3L?Xzl~47$0EZp%~F6ck`?z1 zZq=PaH+qYe|0s453HJr)rc=4eT+6)b>)wzB?9D6zcWk2ejH~9j(i3``fSgX0KkeDb zWKxRtg%FPPFb?wQKsYqRs-Jce+Kh_-+eK#`a zjYPy=Ewh6GFF9acms_WQGy^|}lZRQ`2gHO#)X$i-fq*r+D+oGC^1*hGJ5Ayxrk5X^ z&a=aME*o7yT8{8|i`*$noQ#;4{rv@rh9>Q*+}k;ZVGG9;77qqXAU~T^0tA@jnP1!x z?4J2G*kV5oiI|rYM#*r50SyLC&fK38U`)9a<#8MU?fMn^h!Ymc{NOvaEjO~j$i0)C zAaV;w+Az5`%D=dDU!BI?Q9jk#!L898dQV-WMA|Nrr~11u!D#6qHqEJmkar0^If;gn zOZ_4NH6vtDfsM`U2;x=)%-bp}3aFU5di!8%iA{HRQL>KMjT;KVb-XK@+VL4PR~v5~ zq3yqU5)dHBqH-=Wp zo{E`cwL!t>a(8i+{?!aig4Mr1W|<&0FPT!!)3XgKF;M1*WHt5D{w#Et<+Mez`r9(l z`E*!&(|jHr;;o7CA{txnaMREPB>c+$)skhdXL6E~Bp=$sPDJHUPGDcC{G?g0C-gMFXHRc|!GdCdQUPYxtB11p)#t4vq{V&5S+l z4cF@cj)FB>2lD$WK;j*cu|Nv~qz6$yccmoBYqdi&Lp@!$9B63Qg)PI(EzP4LB0wt| zuE$9O0!|M)rM(q(Kcf#;%PEkm0~lMv_ps7tRndddB>|pqO2TCaKygBl$*}nuH8bjSR6U%T={B z>MY$f+%|B$r|Ktfx||w}_C=!2jgz!6;6lNZ)&edWVKJzTSUaNs$`B=h>L5Tdyjj2SvA= z)Xz|>vh|XCVugnaMUIJ)Cg4%O9bt&}M{70heC4EK{lsF=PqC@M^45*isYo5KJB5p{IsTbHF!($WY%=O%KO6U(1}{)thZNm zBQSoy3Q=uD3I&3?>LO0}bY)mU-CT^9{n6WHrdG6la9N%|k10gaEY%fWA zcwEs1jQAL0WGft!9I`})bB$2;74O#>9=;)Nh@Qou%0HDoE4y7h)!%vL>qDgGVduwX zc(t|`pgtS5!G*kbmm;DpWk8bI2*e(J)4{sVeL3(~|6%-Md8O@M;lAb}cD++}C+=Q% zj(=j=FGW>bLV9w(c?}QGf&JWUpMN;uXyW=N0{27%YH-RT*!EpQZ*PvWL)=lyYrnNL z?;B0h^af$G-x`S6_UZ6d=)35IUuL!VO+VRq{0I zVKIFr0$(V?b;zcW|_@Uk8z3Wl^SuMmmJZr6Pv~CmVPC> zD5tv_?rKvuTTQLH+S^SgI`toARM%WxWJ6}xug+Z+2~IGA=SU1?akoDubzR3}euSOi z-j6Py<4bT82eNvJu5%U?+zUGI){objV1&wp8;if8uYu;cmeiDyNH_ty7pFt56gAI9 z{OU@XANQhedFC$m79Tz65)&6_4c=WW)h(^v5B@S%!h_I)_Uu8~>oPW}T_1#S8s!Pl zY@cnc^~+d+Nv!qyW?$G%U-_b)H?DTGVLqM)8b>*=zTtX6cLVTs<{!rWo_*$Ru~Am+^$Oa{PmK>7IUemBgG!F*pln`N=two z9Po;iwO{hnSMca)n=;v)RJ}B{`9bzsxr1j4=&mI|yDfA<((zLFm7LST>r>_p)+DRO zaooH7=SwM8&o(A}cO+$5X_Wv<>b`AunKefjZnXOJQN!|0A{s#MZE-g$Z0XiRhNy}- zexeMUt~qi-g&_mk?=uNnR(TVZ2Zh-yZfh~ddWSo!C)okoNXhXJ4FgP(hlYXRhYMa+ z-PIGIiwdNfn6JTk=qxq+U-HK$>HOwsUp0HL0=ahn4n!~bZK1hMsfuTi-^A%uh{)*_ z^$6gW_Wnol7_=UZ;CBfB#_dVfRf`V>i(eTFekDks+-$pOIzNm0w2Xe_TNfn}ac_C#UGyFVtyj*39KM)mITUJII<9dzU zAJ9=fka{vFS)gh{ymP&bL2aSSmxK?L={;GrN5|kS7^(iId~DZ+!2aR6`$i&B`4!?z z?v9*f-eqKWaJTA}Ns%s9J3@C{ibDmpd3q$qM059{MiddNxynb~8d)o=xgwEdR2lBaoK!8bL_)ynn93gqokE2dP zg>|T%qeUb4kqLD}Hm4R`P!ki=uHrxsWzxW`#3&wt-ec4)Sa;$o{Uk%|h5H=Vrue_d zkE|-7zN33j__XWFJ#+Di6wFFr)p-Htn;hn7$A11UCS%jr!t+2mUOungZ$~7r4 zn~$=XXnM!LpOK=j6W5vTe7i?wnz%QA)b&;iU<8dUjFYl-OIQpmn=_WwVrPVoju--8)tjwo6+C6R^@FON$WyD&a0;@Oq;`~x`%T!&hzHA0*oZOX&m0P z|3KtgPdDU2EzM)<2s?0da<9P4y>im{S~X}CZk&FeePx=unf>y4GG>zNZpuPmTjA-O z`m+p5+Z-_1dphn1snUwll<42rYCa`t$%I{`p^JPco?>7V7{0h2I;YDzl+EPKLK3-C z$IL)&5V4paA)QZtK$V|jslQ=Yo8irhiX{YU30-jO1m8X*$f?Y88+KT@>Ybj7o6ztR z$}SJEyjenotK?-_AQ?lc=nwZ|Qac80^tMz2A0nAZ6+z*T1bh0^Lm#ibc|c9u)&0Es zMf)28KWL8Xw@#g(jf$S#(D?e!!dCxSwIoDxb7DAg^T=K90oy{OB_(CAZM3+Jef8MH z+3pn$3cO+H!0sfY)o@u#K3Bhijh+Y>Ctpccf0Xh1#h*qpbnMshET#F$;`z_&;n~Hu zvvVBe7WyM5>Q}Riab+!lz$sFA6t%B9MWO@PXQ;4%0Na0-6gd-{z|IINdr$kHKeGEb fr+-Sok$4Nh7btU1@5BdBfO;9|7;BenI)(lhGcL*Y literal 0 HcmV?d00001 diff --git a/tests/auto/gui/rhi/qrhi/data/simple.frag.qsb b/tests/auto/gui/rhi/qrhi/data/simple.frag.qsb index 264b71ec0f52a346e22efda1ea21e0116560c7b5..0b46de14537252a4b852d82052b416831cfa344e 100644 GIT binary patch literal 899 zcmV-}1AP1d00>=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 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 i9MV9B(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 literal 967 zcmV;&133Hu00}a9oZVGVPZU`YuVH2wY*a@49}|6MJPgsDogqk!0ucdW6I{p)Ye>*^ zn&~&g!=CP;`!(@TybwL=!5Gh8Jn;qm03JPh*-x++PM*jnidC;)(*vt+Ox(-9NzLn5 zRlln0s(RG`kb-D^SX*8V=_WafaBFI zDLfZ;*O_jB47gT{lf3N(B9fmuKz#Y2&1qlf^&xK>B!!bh)pnhEgO<|{iCqX{Q#q3m2%lIEGd1l97@h88Wx9o%`nzI zVY8Mc+~R=o$Y8jdjybR8Y_vo5v0(UNl7@AI!H%SDO)lP;`1AR>o!T#dzaM#XZ)@|}g}*4XTdAl+v2oxv zwJuT*^5&7MlT$bCeVsvF1=-I#R2F)!PF5unDi#77jjC%B2eYR-69)lCE}-wiU0m-uwCh7N!;_=H{xCu(`Q8_YF*{6N6N{ zy_+(q%}gy`2fA%3$m71+11S^LKj!mFzlk~g$nv{(hVgCV^Ubr-K8B*&!uY~Vh;DJb zI-g_wkE|cn|IUj0fL2EdQ`_mTLXJG;Fk}6idjumV-@SOjX`jX_l>%v(hAz{vfWtbQ zBL@&wH?aQMSYI%0O1d5Sx(~*>71psJg;q$d>G%YOUD74zl|Kar=vQ~ zK8+toZeGxSE`Gg*>M4c7)M5ZG&ieS7T+`1FmoQ<@&v>X#l?}+6wBjE?4 zW&cWlrIj(m2m>6PjJ`$zPE5`e3Wrr7{je_8xGI}oDD}i@IG!bk_6)A2rMQ-N@8am% zj}`7-Xgk5}j>=+rAjYn%Zc6+{PsP|469fz-4S9hM<4Kz66OFP*Xp8uGD(#)J!Yw6( pmQ;K$L*FIMc<^SGHC@nG9og+qK3A9jC!Z_K=TG@geF08Z#2d4M>52dV diff --git a/tests/auto/gui/rhi/qrhi/data/simpletextured.frag b/tests/auto/gui/rhi/qrhi/data/simpletextured.frag new file mode 100644 index 00000000000..630df7b8079 --- /dev/null +++ b/tests/auto/gui/rhi/qrhi/data/simpletextured.frag @@ -0,0 +1,13 @@ +#version 440 + +layout(location = 0) in vec2 uv; +layout(location = 0) out vec4 fragColor; + +layout(binding = 0) uniform sampler2D tex; + +void main() +{ + vec4 c = texture(tex, uv); + c.rgb *= c.a; + fragColor = c; +} diff --git a/tests/auto/gui/rhi/qrhi/data/simpletextured.frag.qsb b/tests/auto/gui/rhi/qrhi/data/simpletextured.frag.qsb new file mode 100644 index 0000000000000000000000000000000000000000..876290cbc72b5897191aceef71c5dc9e9b3d6f86 GIT binary patch literal 1487 zcmV;=1u*&m01nM~oZVMjZyQAvKJg`XwzmLHn>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 literal 0 HcmV?d00001 diff --git a/tests/auto/gui/rhi/qrhi/data/simpletextured.vert b/tests/auto/gui/rhi/qrhi/data/simpletextured.vert new file mode 100644 index 00000000000..1dd204f84d2 --- /dev/null +++ b/tests/auto/gui/rhi/qrhi/data/simpletextured.vert @@ -0,0 +1,14 @@ +#version 440 + +layout(location = 0) in vec4 position; +layout(location = 1) in vec2 texcoord; + +layout(location = 0) out vec2 uv; + +out gl_PerVertex { vec4 gl_Position; }; + +void main() +{ + uv = texcoord; + gl_Position = position; +} diff --git a/tests/auto/gui/rhi/qrhi/data/simpletextured.vert.qsb b/tests/auto/gui/rhi/qrhi/data/simpletextured.vert.qsb new file mode 100644 index 0000000000000000000000000000000000000000..e4f12bfb9e70f6109c56e2cabaf6f8237f7f920b GIT binary patch literal 1195 zcmV;c1XTL~01PR3oZVK{@7SGS@4EY8rBu08;*P3_6Nd`8g*zNLaNvlUzxU?Nn|Wr8#h4ngZ|)x+Ik@-|e#YVZIecdmjEymA_C44633y4MAAlOn*VzKP z2{ggFR!euKWimFOLOoOO3FN!txMf+k0sIN%yAS#TzXQ=KGnN6{H-RcZcL;MA=y75g zGZ^z@QS83uNb;E;!LIn&*MM#TeFl3;0ps*7#?lJ6TbG{-R%Ez8U++cZ5!gP813^ru z?_i9U=VC%Y2HRpFVjqv>3$0Hy4a*zNDZd6gzZ>jvnBQU%Jn8lW$Ws`f z?z*--^jt9-=8)jujP^KE4SQj<<^M@F{Kqm5x0{v2jK>?*{o89lzAtw&)4zPxU;J9% z`R-?RT^sN?r06a`0s0N73WD!}YSr}(W8|&Dw~D3y_!G|*=e267gx@Pb94Jq3Lx%J} zlr7tGthUSZwFSPlUEk()l}o;6_4=|4lTxuzVjt8uKdRDO1y2rJjQC8@H=FhOu?QdM z379n2_t$oIYE^c2cD4gpyRX1XK!B@3Jw~vyEP_?vJI^)Z*0x2hQaw_xVUSAcKKygY=OX=xki|Wh%;>BXQ$Mj+{x1 zz21nwrv6JtP;WRQr4s)(5zmcdWaDrGSBQHNJY%er&?4}=3Dr<=T%%CAj%|)zpk4as zkoFw_1wPWsmNCrEEW?~6)LyVwQ=l2uO@R#cy#dZs$}a5m$QuKHa5iwAguN$h5F&q! z_>5%1@gv?e@evRGhut0a0^ZTzRno!rB&~5jTVNC5PM+%|6faKtvl06l;3EHRwM$=T z4rbU~InZU$A7_5EjVoSK)jH}Te~H#<;-OrlSOU35vBU^(itv&u4nMXjvdt3C1+vZ3 zIUw&1SYM>L5bIr9U!uLB{S3*b$bN>-Fh=q@!b15C$W@$$b&mYsfrIbVGVMD0c(DXW)I&zdb=6Ct3J(VRTP&(rk4-L-1QY;p*KclxtTW zu4p0Okv-!*{3+a9(KOG&E`a}^9B4&?D=T>09oP0+u6o^zP5A3T4}808=`J=5esJJ9 z!p_4#GPAgF_wG_Ct_;2T2M0mfq0-4Hv^1m0VS53)^Tv}OaS(Q=A+6Fv;9;PyM;N?6 z%Lg90M0m%=7AzsGpnHY-NXz`;iSHCv1=ZQ4Sr~3^C>d^Wpc3{tRI!EY*(PcRJujvF J`~^txNDnT;T3G-9 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 65561595a1d..ddead9aa447 100644 --- a/tests/auto/gui/rhi/qrhi/tst_qrhi.cpp +++ b/tests/auto/gui/rhi/qrhi/tst_qrhi.cpp @@ -85,6 +85,8 @@ private slots: void invalidPipeline(); void renderToTextureSimple_data(); void renderToTextureSimple(); + void renderToTextureTexturedQuad_data(); + void renderToTextureTexturedQuad(); private: struct { @@ -818,6 +820,34 @@ void tst_QRhi::resourceUpdateBatchRGBATextureUpload() QVERIFY(imageRGBAEquals(expectedImage, wrapperImage)); } + + // now a QImage from an actual file + { + QImage inputImage; + inputImage.load(QLatin1String(":/data/qt256.png")); + QVERIFY(!inputImage.isNull()); + inputImage = std::move(inputImage).convertToFormat(image.format()); + + QScopedPointer texture(rhi->newTexture(QRhiTexture::RGBA8, inputImage.size(), + 1, QRhiTexture::UsedAsTransferSource)); + QVERIFY(texture->build()); + + QRhiResourceUpdateBatch *batch = rhi->nextResourceUpdateBatch(); + batch->uploadTexture(texture.data(), inputImage); + + QRhiReadbackResult readResult; + bool readCompleted = false; + readResult.completed = [&readCompleted] { readCompleted = true; }; + batch->readBackTexture(texture.data(), &readResult); + + QVERIFY(submitResourceUpdates(rhi.data(), batch)); + QVERIFY(readCompleted); + QImage wrapperImage(reinterpret_cast(readResult.data.constData()), + readResult.pixelSize.width(), readResult.pixelSize.height(), + inputImage.format()); + + QVERIFY(imageRGBAEquals(inputImage, wrapperImage)); + } } void tst_QRhi::resourceUpdateBatchRGBATextureCopy_data() @@ -1201,5 +1231,134 @@ void tst_QRhi::renderToTextureSimple() QVERIFY(redCount > blueCount); } +void tst_QRhi::renderToTextureTexturedQuad_data() +{ + rhiTestData(); +} + +void tst_QRhi::renderToTextureTexturedQuad() +{ + 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); + + 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()); + + QScopedPointer srb(rhi->newShaderResourceBindings()); + srb->setBindings({ + QRhiShaderResourceBinding::sampledTexture(0, QRhiShaderResourceBinding::FragmentStage, inputTexture.data(), sampler.data()) + }); + QVERIFY(srb->build()); + + QScopedPointer pipeline(rhi->newGraphicsPipeline()); + pipeline->setTopology(QRhiGraphicsPipeline::TriangleStrip); + QShader vs = loadShader(":/data/simpletextured.vert.qsb"); + QVERIFY(vs.isValid()); + QShader fs = loadShader(":/data/simpletextured.frag.qsb"); + QVERIFY(fs.isValid()); + 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(srb.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 readResult; + QImage result; + readResult.completed = [&readResult, &result] { + result = QImage(reinterpret_cast(readResult.data.constData()), + readResult.pixelSize.width(), readResult.pixelSize.height(), + QImage::Format_RGBA8888_Premultiplied); + }; + QRhiResourceUpdateBatch *readbackBatch = rhi->nextResourceUpdateBatch(); + readbackBatch->readBackTexture({ texture.data() }, &readResult); + cb->endPass(readbackBatch); + + rhi->endOffscreenFrame(); + + QVERIFY(!result.isNull()); + + if (impl == QRhi::Null) + return; + + // Flip with D3D and Metal because these have Y down in images. Vulkan does + // not need this because there Y is down both in images and in NDC, which + // just happens to give correct results with our OpenGL-targeted vertex and + // UV data. + if (rhi->isYUpInFramebuffer() != rhi->isYUpInNDC()) + result = std::move(result).mirrored(); + + // check a few points that are expected to match regardless of the implementation + QRgb white = qRgba(255, 255, 255, 255); + QCOMPARE(result.pixel(79, 77), white); + QCOMPARE(result.pixel(124, 81), white); + QCOMPARE(result.pixel(128, 149), white); + QCOMPARE(result.pixel(120, 189), white); + QCOMPARE(result.pixel(116, 185), white); + + QRgb empty = qRgba(0, 0, 0, 0); + QCOMPARE(result.pixel(11, 45), empty); + QCOMPARE(result.pixel(246, 202), empty); + QCOMPARE(result.pixel(130, 18), empty); + QCOMPARE(result.pixel(4, 227), empty); + + QVERIFY(qGreen(result.pixel(32, 52)) > 2 * qRed(result.pixel(32, 52))); + QVERIFY(qGreen(result.pixel(32, 52)) > 2 * qBlue(result.pixel(32, 52))); + QVERIFY(qGreen(result.pixel(214, 191)) > 2 * qRed(result.pixel(214, 191))); + QVERIFY(qGreen(result.pixel(214, 191)) > 2 * qBlue(result.pixel(214, 191))); +} + #include QTEST_MAIN(tst_QRhi)