mirror of https://github.com/PCSX2/pcsx2.git
VIF: Set decoding status on VIF stall (#3683)
* VIF: Set decoding status on VIF stall * VIF/GIF: Remove VIF Reset hack, Let GIF Unit reset queued path data (Except MTVU)
This commit is contained in:
parent
f7f9e30efc
commit
b5e3fc97dc
|
@ -196,16 +196,17 @@ struct Gif_Path {
|
|||
void Reset(bool softReset = false) {
|
||||
state = GIF_PATH_IDLE;
|
||||
if (softReset) {
|
||||
GUNIT_WARN("Gif Path %d - Soft Reset", idx+1);
|
||||
//gifTag.Reset();
|
||||
//gsPack.Reset();
|
||||
//curOffset = curSize;
|
||||
if (!isMTVU()) // MTVU Freaks out if you try to reset it, so let's just let it transfer
|
||||
{
|
||||
GUNIT_WARN("Gif Path %d - Soft Reset", idx + 1);
|
||||
curSize = curOffset;
|
||||
}
|
||||
return;
|
||||
}
|
||||
mtvu.Reset();
|
||||
curSize = 0;
|
||||
curOffset = 0;
|
||||
readAmount = 0;
|
||||
curSize = 0;
|
||||
curOffset = 0;
|
||||
readAmount = 0;
|
||||
gifTag.Reset();
|
||||
gsPack.Reset();
|
||||
}
|
||||
|
|
|
@ -175,38 +175,15 @@ __fi void vif1FBRST(u32 value) {
|
|||
vif1.done = true;
|
||||
vif1ch.chcr.STR = false;
|
||||
|
||||
//HACK!! Dynasty Warriors 5 Empires has some sort of wierd packet alignment thing going off, meaning
|
||||
//the packet ends before the DirectHL in progress has finished. Not sure what causes that, but the GIF
|
||||
//Unit is still waiting for more data, so we have to "pretend" it is finished when the game issues a reset
|
||||
//which it does without causing any pauses.
|
||||
//In most cases, this will never ever happen, so doing the following won't matter.
|
||||
if(!gifUnit.gifPath[GIF_PATH_2].isDone())
|
||||
{
|
||||
DevCon.Warning("VIF1 FBRST While GIF Path2 is waiting for data!");
|
||||
gifUnit.gifPath[GIF_PATH_2].state = GIF_PATH_IDLE;
|
||||
gifUnit.gifPath[GIF_PATH_2].curSize = gifUnit.gifPath[GIF_PATH_2].curOffset;
|
||||
|
||||
if( gifRegs.stat.APATH == 2)
|
||||
{
|
||||
gifRegs.stat.APATH = 0;
|
||||
gifRegs.stat.OPH = 0;
|
||||
vif1Regs.stat.VGW = false; //Let vif continue if it's stuck on a flush
|
||||
|
||||
if(gifUnit.checkPaths(1,0,1)) gifUnit.Execute(false, true);
|
||||
}
|
||||
}
|
||||
|
||||
GUNIT_WARN(Color_Red, "VIF FBRST Reset MSK = %x", vif1Regs.mskpath3);
|
||||
vif1Regs.mskpath3 = false;
|
||||
gifRegs.stat.M3P = 0;
|
||||
|
||||
vif1Regs.err.reset();
|
||||
vif1.inprogress = 0;
|
||||
vif1.cmd = 0;
|
||||
vif1.vifstalled.enabled = false;
|
||||
vif1.irqoffset.enabled = false;
|
||||
vif1Regs.stat.FQC = 0;
|
||||
vif1Regs.stat.clear_flags(VIF1_STAT_FDR | VIF1_STAT_INT | VIF1_STAT_VSS | VIF1_STAT_VIS | VIF1_STAT_VFS | VIF1_STAT_VPS);
|
||||
vif1Regs.stat._u32 = 0;
|
||||
}
|
||||
|
||||
/* Fixme: Forcebreaks are pretty unknown for operation, presumption is it just stops it what its doing
|
||||
|
|
|
@ -182,7 +182,8 @@ __fi void vif0Interrupt()
|
|||
|
||||
if (vif0.irq && vif0.vifstalled.enabled && vif0.vifstalled.value == VIF_IRQ_STALL)
|
||||
{
|
||||
vif0Regs.stat.INT = true;
|
||||
if (!vif0Regs.stat.ER1)
|
||||
vif0Regs.stat.INT = true;
|
||||
|
||||
//Yakuza watches VIF_STAT so lets do this here.
|
||||
if (((vif0Regs.code >> 24) & 0x7f) != 0x7) {
|
||||
|
@ -201,6 +202,7 @@ __fi void vif0Interrupt()
|
|||
vif0Regs.stat.FQC = std::min((u16)0x8, vif0ch.qwc);
|
||||
if (vif0ch.qwc > 0 || !vif0.done)
|
||||
{
|
||||
vif0Regs.stat.VPS = VPS_DECODING; //If there's more data you need to say it's decoding the next VIF CMD (Onimusha - Blade Warriors)
|
||||
VIF_LOG("VIF0 Stalled");
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -331,7 +331,8 @@ __fi void vif1Interrupt()
|
|||
if (vif1.irq && vif1.vifstalled.enabled && vif1.vifstalled.value == VIF_IRQ_STALL)
|
||||
{
|
||||
VIF_LOG("VIF IRQ Firing");
|
||||
vif1Regs.stat.INT = true;
|
||||
if (!vif1Regs.stat.ER1)
|
||||
vif1Regs.stat.INT = true;
|
||||
|
||||
//Yakuza watches VIF_STAT so lets do this here.
|
||||
if (((vif1Regs.code >> 24) & 0x7f) != 0x7) {
|
||||
|
@ -350,6 +351,7 @@ __fi void vif1Interrupt()
|
|||
vif1Regs.stat.FQC = std::min((u16)0x10, vif1ch.qwc);
|
||||
if((vif1ch.qwc > 0 || !vif1.done) && !CHECK_VIF1STALLHACK)
|
||||
{
|
||||
vif1Regs.stat.VPS = VPS_DECODING; //If there's more data you need to say it's decoding the next VIF CMD (Onimusha - Blade Warriors)
|
||||
VIF_LOG("VIF1 Stalled");
|
||||
return;
|
||||
}
|
||||
|
@ -404,8 +406,8 @@ __fi void vif1Interrupt()
|
|||
return; //Dont want to end if vif is stalled.
|
||||
}
|
||||
#ifdef PCSX2_DEVBUILD
|
||||
if (vif1ch.qwc > 0) Console.WriteLn("VIF1 Ending with %x QWC left", vif1ch.qwc);
|
||||
if (vif1.cmd != 0) Console.WriteLn("vif1.cmd still set %x tag size %x", vif1.cmd, vif1.tag.size);
|
||||
if (vif1ch.qwc > 0) DevCon.WriteLn("VIF1 Ending with %x QWC left", vif1ch.qwc);
|
||||
if (vif1.cmd != 0) DevCon.WriteLn("vif1.cmd still set %x tag size %x", vif1.cmd, vif1.tag.size);
|
||||
#endif
|
||||
|
||||
if((vif1ch.chcr.DIR == VIF_NORMAL_TO_MEM_MODE) && vif1.GSLastDownloadSize <= 16)
|
||||
|
|
|
@ -434,13 +434,6 @@ vifOp(vifCode_Nop) {
|
|||
GetVifX.pass = 0;
|
||||
vifExecQueue(idx);
|
||||
|
||||
//If the top bit was set to interrupt, we don't want it to take commands from a bad code if it's interpreted as a nop by us.
|
||||
//Onimusha - Blade Warriors
|
||||
if ((vifXRegs.code & 0x80000000) && (vifXRegs.code & 0xFF0000) != 0 && vifXch.qwc > 0 /*Not tag*/)
|
||||
{
|
||||
GetVifX.irq = 0;
|
||||
}
|
||||
|
||||
if (GetVifX.vifpacketsize > 1)
|
||||
{
|
||||
if(((data[1] >> 24) & 0x7f) == 0x6 && (data[1] & 0x1)) //is mskpath3 next
|
||||
|
|
Loading…
Reference in New Issue