From 821c404ef2846129cc1020a83a80b0a183a1d3ac Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Tue, 27 Jun 2023 10:56:56 +0200 Subject: [PATCH] rhi: multiview: Exercise instancing in the test Just to make sure instanced drawing does not regress. Relevant particularly with Metal. Fixes: QTBUG-114885 Change-Id: Ib39066d32985bf25ca02d5aa54d9cf654772be9a Reviewed-by: Andy Nichols --- tests/manual/rhi/multiview/multiview.cpp | 40 ++++++++++++++---- tests/manual/rhi/multiview/multiview.frag.qsb | Bin 2426 -> 2425 bytes tests/manual/rhi/multiview/multiview.vert | 3 +- tests/manual/rhi/multiview/multiview.vert.qsb | Bin 4199 -> 3870 bytes tests/manual/rhi/multiview/texture.frag.qsb | Bin 4340 -> 3598 bytes tests/manual/rhi/multiview/texture.vert.qsb | Bin 4230 -> 3683 bytes 6 files changed, 33 insertions(+), 10 deletions(-) diff --git a/tests/manual/rhi/multiview/multiview.cpp b/tests/manual/rhi/multiview/multiview.cpp index 7f6e611d8fc..b9768ffe09a 100644 --- a/tests/manual/rhi/multiview/multiview.cpp +++ b/tests/manual/rhi/multiview/multiview.cpp @@ -33,12 +33,24 @@ static float triangleData[] = { // Y up, CCW 0.0f, 0.5f, 1.0f, 0.0f, 0.0f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, - 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, + 0.5f, -0.5f, 0.0f, 0.0f, 1.0f +}; + +static const int INSTANCE_COUNT = 5; + +static float instanceData[INSTANCE_COUNT * 3] = +{ + 0.4f, 0.0f, 0.0f, + 0.2f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.0f, + -0.2f, 0.0f, 0.0f, + -0.4f, 0.0f, 0.0f }; struct { QList releasePool; QRhiBuffer *vbuf = nullptr; + QRhiBuffer *instanceBuf = nullptr; QRhiBuffer *ibuf = nullptr; QRhiBuffer *ubuf = nullptr; QRhiTextureRenderTarget *rt = nullptr; @@ -109,6 +121,11 @@ void Window::customInit() d.vbuf->create(); d.releasePool << d.vbuf; + // data for the instanced translation attribute + d.instanceBuf = m_r->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::VertexBuffer, sizeof(instanceData)); + d.instanceBuf->create(); + d.releasePool << d.instanceBuf; + // resources for the on-screen visualizer d.ibuf = m_r->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::IndexBuffer, sizeof(quadIndexData)); d.ibuf->create(); @@ -160,6 +177,7 @@ void Window::customInit() d.initialUpdates = m_r->nextResourceUpdateBatch(); d.initialUpdates->uploadStaticBuffer(d.vbuf, 0, sizeof(quadVertexData), quadVertexData); d.initialUpdates->uploadStaticBuffer(d.vbuf, sizeof(quadVertexData), sizeof(triangleData), triangleData); + d.initialUpdates->uploadStaticBuffer(d.instanceBuf, instanceData); d.initialUpdates->uploadStaticBuffer(d.ibuf, quadIndexData); qint32 flip = m_r->isYUpInFramebuffer() ? 1 : 0; @@ -189,11 +207,13 @@ void Window::customInit() }); d.triPs->setMultiViewCount(2); // the view count must be set both on the render target and the pipeline inputLayout.setBindings({ - { 5 * sizeof(float) } + { 5 * sizeof(float) }, + { 3 * sizeof(float), QRhiVertexInputBinding::PerInstance } }); inputLayout.setAttributes({ { 0, 0, QRhiVertexInputAttribute::Float2, 0 }, - { 0, 1, QRhiVertexInputAttribute::Float3, quint32(2 * sizeof(float)) } + { 0, 1, QRhiVertexInputAttribute::Float3, quint32(2 * sizeof(float)) }, + { 1, 2, QRhiVertexInputAttribute::Float3, 0 } }); d.triPs->setSampleCount(sampleCount); d.triPs->setVertexInputLayout(inputLayout); @@ -222,8 +242,6 @@ void Window::customRender() d.initialUpdates = nullptr; } - QRhiCommandBuffer::VertexInput vbufBinding(d.vbuf, quint32(sizeof(quadVertexData))); - QMatrix4x4 triMvp = d.triBaseMvp; // let's say this is the left eye, make the triangle point left for now triMvp.rotate(90, 0, 0, 1); @@ -237,8 +255,12 @@ void Window::customRender() cb->setGraphicsPipeline(d.triPs); cb->setViewport({ 0, 0, float(d.rt->pixelSize().width()), float(d.rt->pixelSize().height()) }); cb->setShaderResources(); - cb->setVertexInput(0, 1, &vbufBinding); - cb->draw(3); + const QRhiCommandBuffer::VertexInput multiViewPassVbufBindings[] = { + { d.vbuf, quint32(sizeof(quadVertexData)) }, + { d.instanceBuf, 0 } + }; + cb->setVertexInput(0, 2, multiViewPassVbufBindings); + cb->draw(3, INSTANCE_COUNT); cb->endPass(); // "blit" the two texture layers on-screen just to visualize the contents @@ -260,8 +282,8 @@ void Window::customRender() cb->beginPass(m_sc->currentFrameRenderTarget(), m_clearColor, { 1.0f, 0 }, u); cb->setGraphicsPipeline(d.ps); cb->setViewport({ 0, 0, float(outputSizeInPixels.width()), float(outputSizeInPixels.height()) }); - vbufBinding.second = 0; - cb->setVertexInput(0, 1, &vbufBinding, d.ibuf, 0, QRhiCommandBuffer::IndexUInt16); + const QRhiCommandBuffer::VertexInput quadPassVBufBindings[] = { { d.vbuf, 0 } }; + cb->setVertexInput(0, 1, quadPassVBufBindings, d.ibuf, 0, QRhiCommandBuffer::IndexUInt16); for (int i = 0; i < 2; ++i) { cb->setShaderResources(d.srb[i]); cb->drawIndexed(6); diff --git a/tests/manual/rhi/multiview/multiview.frag.qsb b/tests/manual/rhi/multiview/multiview.frag.qsb index dcaf6c6dff85814bf908677eee703a06a0648c4f..64f95c0514b4c75569aeee5120beeadd874e4452 100644 GIT binary patch literal 2425 zcmV-<35NCn01Qa}HPBcRGLC|4@?jeX zZIE}=UjTao*wRoILVe^%z^z5YngoG_BRrEE3potwi#UCZ(-(6wi#UBT7bn7=gJS`^ zH&i^|Qo(fbxwQc2;|qwOBxZBI=W+JM5EZbw2w)%tqd1Hgf<>z*bZQEdoGIER5p*G+2$;f z*IJ7$WYs`V8T18j03{< zaPnRFvVH-jB(H!WLoQQ6$=cLZ?v(^_Wyn0nwFD7pOV^ZX*RS7@3)Vx!w0~fj6Ji+7 zwI!Rjl^PvY78lT$Y+`&6VZhT%kl=Yd^!H?u{9PP#51b0=^Wbj>#-Fp{fm{mX=0ka_ zq*PtH6(-mS`!B-D+_C~4S`_)pg}6pL{81cS@Y@g*dui4d{SFXK347I}c!7XQTeXkp zlO%?b(Xsd*lSj6Ouh}Qo3{q*bm885-l(wNQzf(qQ^V*Jp=rqm!d}-(2_;Y%7aZ|_L z=1jyq`UL=OMxJl_oJVl;}kKpu!W%4^Wju-y%-7}%!8=L_kI7Q8Ed z&>JckISC*U$ST1!Ic#_hB%h~!GR<3Z54Axs(Bv`VruTKd@#}hC zR?WZuhX?U%_r22H8~a_&nMHZ>){(*F!@dhuCEItsn&Noo(}jKhUj6t<4_sg781}mi zepR)~(Q9cjdzO>jLS#*T1 zvqPA)_B^hQPh|LdN!SKKi(Z;oEdQjKDqUy7`^k&_IijXX2^fk7jpq4S1c}@D=JBI)m&?s!XC`*yxvsv#olflF_932nK%CjPbMF$<5>fAxKlKhZHKZ0g#pc2( z3Xj4~leA<6Z=zM?8a2;m^XAADtypvtDOs+jB}udF5QTr-LsR7bvn!7rxy-KUsQKD+EK3Cxr z+&C^X=LjqYK^4=lE*4mi$LX=8*>@Y|)AZ7^D|nMZMP5?Wl!;Vyvx;d>li%uBVk;-9 zb7xwO^X`L5eT|7Bz;OJf+SkyAGcu-sdHE-kqt#|%qLz6$EPd2}276ni=qv9l zT(tS1;&wNERMYyv^kUMA1HYeECCYm{?+#72oS52wp-9;NLdA|0XSK1y;wY-Cu+)_B z2P2~oiOXZRZtm>6sVJA1-{`w}OBVOrhsfy2{@aOrizZqo_7@3<`=!x`3J)sY*cy9v zORwVgt!{(#1E|#T;}3@>_FuSEB%EQ-w*a1RI_ZfycQ>X|#>;NguJny`Xgoy24#L^9 zT`~>Ae?>`u=aHsMG_hyTEWSJtQ^|y}YR!r1UnNyG*!^3BNZZozY9vsdI}zii??yTYT0STgmLsJl&i*u3dEs%R1eh z<-;<^W@K&yv9p?3QSEoY+T*u(`t1h7tt8xEgh972dHmZ*|8}|G(c^FEXOEcGd-$b$3*y^J zJix!I$M|;`pX1->|5^T}0{rWnPzdjws zApUKS_N?MFJqbDOskx=OneHE}bi1$)(~ax%65@(0 z1Nlj0%gMOvB=TozY9%C4qmF7bH|K0ryneo+KY!6%f|DwIVONl1KM-mrAoW#wb7%$L ze)D+7)SGL@k1yB17dNAlOcFK91p*1^|E476eG_uep7QTZl}Ap=AV*Dg)8E&&KG-mw z_v``U^Vg^IR;)-wpGg1bpZ_fX7@^H#^mcLeQp73fTe>tcr&QF!U^(e|z)QEiiu4i$ zLf|zR^cep9*)}!bL(Ap!Bi5W}Or3xx1+5$NBefm!X8`HtnHFEUFA1o7%6^^^$EnlT rQj3Z>^|pFll$H*@so+0L!OzZ+f0)?v*ylZ4cwd1(%?J1!j=Y1=A#~dy literal 2426 zcmV-=35E6m01<9@ob6YAP*YbHzsY;#y?hWJ5H%QN9w0PWi%-yq1uRJrLBbjY6;~M( zLV)Z*2uVo!sBH*=ATnJPtq4;Kimlt-omJPFmX5ncab0xOfz?{@qodX0)ahDgcf0HE zbU*HWd4a5U+nw(2?EbNLIQQds&pG$pbMO7}0ss&K0B|TgC{o}8JAet)f@&ysh+t5_ zU%3Llq9C&fPyv;Vpb}_cAc(B zm+WwsC$Ct^pn0i(o9tW|AlS%})EF&RgrgKmpioc`;RNyldkBx=)<9!P&^QvV$%kz$ zv_alce?II9U`s<;0QHd{0k;+nYZCYqj_`DDEaWhxFXHquPG8K$EaLRVT$~7d7LEn% z-cWJBpn~b*b87+4$76_~BxZ8HLpl3Ghzi(T_%RTKQ5?n#!ooQW`PakfQT!2{J;lwV zIM%>bh1}eqp@%fq3&6QN!vSw8=NgqC$GgmSho#m^r!ov}c8F|tv&q5&RhG&s8(mRd zYjmbR1zW5T6jd7=YwMlL>ROZ0iRLnCCW(d!?J}EI&=q!LrM9-Z)}Ai1SP_&;yLOoT zfXG#ADW_3T$|O;k!Tp2WvaV=Ephs|L3ydFh9YHpQar41k zRaC4l-VT#$g#9gWGP@*ChZaJ@f(XdU4%N5e)ZFo=I zkQY|>yo24c2wi8F*gK@7vf@DkkX3+ba>Vc|NIFk@WtunTZfc`ou*Ge}%ih)X#jWps zNj2}oKRk$AxA*0JeKFtDoLQJ7Zyy~>I_$krSyZ?4m1O(kPZ#w2`t;)`-Ee)GeZ=Q9 z_*7NC#wrZ~(F+LC7xRjV)SyZ^L zyGxk3?mVuIOJMkVNytV)n_ikwDF398DqdfP50DoJvP3PD5-=PEnoRSsa1yy`gt>RY zb|I$g&f!O9uauj_j&$tAvpxO!%?|8f-7rr*C{FKh-m|1^iKuVMpZbPd8kgrg#HRcy z3XjCgCTYni-a@O$wQ8Q#>dBHR+OeoaQnFG_OA==pArk+%m!`=5Nk3fnHZ%Owl;?Ye z{5?8~G-Dp7;BJQgl)7X{=qW0oI@)}Oz6#c&r{voPDd2UQHh@yNb6MRODqvb%{ttx2l-d6#163*Sv~0ykf=lude)ja;)mo(bsogo~U6Sjz}L3oWb4_Df&zM z^A~PCsJOk4KBj4ZP_`v;)q&qns}kgW-FJs4+fGdFzfd6Te7?LP*->RIH`@zp%gxnA z{Go`bL*mky?OVJ1Zz@XVr8oL--jc=s_8~Gly8m{A=6Z(CsXw$r-T^cvh*g!aX z>m<`4?AMg^cW!B_L=$uN%%UrU(G^SxtJbQxgk_FtGrO?NOATF48_`S>jk!LXjcBrA zt_Git_C;L^mwwhQy~~7InXr2^(iy!pl{&ZRquA)l*hOcJF%`_N^wX{B?(u~YyAeyU)RaHJatld6ax6fuETuQ?AI0U+V(e2wo`s(C9d#|stw`J+08R?@t z(l17&pD|e3*kJVi!RSkDeajeqF*f>K%c6@$!S!zK>M`x=UbcRBG;Ntx2Y z`wQNw;eTNJZyTM-mR>9iDHM@Jh|L{xKHpI7+ zxSxMjPw?*uKF7b${j>Z_`T5s7%fFhZ_%}S5e`CKL|FXOiN3#4IiTF1%z`q@kf4w@2 zLHyepCi)N3co&nwMRCA z59TJ4Z6{-^63JhrsFjdFjXJ8s)S9(P@!I*uf!u{}3Qnr<1w8?ZeNU*FfYev%$)Xi_ z=gs3QrjD!~KfY4`PV9_IGD%b`=L;lY;MXFJquzF9xKCSGMTteTiS)UGmEnv79=6 seR)9vr`}Poi`3GAHx>AS6!`26`jNzzCqC)f!uuNht9*dJ0ab&9PDHlU00000 diff --git a/tests/manual/rhi/multiview/multiview.vert b/tests/manual/rhi/multiview/multiview.vert index b9c9e5a704b..4d4949672f6 100644 --- a/tests/manual/rhi/multiview/multiview.vert +++ b/tests/manual/rhi/multiview/multiview.vert @@ -3,6 +3,7 @@ layout(location = 0) in vec4 pos; layout(location = 1) in vec3 color; +layout(location = 2) in vec3 translation; layout(location = 0) out vec3 v_color; @@ -14,5 +15,5 @@ layout(std140, binding = 0) uniform buf void main() { v_color = color; - gl_Position = mvp[gl_ViewIndex] * pos; + gl_Position = mvp[gl_ViewIndex] * (pos + vec4(translation, 0.0)); } diff --git a/tests/manual/rhi/multiview/multiview.vert.qsb b/tests/manual/rhi/multiview/multiview.vert.qsb index 69b457a52cf18ed3c7d5651db0571e1a01e1bc61..38ec9c60be730a3636cab06d8a657be90a4230b4 100644 GIT binary patch literal 3870 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 literal 4199 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 diff --git a/tests/manual/rhi/multiview/texture.frag.qsb b/tests/manual/rhi/multiview/texture.frag.qsb index 091e9b1cd79b27f174491ec3e34b8b483efaeed6..fc55cd954ef65870652cfef640f5e416899cdad6 100644 GIT binary patch literal 3598 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 Ue^8cKMLvK(xF%oz8|}#-J$=F^aF zK#*)9gajyP+fBlsL`9pTtyK39Sj*adt)=Q~>uZkw3Yw!*K9GYHSjq{|!MrtP z&^t3M1#_q}K!foYC`eNZj9x_{r-aYet^lg(K`rd7h4UioFR9+^sxLeMJizsc_t#AR z-fIr`E}DUGH^z@85x)TTDw#t=;b5Q^gP|wry;ieHlVq(dN=kiDhU$ghVEMcf0n*zc zbeHLkCZ9b3ivbE4=EX_G0ZSnq4g%yDjt9xeE}E;)f%4n{$8+G*FUL;n%wQz&4Uiw> zaeB%CjL%_N-uAF*47EM)KHuhXzWL?F0ltMpE55fL^F{)dBVdVuZx-J3pg!`4;Nrr< zC&l@Q?nt;G1YEs;Wbc13fP82Y3OIY3!x5Io$srtu+7oend`_R49v`1R!;K5VBv20L zd_n%rg-4@cmE+aV+I{5(4a&&0?3x;r@O- zz}W`&HHpJ`0oZa5<9qv0dix>c?31|qM6SP!xw`Km!%E-m$GLq33cN%xy(D<~vDF5P z)mUy~Q)DvMU=^4xhC-tkC^7CRF|);`<@(CBAHYTv1O?VgOI2YdTToRj*d<`$Ri>{@ zWy`9~XK=$R<;&9O#PVQE#7flV(n zRO(Cf;h9=$ELbg=!L7!!qUGq3RI(bz#cDL|U`_fmgVn4rG_YQ)+2*o0#;G-b{}^x# z$Wd874BS0D0bSj;tq{GXvV`s1XR$Pz0u2Ml2wGNI4Hh&+rWs>ITxKu@H0&!${dCZ8 zXlbp~?=V1V`*s-EauXCy-rmNeQGxZaSZwe)mFOQvc~QO|&6;$tE2|LxDTkxKsYkorkf#Mm-fBPuKcLC3*5i7yu64qYazq0qSwcC!GKz_)y{ zD~K&>z{6vY)x*cN`Zl*XOw-g9T;HQ%4tCNW8K2i5YU|WkWWotX__a)AQU+hQiEe8} zQ(B=#DQIIwQ;hJAhy0^fcugt#iWNPj6HZJDN0p*dKva&9x)E|`D|yo`oRo>)Q;O~Y z(RCYN-<~2Nt0`w~3%R1T!Qvrz9w%$1n3X{=TjrtE~&Gk)%m2GTrDH3Ynel?EMO&Gd^seHmd0hbS7aiw^ zxPVs9*E$+nR`HKXY%H~3xiL9H#YEYT9%=mGR~=6G-RIp~3a0j6$%gC7ro52ReSPC4 zb8!XU|=heCJ$QEF9EUrbQcca3B;vcN|~K zC_W?jNe9|pVe!ApJ@?J`XL_GIw&>+{=V2{F$5I~sN8-G$u~V$ zf{S4h%I2qtmc?UJd(ZLW7yYS1%&x#U+lf5T43|x~*y3?k>YR!aXKe`v%OS68g=K@n zo$v`nJ7uJ$m9(;CnOj)lFVsvUIua=i5?=(URV&GzI!z4UuqeZ&gK}!$HrS42= zgG1`z)6yQ>6#HvNaE!_Z>m3Ip!TMrwqlMR6K-gT7V16->LZO_nbwObVa7FE9T%Yqm zEo`I*wlg2oxU>1;Sr1AIgRN=U8_NzH*|5usy;yOEr)mpMJF@G!r3Fg`hnIeL_>8?a zd4n~$aKjLThvTXtmhQ$?TNTtA70+aHu(Ab>SY$laAThTt>psF#1GvfzD^JBF9DG?y zw3`+9MO<}frR$RybD8=b*uz;5=h5LEF|F~`T8aD4(PiC#J{9}%m0 zrBp`z(hmvji+3HyoYOCN4&*Yp5wqLu^N8^JR$4)wlax}ux;pK_ zPQvl$9uFN)VUZf9emC*YEej&I4dJR*g~T<#X3i;ML4B&OE~sk=U{2N!y){I!=1RE9<;rGsK5WwBMXOdRfmE$x`}QA|FAA&1bbaKe=$5z z^HClXj*ni}vCoWr&pSY9&K4D)z0@_;Hx^Iv6{<_kAyk;)mr_}7ieQ236_L^|j;Deo zr6qfA(u1ub!%E>e5KXm;HEj?d=-^$FiC=LG7VsarB%_aa2*PoBPF;veZ#C|K8DZ9qzR9!0SH~_Zq@yFdu@%ByN}*9JRL@l?-ccM%Jt<%D zZwV@G1AXz_35_Y~=0MqcS!ztT^^M@dQ*bJViK}`iA0Hp=>g^jle6_dlQahd#DNmnw z=H!{T9y;^J$ukM6ExYN94N0OCiM<0i_a!wU3ez5);9s;($eHxoMAGikJxNU`O4knx z5Le&ujj^fLs~-*D7;nel8-xuTCSJR+4>oREuZ6!{(Yja%*F_3ti|QGTDi-rHTplp$I|*I#nn1;R|&bI#A$&~o73!enssEgl&t=C4y1k3=FF#@6%wbV1)e7M z#9NcXTO-16Ji-YXR?yoPHP#l@?|lyIqxxc^dh84P^u(ub^{QU=suu6_?e3Ka)hk_C z+QIJSu+h7YwBKQA9o-!Nrmm%!`ap))K zfA;yP;^*66!0e~KOdW1K^}$p^hGsct@8p-%d7k~rdCZ>jhi9`Mxb{U=?PJ+=-}TY- z!S7;+J}CTdo3ON5m%=g>eb^SJJ@+0%u)6AwkV9XkpJlXbR9P=$^b$SbkI#FnjQYrY z=fbt%P@X0WolTO?)W^?${q0_iF8Eq|Ab{$Eg)Q=`&;(oT|*z+xSKYKGT zneJ9O^+9}tP`HMqq#ob8B)>~HEECjQWf2&66VB+$5hc>F^j(SMEB{VZj3G* zvy1xeXl>lEhj?tlyMVr{6y0uJ_z^F9e01K8m_;LPQCekxC2`GzR@B!c#A&VYTczk5 zR&<>uk1>KNRy68{*_i0MOn7@zIOQS7J;JZx>h%yhCHV{>p0VM7SezL2>N|}ekP$s4 zlA|x)ZIA)p*Vu2Ab=mak-^b;KF43$GmR-!un!q)#*K zkI=OYJN*SwGL@>F{`oE&v)jCB2D)^;DLkHx6O<8@_X8fxKg0p~$Kv&^l5Eh|7AKIm z(tUM%nqe;D;3wdH#lUrh$HMgD>>HH5Cfd7yKK?(*E4nVByu!XxL8(z*(QOt(Nf}QK zW$7HsxNtmkh>aU)jLUl=F0!R(h)EB}_aA1N4~V$k5Q)>NWx33|KgF6iZ)m22I$}B$ z45Qp0UVrg2QxuN#*bgIK7|*W%4fVv0FV^iTacEbD*MBy|#D&-MAxS@>qI-1R&6QV4 zLNBXVP3`M!w9$d5A~MMd$Bz!NF4g?ftzjvX7XW>h7t*{jM1eoip_gI`pb#(kcS53V z*f(%uV9CB$`}djFGn>(g=8M3QFgh0=Lla$>Ci=$O@ihzO>4#RGmYtNJXR&56=mul!is)yjFo}^Kezt7=N6j$*|VQ9 zbM8H3wtDV6V?ypZW8!~s#t{B9Mi1M05bYJXDiNI~jn(dh-m*oX+z*5A4Uu&+MZ<53T%3)6?1n)ocTc3`k zsH5^1ZB3FWSiy@U`aDhXc&DoqgH@@9jwm7-rzAF29Yj4P4yGxd?keFYOG10!r&O!6 z>8Z%%9KhgMPlzm4StpZZ(_sMb1Qi$^GRTGnN`Q8R*5N=UQw{?)mg=VbyNdtYp#N_b i0pAB_K26N>SHJr{-~3fw-Yoil{Qfq**M9-bimtj=2#~h` diff --git a/tests/manual/rhi/multiview/texture.vert.qsb b/tests/manual/rhi/multiview/texture.vert.qsb index 114fdddb18ae9514f4b9f366ec912fdb9821c035..6e26028d0db9ed308ab5e04becbcc1f2d3f07977 100644 GIT binary patch literal 3683 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 BD^maf literal 4230 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