summaryrefslogtreecommitdiff
path: root/libpcsxcore/gpu.c
diff options
context:
space:
mode:
authorSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-11-12 14:00:21 +0000
committerSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-11-12 14:00:21 +0000
commit50077afa22a99cd4f4985b8017ef3d0f8c9a2ad6 (patch)
tree1e8da530beea1c9b6815c8487583b101154765ef /libpcsxcore/gpu.c
parent143dcb6825ab01f500886d3126db13bf9f5ed5d9 (diff)
downloadpcsxr-50077afa22a99cd4f4985b8017ef3d0f8c9a2ad6.tar.gz
Tekken 3 - gpu.c
- Add infinite dma loop check to chain slice - Fixes post-replay flicker git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@59480 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore/gpu.c')
-rw-r--r--libpcsxcore/gpu.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/libpcsxcore/gpu.c b/libpcsxcore/gpu.c
index 767d332e..8d33639f 100644
--- a/libpcsxcore/gpu.c
+++ b/libpcsxcore/gpu.c
@@ -42,6 +42,7 @@ extern unsigned int hSyncCount;
u32 chain_ptr_addr;
u32 chain_ptr_mem;
+u8 chain_infinite_loop;
/*
DMA2 Chain slicing
@@ -86,6 +87,7 @@ static u32 gpuDmaChainSize(u32 addr) {
// initial linked list ptr (word)
size = 1;
+ chain_infinite_loop = 0;
do {
addr &= 0x1ffffc;
@@ -95,7 +97,11 @@ static u32 gpuDmaChainSize(u32 addr) {
//if (DMACommandCounter++ > 2000000) break;
- if (CheckForEndlessLoop(addr)) break;
+ if (CheckForEndlessLoop(addr))
+ {
+ chain_infinite_loop = 1;
+ break;
+ }
// # 32-bit blocks to transfer
@@ -109,7 +115,7 @@ static u32 gpuDmaChainSize(u32 addr) {
chain_ptr_addr = addr;
- if( addr != 0xffffff )
+ if( !chain_infinite_loop && addr != 0xffffff )
{
// save data at stop ptr
chain_ptr_mem = psxMu32( addr );
@@ -229,8 +235,8 @@ void gpuInterrupt() {
#endif
- // check valid data left - no Tekken 3 check yet
- if( chain_ptr_addr != 0xffffff )
+ // check valid data left
+ if( !chain_infinite_loop && chain_ptr_addr != 0xffffff )
{
// put back old value first
psxMu32ref( chain_ptr_addr ) = chain_ptr_mem;