diff --git a/pcsx2/Vif_Codes.cpp b/pcsx2/Vif_Codes.cpp index c011a00b36..97d035d3c7 100644 --- a/pcsx2/Vif_Codes.cpp +++ b/pcsx2/Vif_Codes.cpp @@ -100,6 +100,7 @@ static __fi void vuExecMicro(int idx, u32 addr) { GetVifX.queued_program = true; GetVifX.queued_pc = addr; + GetVifX.unpackcalls = 0; } void ExecuteVU(int idx) diff --git a/pcsx2/Vif_Dma.h b/pcsx2/Vif_Dma.h index 31ca98c31c..13022ceaf4 100644 --- a/pcsx2/Vif_Dma.h +++ b/pcsx2/Vif_Dma.h @@ -80,7 +80,7 @@ struct vifStruct { tVIF_CTRL vifstalled; bool stallontag; bool waitforvu; - + int unpackcalls; // GS registers used for calculating the size of the last local->host transfer initiated on the GS // Transfer size calculation should be restricted to GS emulation in the future tBITBLTBUF BITBLTBUF; diff --git a/pcsx2/Vif_Unpack.cpp b/pcsx2/Vif_Unpack.cpp index 19943a2922..122054d26e 100644 --- a/pcsx2/Vif_Unpack.cpp +++ b/pcsx2/Vif_Unpack.cpp @@ -193,8 +193,12 @@ _vifT void vifUnpackSetup(const u32 *data) { vifX.cmd = 0; return; // Skipping write and 0 write-cycles, so do nothing! } - + GetVifX.unpackcalls++; + if (GetVifX.unpackcalls > 3) + { + vifExecQueue(idx); + } //if (!idx) vif0FLUSH(); // Only VU0? vifX.usn = (vifXRegs.code >> 14) & 0x01;