Avoid changing video state on useless BP writes

When a game writes the same value that was already configured to a BP
register, Dolphin previously flushed the GPU pipeline and reconfigured
the internal video state (calling SetScissor/SetLineWidth/SetDepthMode).

Some of these useless writes still need to perform actions, for example
writes to the EFB copy trigger or the texture preload registers (which
need to reload the texture from memory).
This commit is contained in:
Pierre Bourdon 2012-05-20 20:56:03 +02:00
parent 7cccb4baa7
commit c95baf614d
1 changed files with 16 additions and 6 deletions

View File

@ -130,14 +130,24 @@ void BPWritten(const BPCmd& bp)
} // END ZTP SPEEDUP HACK
else
{
if (((s32*)&bpmem)[bp.address] != bp.newvalue)
if (((s32*)&bpmem)[bp.address] == bp.newvalue)
{
FlushPipeline();
if (!(bp.address == BPMEM_TRIGGER_EFB_COPY
|| bp.address == BPMEM_CLEARBBOX1
|| bp.address == BPMEM_CLEARBBOX2
|| bp.address == BPMEM_SETDRAWDONE
|| bp.address == BPMEM_PE_TOKEN_ID
|| bp.address == BPMEM_PE_TOKEN_INT_ID
|| bp.address == BPMEM_LOADTLUT0
|| bp.address == BPMEM_LOADTLUT1
|| bp.address == BPMEM_TEXINVALIDATE
|| bp.address == BPMEM_PRELOAD_MODE))
{
return;
}
}
else if (bp.address == BPMEM_TRIGGER_EFB_COPY
|| bp.address == BPMEM_CLEARBBOX1
|| bp.address == BPMEM_CLEARBBOX2)
FlushPipeline();
FlushPipeline();
}
((u32*)&bpmem)[bp.address] = bp.newvalue;