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
This commit is contained in:
arcum42 2009-04-10 01:34:04 +00:00
parent 19362d3c55
commit f127f69b3e
2 changed files with 59 additions and 58 deletions

View File

@ -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 <class T>
static __releaseinline void _UNPACKpart(u32 offnum, u32 &x, T y, int size)
{
if (size > 0)
{
writeXYZW(offnum, x, y);
_vifRegs->offset++;
}
}
template <class T>
static __releaseinline void _UNPACKpart(u32 offnum, u32 &x, T y)
{
writeXYZW(offnum, x, y);
_vifRegs->offset++;
}
template <class T>
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 <class T>
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;

View File

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