From 95325c6400b999aad358284df977fdb795e32a5d Mon Sep 17 00:00:00 2001 From: MooglyGuy Date: Tue, 24 Aug 2021 16:33:47 +0200 Subject: [PATCH] -bgfx: Revised fs_blit_palette16 to not use pixel rounding. Fixes issues in carpolo, kncljoe, and others. [Ryan Holtz] (#8488) --- .../dx11/chains/misc/fs_blit_palette16.bin | Bin 1020 -> 672 bytes .../dx9/chains/misc/fs_blit_palette16.bin | Bin 805 -> 481 bytes .../essl/chains/misc/fs_blit_palette16.bin | Bin 1063 -> 445 bytes .../glsl/chains/misc/fs_blit_palette16.bin | Bin 1000 -> 422 bytes .../metal/chains/misc/fs_blit_palette16.bin | Bin 1476 -> 958 bytes .../spirv/chains/misc/fs_blit_palette16.bin | Bin 2628 -> 1660 bytes .../shaders/chains/misc/fs_blit_palette16.sc | 19 ++-------- src/osd/modules/render/bgfxutil.cpp | 33 ++++++++++++++++-- 8 files changed, 32 insertions(+), 20 deletions(-) diff --git a/bgfx/shaders/dx11/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/dx11/chains/misc/fs_blit_palette16.bin index c32a68b09a6ffe646930c824a7b9f7110130c456..91a4aaf2d297d1dcbb455efaf9cdd00cb89a9cee 100644 GIT binary patch delta 244 zcmeyvzJOKHE!cybvH8&n2;eTadf!8ufv!H7WsEbAs9zyLI!VOkA@&yWD2Ef^R$U~0rzp=uixzWW1Q-BQe<%$A 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 diff --git a/bgfx/shaders/dx9/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/dx9/chains/misc/fs_blit_palette16.bin index 136f81cdd4791948c6bdd5b9bc6d4c6e26b06e2f..59f3c6dce2744de8d5b2b89a5f45c8ac766816fc 100644 GIT binary patch delta 238 zcmYj}u?oUK5JYEl8U+nO3#)uYQiyh9f?}_QrL|ZHHkJV!OT#HxUL)A~BmP7nSXuc2 z#<^4u_t>4e-MzWF@}~1yOAenLl*+tt6LkgPqt3Rdviz0IAM^i_*YIuU!jS*tR}dMEw1z&Ajekdc1MFpR5Pekv$V cXcnekd6fb$^6v}I!05LVGz1qTSZiPPeloTvfB*mh 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 diff --git a/bgfx/shaders/essl/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/essl/chains/misc/fs_blit_palette16.bin index 5ce09d13b325d35920a6effd8c74770e6ee475b9..d82fc7f6fbc2f989f4fd46935724130d9492bb40 100644 GIT binary patch delta 148 zcmZ3^v6q?GE!cybvH8bgXNE9e_>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 diff --git a/bgfx/shaders/glsl/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/glsl/chains/misc/fs_blit_palette16.bin index f9a7910a249a87dbb6330b3cc006e058f7dae3ca..aadd6349d8c62d9b684ce34c28f2927c77c3c718 100644 GIT binary patch delta 146 zcmaFCzKogIE!cybvH89Nvkw?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=plWgS#B()+rKffr&Ky&f|76V4j$&*+Om;x98xG5L9 delta 500 zcmaKoF-yZh6vuN(q1aNCf`bb3Ht(uEFG(Xp>niT9;vt%1ASTkLnp8>$SC^Xa;0N#n zIQd1~oON;ZU9N<@7-Jdz1ccGJ!z81uMY#y%AytaM4PM`L_Lk>L?(VJ z$HCOcsl^wfHU@_Yqe>XKa)*U^k2yjnGeJGB5^=EJpo4$M7*Fc z<9Ku>pab$I3FU-W!g!kX8-S-E73d(Sc%J@gxZ*%J9OwddxUxeg9?^p7fZ!fmXBDOg z(zQK=a@*S4rc}?S3qrG40)drPr z<9Y4sF|i3GlkUP6O%jlt19yUEQFq3;kkS3*;uQXe%(VFluXR*6h>$fIyO%b~8%y2Z z?$YwLBKnbW1gp)MgXVxZtQ9oc=q*`C){~87v+_q*BArqut^JP@q{YVXrIl|{nk~B= zv^vdNBq+a(x#0QD+Mw5uYM#Gjd9^j+U-0~d|Caczc4IG$T6dda^(k>OstlerF-+x7 znVqp@>!7!Kv$7Ti_0=$pc9GKhqu>2XHEf2Foe>=U+lQ&*S+w_=$CLWrz(%+i^a6R8 zGzI!TD`R=Qpfj%trvJDOM(1tOnL}I$qaSxV^N8zUbiRdkRp$Gr4pvDDoR7~8;`hPa zPsqs6T(YtmhndH`jD^lDz}|o4ur}40w0RbklX}QGr~mpq%}FtQH#ym9eQVR&!NiF# zk54HVb>KrB@L`Af)^ftW58~f&*!PWoUObCj=wRl}^8U=1<#p!CIwAin+H*2$$~(NQ zGwY1{SOh&z6YV6CXZ(CWI^H&)$$+IJlJKtpR_}{pDr8)*m{< z${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 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 c152bfa8fe3..e87f8a76315 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 @@ -15,22 +15,7 @@ uniform vec4 u_inv_tex_size1; void main() { - // 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; - + vec4 srcpix = texture2D(s_tex, v_texcoord0.xy); + vec2 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/bgfxutil.cpp b/src/osd/modules/render/bgfxutil.cpp index f0d01e4fa86..88d2fbf399a 100644 --- a/src/osd/modules/render/bgfxutil.cpp +++ b/src/osd/modules/render/bgfxutil.cpp @@ -17,23 +17,50 @@ 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; + const bgfx::Memory *data = nullptr; + switch (src_format) { - case PRIMFLAG_TEXFORMAT(TEXFORMAT_PALETTE16): case PRIMFLAG_TEXFORMAT(TEXFORMAT_YUY16): dst_format = bgfx::TextureFormat::BGRA8; convert_stride = 2; out_pitch = rowpixels * 2; + bgfx::calcTextureSize(info, rowpixels / convert_stride, height, 1, false, false, 1, dst_format); + + data = bgfx::copy(base, info.storageSize); break; + case PRIMFLAG_TEXFORMAT(TEXFORMAT_PALETTE16): + { + dst_format = bgfx::TextureFormat::BGRA8; + convert_stride = 1; + out_pitch = rowpixels * 4; + bgfx::calcTextureSize(info, rowpixels / convert_stride, height, 1, false, false, 1, dst_format); + + uint16_t *src = (uint16_t *)base; + uint16_t *dst_data = new uint16_t[rowpixels * 2 * height]; + uint16_t *dst = dst_data; + for (int i = 0; i < rowpixels * height; i++, src++) + { + *dst++ = *src; + *dst++ = 0; + } + + data = bgfx::copy(dst_data, info.storageSize); + delete [] dst_data; + break; + } case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32): case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32): dst_format = bgfx::TextureFormat::BGRA8; convert_stride = 1; out_pitch = rowpixels * 4; + bgfx::calcTextureSize(info, rowpixels / convert_stride, height, 1, false, false, 1, dst_format); + + data = bgfx::copy(base, info.storageSize); break; } - bgfx::calcTextureSize(info, rowpixels / convert_stride, height, 1, false, false, 1, dst_format); - return bgfx::copy(base, info.storageSize); + + return data; } 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)