fix softfx scaler hq3xs

This commit is contained in:
dinkc64 2024-06-17 23:52:52 -04:00
parent 24d010b29c
commit 566018c757
6 changed files with 55 additions and 24 deletions

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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
}

View File

@ -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;

View File

@ -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) {