From 470c178e4f2ddb319c81d7a98c2f0fb3fcf61e7f Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Fri, 8 Nov 2024 12:29:44 +0100 Subject: [PATCH] Moved command buffer creation/destruction to context create/destroy, so that the command buffer is directly associated with the MFSR context. --- .../Upscaling/Plugins/PS5/PSSRPlugin.prx | Bin 6344600 -> 6344592 bytes Tools/PSSRPlugin/pssrplugin.cpp | 58 +++++++++--------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/Plugins/PS5/PSSRPlugin.prx b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/Plugins/PS5/PSSRPlugin.prx index 558de84dacb976bfe0fb4638c67e81a6793ed317..3ae43a6021f036dba58e6b2c0674b3745cca1874 100644 GIT binary patch delta 38435 zcmafc2YeL8_xR3U3tV=0E|-_PO+qd?0wfno=r!$Vp$Cv6MWaZOj(`-w3q2tqgaC{5 z4pO8WiWCI}1f;3-CMdy1QJSLs-|X&P4)Oo}<@33nH?Pl|x^MR`^Oj67%w(Sga%xNB zTg?)uyboMveoAL7if=kNE;G+GhM^{;^v8meCe`8)IU%K2;U~@Ng~l=*LmW1hDSXy! z1K)3K;kxEAqa{fl9 z9cHZMo92#WP9uI&7Gg7}k3E$+eTS;$l@O+7?5X1S7=YUICuJ2*YvYU`iS;|o_54Xp zQ{JSBs-$L{G2fZY7anO-&o`CVy*k1SF2ovo#bDj5ADLH;nX}BRF^uV)32XVLog@5S zWvaTzu0^j@E$>>Gma%J#7coHfim_Bh*P)$(a=UWTvFF%`v1>Dm=Od5qDbpVCRMo^3 z+*wOF?vd$LG)JU~5{e#HTf#`_goCIMUIr<5=!Tf6;@Qsb-1=>yw!`WuEGoshWmK z&&+E|GxPq;obb65-JPvszYHm^UZN@F1xV-eG zkK;*)LgAG%;mhsV#f^`nYv(ibEt!Uq#l?`EPjhIlXw@msdSdYw851DHa#wv63byrpnqr&w~TaBrvbmFhY~ zE*E<=uLGNGM~d@MKkG=Gz}y|yM~KyX^EFyXJ3DRP_+7JxG3%yp3hQ=`&1nYyTtO72Nq^^DbLRhFC5vW3Ew)r@IaR)PP59iw~o5v4WCzB>kX!1QfA@(tk_a9 zjF@LC8c^7@Ya9MMd*QsUiG2M5g$KJ<0el}TLt^uoe7%V zTm0<#^L;p(xZ*yq7WV3vRrkjdeAP$APue0^-lTcRm6WgH=HR_Tx>4=IK?)GH?4VjQ~`c2@X zq)B76hMz<a@c z9Yv?ZW>x<=j6XfMXmt zG_*cpFT0{gXoTC3?A$)wQ@G*}|6qalVe9+gkSbn}RUOtNZ~I%~ieGuiVuz7uN{WAc zjJ15z;kW&fABqCrudvrq$e5Ma2iTl53~Q(a#|?tmOYIUwC=-P?EAOYt2R*aTWfva}2+Hap9O<75Gt$C#>2vWz{Z%A09sj z{21|L!jBn07W{10zNBTR1thm8wyao%B~4M@cRcs`QMK%JRAO zl&MjYo5U*{8McOULMwjN3L#o@`Ce&o|M?J95>U?fN8RWoqH@sacBEVJWFMd#o}2u} zqY=Fld6s&y!Ps*pJe>$r!kjyV^y>}pKldQa{+P^p#63fti{qxOkCyO5@ngeJ7=G;d z2`^e74Ob4^I9V0qR1XlmuN2$_hqCz=gp{Hv&i=Y7pWOln|J0ydyakg>eS0vy-d){@EnbvnXA~}ay;_Q#FGd6+pL#^@pQ%hXoOb2sh6kNO2Gbf?_%{b zT`zG>Q~&(l`x`z&4}c|76JMv7U8B@`b#4d?DE@USqm{*a=~w74{m~j6TePRAV{z#& z{+422tAG9$`|JLe`|JJ)#OnP1NU-BI`^(fL)R|Yd4R(C(Q%5Y~{Sm^mn)>ID)KeU-*L#z{n1nhI1~QYaPkLdxu%)( z2T2{wh#MTM5jOE*e~lm0uLi6j^C4+H7|ooK7-}hAnf}Y2@2z z>&z#H#eCif8|qpq4I0XEiIJS^vGg}$5~J$G7TO-SLMZwPiQ8yP1hM`NT=M9LPB_}XZBsT6aSxfJs& zyK)ZGGNd_m60$DGYNDT&D`%QzJ3u@=jMgVo@imU~^fYq9Oq-{_@vG|`N5qqO<%DrI z&j_P;i623Syk>0=>ZL)BzjgGtZ$^xZ0@c zHqRw~3vv;0&vhST{=nwB70j%*5M7^O%l51y6|ShRC%$K6Ry}J;CZ9OQ#&|p*kt{xO ztc?ZBvyOD;h4*cq3xu%|aXDT&!DsW_AdJ_K$gz2TB84i)2E1bYv0I)Jty?r1?2zX~ zbC9uUeZd(`qivafn-nR5Z8K1jcOI@O4Q<;>~wi-{TQ`stgDr6 zB7>?WxQLbYxu<%vtAma8lBb5Rnk(DJ;^L`U!}W#+)vDuqQ-f+ZaP`ojI_a*rG^lPP zPfy!F%!O1wHmR4*(~kK=#5}aYCH1y>Ix(;O^*%OFH)hjcf7|AHgPHT!eSK}7Ucrcd zHc!9cdViZ|aBzKq%`-f>KG5bF9b6w|^Z0`6gKeIP!Sx|F&#vuP0}l9--m!W11tF4# z+B^qY+18}5OITP0ICq*Y>AMnK8MfZK z^Q}o22K&$l)e*|#!@1LKN!LplS<5(ghAruK364dcb9-$`zm?!vUvch+wxow8I2Jw5 z-N=^otOUoR%tZ~dCK<>F*lcmMx;8~Mwk3rS79T_~h9|rfAuHvXtCjWS4amYGj0a2+CrdLo=cF#hXRE=;vePxsR>Y9e zv91NSDhyX9!L`tKkl|vJT}x~a7%r}kYpLxqgW}U&D>SHFBiBj|Dxc|ErM9|Kg_f?> z8kCUbTBAXUuejD~kf(FfN482;nPWa8mclKcOKNGYlwwDSh)%q!qna`XZF@~xXRGvj z5V?$>hhvmpL6izFPzD51s+LgJ+bYe_C}!2#A4PNSIZqH$si?;T=i4UIO*!${854C% zB65hGmreE%`Lsmkv(f=h{zkga$tM-_6X%%!$*|~&vzssRw-})_HqU>Odc;mrnTSbz z95_im*=dO59f|kFa>dBWzy~TwJ^uRdTD=CVvy;>xbrA~UiNcfAAQC`wQFxRpAlN{k z#>LK3oI^cJ<#bZdQi;r|m^$o=1NNT?c9zme$od?sc$U)Z}D&!^7Fj-Go#?7_zsJU7Lew3AGbAZ{WRP1-IJ z#q@I(LmUoMM`vbF(bdMumcgEsb7d)g|8yo>+dA2L&@&>|)lOOUr?X1q_8KCVaD1g# zG&qhB-rdsLvuvG6!igz(;oOt0Ju3#PbY}>fad&X`tfJu*`7h@r-)p!vIt5o^6_Z0C zuCTJE*Q6Zx!IsuYVG>f@Qfn@mSPK|PTN|qil8Uvpj%sOjds{C>ytoQ4T$CueTb0zc zMLSB8+c_uOD6yX0Q>64MB)`{Q7y ze5-p;5K|PUAh-nP4{mwxV=e6h7iAZXb}7V8L+v(d4-2>3o%Zl(2$y03l%i+O7+-`m zhKm|zbsufb#6_(k4#|BfNO3+>T#YGiWpv+dX;0L~Wk(NG!C)>bUUFAy!+3QqrkV>Salj~4mE05BFg9I7HOW0a z$c4251=Z1oc6ulSosq-3qlV<3*M>3bDr!pZQwLLJ?i4i2M$y%4MQ zMl2UqTXJt~!x(iPbtHFDkQ^GBjCs_4_oUYCRSttjuqkzp5evh5fZ!n9q-Hr12d zpSSTb8C}~{tNVD6w)X+P{RlQ=&;6MQ_?Xfn8jFh z;S9-b%_^BGjRL}66#kG2`v;g0$5%ti9g)R&bm>)AcWjXKxPWwhjKj)SP!Bt%mNgb? zThq~eHW#(p>Q2gHY`TIKR(H)H1)m2L)IkNC{R)hzAcVC)l#5zvb*E=BK3&6NtGjuS z21B;L_03Sjr>&qVx{ztbzHB66e>9eI3@nZYE^40D-64yy>x!C4?l*%JwG1d~ijg?p z3Vdv`*R$pru|+scnU;w-STiN};4H?ht7#^=M+d2y6;RV0)tqmo&Q@H0^r4C)wT0xK zl*QO|1uZ4_j35PUE#;zGNp9bQte_2~wd7v)5?33^y(O3_7gzn4n8sV(hl81>Sly>z zVj5?4UkPUFZgszP`z5Y1R`>70TzOXa-!Cyuu)0gN4f1@l)opKEGUB$pf$dYbqCZL- z-AW~coP;|~PL7L!reCrxhW1`7;IV@YY#9gvBP+C34HJP; z?IgFSE#ucU&9}O11ZnCL(3FCM<{9oZtgl%wWJ&`zqq)l zPLg{{FjHsAUGNgqtCD+ZFjE)Fz3wHZu9ACK2@~4yCbTV1j-0J#0Um(2}U2p3MPmX%-|L*P*w`DhmKr1Scd5kx*5Lf@(rER2RxX4Iu_<3NEN6;94ZaK^*}Xgu22wycHM5 z6R0mtAkaXVNFYU+M8KCSOeT;fOd*gi(+M;dJ|NIUm_eYa zFq1&0P(YxWFq=SgVGe;7!dwC^1%*H>VIG0j!iNOf2=fVK2@43c6&4a`CoCe+URX@v z6=4a14#H9b9ff6h!zcKb6X-0gAn>ZNl0X+>6@jk8Y69JaH3Yf~Yw^BM_=v#k!a4%k z!g>O42pb5zDQqOrL-?4$Tf!y+J%!B#dI?(y^cJ=f=p$?+@V2m>Kwn`8fqud#1o{g_ z1O^B@2@Di=5f~)wCNNmoLwqnq_>{mq!d?PHg?$8u3Hu2Q7Y-13SNM#;2;p-ABZY$m zMhS-qj26Bi@SgA`fic2i0%L_E1l|{pVjP992;>OI2#gbs6BsX?ATUArn!rTiB!Nl7 zDFTy))0poR&Jf5I&JxHIE)kgO6N(As3wH=i6MiBvUHF;62f{A|W(fBP%oOeuC=ebH zm?cc$p-`B}!)##^4|9acJj@lQ@Sq5}Jj@gFc=%Ar=V87ujfVxobRHH8Gk91e%;aIQ zP{6|yVHOWdg+d;d3A1@vF3jO!g)rC0!%9KnVU;kCht8$06%XfyV?10Cj`MI) zIKjgu;cFf)3nzKFBAnvks&JZzYr+{Gt_x>*xFLMQ!}r3sJlqt%U_g?l{w zBi!fVx$uAoPW+t*BL2YxFFxeKAU@*3C_d)FBtGH6EI#GIBL2xki1-%|rF`Nu9!iUU z^I#SK;UQFf&VwN0!9f(q89)-p8-R)v3}6!{8X!!ZWB|K3*#O~UfdN3Ag$E3=&;Sl` zwgH^t90SPWTmwXkiUFd;c?O6UKQurYalQd!#09wEi3<%7D=soXoVeHkZgGjv0AWJSPpssk+0QJOM2BQXFT3R^oUQv=(QXpp95)f-G@?3EGOwOwdkTZG!gV zMiaauZZbg!(YM(I9mOps=p=q^g3jVMCU{l+)&yO|?@Z8DykvrI;$;(b7q6P&HSwAW zUKg*MAX~g)f;YtPP4K38(*!-lhbDMSd}M;2;u90}5}%r&xA>7%WaO!w_+z8Qu{mnPI3n*$l(PDP|Zh=9=MM zG0zMm#HnT&DdwADlsL@{qs8fFcu)Mm3}eI@W*93LnBjeKmKl6vp&4?-d1e?VE-=G* zaiJL|h>OfHQCw_>N#YVSOcs}!VT!oI47omWr5WzGee=c-3+tEPs}h!++~Kj;%+l2;vO^16F)V>hvHr{ z%oq2YVS)IW85WA4n_-c7&_hHZH86i zDKo4VPn%(lc*YEC#c#~;k$BDw>%{YBST9~M!v^u988(WS%z#SELoYi8IiUN^%Q z@rD_;iZ{)$P5jXe+r`^v*dZ31;S=$W8H&W8%&=4Z#SFW|-^{REyo=G=Bi=K^r{V)M z>=hrHVW0TO4EynQ3pgM?F~eu#Q!{)n{$+-P;@@UCB>rQDFU03&_);8afy3fN3mg$A zS>UKR*#cjQQ!H>y%(cLAajFGQh|?_awK&}ZC&dpea7vtMfzx7v1W>}PT>L0eI_lC0y~?=QeZ0fn>3aJ z`!nq_JLuiO3m1iV3#RlyT|4td;mv|AUA+(ZQDu5vaz_O*9UkC6&1d`Y_?(!AIVpQ@ zVt<$2ui@?58z(ed}D5}6)N4)i}pUxO{ z6>m!J#z87F{VIH15A?vBrriPHU1Ld_2k(L3lH6J8j91svQ*w6+(lXtzh3kb%TIot& zOmOs;+&$A7qpqS4W&?v%_)Z0M^g|t8)8K8))AVJxA;EVN{Uvu!I%Czf43OMYgS5aP ze?$hNl3uDKvHqsuedi#_Jtv(p>EeSW_YzIq$9j>z5|AH)@*(quMyQ!J# zo%hUiOoU4AZ_*i?u3?nqz8YlQKG@&>(Wqb+^Iy*rVUKFJW7wPTN$xx8j8#`MMsok| z3)0d#pk*v-S@cpA-L;U$eL*VpdvZ)QPQjE$24mElor}qC zO@%i8P6l-3qmHB60La5h5DQcBst$vkY%XdVj^hl*tn0yi#*!dcwCG_zV|{R&F*CB` zB__;_e8!mYS&FvCOqblpg1Fk^4K8K@B=@%&4AhxsU;;0QNwYUoa{n4^uRwA?4q{TD z?ncd$+-9$OldqX8l-$&dV+ZZ4Gf?B2ExBF6TyrFMBIA02X|Ck16U?MYZtqJ>^CWlM zV5Scxch{Gg=3}??4d%jBz%Z|x3edd7R6wbQ_n3XPjxUQmkm@AllL`;;1tR?B%L6H4 z1|i~C*RaMaGxZ8R>BkiKF&7v{cxX+SMXn;K3DJ{275zKvF^(J=K!3QzpFR*CNeTFj zJwRgb+8mPVxGwM&z8t3da7c1p;fXkuDUz^qRj<&Iehj{arIP7*)!0L;>pDLLL5594 zLn@>2h2%;y>+x5aRkOaJtj-CaO7USqT%53% zMZ83e6ZT2*<$@5Z998`g_Dk^<|39PyQharyjT$w=n1eE_j2YzI2c`19MAmBYZN|h!OvB=^osOG$mV?YKl-Ntm0EjBr#6 z$5ea*d?h8pF{zUFw!^w4DK*o#G2WIw;1ecKQL+jVk%69}V<2mVyMBpl_yN0L6vZn8)Sl2$@N~CS*m+Jt} zS#L#0$Lae3K*MQ>s5o#?>t1xVT6thzHB1hZ+5^LQ|8(zopA2*OB zSb1AFh8{$ct&#=~CUvY-eGemU2uZivH1HkL$Qq`BLrG>Gy9N#;u57+exKy2| zR(Y3XStD%h#gw=aeF-zTMG@|+ivef+pS?U3VWvK_%MG-L- zFO+fWS!(sE#K+Va`!|75Y6gK?K%^lc(NaKZX|Pc%gwaqR*r@>FR0NSR1&F2*P=-1nhC0DTWr(Gb5J#iHO{1YKEd%j12Fg(vl&7&!fyO}sbweU8 z3mzH|NwgePq~)O!tpJs20#u=ikW4*Ll_o(o>Z=CTX?3VUYd}p}6KYY+ZP%ul)~-V_ ztzDO58oM6FG3kn%xhbZ#TT@JHx1pHU&Z3ysZc8z( z-Hu{fyFJCU_A3;#+8ronwL4PGYImZT)$U9&tNkj)tacZQS?#VAv)bJ#X0^Lh%xb?z zF>n1k#k_Sk#k}fV9$m=87>dc?u@sZP?^8_v`lxRy4>=UGzvC!of5%hI{!XBn z{hdfL`#XtZ_IEPH?C%tc+234>+21^h+25&jJrDU5)4S6srgx{)?L2%yF}*v3ViI;H z#T;w_#iZISib=IXim9~Ow9p81=o}-=rSpuS(3M7*M_1wFk`L)>Bh063jIe;NHNrx= z&IpU>0V6D?pBZ5Z{oDvk=|Lkbqlb*JoPJ@174%CZtfYsHu!n}b!kv#)?6&I{u zaW){>1sAOQ)Wg88B;5LtzRJLExOP3)c)R1;#o1I9uaN|tr$6I7orLrB9@9D{Fi&#> z^E8iV^E5w`%~SSv9%Y=`JoRaJ8b9Gg#aM5}DX@*!g6*_6?4Whv6IvIFXg%0T>%%VE z0Cux+xQB)0Q`YjmtkL^eqxaKGMmRt(8{sp0#R#9%t426TuNmPG{oV*)(3?j1lI}6V zVfv{Fj?ld(I7;`K;4A9eZ-Qg=kO_{{FHCTPerbZQ>0uL`q(@9}iXJt=Y5J83&d_5f zI7^S4;2V0v1m9B3ZGJ~jn&2EgWrFkcvEaN$LzjeLbnj7P z+_uucso{#-;o?f))xb}P3%m3Wq_!f~2ig+a2D|ik4a_2ZR90wQTf&xHu^mQTeT59W zYFFt;nub02+O6-g27gLO=_eYvm++;ZYT!O%DE+4f?kC35e`(+WVk&i-9jW3zNa?>d@SvlV-^oKHw$wK&>ldy#bXT+)Cm}vA)TmV&kdTm2lLn^{ zBMmica4O-$LoFJdPDn&(hz4g6;s`CJ!Cpd~p`|srAt7?8Rf8K55*d0!+nyT}5)~S% z;hPXXI#ggV?!Qe5AH#*SZ7<$N;=TeIU+9dq5s0$!5N*S3Kfb^jV>5xvW`*2! zPB-Gp+CuF0L+}iNv7KvkRjoM37Ez4we4DFU#Sd)}zaqTY=Bi$Ckxf01+zulyT*Q9} zBk*Gwubolu8W5?x?v^VgxO(w$4{7(2rh4-*j3oHr_b?9r2qW54SEJpSpnU9>yZT&B zz+@+2w&TMOy8(}2u@GX%z2g*nQQ|Z^fR(c2np)bPYXqwuSJF^Bu19Csc}%e5UASn+ z_pk7vhTM2k!^b0dR6`*=t0BiZX(?jPGc6aGK8b0*C@q^}P)}{>oy>7IJ4xt*u5suh zy2pmuJUj0yT2@wW&L_IY68O;0!F)T>TDsUyT)3m**VdDZqpP_TwSybAbZDLwHbo!tH2yiz!J^^ZqU%7h+d$gZz_oia#RD?Bkj#7Ca89w zh{~QZ9AU{QO-e$k4SI4**B{5+$w`n~rzcDTH+oan?@axWlp(R-k1K5r;cx20G=%A4X7H+XQjAUp7*{O_U{{3-`vRNY3<=nsG-{+x_5BbX$G=TLpHDH^>hvGk@XvB8(sz4g(qv$ zuOR9~W$+*F&EY04fep2e;k>IU4;|1Fj}{I7V7`iKl>(1!2UjEyU672i)+}~IQqeAt z+?V*`Zp(Q4A%7Q6dGl9(#CxQPH3NC`Nj1%w zH&?NfYqGp~LCtJr5qsi=i<)G0FD$83XFej;LuhHtX%DK&W)56NSFeQg%JPbG)r1HM zUz6!;b+4((c*VY|7EIV|si`Jxv^pkil)oy<{i0=DjUsW?iNe+Aad;@_dKxZF9HftRmK#`KN`=oP_1?+ARCAcE(j<8d6t z7d@yUuOZ}tGQXDG-L_e3RD(@8A~s}i@+NIlLTbyY82{K`WIK>S$E> zxM*!{c?C~aC@t&B<=iWnxv<;(x9feBBr+1;7ns` z8x3k^OwH1u<|y7)16$D4cFHgH<@&U`&1mu2Mb0h}J9b&MqS_7Q_QaCnAkMVZ21-GS zoML4I*g44Qdeu=-bRk9ljF1k>f;731Tv4i|%aus;qVDPPz;eFbk1%v<>TEwk99Og6 z7aUi?L8{yq7CWkJA_ot${<`-7Ny48IRmPJ(he{C0v0dlr`3LG@%$%^sQKh^7tu0M% zt)og)(y&BM+ACG5j5$7(Y0ObZ(7wneO$)1%$ny-39sHfGN~J&rB~mmAO@I@2I;!j; zO?Roz6wT-*OQy`|-%-fKg4GC$C0G>IX)KeT4f zNJhwyRDSFyyUI8aqib8{$m~r-hQI*b+sAQU#ob@-PxdM^`pYNWHEoC|okE>emhywY z#HoT9a?Q zjNL0G-_zxiHae0YF##f8VG>E7*^>WavU*+k*pbYU2PaDqo1-1cJlTOk(OKSE?MSxj z6Yq-BeTeMQJbaCWNShqVQ8<6TXR28RzXYLHf_#+F$14AUMkiDKq5^u^h-hx!X1WA) zvl-F+)DW8;$*py-Zo3%^bE}i?mde7l+~Sb7IFju+0Zu3h@5n8pYCpk9RmR5AwQPWK zEw?(lZgsR+NW|;P2k*$yHtBB_{fVR2Cyth{5^;>O=N&l``}Mnb zz5O#WW0iD_a#qdbZ)$y-J&IL+y}@zA*+?1oW?0o}d@kCbk4V5cm z@v~MqhskwGS*6`DM3z;2!{o^JFHUOz4CmfH$H$?2q*EM26_<>nKxJ6{66Pzs=AK*i zNcm-$97R-5l6+VB%BY8pZca5>y}TSeBprxx{}YDK7%i8qMRiVA9xlB^YV z)grBhR^YF9A!mAbt>~o|8H2Q9q*{2#X~k5vXk4fj3)P~@$I)834o@~CUP~%swbzo= zroEPQK$-Eb{8fB;?2r*}3{a7846LKp1|DFXZwzkEYHvmMDjGXN-e;)0onK}dxft6w z>Kew_$@y+xz#j%^K=@@LCFpvbZz)5!Lv$&h=^}!ilwt45%cDDA!S3pgm#GeM{vGT) z_aaB+);kRQTT!(!@&vw5T_zdFFT-!=g$j&cj^LMtd6|&I6ec8;vBum$jhssm79p;T zz_~~Zmn`&PP;>(NHxQw^F=dj`!F>!FQ-|}mMF8DlPrlUKc+Sgm;od%oo}jKO z-k};tjxxq4*NEPPwX}MSg^jrkR`nj#IF2dDeR8btXU5S1-}=a4P!3rnl?}lbmF1U( z=a9wHdzZ1|2=$h~#=^liH1&&xszZ9D*i%9;yJWOLrZfh< zr&d)0!+F`W7;lOXAC!0pG9LES#mk;>W{hQ32EC_N*~MFc)QI^=_*$wE8j-Su<4#B< z&AXPdZo~_|S&UCBCldC|WF)(&`3%6^xjOwbZ&{4 z4_K9bvp<7fyy``5#TsSCIJpdb!RU-LgZ&VMSG`yyK%U{F1J+e2C;;nmvvJ{V^(F*duo+kl*8lYeSDv*MN=lo zJB+^54%4?0;qp<}sR-7c@-fbJT7!-oU1v1tM2PFG27Mjs`bL9JQO;ZHHg-oCUY$t9I2Ct^Ou4~Y>My?wXtrnn>8=0;jH0b***N+izGu*AtuDcOO8T7+E*L@B8 zai!~l2HoE5`aR+E!UqBA`|(w zsCS;6OUPs8-c-3B|4ddY=F4tYX654z*gj=OzMM_2D);i`TH)+>IPh<174|DF>?w}i z|FKeUn!LludD*GWy9h5C)9_@Mwv$2Z;$^4BjHL_*496~Bc1+FK&T#KCh+Vt~S(OoT zNv*ADg><}tn0AQBBY3bX>m<09;}L6E17}84UOg-4k~#+nz+Du;~XJ%+-;rYnBJ>!$}?|NC#PJQ zuw@k`W;3VjXihi&NYiqDOl7BBp9ts#YH7k=fkV#RQJtM~Q^IcZecX_yI&bl472|~EspzuG-p5ZLpoBY+?C{#79J+u zX%0#+LHBg&2G(7rsQcUp|P|4lCMjEPm1F(az74v{MJ&q`MmrXlw* zb|vGsr81>J?(dt3*jcz`>W12~(VR=VYk^vZ#BnbXUn`@k-G{{9_?m<+*-?{xJzj0V zB_tLs4G{G?mVHAdK0#u+l`7Fx(5I}^rHq&*clV_^L+v~pw&*|)wVfSD-p4_(T2q6w zysKv8EiFiMkl24+z(zI_aWNWP3V)cv*ctIy>67Nf%9~h0ojnJt){mpu_bW6pW?U1? z?xwUal*4?FkQ)7>QWWj2Egg2uth`L@gR>p`BpHe4Rt4PYsrmYL1=VOPBtCkPsQY@B z7qEf4uV!p{JMz7@=l#a>+Y()y5zu${6vP3fnLyXr2z&JeY>m3IFn726a zu=$vq34Mj{p;ho+zVaN|6>}8@J01(z&(*Y!8mcZ9Q? z$7PkYU>P==&8xmnOrWqd6`OngoK<+DCRKCE2P9FItB-O$P!k*FJ{-KOwN4q9>P$Y% zHXj`FeflGO9!;XT8AKghorVO7{ohhE$wbxInjj~!XLKh!`<<-9yv!=`()-aVX0w2x z|Jbj$Py8d#Xn+#I4Gp^)|ErEV@hfM(8|LFxot)AZG0hthVw97&%cw(GJ0)}_2R zA2a_Ip5l#Q$zr9iWFL|+rm0h7q;_2!klBqLfL_ceMXH@1NKMx@;^v?)@+7LiRjoM2lZi6Uum^KmN9wNdx0EFoquxN zANuBjo$FGR1#&{mEX499SpB@YghZ&qEe?J^-Pdi#kx?AN-aWc zaS&E_W_*}*L2V8jv)DGRGGw``3#V{4HvWcbzw*{XIduT;ryl=)x{~Cn)|&psarTnU zkNLvH20EpWEqa(%>2AM+tPNgrdo|8&*2y!GdaOi|OOY1IUiv*^$FI{m3?q9;d1H}W z>y3nGm|Z9t5J$CcTt~{PE;T`FLtO^L^Dt5kO9P`t9}k1;E3FsHPTyms+D`|lU!yGBv-&z)EL78&-tfP1<)FxsOSb4E zISEnmB{F9<$F~wE^QKcXq_%pg*SC>0)z{ugy<6gq&+iWQ&@!VwpSI&`ZLD3hkauwj zub;KPQ|e*taSmB>$qsEr?YI|NkL!yPM)FClfne=4fA+b}@WR78*ojhg@A zxNmgc7pKn$s(%>S>@;Qm61kGIGqP^~54Fm*CF<08icG#DWLmF#hW)5}wp-suzD4SS zm#BM4j_S+rNcH<2wDw>C0&ah*_esoi+;B?9zzz&R0WQ#kl~qgSuwI!+_5FvZPU)_{ z{rku~)#gxS^$(X9ZAKgPpzkOBRMy4FYSD*iXEv1zlGR@mj`Zrr}&+rmKN*J z^?s2!!rj6%jJ_oHR6bZHNBZji3+r!+c!+-;_ZRH-L%MtquV|y>OVU7X&K9KNnWeGc9d>?0V~5Ecm3$J(2lYb&b|gC_AoYko0Dnd5!mk2N zQI!76<#ZoD@8gyQ?d6)xaWX>H*cGYwOKz&aM=FcN;Ni~O2(q=TRaox(rUnT;<*>+41TlEh<0hvtSJ}{r#c}96Q6tgyG|6_J|R?{8xQNJ%g;$ z7g~66anldUzv&^mr)00j1E^>s+?7uPePB|iua+w|>Wx^g?QTa{I|~t6MN7a-dmLe} z>KHs{RzN~7xu*}+_p#O#Kl=D9t^B=Oj;j6epW$|a9UIhAP$QeQB3Zw)?`TBwAsmCKObif64{ z8(-qUqKfk`Qdbr6SP19X6=-R=^3hrp>7abE7LVgO$~`8zm=)lAt~cpZ6xp>qAfi6r z%Eh<2o2v>hBK3q$#rW#faePIU`UI)J6a{2W=s$MUh_{?o7nPzIaBR$Y{tcD2YzV$| zxU+;+S^klnK)WKgQZV-7M{*RMjMx^zSkpS>-G|tL!Pt~_$a@E|(}J;m*2y(#*rm#xbEwQ{(!c!L~5 zYAb6t$Yop|@U6L*NAyBoI|2?>#Eo(U)OS{`OMbnfdcTOTq}o`lk|Kghi*@ryt;!p# z(N61)a!Ar`H1NMSi=})GRijNAw^1%ru1Y8_#zn2{aB7o{S2vxU)-iJ`m6NbzxJQh)q3>*4pjzzEJu?lCI4ewkm?GAd#J0z zS@nyu^JDq7q&0|**3C04dWr+Ff4(zgcNn74*n0f>3mXrom5fao?7JvX_eB9@+Q|1- z+b<|%k%=TJ3pUAR@xEsNCb^zzsz|sS%92eoSR>VUH!v3c)0CLaawU2hX>E0Ncx(EL z(si@kynHSE0kUZ?8o~5_A2S9}BqNc48s2K49NR3%k}=9Jo8_9Wttc|%U?AlBcE25e z>4`aiN=e@$Cz3yvzFW{er;>|>s}@Bo2mURxlaExJ@``eZiM+4;#)`Fyb1O=Isnpsk zXOIwOqN~!Joe8az9uu- z>D^$~|K$7v-%n4d@aV*F%GFO58khM zOb;M64XMZUKE{(E8+qvHF6?=zYXi4aN@MAy+Gp3Bm^a+?DEpdmodfDQX4%JgddN6TULay{T0BL!uWc=5;@kPc+ly7 zs@5!B?H#_KDrj+(sMQ6z+2kiJ>K!A>Bl%N@z3Cjn9?+^!`Xc6#BP%>&C;|r^ZE1*!wheXdb40nqwZG`$CU=V}1ui^SnQOb`vgMe}bw}5=5rDuAN7s!Js}Q*9=oT80bpfAw zI7oJcSE;aD9$~M753C+Lvb#laH}JWHgLI9+jQDOjvK)Ki=1u&G-oG5|dFz`tjKUy9 z8Js;L6fy!K-Z^rDa&NcXr1W8|m2yU>dygyWd*pH{53ru5zHga=A@?@Ch!^(o*jpBF z7BVP~&$N&5zEORu?EM3^d-r48)Mu;S%F6ORas`X}0!52!%BekaoRvMX&>ux8&-Tb| z%q&6UJ*2e#R4!BbFQ)Da-Y|II!^4yJ{4Kn&!?brRp0~XwJd9=Bz!Q8 zDAB+f!py&NoH1;6(Y=(&8a%08R4zR-l$0)mG!mV}hc#8|XGAt2U6hd-ksUA_|8+)W z3sO~y^hWkVN5*+0Wm2Rp@J6PSDavJ5>rwQ`%Zz=iK%>Zpq@(g`qsZH&r;^baiEWjx ztk|mzZyebM_u?-aM^=-#20X{yjbPu_v7S-PO(GwW-;}?bM7|q&?t7m5bSl1OgkN>9 zd={fI1J5fYrb4Bs%Jim@@7iB?@LWuzm1?l8tg*3!l!(m8>q$mzK+KFg)CCqHj5lhW)vN77P-kC+Qehv%7oI+>sc>O=^xo(Bw1B- z=vJgUCR`1p)G^VkNtAy~M3sz*)6JrAOei=esud+RkGf|G42)076&;Qrfb$~^2ZT~wvuq;iQG-sG)cNL_GSkYAhOHh%bqBueTMbtb| zuqz4}iGm#qxk)ULn8Y303KJx-9BLz^`5kgnEHDQEslE)X# zjj~Y2r6`MK!Nps1p6rK+v6OqZg7$`2vfNhWWw|UGrP0@GhBiDgrIE2wRUln?_*2CsB$~gBrhJmoT_o@(W+{gkjl5z_Lf7*4Skc|LZ zw@~Qjiof_dw?gm@Q3EN&>h+YO_m42?yY^(C5NL zE{Ik=7dF7{QO&B`6PtCnGrk<$E-<&N8Ms}@qwh2etGUwZE~4fowS;*o=*s??;&y{- zA~(0zTS0DDB6xAK17iM7Cy|-xM2!lf+Z6}JX4;(9stPeaWimcf<1c~X;P!1B&Vw5yVY+#KgAyjN>EDowu9oA8= zF!5tp?`oKMjr)=A3>T~5+};r)Yph2i#3cpl^qbo`p0wTGTx1(X>`AD8sK?X#h&qDE08>{(_U%33O6Nk#%nCJBsMss9%g&4F~Rw z5tCJu6=8AY2$M<7WHVU?CX*D}x|66iWyaYNK9!hH)eL+p<Ljs{?l~>0jePAHQETL8Z*C9DIQNYV1C9LqGphM~&NA~UE6<8! z+N(9|N(sCbj0KE0)@zJ0>no zaoQHdkHgf$)m>7Dkzt-vfisjp7AT!JXj2U9i{V6hOO!T`26ms>5?-V}+0#G*rlkzQ zTEl%Pemu_Mp#tK6O{tqBt>d`+G_hEU;C$)yV(CXNo@ULHhH&@jHk^FEisVSZl+>Hp zK6D=mQsRG4G0m6o?#W}NtW-*IFc|Ih;zB9Z=NZGS9h%F8XqbP`rURw zFGSinM$y~l()-v9T=tsup25+dc3K44yJ+?zsWaD(u302a;{257i=<6>m6mR-km|UT zG_6wdgJ&jGO1az_dbU!U!*!(zOQgeGH~M^u)SgRHLYGS4vAD+e>ztKR zI!^nv)32)~fwod;@HSbsSh%>?Zh=2L z8tuwNyLqBB!u@i8^XwM4FWd}_3jBC@vqcWvo;$$&-)^@gnwi^O2AY}MGjM8g`?^^m zT@F&__5%aWs@tQI%$nOvQq3>i{yGz)VLqlxs<{>w8I@)p6{c1s*v+$hEsN^IbIlc= z80PvfHSZY1c7%U2r^9&zel{1G{uU^m5GW^qH?u&Q^dGYtDBgdVS)la!!^{F@+8<^X zDBt{HRs*HvPcsXYj*Vs(D2a_`7ARXA%`8wXO=cD--!z$7pg27-<8IC>iZG|C90B#L$wv51-u%Ow(CP62gEtn)% z@3aOAY{HYb5)H6r!lP!?2~YJ+E1U0huKeFQTA0$+U~T23#*Z{D z<^Dmm=m+@mV5BU5GM%kz{4}^&S+^m&T3P%!x>;HL48uu{A8ATzZ4Z$C4pJ6Bd)%yQ z{Itg(RjA#@93QI|KT_?`=S+x(`Iy%ESW~zt%C)vK|8H$=RsEmp3u(LPJYOsG|88F^ z^S|I{RsDa+-&&_BJSd^{N8lBRpB9DbYXMdk4|f8rddDHs;y`OHfbLTT7F2izRms^a>+2Ovt12B%o;1Vvo2%P3hS}9Tu+)^2U{LccGX#3T8FU(ikDlv zr+D(pjs=tXFr=|Cg&0)MNS9ol)#Ev~8Jp{a}V(A2fw z!cDC>9^O?s9^UQ8OztIR+v08m8o6^756ZeL56WUM$8i(riDR+TJpb9JdF1m!dA;r~ zU2)m=WJ)I zr#PRC^>peTLktdvS*G7=jQppi1{>$fAK=F0vdZ8@IL;xOI2&62UX`zLqpR>rp=I`agGHH}Z!|O@o9| zJ6B@*+{hm^j53vfN>6+mE6`2#u>pZ5KSpmnYrMWoy)cb3n#xVG={#LfAKTY$ONm<7 zFAU@PEwsKq_NCsQW}Weu2F_(E)KJMjH(odOK4KbuUCkM+-o|M8#Wi19(!t0-F^oDw z2VRV|2DF8KMZr3o4Pa9>c%%fRzDWI$`XdcMdI>2JX&}-dq`^o@ zNJEg4ky4OSkgWExm>_|`R)ab-__2RqLaeViUj(qHKp6}U#w+nnP zf$!ao@6(Zwo65&8bK?iT!|{W^GVn>^O8m}rW3_Mc`03LU3SOBoWpe(M8Dvu5nd8Uj zPg61zMx1_&KFk~CqxAb~1m5zUo--_e%DDV#`P0(p7Ue4yUyt}Gh}JwEA!Q9L1`AXvCCPX3R~THl}FeD|yq? zhIdthPLF(MP$K^|($C^PJ?Fnm67G*2Yf$$5Jo3T2KGSn1L(k;=$%WJA_AMyPn>3wh zg7>b@xNT6jugh59pPsmp0d>E~n9o&Qy^*0@y)o+J^<`ad8OY~73`Cy9kzYc2;(E+L zCgA$&U~Jd>8px^pgnY7;Cp)fiCFlW>Crq(4KyJe02m3_COA z8FVLu2$=;~IPxD+I$Q3Xd@BN5?*P4vsILEK z9C?KD$V>xy2ReITEpd?A=gK()&VXZYphiJTB~+dO(q6dU1GFfh4Tj`dj2$d81yxCc zxW&l#LEazi2f(VY({Ja>-NQcztM5=lx4}H=(w`Mr_A}$qc~a@HrGKM6CkhU@*A>rkkOC4vh60%EtlbT?K!`_MtGu(epgn z2cv9*sY=x)arsw9% zp@FO5%|2jr2qe}}%uOKT3$)o<>RKX)av#vnC32kCLsWYlurh(M7Yt9+a+Law1^@3M zcPnc91;DeAcNjvCm&k1r0){{*gh*HD{SJiug7UYZMJISGrr31xEX0HfVN%7DRE*N;JQ7!^5( zKpYOrci`?qD0%=KH$kcUuuPAKJaNSK;vSUk0<0OZcC@(+(dI|}7szo#+n}`ba-Nie z@{Jul$p@z!;QFr%JUIi33E(gk6OOjn-06y{-$B_J!NDaBy6W;D%dF^*s3%f{ubJ zvc^Du+F&3%scoU06uIbM4}{{YN4!4gjY#_cYe`kEZg)zY%pRQ(ZhTuvCsm$+U7 z3;hP{23&81?6ygSd<1KnI&fq=R2*m|B%VH5Bu591oQ&=svf1qdc9(#ymDxRkBedUQ zIUH(DTC-RVb!Ioh*jDX2dU3Iw zh^I>YE98FMEt-i_;39}%cl|toQ1%aWEAZPV%mGxXkj=@aaGtyYW7PqC72)BH{8(rv zu0YoSk}goCRRJFU1-$GLPxAJ2LEk>|HdqQWmW2 zZeluY+7}#x!Qod_#ttq!fhqYp5ZpXkUMcqt3__)Az%>uJY$eDRhO1%16#7G@Z1%`P zw$;n9<`eWfH3lVYi5%nSw6>3d+^8Z{u93sAC0$-4M=OVF#&+y`u3!7yl zr(Atk#;1t_Dt*<7u}PaAhvcHR>W3{hT{&7o| zxIr!J7B8Jm;!fpyS9roZIJ0kSrcpCG)95-eN#x5q@^Chh~Mmv$2fa5EMq~mc<6*5PMZ`a{l zb$FT%|5oRdrt_Jt!@cNbXi=7hz+htH(Lu3;J#fR05*@xkhquzeq*{kp>2RA4->Sop z>u}vP1j{0o|4kik(ec01;Nher+6y~c1pKZOc za1y2gTHwod_yQe&x{iNbhsW!1eU(V=>Tpk;Pq>aBv`3XoL+{95WnHukDbkVRbfjV( z{-F+UaqTi4?wO(?cF^(PZNbOpCp+*ota?1t;qf|t3!heqKvbS8Oo`oEhBW9N)q|AW z)8QTU$XKj1wd~a_*ASu!8K9j=x(<)mUD;NLXY24ZT{-rw4m)1g-~uT^hs=%^?cxvU zt_fDg-jxpo7&h)#+BC}{tqu3~D}8-N`|)G@?bA>$P1lsNYaGZ#9e#6$2KUn8Z|d+5 zb-0rbztzGAJs&$-f;wcsa>#GAbjEOHuX5w-(UOZ{{C=hBhtco%cWK!Na5d8Hk(nW3 zEz5WI$~8M4?m+K|6+x9Ai0mr_>}aBUA~XG|XH@1u$4r>ko4y+94*;(FF6HI%Z%@t|J z`P@L)`%0{;L+ke(H7Ett@H~swozG<-yL)&(H;&s)V=m;zxfJe5S8@Mvp!T!5L6ly| t4a7qbdr*db;fL&Wmd4cM6hNo4(|NjwooeYrb_%937jbf-Q!nO*{vV(J?EC-# delta 38652 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 QYr`VWVCTaooXHLUH%052SpWb4 diff --git a/Tools/PSSRPlugin/pssrplugin.cpp b/Tools/PSSRPlugin/pssrplugin.cpp index a8e460d..aaf6e5a 100644 --- a/Tools/PSSRPlugin/pssrplugin.cpp +++ b/Tools/PSSRPlugin/pssrplugin.cpp @@ -175,15 +175,6 @@ extern "C" int32_t UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API InitPssr() createMfsrSharedResources(&s_mfsrSharedResources, &mfsrSharedResourcesInitParameters); } - // Set up command buffer for NGGC - if (s_RendererType == kUnityGfxRendererPS5NGGC && s_GraphicsAgcPS5 != nullptr) - { - const size_t agcContextSize = 128 * 1024; - s_AgcContext.m_dcb.init(s_GraphicsAgcPS5->AllocateGPUMemory(agcContextSize, Alignment::kCommandBuffer), agcContextSize); - s_AgcContext.m_bdr.init(&s_AgcContext.m_dcb, &s_AgcContext.m_dcb); - s_AgcContext.m_sb.init(256, &s_AgcContext.m_dcb, &s_AgcContext.m_dcb); - } - s_mfsrInitialized = true; UNITY_LOG(s_Log, "PSSR plugin initialized"); @@ -194,12 +185,6 @@ extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API ReleasePssr() { s_mfsrInitialized = false; - if (s_GraphicsAgcPS5 != nullptr && s_AgcContext.m_dcb.m_bottom != nullptr) - { - s_GraphicsAgcPS5->ReleaseGPUMemory(s_AgcContext.m_dcb.m_bottom); - s_AgcContext.m_dcb.clear(); - } - if (s_mfsrSharedResources != nullptr) { releaseMfsrSharedResources(s_mfsrSharedResources); @@ -336,6 +321,15 @@ extern "C" int32_t UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API CreatePssrContext( *outputColorTexture = &s_outputColorTexture; } + // Set up command buffer for NGGC + if (s_RendererType == kUnityGfxRendererPS5NGGC && s_GraphicsAgcPS5 != nullptr) + { + const size_t agcContextSize = 128 * 1024; + s_AgcContext.m_dcb.init(s_GraphicsAgcPS5->AllocateGPUMemory(agcContextSize, Alignment::kCommandBuffer), agcContextSize); + s_AgcContext.m_bdr.init(&s_AgcContext.m_dcb, &s_AgcContext.m_dcb); + s_AgcContext.m_sb.init(256, &s_AgcContext.m_dcb, &s_AgcContext.m_dcb); + } + // Finally, create the actual MFSR context int res = createMfsrContext(&s_mfsrContext, &initParams); if (res != SCE_OK) @@ -352,6 +346,25 @@ extern "C" int32_t UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API CreatePssrContext( extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API DestroyPssrContext() { + // TODO: this still crashes often due to race conditions between dispatch above and release here + // The main cause will be that the MFSR context is released before the already dispatched commands are executed on the GPU + // Just adding mutexes everywhere is not going to fix that + // A cheap but slightly dirty solution would be to run this code only at EndOfFrame from Unity + // + // Another issue is that we reuse the same static s_mfsrContext pointer when recreating the MFSR context, which can lead to situations where dispatch uses the wrong context object + // Multi-buffering those pointers will help with that + if (s_mfsrContext != nullptr) + { + releaseMfsrContext(s_mfsrContext); + s_mfsrContext = nullptr; + } + + if (s_GraphicsAgcPS5 != nullptr && s_AgcContext.m_dcb.m_bottom != nullptr) + { + s_GraphicsAgcPS5->ReleaseGPUMemory(s_AgcContext.m_dcb.m_bottom); + s_AgcContext.m_dcb.clear(); + } + if (s_outputColorTexture.getDataAddress()) { if (s_GraphicsPS5 != nullptr) @@ -366,19 +379,6 @@ extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API DestroyPssrContext() s_outputColorTexture.init(); } - // TODO: this still crashes often due to race conditions between dispatch above and release here - // The main cause will be that the MFSR context is released before the already dispatched commands are executed on the GPU - // Just adding mutexes everywhere is not going to fix that - // A cheap but slightly dirty solution would be to run this code only at EndOfFrame from Unity - // - // Another issue is that we reuse the same static s_mfsrContext pointer when recreating the MFSR context, which can lead to situations where dispatch uses the wrong context object - // Multi-buffering those pointers will help with that - if (s_mfsrContext != nullptr) - { - releaseMfsrContext(s_mfsrContext); - s_mfsrContext = nullptr; - } - if (s_mfsrMemoryBlocks != nullptr) { delete[] s_mfsrMemoryBlocks; @@ -403,7 +403,7 @@ static void UNITY_INTERFACE_API OnRenderEventAndData(int eventID, void* data) // User rendering code switch (eventID) { - case 0: // Initialize PSSR + case 0: // Create PSSR context { auto* params = (pssr_init_params_t*)data; CreatePssrContext(params, nullptr);