From 566018c7578bea3049f5536a0142a19787011b22 Mon Sep 17 00:00:00 2001 From: dinkc64 Date: Mon, 17 Jun 2024 23:52:52 -0400 Subject: [PATCH] fix softfx scaler hq3xs --- makefile.burner_win32_rules | 2 +- src/burner/win32/app.rc | 2 +- src/burner/win32/menu.cpp | 2 +- src/intf/video/scalers/hq_shared32.cpp | 65 +++++++++++++++++++------- src/intf/video/scalers/hq_shared32.h | 4 +- src/intf/video/vid_softfx.cpp | 4 +- 6 files changed, 55 insertions(+), 24 deletions(-) diff --git a/makefile.burner_win32_rules b/makefile.burner_win32_rules index 4f553fb4b..62305871c 100644 --- a/makefile.burner_win32_rules +++ b/makefile.burner_win32_rules @@ -25,7 +25,7 @@ depobj += about.o bzip.o choose_monitor.o cona.o debugger.o drv.o d3dkmt_sync.o aud_dsp.o aud_interface.o cd_interface.o inp_interface.o interface.o lowpass2.o prf_interface.o vid_interface.o \ vid_softfx.o vid_support.o \ \ - 2xpm.o 2xsai.o crt.o ddt3x.o epx.o hq2xs.o hq2xs_16.o xbr.o xbr32.o \ + 2xpm.o 2xsai.o crt.o ddt3x.o epx.o hq2xs.o hq2xs_16.o hq3xs.o hq_shared32.o xbr.o xbr32.o \ \ aud_dsound3.o aud_xaudio2.o cd_img.o ddraw_core.o dinput_core.o directx9_core.o dsound_core.o \ inp_dinput.o prf_performance_counter.o vid_d3d.o vid_ddraw.o vid_ddrawfx.o vid_effect.o vid_directx9.o vid_directx_support.o diff --git a/src/burner/win32/app.rc b/src/burner/win32/app.rc index f5a6a5941..14c513088 100644 --- a/src/burner/win32/app.rc +++ b/src/burner/win32/app.rc @@ -1279,7 +1279,7 @@ BEGIN MENUITEM "hq3x Filter", MENU_ENHANCED_SOFT_HQ3X MENUITEM "hq4x Filter", MENU_ENHANCED_SOFT_HQ4X MENUITEM "hq2xS (VBA) Filter", MENU_ENHANCED_SOFT_HQ2XS_VBA - MENUITEM "hq3xS (VBA) Filter", MENU_ENHANCED_SOFT_HQ3XS_VBA, GRAYED + MENUITEM "hq3xS (VBA) Filter", MENU_ENHANCED_SOFT_HQ3XS_VBA MENUITEM "hq2xS (SNES9X) Filter", MENU_ENHANCED_SOFT_HQ2XS_SNES9X MENUITEM "hq3xS (SNEX9X) Filter", MENU_ENHANCED_SOFT_HQ3XS_SNES9X MENUITEM "hq2xBold Filter", MENU_ENHANCED_SOFT_HQ2XBOLD diff --git a/src/burner/win32/menu.cpp b/src/burner/win32/menu.cpp index 8af9999fe..4721836bd 100644 --- a/src/burner/win32/menu.cpp +++ b/src/burner/win32/menu.cpp @@ -1303,7 +1303,7 @@ void MenuEnableItems() EnableMenuItem(hMenu, MENU_MODELESS, MF_ENABLED | MF_BYCOMMAND); -#if defined _MSC_VER && defined BUILD_X86_ASM +#if defined BUILD_X86_ASM EnableMenuItem(hBlitterMenu[1], MENU_ENHANCED_SOFT_HQ3XS_VBA, MF_ENABLED | MF_BYCOMMAND); EnableMenuItem(hBlitterMenu[2], MENU_SOFTFX_SOFT_HQ3XS_VBA, MF_ENABLED | MF_BYCOMMAND); EnableMenuItem(hBlitterMenu[4], MENU_DX9_ALT_SOFT_HQ3XS_VBA, MF_ENABLED | MF_BYCOMMAND); diff --git a/src/intf/video/scalers/hq_shared32.cpp b/src/intf/video/scalers/hq_shared32.cpp index 93df36772..d07ada397 100644 --- a/src/intf/video/scalers/hq_shared32.cpp +++ b/src/intf/video/scalers/hq_shared32.cpp @@ -16,16 +16,20 @@ // along with this program; if not, write to the Free Software Foundation, // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#define USE_C_CODE 1 +#include "burnint.h" #include "hq_shared32.h" -const unsigned __int64 reg_blank = 0x0000000000000000; -const unsigned __int64 const7 = 0x0000000700070007; -const unsigned __int64 treshold = 0x0000000000300706; +const UINT64 reg_blank = 0x0000000000000000; +const UINT64 const7 = 0x0000000700070007; +const UINT64 treshold = 0x0000000000300706; void Interp1(unsigned char * pc, unsigned int c1, unsigned int c2) { - //*((int*)pc) = (c1*3+c2)/4; - +#ifdef USE_C_CODE + *((int*)pc) = (c1*3+c2)/4; +#else #ifdef MMX __asm { @@ -52,12 +56,14 @@ void Interp1(unsigned char * pc, unsigned int c1, unsigned int c2) mov [eax], edx } #endif +#endif } void Interp2(unsigned char * pc, unsigned int c1, unsigned int c2, unsigned int c3) { - //*((int*)pc) = (c1*2+c2+c3)/4; - +#ifdef USE_C_CODE + *((int*)pc) = (c1*2+c2+c3)/4; +#else #ifdef MMX __asm { @@ -84,14 +90,16 @@ void Interp2(unsigned char * pc, unsigned int c1, unsigned int c2, unsigned int mov [eax], edx } #endif +#endif } void Interp3(unsigned char * pc, unsigned int c1, unsigned int c2) { - //*((int*)pc) = (c1*7+c2)/8; - //*((int*)pc) = ((((c1 & 0x00FF00)*7 + (c2 & 0x00FF00) ) & 0x0007F800) + - // (((c1 & 0xFF00FF)*7 + (c2 & 0xFF00FF) ) & 0x07F807F8)) >> 3; - +#ifdef USE_C_CODE + *((int*)pc) = (c1*7+c2)/8; + *((int*)pc) = ((((c1 & 0x00FF00)*7 + (c2 & 0x00FF00) ) & 0x0007F800) + + (((c1 & 0xFF00FF)*7 + (c2 & 0xFF00FF) ) & 0x07F807F8)) >> 3; +#else #ifdef MMX __asm { @@ -121,14 +129,16 @@ void Interp3(unsigned char * pc, unsigned int c1, unsigned int c2) mov [eax], ecx } #endif +#endif } void Interp4(unsigned char * pc, unsigned int c1, unsigned int c2, unsigned int c3) { - //*((int*)pc) = (c1*2+(c2+c3)*7)/16; - //*((int*)pc) = ((((c1 & 0x00FF00)*2 + ((c2 & 0x00FF00) + (c3 & 0x00FF00))*7 ) & 0x000FF000) + - // (((c1 & 0xFF00FF)*2 + ((c2 & 0xFF00FF) + (c3 & 0xFF00FF))*7 ) & 0x0FF00FF0)) >> 4; - +#ifdef USE_C_CODE + *((int*)pc) = (c1*2+(c2+c3)*7)/16; + *((int*)pc) = ((((c1 & 0x00FF00)*2 + ((c2 & 0x00FF00) + (c3 & 0x00FF00))*7 ) & 0x000FF000) + + (((c1 & 0xFF00FF)*2 + ((c2 & 0xFF00FF) + (c3 & 0xFF00FF))*7 ) & 0x0FF00FF0)) >> 4; +#else #ifdef MMX __asm { @@ -183,12 +193,14 @@ void Interp4(unsigned char * pc, unsigned int c1, unsigned int c2, unsigned int mov [ebx], eax } #endif +#endif } void Interp5(unsigned char * pc, unsigned int c1, unsigned int c2) { - //*((int*)pc) = (c1+c2)/2; - +#ifdef USE_C_CODE + *((int*)pc) = (c1+c2)/2; +#else #ifdef MMX __asm { @@ -210,6 +222,7 @@ void Interp5(unsigned char * pc, unsigned int c1, unsigned int c2) mov [eax], edx } #endif +#endif } @@ -259,6 +272,12 @@ bool Diff(unsigned int c1, unsigned int c2) if (YUV1 == YUV2) return false; // Save some processing power +#ifdef USE_C_CODE + return + ( abs32((YUV1 & Ymask) - (YUV2 & Ymask)) > trY ) || + ( abs32((YUV1 & Umask) - (YUV2 & Umask)) > trU ) || + ( abs32((YUV1 & Vmask) - (YUV2 & Vmask)) > trV ); +#else #ifdef MMX unsigned int retval; __asm @@ -328,11 +347,22 @@ bool Diff(unsigned int c1, unsigned int c2) ( abs32((YUV1 & Umask) - (YUV2 & Umask)) > trU ) || ( abs32((YUV1 & Vmask) - (YUV2 & Vmask)) > trV ); #endif +#endif } unsigned int RGBtoYUV(unsigned int c) { // Division through 3 slows down the emulation about 10% !!! +#ifdef USE_C_CODE + unsigned char r, g, b, Y, u, v; + r = (c & 0x000000FF); + g = (c & 0x0000FF00) >> 8; + b = (c & 0x00FF0000) >> 16; + Y = (r + g + b) >> 2; + u = 128 + ((r - b) >> 2); + v = 128 + ((-r + 2*g -b)>>3); + return (Y<<16) + (u<<8) + v; +#else #ifdef MMX unsigned int retval; __asm @@ -410,4 +440,5 @@ unsigned int RGBtoYUV(unsigned int c) //v = (0.439216 * r - 0.367788 * g - 0.071427 * b) + 128; //return (y << 16) + (u << 8) + v; #endif +#endif } diff --git a/src/intf/video/scalers/hq_shared32.h b/src/intf/video/scalers/hq_shared32.h index af071c426..ec9409693 100644 --- a/src/intf/video/scalers/hq_shared32.h +++ b/src/intf/video/scalers/hq_shared32.h @@ -17,8 +17,8 @@ // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#define abs32(value) (value & 0x7FFFFFFF) -#define abs16(value) (value & 0x7FFF) +#define abs32(value) ((value) & 0x7FFFFFFF) +#define abs16(value) ((value) & 0x7FFF) const int Ymask = 0x00FF0000; const int Umask = 0x0000FF00; diff --git a/src/intf/video/vid_softfx.cpp b/src/intf/video/vid_softfx.cpp index 6e82b6808..e9abfee78 100644 --- a/src/intf/video/vid_softfx.cpp +++ b/src/intf/video/vid_softfx.cpp @@ -25,7 +25,7 @@ void _2xpm_hq(void *SrcPtr, void *DstPtr, unsigned long SrcPitch, unsigned long extern void hq2xS_init(unsigned bits_per_pixel); extern void hq2xS(unsigned char*, unsigned int, unsigned char*, unsigned char*, unsigned int, int, int); extern void hq2xS32(unsigned char*, unsigned int, unsigned char*, unsigned char*, unsigned int, int, int); -#if defined _MSC_VER && defined BUILD_X86_ASM +#if defined BUILD_X86_ASM extern void hq3xS(unsigned char*,unsigned int,unsigned char*,unsigned char*,unsigned int,int,int); extern void hq3xS32(unsigned char*,unsigned int,unsigned char*,unsigned char*,unsigned int,int,int); #endif @@ -881,7 +881,7 @@ void VidSoftFXApplyEffect(unsigned char* ps, unsigned char* pd, int nPitch) break; } case FILTER_HQ3XS_VBA: { // hq3xS filter (16/32BPP only) -#if defined _MSC_VER && defined BUILD_X86_ASM +#if defined BUILD_X86_ASM if (nVidImageDepth == 16) { hq3xS(ps, nSoftFXImagePitch, NULL, pd, nPitch, nSoftFXImageWidth, nSoftFXImageHeight); } else if (nVidImageDepth == 32) {