mirror of https://github.com/PCSX2/pcsx2.git
newVif: fix for rule of rose.
git-svn-id: http://pcsx2.googlecode.com/svn/trunk@2452 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
804cae0b15
commit
9e7d4dc49a
|
@ -130,7 +130,7 @@ int nVifUnpack(int idx, u8* data) {
|
||||||
|
|
||||||
if (v.partTransfer) { // Last transfer was a partial vector transfer...
|
if (v.partTransfer) { // Last transfer was a partial vector transfer...
|
||||||
const u8& vifT = nVifT[vif->cmd & 0xf];
|
const u8& vifT = nVifT[vif->cmd & 0xf];
|
||||||
const bool doMode = vifRegs->mode && !(vif->tag.cmd & 0x10);
|
const bool doMode = !!vifRegs->mode;
|
||||||
const int diff = vifT - v.partTransfer;
|
const int diff = vifT - v.partTransfer;
|
||||||
if (size < diff) DevCon.WriteLn("newVif: Still not enough data for unpack!");
|
if (size < diff) DevCon.WriteLn("newVif: Still not enough data for unpack!");
|
||||||
memcpy(&v.partBuffer[v.partTransfer], data, diff);
|
memcpy(&v.partBuffer[v.partTransfer], data, diff);
|
||||||
|
@ -142,8 +142,10 @@ int nVifUnpack(int idx, u8* data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret == v.vif->tag.size) { // Full Transfer
|
if (ret == v.vif->tag.size) { // Full Transfer
|
||||||
|
if (size > 0) {
|
||||||
if (newVifDynaRec) dVifUnpack(idx, data, size, isFill);
|
if (newVifDynaRec) dVifUnpack(idx, data, size, isFill);
|
||||||
else _nVifUnpack(idx, data, size, isFill);
|
else _nVifUnpack(idx, data, size, isFill);
|
||||||
|
} else if (isFill) _nVifUnpack(idx, data, size, isFill);
|
||||||
vif->tag.size = 0;
|
vif->tag.size = 0;
|
||||||
vif->cmd = 0;
|
vif->cmd = 0;
|
||||||
}
|
}
|
||||||
|
@ -227,8 +229,9 @@ __releaseinline void __fastcall _nVifUnpackLoop(u8 *data, u32 size) {
|
||||||
u8* dest = setVUptr(idx, vuMemBase, vif->tag.addr);
|
u8* dest = setVUptr(idx, vuMemBase, vif->tag.addr);
|
||||||
if (vif->cl >= blockSize) vif->cl = 0;
|
if (vif->cl >= blockSize) vif->cl = 0;
|
||||||
|
|
||||||
while (vifRegs->num && (size >= ft.gsize)) {
|
while (vifRegs->num) {
|
||||||
if (vif->cl < cycleSize) {
|
if (vif->cl < cycleSize) {
|
||||||
|
if (size < ft.gsize) break;
|
||||||
if (doMode) {
|
if (doMode) {
|
||||||
//DevCon.WriteLn("Non SSE; unpackNum = %d", upkNum);
|
//DevCon.WriteLn("Non SSE; unpackNum = %d", upkNum);
|
||||||
func((u32*)dest, (u32*)data);
|
func((u32*)dest, (u32*)data);
|
||||||
|
@ -272,7 +275,7 @@ _f void _nVifUnpack(int idx, u8 *data, u32 size, bool isFill) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool doMode = vifRegs->mode && !(vif->tag.cmd & 0x10);
|
const bool doMode = !!vifRegs->mode;
|
||||||
UnpackLoopTable[idx][doMode][isFill]( data, size );
|
UnpackLoopTable[idx][doMode][isFill]( data, size );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue