From f127f69b3e9fb108effefcb9f6413ad0ace18437 Mon Sep 17 00:00:00 2001 From: arcum42 Date: Fri, 10 Apr 2009 01:34:04 +0000 Subject: [PATCH] A few tweaks to the unpacking code. _UNPACKPart isn't really neccessary anymore, and optimised writeXYZW a little. git-svn-id: http://pcsx2.googlecode.com/svn/trunk@941 96395faa-99c1-11dd-bbfe-3dabce05a288 --- pcsx2/Vif.cpp | 88 ++++++++++++++++++++++++++++----------------------- pcsx2/Vif.h | 29 +++++++---------- 2 files changed, 59 insertions(+), 58 deletions(-) diff --git a/pcsx2/Vif.cpp b/pcsx2/Vif.cpp index 684927a591..8157efef21 100644 --- a/pcsx2/Vif.cpp +++ b/pcsx2/Vif.cpp @@ -47,8 +47,6 @@ enum UnpackOffset OFFSET_W = 3 }; -#define spr0 ((DMACh*)&PS2MEM_HW[0xD000]) - __forceinline static int _limit(int a, int max) { return (a > max) ? max : a; @@ -95,8 +93,8 @@ static __releaseinline void writeXYZW(u32 offnum, u32 &dest, u32 data) dest = data + vifRowReg; break; case 2: - vifRowReg += data; - dest = vifRowReg; + // vifRowReg isn't used after this, or I would make it equal to dest here. + dest = setVifRowRegs(offnum, vifRowReg + data); break; default: dest = data; @@ -107,33 +105,13 @@ static __releaseinline void writeXYZW(u32 offnum, u32 &dest, u32 data) dest = vifRowReg; break; case 2: - if (_vif->cl > 2) - dest = getVifColRegs(3); - else - dest = getVifColRegs(_vif->cl); + dest = getVifColRegs((_vif->cl > 2) ? 3 : _vif->cl); break; + jNO_DEFAULT; } - setVifRowRegs(offnum, vifRowReg); // VIF_LOG("writeX %8.8x : Mode %d, r0 = %x, data %8.8x", *dest,_vifRegs->mode,_vifRegs->r0,data); } -template -static __releaseinline void _UNPACKpart(u32 offnum, u32 &x, T y, int size) -{ - if (size > 0) - { - writeXYZW(offnum, x, y); - _vifRegs->offset++; - } -} - -template -static __releaseinline void _UNPACKpart(u32 offnum, u32 &x, T y) -{ - writeXYZW(offnum, x, y); - _vifRegs->offset++; -} - template void __fastcall UNPACK_S(u32 *dest, T *data, int size) { @@ -147,21 +125,35 @@ void __fastcall UNPACK_S(u32 *dest, T *data, int size) template void __fastcall UNPACK_V2(u32 *dest, T *data, int size) { - if(_vifRegs->offset == OFFSET_X) + if (_vifRegs->offset == OFFSET_X) { - _UNPACKpart(_vifRegs->offset, *dest++, *data++, size--); + if (size > 0) + { + writeXYZW(_vifRegs->offset, *dest++, *data++); + _vifRegs->offset = OFFSET_Y; + size--; + } } - if(_vifRegs->offset == OFFSET_Y) + + if (_vifRegs->offset == OFFSET_Y) { - _UNPACKpart(_vifRegs->offset, *dest++, *data, size--); + if (size > 0) + { + writeXYZW(_vifRegs->offset, *dest++, *data); + _vifRegs->offset = OFFSET_Z; + size--; + } } - if(_vifRegs->offset == OFFSET_Z) + + if (_vifRegs->offset == OFFSET_Z) { - _UNPACKpart(_vifRegs->offset, *dest++, *dest-2); + writeXYZW(_vifRegs->offset, *dest++, *dest-2); + _vifRegs->offset = OFFSET_W; } - if(_vifRegs->offset == OFFSET_W) + + if (_vifRegs->offset == OFFSET_W) { - _UNPACKpart(_vifRegs->offset, *dest, *data); + writeXYZW(_vifRegs->offset, *dest, *data); _vifRegs->offset = OFFSET_X; } } @@ -171,21 +163,35 @@ void __fastcall UNPACK_V3(u32 *dest, T *data, int size) { if(_vifRegs->offset == OFFSET_X) { - _UNPACKpart(_vifRegs->offset, *dest++, *data++, size--); + if (size > 0) + { + writeXYZW(_vifRegs->offset, *dest++, *data++); + _vifRegs->offset = OFFSET_Y; + size--; + } } + if(_vifRegs->offset == OFFSET_Y) { - _UNPACKpart(_vifRegs->offset, *dest++, *data++, size--); + if (size > 0) + { + writeXYZW(_vifRegs->offset, *dest++, *data++); + _vifRegs->offset = OFFSET_Z; + size--; + } } + if(_vifRegs->offset == OFFSET_Z) { - _UNPACKpart(_vifRegs->offset, *dest++, *data++); + writeXYZW(_vifRegs->offset, *dest++, *data++); + _vifRegs->offset = OFFSET_W; } - if(_vifRegs->offset == OFFSET_W) + + if(_vifRegs->offset == OFFSET_W) { //V3-# does some bizzare thing with alignment, every 6qw of data the W becomes 0 (strange console!) //Ape Escape doesnt seem to like it tho (what the hell?) gonna have to investigate - _UNPACKpart(_vifRegs->offset, *dest, *data); + writeXYZW(_vifRegs->offset, *dest, *data); _vifRegs->offset = OFFSET_X; } } @@ -195,7 +201,9 @@ void __fastcall UNPACK_V4(u32 *dest, T *data , int size) { while (size > 0) { - _UNPACKpart(_vifRegs->offset, *dest++, *data++, size--); + writeXYZW(_vifRegs->offset, *dest++, *data++); + _vifRegs->offset++; + size--; } if (_vifRegs->offset > OFFSET_W) _vifRegs->offset = OFFSET_X; diff --git a/pcsx2/Vif.h b/pcsx2/Vif.h index eb26758fbf..fa318d7618 100644 --- a/pcsx2/Vif.h +++ b/pcsx2/Vif.h @@ -87,7 +87,7 @@ extern "C" extern u32* _vifCol; } -__forceinline void setVifRowRegs(u32 reg, u32 data) +static __forceinline u32 setVifRowRegs(u32 reg, u32 data) { switch (reg) { @@ -103,13 +103,12 @@ __forceinline void setVifRowRegs(u32 reg, u32 data) case 3: _vifRegs->r3 = data; break; - default: - assert(0); - break; + jNO_DEFAULT; } + return data; } -__forceinline u32 getVifRowRegs(u32 reg) +static __forceinline u32 getVifRowRegs(u32 reg) { switch (reg) { @@ -125,14 +124,11 @@ __forceinline u32 getVifRowRegs(u32 reg) case 3: return _vifRegs->r3; break; - default: - assert(0); - return 0; - break; + jNO_DEFAULT; } } -__forceinline void setVifColRegs(u32 reg, u32 data) +static __forceinline u32 setVifColRegs(u32 reg, u32 data) { switch (reg) { @@ -148,13 +144,12 @@ __forceinline void setVifColRegs(u32 reg, u32 data) case 3: _vifRegs->c3 = data; break; - default: - assert(0); - break; + jNO_DEFAULT; } + return data; } -__forceinline u32 getVifColRegs(u32 reg) +static __forceinline u32 getVifColRegs(u32 reg) { switch (reg) { @@ -170,15 +165,13 @@ __forceinline u32 getVifColRegs(u32 reg) case 3: return _vifRegs->c3; break; - default: - assert(0); - return 0; - break; + jNO_DEFAULT; } } #define vif0Regs ((VIFregisters*)&PS2MEM_HW[0x3800]) #define vif1Regs ((VIFregisters*)&PS2MEM_HW[0x3c00]) +#define spr0 ((DMACh*)&PS2MEM_HW[0xD000]) void dmaVIF0(); void dmaVIF1();