From 190f50e0a44d1fecdc7c9e442030cd5fe4ed434f Mon Sep 17 00:00:00 2001 From: MooglyGuy Date: Thu, 19 Aug 2021 19:07:28 +0200 Subject: [PATCH] BGFX fixes for various backends (#8469) [Ryan Holtz] * Fixed palette and UYVY conversion in all backends. Fixes MT07760. * Fixed a typo in targetmanager.cpp, thanks LN for the heads-up. --- bgfx/effects/misc/blit_palette16.json | 2 + bgfx/effects/misc/texconv_palette16.json | 2 + .../dx11/chains/misc/fs_blit_palette16.bin | Bin 672 -> 1020 bytes .../dx11/chains/misc/fs_blit_yuy16.bin | Bin 1396 -> 1118 bytes .../dx9/chains/misc/fs_blit_palette16.bin | Bin 481 -> 805 bytes .../shaders/dx9/chains/misc/fs_blit_yuy16.bin | Bin 869 -> 771 bytes .../essl/chains/misc/fs_blit_palette16.bin | Bin 445 -> 1063 bytes .../essl/chains/misc/fs_blit_yuy16.bin | Bin 1723 -> 1587 bytes .../glsl/chains/misc/fs_blit_palette16.bin | Bin 422 -> 1000 bytes .../glsl/chains/misc/fs_blit_yuy16.bin | Bin 1645 -> 1520 bytes .../metal/chains/misc/fs_blit_palette16.bin | Bin 958 -> 1476 bytes .../metal/chains/misc/fs_blit_yuy16.bin | Bin 1872 -> 1815 bytes .../spirv/chains/misc/fs_blit_palette16.bin | Bin 1660 -> 2628 bytes .../spirv/chains/misc/fs_blit_yuy16.bin | Bin 2764 -> 2838 bytes src/osd/modules/render/bgfx/chain.cpp | 2 +- src/osd/modules/render/bgfx/chainmanager.cpp | 8 +- src/osd/modules/render/bgfx/inputpair.cpp | 5 +- .../shaders/chains/misc/fs_blit_palette16.sc | 21 +++- .../bgfx/shaders/chains/misc/fs_blit_yuy16.sc | 22 ++-- src/osd/modules/render/bgfx/target.cpp | 15 ++- src/osd/modules/render/bgfx/target.h | 5 +- src/osd/modules/render/bgfx/targetmanager.cpp | 22 ++-- src/osd/modules/render/bgfx/targetreader.cpp | 2 +- src/osd/modules/render/bgfx/texture.cpp | 13 +- src/osd/modules/render/bgfx/texture.h | 8 +- .../render/bgfx/texturehandleprovider.h | 1 + .../modules/render/bgfx/texturemanager.cpp | 19 +-- src/osd/modules/render/bgfxutil.cpp | 24 ++-- src/osd/modules/render/bgfxutil.h | 4 +- src/osd/modules/render/copyutil.h | 115 +++++++++++++++++- src/osd/modules/render/drawbgfx.cpp | 23 ++-- 31 files changed, 233 insertions(+), 80 deletions(-) diff --git a/bgfx/effects/misc/blit_palette16.json b/bgfx/effects/misc/blit_palette16.json index 99d849ddd23..1f1e1747b78 100644 --- a/bgfx/effects/misc/blit_palette16.json +++ b/bgfx/effects/misc/blit_palette16.json @@ -118,6 +118,8 @@ "values": [ 1.0 ] }, { "name": "s_pal", "type": "int", "values": [ 1.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }, + { "name": "u_inv_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }, { "name": "u_inv_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } ] } \ No newline at end of file diff --git a/bgfx/effects/misc/texconv_palette16.json b/bgfx/effects/misc/texconv_palette16.json index 4fc8e169d0e..57d95e91fce 100644 --- a/bgfx/effects/misc/texconv_palette16.json +++ b/bgfx/effects/misc/texconv_palette16.json @@ -21,6 +21,8 @@ "uniforms": [ { "name": "s_tex", "type": "int", "values": [ 1.0 ] }, { "name": "s_pal", "type": "int", "values": [ 1.0 ] }, + { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }, + { "name": "u_inv_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }, { "name": "u_inv_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] } ] } \ No newline at end of file diff --git a/bgfx/shaders/dx11/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/dx11/chains/misc/fs_blit_palette16.bin index 3f7949c9e32eeb6a10d0c879155730029ed0a846..c32a68b09a6ffe646930c824a7b9f7110130c456 100644 GIT binary patch literal 1020 zcmaJ;O-mb56upy}k4~UT0|n_qhJrhhn1$`CMq@?;ts|L4(jug$1hj|*zbIXliApy@ zSN#F*v+k<9F1qTnf1nin0r>@!86>cyE? zmw)Gfef{?C`>a1Y$dip2KAD4G!GFV>;o8PNR_62YO*oD9%+ZSQ?Rcj@=7|>p^zY?U zh|?$tw|bjF*lah04XFn&gO;=#-FgtTR%INZCpD0RJw3R!WKVFkms@L%wv5N&dZQbG zocgZd@AKlk7Mb$Dc!*T%8!m54acuYO(Vdnl8EU@Mxr>Q0?w2GzDe2pAU&WsH7=Ul$ z>A78z6m!oZxh$Ge-SH5V8{aQv}Hf8QH@>rsGGFU_8@`p%N z?>v@?>HFDW{wJM}eGAUS*8I#Wr+=ZGW~Q#i{fCODYG?@hq(2jRP&GZaGTP(XHGD=x mQrDr?V^`?ne5i}-BIbQ&FnfQ#k9~7$q4_gf{~{hiMQ#8q%WHrD delta 244 zcmeyvzJOKHE!cybvH8}{!{lxo)rpLX#Kg~U@!wA%5z%+5&KG_f;GXTg71>!6Y2F6GR1{SwI1t5=sfpPLg z#^idCT2}^!?n4X=4bGvW3`PtBU|BZ-0S2J)3~qH0K0^Y8wqRi3fUAM2ZBPK~0TDoX aE_8V&2arsIGX#U!a62c@XO3nPU;qHo0V)mv diff --git a/bgfx/shaders/dx11/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/dx11/chains/misc/fs_blit_yuy16.bin index f3e17c242ff4a2735370dfbbfd756a2953aaaa14..c5c1a04503bc023e82552febfeeafc9a97973b37 100644 GIT binary patch literal 1118 zcmZ8f!DdET*W9-BWhz$f6^~AV5#QpT79>mFeAT~#E8+QkSq}ADol6s>a ztxGk!6UEY~wX0DSuSh>aPkLYt_Vf{EWqYDVV<}#(HKgB9)@topko5Nr@u(oyT?{aM z@29EkdykeMl+t_q5{CO!otsVgEQvEHsVVYY#+f-?XL~>b<`m%_d!Ftf7OXpNf4d{yW#lEig zZ~QREk*uIiM1nK1poPN*K#AMSh(e*gFt zn7!o<^^;}o<-k4P6?|~t$GzvCd)|FBVRNnMyc!(}Mn;NH zyF0yS-R*}jdh;cC9J*y+RQeJ7CkC@;=!k!<+Zk5kEY zhm!Ak@wszavhu|2+imFdBs227xF+{y?5VYfoRM#E4@6v)kOj1PSB%dINY}4mDwg46 zov`m?Hp30L_79A4FH#nn9$M_=NmFMsYjWLyh-8qrvV?kDz*EnD(co@~9gjexy0I%sgH}N1x@&=ZRcn8s%$leeM)%Gd$-@cQsFU?!(w=s^T zmZO5v6pmpL%I#X70#;&ePY=qzOtI%2H!X&-pI?7ew4Vs&N~wHmP3JSlL2iwG-uaZ| z^IeHyUDQb4iyU)TKQ3w=Xepfg!}S;L@Y_N~we!0gSzI_{YKL>C_W#tPM!k2&Xi9YJ zy%j^<#2j}wi-|Q`%s(~j|45t@V8VBy_h4Um561K!*F~oEpWes2vQ~0eV41TR{~n(F E2BHppCIA2c diff --git a/bgfx/shaders/dx9/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/dx9/chains/misc/fs_blit_palette16.bin index ea5991e396f5f1449f7164993e967292f8847fee..136f81cdd4791948c6bdd5b9bc6d4c6e26b06e2f 100644 GIT binary patch literal 805 zcmZuuu}%U(5S_gPauJhDFm@(hVWEvV;s=Oe3p|MZMGFYqsFZf0CLmC0s=@zay;OxBN-?hMGAQhv!I74|mr3xJ(+?rN5LJNP3^vSY}u!*jUEBfP+TLh&K+&-0{Re@!QCQzJ{(4=mH2tPw%lPb5|qdCF(h|mwNtNXZ) zHSaM;YqI`m9ysoab$=4IL*OU$%P^0*f^2ZFAz4G!!&p!qJ8e$jA@pUuul6$4JfU>n dl?Evd=t4u!Va+A%oCBWMyI9N(*&`{5=o?h0k$V6D delta 238 zcmY*RI|{;35S-2P2O5GFRyjmch<0LvVy}gzwO9x?mH`_}!&9(KBiMNnFA+#-IU1eCjcLDQ88utEr*DglgOui>Vlb}s7DGsC@a$N zPSC)bvtmc;KY@dT2E>VUNUgqEk!d&Nte3SaV{G>_=m@+FNMdqqUor}!s>@3R#Tl(4 Zt5@D6K%xBeEYIxQ@tcBcCfHcd^nWsHCw>3` diff --git a/bgfx/shaders/dx9/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/dx9/chains/misc/fs_blit_yuy16.bin index 5f6e1dd1c303c6cbd3c57ad5e2f00aa1652a18fd..ff4eb14787c55b86112c9867340e67cc8bba7df3 100644 GIT binary patch literal 771 zcmZ8fJxc>Y5PiFMk>CdhesrQKwULNoY5YP`XrVD+cZx;~s0k(!u{yD_jJ?GLyQC3p z1^<9W1pj~%!CJ6&eX|!saJXT2-psstJKSm}-KVa;-avB@EBWQzc~SxVXkNw7pPUKi zm+}|6pXZ$4A^LwX-QsJPSnAn_5q}MWQ ziOk{de(p4}TsSV~k9e6*PEDh+0mL-CkTfa!0u?^-d=lIt{#brUeKg-wV>9>jZ!dEx z!ChM)NPWk~`J7(+Jg+ME81K|+?<}e!?uEp-nw|h?h6>GU6vr871MVUmVjs7}*htJ; z$ruf z*k^!vD-=HNhxu#rnNE);zk_;B;oIs^7-#;O*a~Mxn8uK3AZBX9$C=vU8^~#U91IW} q=6xk}F+zu{EjHJ|M6>A8)JUCnXQIbx$Nb-1?v}YMxmvc)7y!Ru&XAM< literal 869 zcmY*X!D>@M6g~6ir371eSY3){*;0{|f=i=qkuKswW59(FibfhxQkn?GjT8KV_y_N8 zUp9hU!C$DKP%$pJ?`u+n@_(_!4;u4>W%xyO#|@H zwftUjZ#4MOZ>}!TyOu|`EdQ1p*m?eF`xe8Gq7#d_DaL2unA5kSn+;>FqFsJGQ?;>qCE(Qq_;Gj6OsTW{>OJMBj2VE=XhsIfDA zcQ|-UXR~>46SJp4%^*nu_np;Sw1+e&JR<&W{Izv^>&t`FANO0oPJXuTQ06tB1Ibi= zjXpJapLtW%laxAnl{#@`@~K>YO3;!kpZP@^1F^vh}{5h^0d_;ja3bv;xbgXNE9e_>Bo2qv zoMkA5$6l%{KOzokFt1N*IE66ph`1{eyF5Lpi!uvvfm*jg12m!JbdEfDE*cS*eyRkrI96DPuNx_+i>iD`%Hp?(g}V0GzxGzz2b zj&<6;yK8k07iZ^5v-8LfMNoeftDE+8rfA<7^@f9KT3)q@=pyqsul$$e4Iek>@u3`l KL|pGdRh3`X#z+PL delta 148 zcmZ3^v6q?GE!cybvH8D(-JAEtMru=vEoPX{RO_@9=mqp zwCM&R5mi;o$(@vRh%!gr0}0W zDrx|O)zEeZZ>hxQJe@)wrwee1{cb}e(T8=uL~W5b#%28u58xQ;;1-OQw5*6IJ_wp+ zJYMUKzCq#(5{WuFpMs;gY1spxx`Y@cIICJnU~mMq6fDhF=+~{}c7+7A!n(Sw5)>KV zsSwmUGl-cePs;VCNO01Q9CZ&I-6@ccTSFAC;SQXm6M)NDEA%@q9rOVI2%+V{Tsmtg zeYgit*oJo$*T@UB?17M1M=+4iCmEiGhJ&F^l;Bb3`q)+0Lp>gbTl!Lf1PBpo+@9=u z#4V^YQERxP&TvO~QH^j_9%sTGorF8KKWy9j4<-M%ZvX%Q literal 1723 zcmc&!OK#gR5LE)S3*{2CBpX{LDawlBcGV*2z6THlTXqCUmLY#4CCH{dX|K=|bV!R7 z9m^gVrY9)7O9ciUu_HQtq{zWBM>t8=o=pE7oBZ-2b^ zyhB>I`FaHp`RZWpMf|4LDRxmi4}wgYy|j2smix}7DhNQ z0%4W~YA1v^eZU9HL*W)!5V>GjknT)E=%9s4l#Y_JS^(*^il7;RP=YQfk`9Ip8imrA zVq4uI)aBhl1})~1g?P22is+gC1bq{IzZ_N58bN0!dBK8Y$H&Ck1Zw(LMgdKmOgIa=@B2Z z2@7I=O#62+PmY+*c-v?k4>UUYYoo?nX@)yJ8Nf7nL{5AJU)?sX($Z<@{8$yqeVwkp zsP_v7%`~Ps8S~cBYySdSvCS@-%TK8|8?rZk8+#Fa$X|v2AN)l%0|whx-^yUFU%vM7 Z;e60yygu>R*mA*S&d*$)`7gfj{Q+Tm+|U33 diff --git a/bgfx/shaders/glsl/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/glsl/chains/misc/fs_blit_palette16.bin index 952107ab982dad70d1db687d2689b520bcd4f1aa..f9a7910a249a87dbb6330b3cc006e058f7dae3ca 100644 GIT binary patch literal 1000 zcma)5%T9w(5T%-KaN#e^5)^NM0vmOuY25n(H>9Nvkw?R;K+~09>M!^O&Rlt1T4PEG zkC{0$=bVA%``gXz^ZQG|W3J3|UIeu=Q|P2f&Ubz^zTcFT=Xux$=G9PjTkC3O|vy-$|T&RSq!-!@1h{HUqSHwJAuT< zgcu=_Kg&!6{F}9qVH&O>_QM1;T|KBk3T(iEK~V&}tT@(m!6M$F9&S^he}-q!BwcU^ z5;ImeIu&oC)GvC-LV_;{F0xvju0iX&vf2QfnYu3Ef>D=pB(%e7!jB+$7={R7k6{hg z4P_0r5GHmZSL*3fWl$Go7T`)Wu@eKdeuyIkP7EfIa1Ywahl63PCF+{VTm$f;>#Y7& zB-=|8`t~lX_dUvXJ!YZ}bkp^-xmIs(xEb*acmhk5A5bGq);OKh4(u+Sb3C=plWgWZs`@D``uY-88>B@Xw z8pbBf%Xl$|O*9d(2_{*R<@VUr!Y+n!>?F(bDQ4D-c$VcUEW`9QiE{T5B#R~?CuvNM zGA%X;mBmv?!*~G}Gv7=gDlV+jSL6^lV+^QwxCcw)0ym(+@SRY+(v1yx4HYMn>8 zMoaFo2bKcyq`=m;NF>~Xbzmumv6iS?HXrl=AB^#0uPB~1BVD)yhqS^Q@{-IvMRq{U z>SYh4-bsQkH|+w&A-cnb?INJ8hk7XjTlx}PCKw|kc25Ex%%&Zw*-9=A@7FVJ?g`-t zL}~K7YCPM|$1jxYJNvTVli6uxluJse?{^ASOil^a9Ur!|5BV11(1U|$Q4);`zOrJT z1W$Q5f1opoNwtU}d0m}U`Rlzylq{nTOZ^sz-)-skFD&)tZ+~p*_CGB3d8eh7&_A$r c)Y|K))6x+hO3l*BiW8QOjw~IU@1|+|00mc`asU7T literal 1645 zcmc&!-ENyO6sDE73;Gi0(q0qS1``@(yXsW+z7K#eZffuh1vhvBAbk znI=t@hN1}job!F(IiKIyQ=Lr&;}gI?N>#oK5I6t<0;~&EN(gaO z!xzgy;TkxLIv7k%_a+oNIH3}vqok}>Kze-vYbFpV5${w;r&_W`)elA3M861iVZV^9 z#XOtVo_7{Gn9iJW9S8?IPG%%#4Lzy-s zl%rI1PH{D)G4y;5#FT{awX+mn&{OSdX!P7FW_vJh^+cBip1GlXhU2>irY& zjpLC<7}}XLYvQv`R)#-&?UMlKVQ{+^HJ^gJuwO9E!O&^x=Mm ztk`8EmWopr!N*LEKgLu9A9Gcq{|8r5&4{hG)eo>$=xfw|FG7qOi`ys88b|(Mtq||L KUHGrQ@BIc6$iKD# diff --git a/bgfx/shaders/metal/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/metal/chains/misc/fs_blit_palette16.bin index b08396630f2e15e65f521a3d1d3170e16b44cae5..b541e7f9cb63fa17b9ba2dad08cdb57e1c58ba7e 100644 GIT binary patch delta 502 zcmaKo&q~8U5XQ4fq1aNCf(I33ZthmQZ2pOmdKK@UbrDT55F2SzOX zc=AQOdDe?ZXS1cmi+fnuneX>~Gy7J5Z?;a(PMhTM>%+jambYS0w8@4+)YE8=Wg2F3 z6iq{{8q4bXSVn{URmW}<$me_JXDxrZX{_|YGubvp@JfEjq8}%hsRPpS1RO&&;3a*P zB*SX~9gw$aEXTYO#yJlVV_PEwDUcu&+mPC|ylk{RAb_(YPp8p^RsYRfBPV z*FDmcM17zt2zp?1!OB%<<*k-hIvfxcw$I75IJY?0+`QC;@hJQc$sURet6N_p#kbk3 MDa+!?66T%p3wHp4761SM delta 83 zcmX@Yy^o#OE!cybvH8S#B()+rKffr&KvS=xaH=U2yE!cybvH8FDfK4yj)SPr=a!Mrm-eqkIl};hUj6 zDShUn0~B0@&7gxjL0F4|tHw=@;HZm=sNQToH&32N+`(S)@qw(;}TyB zbBSm>M3v)nYmnUXM zjs+S=fDpif?1Z~XmWhhshoTM`FcdyIvkG9ND(=6-RW4}pg&;E~wSQ1)=_=CPB STE^@g|Ik-e@c0cMlKKS#h^hPl diff --git a/bgfx/shaders/spirv/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/spirv/chains/misc/fs_blit_palette16.bin index ec938478045c42033cffe9306e3ca651de25d607..c3afa18867a12bc796f93bda245917239be91687 100644 GIT binary patch literal 2628 zcmZ9M+i%oW5XVouZZ9m-(sGHYbqfz(Ah0E1Bm_|)lm`;gdWn~0yOyP?Zo6dLlEx${u`QTly~_@eDe}7Argd$`1$;LhWy-VroZ`qXU@!=Ip^%zxpTFFYqx()NHvYE zH^kUTb)L#WPEEh zrOM#GVKZ$>BWZ54Oxn&0%~~2NzO(1&&L3P|yLj-((S}R6ZDuHZV`(%!2B$8!mR9tC zjediEkKRJZiPujdtO|Qf=`RXYVaw~P)O!wJ(e_+x`EsY-0}?ls_6PrFdt+_A*AD(r z!LzNt_?h7Q;@^dTYh~$Dx3_$%(_Q%3JVX4+E2R;`4i~($=sT20K4<%X-wgd$()%Vu z?A>`RcA95IrMb}UbbG~It3*4q;_w%YY!vIA;fITtHi`^qT5Bz$ zXPKO{+G{c-@HF;B#?Gwl7wflYrm+yJ)Rc!{&7 zTpgVygKMJ?XH~8vwvKu1)A`lVv5dW2Q>dcfnTaFbd4+$HD%P2%rhRMg;r|fdT`=Cs zI{F0nc!aOmJY@;In_Bi^jCsV5XY4($gP-NAnE!ajo|B^gg-x@lrC;p1C=u^DDB*YR z%1+{s@U5fvv_IpcefStyd6NB|;OoAo@_E^BsQtVLb}ycX^~BC!PX7nlc8&Gi`#g%A zJU~w8(L(35M$AWG|iK z_d_nQ_d{&_ciFa2{bKJ+_M?BZkoW2xxZ+;I$r~R% z4PzhAN@#I6qo)yg{nz1RpQB*+c>|3z-vTEeIcwN*s^TYdZUvavn49$Fd)$WY%zdYK z>0mdua-X}bZw!_5&1grR?by+~?+f^-&ICYzx%WwMfA2fsU+k| hz`5Rd{m#_>^-Y8I`&;ocbN2U1?g6`esn}^F{RcpK?&bgh literal 1660 zcmZ9L+iFu$5QbM0lU9SKDk@eesr3Lh)(BAwqN0_i7X_{9;WBK~Gz63Eu#=YHjT^)V z5l=TB@Cn2_(Wmeg#0zf(|8HjxY%*oK*8l&rX3fmnS*@+*Q!jr1a6y3L*nqR*Y2Tr?4*eGAf} zvTI(q-)RPdip#l6#&0%9!~LLX{FR7TTNCjm<0s-b#c%c6dw$Tp-|-ty$&*uM@YuvK zb$7;XkEN&%dTVv+tAW>A@%>;IDXTyFJ*YSQjvqubf}{WFVH!l1qw}G-C#}6vl;MFl z^b}py6zKcB95XzxJ+BF-|D+B^=WWrMLsAE$pNw_pk<`KHd<$!;%=)JetSSZ0@-u_v zc`)Zwa_(m?d3hnm%wtZDp)(7x#fLH0q8iiDJ@dMgdbo2||Mhvg(_;8;it@Ai)~2=hV-#R&t|J=Z4(5aHXVop!UadIDAg=yaPQ@+m=@Pg5z#5ZvltC6Yq(){0;4u z|1LToJawUS9?aXp8RqT4#Pb7WPhIF>-qQ5v+Vf_X4;;qaP4z=v%pD`{uNZ#+x5YC5 z3vy-;W+s>A%-Zxt?U}XdSG8x>VD9Y8sTWL*Lpk+r>lWtxRZdRs*%8N?Z*q8IAL<1- z_eu_rV=4Jd#iPBJqw_BJ#4+PHa^_xq?7diSV zWE!mcJeeRrmkw1AyS0P}xrM!9PO2-*}Nh{saInO)P7R!^3O6~r7y)my;;Lm%l zmFMb<^+s9?Iq#XaVNTByOfkLpZ0+oN8sTK6S;2dX+j_rSn2x}s*t;_9J-c=!!`^Y2=}>R8io@TYhJH1tc+P0r z+0L0mFh#iQ;OzMba}V!iJFD0@-6QaB&N2^uj48e%!@iRd@EEJZ_{TDAO&#h7I%ay7 zy4V^zt_2@v9btOrz6_7&@KLbi2J)X^HE(^*>kRXo=I18@KMrPW;U_wH%m2v~Z*1wa z;Ne4`O~n2hxc&Y3mR<+{^4+Bq!<=Uiy}#4DZLnGwdG97}G3C_HXSV+Pc`MfP0@ECw zapr5-jC-zO=NB06{eiWI>0V=teHU_peHUW=f6i>rP#3o|PW@MGewk!8AH~MJ$TT0ZIb33T{=G!84!cRT#cFS3&-HNf57J5Z z?7^0EI$U1L>NW&Ww|)`xMsN%4`-qq~!O2I=VQe|4!zE(g3@}f99^xF|(^V_ru9YE$+mYb2?n27GnV8>Jw*|u&uiz&OQK^ceb*84r04s?J+pNqvx=F zBfgt6aK4cxIC=f!jB#vvM{q|n&Nulbd;Lxvg|jYxfB)iz&SZQ3<-MsLV@@%Bx7rcw zIJWWmZ1rOe;JNlQ`t~%~-x4+NWsldf-LJNjPRl)m&4=%9NB8%|oT7)%A)0@8?B~I= z_^5^73)se13vL5DpH~a6#$L7XJCE&twa9A|n@^gTdOoiUaQVDmhV%DLE$;jZwt1;V z>{qe*q_Nc__B0i-uP5QGi#h0PJ*=zRBv}0-_CNH-zS$#t6+Lgr;jD`}=-b_+hr#Ok h9@(ouvmSqiZ7=<9>2Log=$QXQ)c)i2BWVUB$^SLo{(k@f literal 2764 zcmZ9NTWDNW6oyX{C)TFgdZ!gaYQYPZG_`H0)=sTT(}$obQHx?7Ch24hCLNhfYuXn( z4T^{leenV+Ucl<3;1w-uz{{(?t57dg)F)9|1;Ot-bJlP;J7=@k|Nm>Rz1CjmO!iFf z9q3v5^Gw3%O$H8ETD8T>!tAly$Yn4+(n)DSb_AW#yDmAoGD-S+H(aQ`GFg%Q&~ZyH z#Y1x-=}*_O@yYSwh1S90t=mT2dP&mfl4`4yi;@elo%7Y%L-Ic}&oX~!o@cJXU!8-n z`jQgsUmQ?^&F?F5-X^p(&B^NgV{^485WoK9=HTzGEw&CfYr#K(ao?fYnMQN|j=9G4 zqw@Xy$vbivL7cv%-J#Q%=2@Ss>}gi(cQzW$gGwd-%>77Zx-r*iruE8M%Mq_{TF;Sm zzqL)(XBN{4cU48m?tJ0tc2LvX{t_`v$OMjJ)O4-ER%~{bKj` zWV&??Fjr^TdIp&e_gjlN{H-JO%Q?k!)~B87oVgCBAMPqRdpN{gOW#+pij9*Wfv@H) z^U%kb;)^qE--p1%tPbPv$gub4P~Y4!)3emY-k0M_@HW;Vrf1%i;ajmC*N|_S)jZYA zV?XnB>)l;}9{@AD_&^7D{U1*8@vc4v9^CRyIri7VXTBZn>J9KO-~701FzcE1TE}r# z@4!AJ$z09)Xn<}qAjx;?> z_-uyt|1GmUS6%FTqQCk%R=@g)C-%LOi(J0L+52>kQiHYGXNP|0Vf^-Y!rE^?E_*Gu zM_ZWoR_r;yGR;wJUVkvnX*W^4uj@Fk&1%16&-HNf_t0(k+<-0Tbhs>K_j@Bi-FtpA z<2HglN3ET4!`SlHw~EY-y9t{o&0BpRzP?|ZvDF;LlzSX3@4dKRZV{}Tb*qQ(QEYpx zZl3xc!*;(~oU;`>&I!L!IC=fUZ+qs)l1yav+yc;7Eo$6>EuXLPHZV_`qk8z3vDJL{ zp3Y+K&N%Pwez-DP8{3}R=lyW@bO}yg|JXZ*ZOr`MXTZh1&%(*;AN7r6%R7R*8|*ob zk2rUkbpq_Y_^q7dZJf>Ye|fjm_Aw7IeMhw;)+DyEc)I;~4&b@=Gy3*C*xwd4@5#Qs zfbD*@RotT7i`YDT&mG=A~ZD>rJ>~UZ>#vy;F;t-@-O8wTS&THcuK`Jz`IABfb+4!g(*|ps)Ag zy{bI~R`<8yA9`co?2)~S9#yb?2Y9+Qz6U7Y#rtsfNG^0e@3HNr-texture.palette, prim.m_prim->texture.base, &pitch); + prim.m_rowpixels, tex_height, prim.m_prim->texture.palette, prim.m_prim->texture.base, pitch, convert_stride); if (texture == nullptr) { - bgfx_texture *texture = new bgfx_texture(full_name, dst_format, tex_width, tex_height, mem, BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT, pitch, prim.m_rowpixels); + bgfx_texture *texture = new bgfx_texture(full_name, dst_format, tex_width, tex_height, mem, BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT, pitch, prim.m_rowpixels, convert_stride); m_textures.add_provider(full_name, texture); if (prim.m_prim->texture.palette) diff --git a/src/osd/modules/render/bgfx/inputpair.cpp b/src/osd/modules/render/bgfx/inputpair.cpp index 9b430607cb8..4f185db86ab 100644 --- a/src/osd/modules/render/bgfx/inputpair.cpp +++ b/src/osd/modules/render/bgfx/inputpair.cpp @@ -42,6 +42,7 @@ bgfx_input_pair::bgfx_input_pair(int index, std::string sampler, std::string tex bgfx_input_pair::~bgfx_input_pair() { + m_slider_state.reset(); } void bgfx_input_pair::bind(bgfx_effect *effect, const int32_t screen) const @@ -58,14 +59,14 @@ void bgfx_input_pair::bind(bgfx_effect *effect, const int32_t screen) const bgfx_uniform *tex_size = effect->uniform("u_tex_size" + std::to_string(m_index)); if (tex_size && provider) { - float values[2] = { float(provider->width()), float(provider->height()) }; + float values[2] = { float(provider->rowpixels()), float(provider->height()) }; tex_size->set(values, sizeof(float) * 2); } bgfx_uniform *inv_tex_size = effect->uniform("u_inv_tex_size" + std::to_string(m_index)); if (inv_tex_size && provider) { - float values[2] = { 1.0f / float(provider->width()), 1.0f / float(provider->height()) }; + float values[2] = { 1.0f / float(provider->rowpixels()), 1.0f / float(provider->height()) }; inv_tex_size->set(values, sizeof(float) * 2); } diff --git a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc index 82236d954a3..c152bfa8fe3 100644 --- a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc +++ b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc @@ -9,11 +9,28 @@ $input v_color0, v_texcoord0 SAMPLER2D(s_tex, 0); SAMPLER2D(s_pal, 1); +uniform vec4 u_tex_size0; +uniform vec4 u_inv_tex_size0; uniform vec4 u_inv_tex_size1; void main() { - vec2 palette_uv = texture2D(s_tex, v_texcoord0).rg; - palette_uv.xy = (palette_uv.xy * vec2(256.0, 256.0)) * u_inv_tex_size1.xy; + // Logic taken from fs_blit_yuy16.sc - we need to do this, because + // the D3D9 BGFX backend claims to support RG8, but does so in + // a faulty way by using A8L8, which is not an appropriate format + // for representing an RG8 texture. + + vec2 half_texel = u_inv_tex_size0.xy * vec2(0.5, 0.5); + + vec2 original_uv = v_texcoord0.xy * u_tex_size0.xy; + float mod_val = mod(original_uv.x, 2.0); + vec2 rounded_uv = vec2(original_uv.x - mod_val, original_uv.y); + vec4 srcpix = texture2D(s_tex, rounded_uv * u_inv_tex_size0.xy + half_texel.x); + + vec2 palette_uv = (srcpix.ra * vec2(256.0, 256.0)) * u_inv_tex_size1.xy; + if (mod_val < 1.0) + palette_uv = (srcpix.bg * vec2(256.0, 256.0)) * u_inv_tex_size1.xy; + gl_FragColor = vec4(texture2D(s_pal, palette_uv).rgb, 1.0) * v_color0; + //gl_FragColor = texture2D(s_tex, v_texcoord0) * v_color0; } diff --git a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc index 21f3b8816fc..91e3c3ed462 100644 --- a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc +++ b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc @@ -8,8 +8,6 @@ $input v_color0, v_texcoord0 // Samplers SAMPLER2D(s_tex, 0); -#define round(X) floor((X)+0.5) - uniform vec4 u_tex_size0; uniform vec4 u_inv_tex_size0; @@ -23,17 +21,17 @@ vec3 ycc_to_rgb(float y, float cb, float cr) void main() { - vec2 size_minus_one = u_tex_size0.xy - vec2(1.0, 1.0); - vec2 original_uv = round(v_texcoord0.xy * size_minus_one); + vec2 half_texel = u_inv_tex_size0.xy * vec2(0.5, 0.5); + + vec2 original_uv = v_texcoord0.xy * u_tex_size0.xy; float mod_val = mod(original_uv.x, 2.0); - vec2 rounded_uv = round(vec2(original_uv.x - mod_val, original_uv.y)); - vec2 next_uv = rounded_uv + vec2(1.0, 0.0); - vec2 srcpix0 = texture2D(s_tex, rounded_uv / size_minus_one).rg; - vec2 srcpix1 = texture2D(s_tex, next_uv / size_minus_one).rg; - float cr = srcpix1.r; - float cb = srcpix0.r; + vec2 rounded_uv = vec2(original_uv.x - mod_val, original_uv.y); + vec4 srcpix = texture2D(s_tex, rounded_uv * u_inv_tex_size0.xy + half_texel.x); + + float cr = srcpix.r; + float cb = srcpix.b; if (mod_val < 1.0) - gl_FragColor = vec4(ycc_to_rgb(srcpix0.g, cb, cr), 1.0) * v_color0; + gl_FragColor = vec4(ycc_to_rgb(srcpix.g, cb, cr), 1.0) * v_color0; else - gl_FragColor = vec4(ycc_to_rgb(srcpix1.g, cb, cr), 1.0) * v_color0; + gl_FragColor = vec4(ycc_to_rgb(srcpix.a, cb, cr), 1.0) * v_color0; } diff --git a/src/osd/modules/render/bgfx/target.cpp b/src/osd/modules/render/bgfx/target.cpp index cb912aba9ef..ff814ed649a 100644 --- a/src/osd/modules/render/bgfx/target.cpp +++ b/src/osd/modules/render/bgfx/target.cpp @@ -30,16 +30,24 @@ bgfx_target::bgfx_target(std::string name, bgfx::TextureFormat::Enum format, uin { m_width *= m_scale; m_height *= m_scale; + uint32_t wrap_mode = BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP; uint32_t filter_mode = filter ? (BGFX_SAMPLER_MIN_ANISOTROPIC | BGFX_SAMPLER_MAG_ANISOTROPIC) : (BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT); + uint32_t depth_flags = wrap_mode | (BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT); - m_textures = new bgfx::TextureHandle[m_page_count]; + m_textures = new bgfx::TextureHandle[m_page_count * 2]; m_targets = new bgfx::FrameBufferHandle[m_page_count]; for (int page = 0; page < m_page_count; page++) { m_textures[page] = bgfx::createTexture2D(m_width, m_height, false, 1, format, wrap_mode | filter_mode | BGFX_TEXTURE_RT); assert(m_textures[page].idx != 0xffff); - m_targets[page] = bgfx::createFrameBuffer(1, &m_textures[page], false); + + m_textures[m_page_count + page] = bgfx::createTexture2D(m_width, m_height, false, 1, bgfx::TextureFormat::D24, depth_flags | BGFX_TEXTURE_RT); + assert(m_textures[m_page_count + page].idx != 0xffff); + + bgfx::TextureHandle handles[2] = { m_textures[page], m_textures[m_page_count + page] }; + m_targets[page] = bgfx::createFrameBuffer(2, handles, false); + assert(m_targets[page].idx != 0xffff); } @@ -64,7 +72,7 @@ bgfx_target::bgfx_target(void *handle, uint16_t width, uint16_t height) , m_page_count(0) { m_targets = new bgfx::FrameBufferHandle[1]; - m_targets[0] = bgfx::createFrameBuffer(handle, width, height); + m_targets[0] = bgfx::createFrameBuffer(handle, width, height, bgfx::TextureFormat::Count, bgfx::TextureFormat::D24); // No backing texture } @@ -81,6 +89,7 @@ bgfx_target::~bgfx_target() for (int page = 0; page < m_page_count; page++) { bgfx::destroy(m_targets[page]); + bgfx::destroy(m_textures[m_page_count + page]); bgfx::destroy(m_textures[page]); } delete [] m_textures; diff --git a/src/osd/modules/render/bgfx/target.h b/src/osd/modules/render/bgfx/target.h index be6e5884d22..15a12731c4f 100644 --- a/src/osd/modules/render/bgfx/target.h +++ b/src/osd/modules/render/bgfx/target.h @@ -44,11 +44,12 @@ public: uint32_t screen_index() const { return m_screen; } // bgfx_texture_handle_provider + virtual bgfx::TextureHandle texture() const override; + virtual bool is_target() const override { return true; } virtual uint16_t width() const override { return m_width; } virtual uint16_t height() const override { return m_height; } virtual uint16_t rowpixels() const override { return m_width; } - virtual bgfx::TextureHandle texture() const override; - virtual bool is_target() const override { return true; } + virtual int convert_stride() const override { return 1; } private: std::string m_name; diff --git a/src/osd/modules/render/bgfx/targetmanager.cpp b/src/osd/modules/render/bgfx/targetmanager.cpp index adc2ca5acee..3cc90e1fa84 100644 --- a/src/osd/modules/render/bgfx/targetmanager.cpp +++ b/src/osd/modules/render/bgfx/targetmanager.cpp @@ -47,11 +47,14 @@ target_manager::~target_manager() bgfx_target* target_manager::create_target(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, uint32_t style, bool double_buffer, bool filter, uint16_t scale, uint32_t screen) { - auto* target = new bgfx_target(name, format, width, height, style, double_buffer, filter, scale, screen); std::string full_name = name + std::to_string(screen); - m_targets[full_name] = target; + auto iter = m_targets.find(full_name); + if (iter != m_targets.end()) + destroy_target(name, screen); + bgfx_target *target = new bgfx_target(name, format, width, height, style, double_buffer, filter, scale, screen); + m_targets[full_name] = target; m_textures.add_provider(full_name, target); return target; @@ -60,10 +63,10 @@ bgfx_target* target_manager::create_target(std::string name, bgfx::TextureFormat void target_manager::destroy_target(std::string name, uint32_t screen) { std::string full_name = (screen < 0) ? name : (name + std::to_string(screen)); - if (m_targets[full_name] != nullptr) + if (m_targets.find(full_name) != m_targets.end()) { delete m_targets[full_name]; - m_targets[full_name] = nullptr; + m_targets.erase(full_name); m_textures.remove_provider(full_name); } } @@ -78,12 +81,11 @@ bgfx_target* target_manager::create_backbuffer(void *handle, uint16_t width, uin bgfx_target* target_manager::target(uint32_t screen, std::string name) { std::string full_name = name + std::to_string(screen); - bgfx_target* target = m_targets[full_name]; - if (target == nullptr) + if (m_targets.find(full_name) != m_targets.end()) { osd_printf_verbose("Warning: Attempting to retrieve a nonexistent target '%s' for screen %d\n", name, screen); } - return target; + return m_targets[full_name]; } bool target_manager::update_target_sizes(uint32_t screen, uint16_t width, uint16_t height, uint32_t style) @@ -133,8 +135,8 @@ void target_manager::rebuild_targets(uint32_t screen, uint32_t style) const uint16_t scale = target->scale(); const uint16_t width(sizes[screen].width()); const uint16_t height(sizes[screen].height()); - delete target; + destroy_target(name, screen); create_target(name, format, width, height, style, double_buffered, filter, scale, screen); } } @@ -165,7 +167,7 @@ void target_manager::create_target_if_nonexistent(uint32_t screen, std::string n { if (style == TARGET_STYLE_CUSTOM) return; - if (m_targets[name + std::to_string(screen)] != nullptr) + if (m_targets.find(name + std::to_string(screen)) != m_targets.end()) { return; } @@ -174,7 +176,7 @@ void target_manager::create_target_if_nonexistent(uint32_t screen, std::string n uint16_t width(sizes[screen].width()); uint16_t height(sizes[screen].height()); - create_target(name, bgfx::TextureFormat::RGBA8, width, height, style, double_buffered, filter, 1, screen); + create_target(name, bgfx::TextureFormat::BGRA8, width, height, style, double_buffered, filter, 1, screen); } uint16_t target_manager::width(uint32_t style, uint32_t screen) diff --git a/src/osd/modules/render/bgfx/targetreader.cpp b/src/osd/modules/render/bgfx/targetreader.cpp index 71b82383a59..e201f3c5f6e 100644 --- a/src/osd/modules/render/bgfx/targetreader.cpp +++ b/src/osd/modules/render/bgfx/targetreader.cpp @@ -60,7 +60,7 @@ bgfx_target* target_reader::read_from_value(const Value& value, std::string pref break; } - return chains.targets().create_target(target_name, bgfx::TextureFormat::RGBA8, width, height, mode, double_buffer, bilinear, scale, screen_index); + return chains.targets().create_target(target_name, bgfx::TextureFormat::BGRA8, width, height, mode, double_buffer, bilinear, scale, screen_index); } bool target_reader::validate_parameters(const Value& value, std::string prefix) diff --git a/src/osd/modules/render/bgfx/texture.cpp b/src/osd/modules/render/bgfx/texture.cpp index 85f1d3645fb..34efd738679 100644 --- a/src/osd/modules/render/bgfx/texture.cpp +++ b/src/osd/modules/render/bgfx/texture.cpp @@ -15,6 +15,8 @@ bgfx_texture::bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, u , m_format(format) , m_width(width) , m_height(height) + , m_rowpixels(width) + , m_convert_stride(1) { bgfx::TextureInfo info; bgfx::calcTextureSize(info, width, height, 1, false, false, 1, format); @@ -32,17 +34,18 @@ bgfx_texture::bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, u } } -bgfx_texture::bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, const bgfx::Memory* data, uint32_t flags, uint16_t pitch, uint16_t rowpixels) +bgfx_texture::bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, const bgfx::Memory* data, uint32_t flags, uint16_t pitch, uint16_t rowpixels, int convert_stride) : m_name(name) , m_format(format) , m_width(width) , m_height(height) , m_rowpixels(rowpixels ? rowpixels : width) + , m_convert_stride(convert_stride) { bgfx::TextureInfo info; - bgfx::calcTextureSize(info, m_rowpixels, height, 1, false, false, 1, format); - m_texture = bgfx::createTexture2D(m_rowpixels, height, false, 1, format, flags, nullptr); - bgfx::updateTexture2D(m_texture, 0, 0, 0, 0, m_rowpixels, height, data, pitch); + bgfx::calcTextureSize(info, m_rowpixels / m_convert_stride, height, 1, false, false, 1, format); + m_texture = bgfx::createTexture2D(m_rowpixels / m_convert_stride, height, false, 1, format, flags, nullptr); + bgfx::updateTexture2D(m_texture, 0, 0, 0, 0, m_rowpixels / m_convert_stride, height, data, pitch); } bgfx_texture::~bgfx_texture() @@ -52,5 +55,5 @@ bgfx_texture::~bgfx_texture() void bgfx_texture::update(const bgfx::Memory *data, uint16_t pitch) { - bgfx::updateTexture2D(m_texture, 0, 0, 0, 0, m_width, m_height, data, pitch); + bgfx::updateTexture2D(m_texture, 0, 0, 0, 0, m_rowpixels / m_convert_stride, m_height, data, pitch); } diff --git a/src/osd/modules/render/bgfx/texture.h b/src/osd/modules/render/bgfx/texture.h index dc96e9acd77..4a5d6636f5b 100644 --- a/src/osd/modules/render/bgfx/texture.h +++ b/src/osd/modules/render/bgfx/texture.h @@ -21,7 +21,7 @@ class bgfx_texture : public bgfx_texture_handle_provider { public: bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, uint32_t flags, void* data); - bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, const bgfx::Memory* data, uint32_t flags = BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP, uint16_t pitch = UINT16_MAX, uint16_t rowpixels = 0); + bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, const bgfx::Memory* data, uint32_t flags = BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP, uint16_t pitch = UINT16_MAX, uint16_t rowpixels = 0, int convert_stride = 1); virtual ~bgfx_texture(); // Getters @@ -29,11 +29,12 @@ public: bgfx::TextureFormat::Enum format() const { return m_format; } // bgfx_texture_handle_provider + virtual bgfx::TextureHandle texture() const override { return m_texture; } + virtual bool is_target() const override { return false; } virtual uint16_t width() const override { return m_width; } virtual uint16_t height() const override { return m_height; } virtual uint16_t rowpixels() const override { return m_rowpixels; } - virtual bgfx::TextureHandle texture() const override { return m_texture; } - virtual bool is_target() const override { return false; } + virtual int convert_stride() const override { return m_convert_stride; } void update(const bgfx::Memory *data, uint16_t pitch = UINT16_MAX); @@ -43,6 +44,7 @@ protected: uint16_t m_width; uint16_t m_height; uint16_t m_rowpixels; + int m_convert_stride; bgfx::TextureHandle m_texture; }; diff --git a/src/osd/modules/render/bgfx/texturehandleprovider.h b/src/osd/modules/render/bgfx/texturehandleprovider.h index b4b3f561d44..03387040d7c 100644 --- a/src/osd/modules/render/bgfx/texturehandleprovider.h +++ b/src/osd/modules/render/bgfx/texturehandleprovider.h @@ -25,6 +25,7 @@ public: virtual uint16_t width() const = 0; virtual uint16_t height() const = 0; virtual uint16_t rowpixels() const = 0; + virtual int convert_stride() const = 0; }; #endif // __DRAWBGFX_TEXTURE_HANDLE_PROVIDER__ diff --git a/src/osd/modules/render/bgfx/texturemanager.cpp b/src/osd/modules/render/bgfx/texturemanager.cpp index d0bcbcb476d..6c760c10203 100644 --- a/src/osd/modules/render/bgfx/texturemanager.cpp +++ b/src/osd/modules/render/bgfx/texturemanager.cpp @@ -87,7 +87,7 @@ bgfx_texture* texture_manager::create_png_texture(std::string path, std::string { texture_name += std::to_string(screen); } - bgfx_texture* texture = create_texture(texture_name, bgfx::TextureFormat::RGBA8, width, height, data, flags); + bgfx_texture* texture = create_texture(texture_name, bgfx::TextureFormat::BGRA8, width, height, data, flags); delete [] data; @@ -122,8 +122,9 @@ bgfx::TextureHandle texture_manager::create_or_update_mame_texture(uint32_t form { bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::BGRA8; uint16_t pitch = width; - const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, &pitch); - bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)width, (uint16_t)height, mem, pitch); + int convert_stride = 1; + const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, pitch, convert_stride); + bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)(rowpixels / convert_stride), (uint16_t)height, mem, pitch); return handle; } } @@ -150,8 +151,9 @@ bgfx::TextureHandle texture_manager::create_or_update_mame_texture(uint32_t form { bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::BGRA8; uint16_t pitch = width; - const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, &pitch); - bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)width, (uint16_t)height, mem, pitch); + int convert_stride = 1; + const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, pitch, convert_stride); + bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)(rowpixels / convert_stride), (uint16_t)height, mem, pitch); return handle; } } @@ -161,9 +163,10 @@ bgfx::TextureHandle texture_manager::create_or_update_mame_texture(uint32_t form bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::BGRA8; uint16_t pitch = width; - const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, &pitch); + int convert_stride = 1; + const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, pitch, convert_stride); handle = bgfx::createTexture2D(width, height, false, 1, dst_format, flags, nullptr); - bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)width, (uint16_t)height, mem, pitch); + bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)(rowpixels / convert_stride), (uint16_t)height, mem, pitch); m_mame_textures[key] = { handle, seqid, width, height }; return handle; @@ -201,6 +204,6 @@ void texture_manager::remove_provider(std::string name, bool delete_provider) { delete m_textures[name]; } - m_textures[name] = nullptr; + m_textures.erase(name); } } diff --git a/src/osd/modules/render/bgfxutil.cpp b/src/osd/modules/render/bgfxutil.cpp index 9d2bef27901..f0d01e4fa86 100644 --- a/src/osd/modules/render/bgfxutil.cpp +++ b/src/osd/modules/render/bgfxutil.cpp @@ -14,29 +14,29 @@ #include "render.h" -const bgfx::Memory* bgfx_util::mame_texture_data_to_bgfx_texture_data(bgfx::TextureFormat::Enum &dst_format, uint32_t src_format, int rowpixels, int height, const rgb_t *palette, void *base, uint16_t *out_pitch) +const bgfx::Memory* bgfx_util::mame_texture_data_to_bgfx_texture_data(bgfx::TextureFormat::Enum &dst_format, uint32_t src_format, int rowpixels, int height, const rgb_t *palette, void *base, uint16_t &out_pitch, int &convert_stride) { bgfx::TextureInfo info; switch (src_format) { case PRIMFLAG_TEXFORMAT(TEXFORMAT_PALETTE16): case PRIMFLAG_TEXFORMAT(TEXFORMAT_YUY16): - dst_format = bgfx::TextureFormat::RG8; - if (out_pitch) - *out_pitch = rowpixels * 2; + dst_format = bgfx::TextureFormat::BGRA8; + convert_stride = 2; + out_pitch = rowpixels * 2; break; case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32): case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32): dst_format = bgfx::TextureFormat::BGRA8; - if (out_pitch) - *out_pitch = rowpixels * 4; + convert_stride = 1; + out_pitch = rowpixels * 4; break; } - bgfx::calcTextureSize(info, rowpixels, height, 1, false, false, 1, dst_format); + bgfx::calcTextureSize(info, rowpixels / convert_stride, height, 1, false, false, 1, dst_format); return bgfx::copy(base, info.storageSize); } -const bgfx::Memory* bgfx_util::mame_texture_data_to_argb32(uint32_t src_format, int width, int height, int rowpixels, const rgb_t *palette, void *base) +const bgfx::Memory* bgfx_util::mame_texture_data_to_bgra32(uint32_t src_format, int width, int height, int rowpixels, const rgb_t *palette, void *base) { const bgfx::Memory* mem = bgfx::alloc(rowpixels * height * 4); auto* dst = reinterpret_cast(mem->data); @@ -48,19 +48,19 @@ const bgfx::Memory* bgfx_util::mame_texture_data_to_argb32(uint32_t src_format, switch (src_format) { case PRIMFLAG_TEXFORMAT(TEXFORMAT_PALETTE16): - copy_util::copyline_palette16(dst, src16, width, palette); + copy_util::copyline_palette16_to_bgra(dst, src16, width, palette); src16 += rowpixels; break; case PRIMFLAG_TEXFORMAT(TEXFORMAT_YUY16): - copy_util::copyline_yuy16_to_argb(dst, src16, width, palette, 1); + copy_util::copyline_yuy16_to_bgra(dst, src16, width, palette, 1); src16 += rowpixels; break; case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32): - copy_util::copyline_argb32(dst, src32, width, palette); + copy_util::copyline_argb32_to_bgra(dst, src32, width, palette); src32 += rowpixels; break; case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32): - copy_util::copyline_rgb32(dst, src32, width, palette); + copy_util::copyline_rgb32_to_bgra(dst, src32, width, palette); src32 += rowpixels; break; default: diff --git a/src/osd/modules/render/bgfxutil.h b/src/osd/modules/render/bgfxutil.h index 2f961f6551e..010321bd6bd 100644 --- a/src/osd/modules/render/bgfxutil.h +++ b/src/osd/modules/render/bgfxutil.h @@ -11,8 +11,8 @@ class bgfx_util { public: - static const bgfx::Memory* mame_texture_data_to_bgfx_texture_data(bgfx::TextureFormat::Enum &dst_format, uint32_t format, int width, int height, const rgb_t *palette, void *base, uint16_t *out_pitch = nullptr); - static const bgfx::Memory* mame_texture_data_to_argb32(uint32_t src_format, int width, int height, int rowpixels, const rgb_t *palette, void *base); + static const bgfx::Memory* mame_texture_data_to_bgfx_texture_data(bgfx::TextureFormat::Enum &dst_format, uint32_t format, int rowpixels, int height, const rgb_t *palette, void *base, uint16_t &out_pitch, int &convert_stride); + static const bgfx::Memory* mame_texture_data_to_bgra32(uint32_t src_format, int width, int height, int rowpixels, const rgb_t *palette, void *base); static uint64_t get_blend_state(uint32_t blend); }; diff --git a/src/osd/modules/render/copyutil.h b/src/osd/modules/render/copyutil.h index 715fcba0dca..295b5a10200 100644 --- a/src/osd/modules/render/copyutil.h +++ b/src/osd/modules/render/copyutil.h @@ -24,6 +24,15 @@ public: } } + static inline void copyline_palette16_to_bgra(uint32_t *dst, const uint16_t *src, int width, const rgb_t *palette) + { + for (int x = 0; x < width; x++) + { + rgb_t srcpixel = palette[*src++]; + *dst++ = 0xff000000 | (srcpixel.r() << 16) | (srcpixel.g() << 8) | srcpixel.b(); + } + } + static inline void copyline_rgb32(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette) { int x; @@ -49,6 +58,32 @@ public: } } + static inline void copyline_rgb32_to_bgra(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette) + { + int x; + + // palette (really RGB map) case + if (palette != nullptr) + { + for (x = 0; x < width; x++) + { + rgb_t srcpix = *src++; + uint32_t val = 0xff000000 | palette[0x200 + srcpix.b()] | palette[0x100 + srcpix.g()] | palette[srcpix.r()]; + *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16); + } + } + + // direct case + else + { + for (x = 0; x < width; x++) + { + rgb_t srcpix = *src++; + *dst++ = 0xff000000 | (srcpix.r() << 16) | (srcpix.g() << 8) | srcpix.b(); + } + } + } + static inline void copyline_argb32(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette) { int x; @@ -73,6 +108,31 @@ public: } } + static inline void copyline_argb32_to_bgra(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette) + { + int x; + // palette (really RGB map) case + if (palette != nullptr) + { + for (x = 0; x < width; x++) + { + rgb_t srcpix = *src++; + uint32_t val = (srcpix & 0xff000000) | palette[0x200 + srcpix.b()] | palette[0x100 + srcpix.g()] | palette[srcpix.r()]; + *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16); + } + } + + // direct case + else + { + for (x = 0; x < width; x++) + { + rgb_t srcpix = *src++; + *dst++ = (srcpix.a() << 24) | (srcpix.r() << 16) | (srcpix.g() << 8) | srcpix.b(); + } + } + } + static inline uint32_t ycc_to_rgb(uint8_t y, uint8_t cb, uint8_t cr) { /* original equations: @@ -116,14 +176,12 @@ public: static inline void copyline_yuy16_to_argb(uint32_t *dst, const uint16_t *src, int width, const rgb_t *palette, int xprescale) { - int x; - assert(width % 2 == 0); // palette (really RGB map) case if (palette != nullptr) { - for (x = 0; x < width / 2; x++) + for (int x = 0; x < width / 2; x++) { uint16_t srcpix0 = *src++; uint16_t srcpix1 = *src++; @@ -139,7 +197,7 @@ public: // direct case else { - for (x = 0; x < width; x += 2) + for (int x = 0; x < width; x += 2) { uint16_t srcpix0 = *src++; uint16_t srcpix1 = *src++; @@ -152,6 +210,55 @@ public: } } } + + static inline void copyline_yuy16_to_bgra(uint32_t *dst, const uint16_t *src, int width, const rgb_t *palette, int xprescale) + { + assert(width % 2 == 0); + + // palette (really RGB map) case + if (palette != nullptr) + { + for (int x = 0; x < width / 2; x++) + { + uint16_t srcpix0 = *src++; + uint16_t srcpix1 = *src++; + uint8_t cb = srcpix0 & 0xff; + uint8_t cr = srcpix1 & 0xff; + for (int x2 = 0; x2 < xprescale; x2++) + { + uint32_t val = ycc_to_rgb(palette[0x000 + (srcpix0 >> 8)], cb, cr); + *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16); + } + for (int x2 = 0; x2 < xprescale; x2++) + { + uint32_t val = ycc_to_rgb(palette[0x000 + (srcpix1 >> 8)], cb, cr); + *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16); + } + } + } + + // direct case + else + { + for (int x = 0; x < width; x += 2) + { + uint16_t srcpix0 = *src++; + uint16_t srcpix1 = *src++; + uint8_t cb = srcpix0 & 0xff; + uint8_t cr = srcpix1 & 0xff; + for (int x2 = 0; x2 < xprescale; x2++) + { + uint32_t val = ycc_to_rgb(srcpix0 >> 8, cb, cr); + *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16); + } + for (int x2 = 0; x2 < xprescale; x2++) + { + uint32_t val = ycc_to_rgb(srcpix1 >> 8, cb, cr); + *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16); + } + } + } + } }; #endif // __RENDER_COPYUTIL__ diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp index 5695e4a2c7c..3f99bfc09f0 100644 --- a/src/osd/modules/render/drawbgfx.cpp +++ b/src/osd/modules/render/drawbgfx.cpp @@ -108,8 +108,7 @@ renderer_bgfx::renderer_bgfx(std::shared_ptr w) renderer_bgfx::~renderer_bgfx() { bgfx::reset(0, 0, BGFX_RESET_NONE); - //bgfx::touch(0); - //bgfx::frame(); + if (m_avi_writer != nullptr && m_avi_writer->recording()) { m_avi_writer->stop(); @@ -125,6 +124,9 @@ renderer_bgfx::~renderer_bgfx() } // Cleanup. + if (m_ortho_view) + delete m_ortho_view; + delete m_chains; delete m_effects; delete m_shaders; @@ -349,7 +351,7 @@ int renderer_bgfx::create() m_sliders_dirty = true; uint32_t flags = BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT; - m_texture_cache = m_textures->create_texture("#cache", bgfx::TextureFormat::RGBA8, CACHE_SIZE, CACHE_SIZE, nullptr, flags); + m_texture_cache = m_textures->create_texture("#cache", bgfx::TextureFormat::BGRA8, CACHE_SIZE, CACHE_SIZE, nullptr, flags); memset(m_white, 0xff, sizeof(uint32_t) * 16 * 16); m_texinfo.push_back(rectangle_packer::packable_rectangle(WHITE_HASH, PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32), 16, 16, 16, nullptr, m_white)); @@ -391,8 +393,8 @@ void renderer_bgfx::record() else { m_avi_writer->record(m_options.bgfx_avi_name()); - m_avi_target = m_targets->create_target("avibuffer", bgfx::TextureFormat::RGBA8, m_width[0], m_height[0], TARGET_STYLE_CUSTOM, false, true, 1, 0); - m_avi_texture = bgfx::createTexture2D(m_width[0], m_height[0], false, 1, bgfx::TextureFormat::RGBA8, BGFX_TEXTURE_BLIT_DST | BGFX_TEXTURE_READ_BACK); + m_avi_target = m_targets->create_target("avibuffer", bgfx::TextureFormat::BGRA8, m_width[0], m_height[0], TARGET_STYLE_CUSTOM, false, true, 1, 0); + m_avi_texture = bgfx::createTexture2D(m_width[0], m_height[0], false, 1, bgfx::TextureFormat::BGRA8, BGFX_TEXTURE_BLIT_DST | BGFX_TEXTURE_READ_BACK); if (m_avi_view == nullptr) { @@ -599,9 +601,9 @@ void renderer_bgfx::render_textured_quad(render_primitive* prim, bgfx::Transient bgfx::TextureHandle texture = BGFX_INVALID_HANDLE; if (is_screen) { - const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_argb32(prim->flags & PRIMFLAG_TEXFORMAT_MASK + const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgra32(prim->flags & PRIMFLAG_TEXFORMAT_MASK , tex_width, tex_height, prim->texture.rowpixels, prim->texture.palette, prim->texture.base); - texture = bgfx::createTexture2D(tex_width, tex_height, false, 1, bgfx::TextureFormat::RGBA8, texture_flags, mem); + texture = bgfx::createTexture2D(tex_width, tex_height, false, 1, bgfx::TextureFormat::BGRA8, texture_flags, mem); } else { @@ -1164,10 +1166,11 @@ void renderer_bgfx::process_atlas_packs(std::vectortexture(), 0, 0, rect.x(), rect.y(), rect.width(), rect.height(), mem, pitch); + int convert_stride = 1; + const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, rect.format(), rect.rowpixels(), rect.height(), rect.palette(), rect.base(), pitch, convert_stride); + bgfx::updateTexture2D(m_texture_cache->texture(), 0, 0, rect.x(), rect.y(), rect.width() / convert_stride, rect.height(), mem, pitch); } } }