diff --git a/pcsx2/VIFunpack.cpp b/pcsx2/VIFunpack.cpp index 331c9153c7..6047af773c 100644 --- a/pcsx2/VIFunpack.cpp +++ b/pcsx2/VIFunpack.cpp @@ -321,6 +321,10 @@ static void __fastcall fUNPACK_V4_5(u32 *dest, u32 *data) #define _upk (UNPACKFUNCTYPE) #define _odd (UNPACKFUNCTYPE_ODD) +#define _unpk_s(bits) (UNPACKFUNCTYPE_S##bits) +#define _odd_s(bits) (UNPACKFUNCTYPE_ODD_S##bits) +#define _unpk_u(bits) (UNPACKFUNCTYPE_U##bits) +#define _odd_u(bits) (UNPACKFUNCTYPE_ODD_U##bits) // -------------------------------------------------------------------------------------- // Main table for function unpacking. @@ -331,16 +335,16 @@ static void __fastcall fUNPACK_V4_5(u32 *dest, u32 *data) // 32-bits versions are unsigned-only!! #define UnpackFuncPair32( sizefac, vt, doMask ) \ - _upk fUNPACK_##vt, \ - _upk fUNPACK_##vt, \ - _odd UNPACK_##vt, \ - _odd UNPACK_##vt, + (UNPACKFUNCTYPE)_unpk_u(32) fUNPACK_##vt, \ + (UNPACKFUNCTYPE)_unpk_u(32) fUNPACK_##vt, \ + (UNPACKFUNCTYPE_ODD)_odd_u(32) UNPACK_##vt, \ + (UNPACKFUNCTYPE_ODD)_odd_u(32) UNPACK_##vt, #define UnpackFuncPair( sizefac, vt, bits, doMask ) \ - _upk fUNPACK_##vt, \ - _upk fUNPACK_##vt, \ - _odd UNPACK_##vt, \ - _odd UNPACK_##vt, + (UNPACKFUNCTYPE)_unpk_u(bits) fUNPACK_##vt, \ + (UNPACKFUNCTYPE)_unpk_s(bits) fUNPACK_##vt, \ + (UNPACKFUNCTYPE_ODD)_odd_u(bits) UNPACK_##vt, \ + (UNPACKFUNCTYPE_ODD)_odd_s(bits) UNPACK_##vt, #define UnpackFuncSet( doMask ) \ { UnpackFuncPair32( 4, S, doMask ) /* 0x0 - S-32 */ \ @@ -374,8 +378,8 @@ static void __fastcall fUNPACK_V4_5(u32 *dest, u32 *data) { UnpackFuncPair ( 4, V4, 8, doMask ) /* 0xE - V4-8 */ \ 12, 1, 4, 4 }, \ { /* 0xF - V4-5 */ \ - _upk fUNPACK_V4_5, _upk fUNPACK_V4_5, \ - _odd UNPACK_V4_5, _odd UNPACK_V4_5, \ + (UNPACKFUNCTYPE)_unpk_u(32) fUNPACK_V4_5, (UNPACKFUNCTYPE)_unpk_u(32) fUNPACK_V4_5, \ + (UNPACKFUNCTYPE_ODD)_odd_u(32) UNPACK_V4_5, (UNPACKFUNCTYPE_ODD)_odd_u(32) UNPACK_V4_5, \ 6, 2, 2, 4 }, const __aligned16 VIFUnpackFuncTable VIFfuncTable[32] = diff --git a/pcsx2/VifDma_internal.h b/pcsx2/VifDma_internal.h index af0651e607..b969d92639 100644 --- a/pcsx2/VifDma_internal.h +++ b/pcsx2/VifDma_internal.h @@ -33,13 +33,28 @@ typedef void (__fastcall *UNPACKFUNCTYPE)(u32 *dest, u32 *data); typedef void (__fastcall *UNPACKFUNCTYPE_ODD)(u32 *dest, u32 *data, int size); typedef int (*UNPACKPARTFUNCTYPESSE)(u32 *dest, u32 *data, int size); +#define create_unpack_u_type(bits) typedef void (__fastcall *UNPACKFUNCTYPE_U##bits)(u32 *dest, u##bits *data); +#define create_unpack_odd_u_type(bits) typedef void (__fastcall *UNPACKFUNCTYPE_ODD_U##bits)(u32 *dest, u##bits *data, int size); +#define create_unpack_s_type(bits) typedef void (__fastcall *UNPACKFUNCTYPE_S##bits)(u32 *dest, s##bits *data); +#define create_unpack_odd_s_type(bits) typedef void (__fastcall *UNPACKFUNCTYPE_ODD_S##bits)(u32 *dest, s##bits *data, int size); + +#define create_some_unpacks(bits) \ + create_unpack_u_type(bits); \ + create_unpack_odd_u_type(bits); \ + create_unpack_s_type(bits); \ + create_unpack_odd_s_type(bits); + +create_some_unpacks(32); +create_some_unpacks(16); +create_some_unpacks(8); + struct VIFUnpackFuncTable { - UNPACKFUNCTYPE funcU; - UNPACKFUNCTYPE funcS; + UNPACKFUNCTYPE funcU; + UNPACKFUNCTYPE funcS; - UNPACKFUNCTYPE_ODD oddU; // needed for old-style vif only, remove when old vif is removed. - UNPACKFUNCTYPE_ODD oddS; // needed for old-style vif only, remove when old vif is removed. + UNPACKFUNCTYPE_ODD oddU; // needed for old-style vif only, remove when old vif is removed. + UNPACKFUNCTYPE_ODD oddS; // needed for old-style vif only, remove when old vif is removed. u8 bsize; // currently unused u8 dsize; // byte size of one channel diff --git a/pcsx2/x86/newVif.h b/pcsx2/x86/newVif.h index 07ff4a176d..9bf06c0bd8 100644 --- a/pcsx2/x86/newVif.h +++ b/pcsx2/x86/newVif.h @@ -20,7 +20,6 @@ #include "x86emitter/x86emitter.h" using namespace x86Emitter; extern void mVUmergeRegs(int dest, int src, int xyzw, bool modXYZW = 0); -extern void _nVifUnpack(int idx, u8 *data, u32 size); typedef u32 (__fastcall *nVifCall)(void*, void*); diff --git a/pcsx2/x86/newVif_Unpack.inl b/pcsx2/x86/newVif_Unpack.inl index fad9bf3ce0..86f6f710d3 100644 --- a/pcsx2/x86/newVif_Unpack.inl +++ b/pcsx2/x86/newVif_Unpack.inl @@ -20,6 +20,7 @@ #pragma once static __aligned16 nVifStruct nVif[2]; +static _f void _nVifUnpack(int idx, u8 *data, u32 size); int nVifUnpack(int idx, u32 *data) { XMMRegisters::Freeze();