aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornotaz2011-06-25 01:49:35 +0300
committernotaz2011-07-08 00:15:08 +0300
commitb03e0caf5e153551cb71065ffaa4361b7f7e492b (patch)
treec192a2d7f859235c2a4867c32556500996ff8141
parent4e44d6f63e9f1af3236fbbe2f59016cd42a67d98 (diff)
downloadpcsx_rearmed-b03e0caf5e153551cb71065ffaa4361b7f7e492b.tar.gz
pcsx_rearmed-b03e0caf5e153551cb71065ffaa4361b7f7e492b.tar.bz2
pcsx_rearmed-b03e0caf5e153551cb71065ffaa4361b7f7e492b.zip
gpus: return DMA word count to avoid 1 list walk
-rw-r--r--libpcsxcore/psxdma.c5
-rw-r--r--plugins/dfxvideo/gpu.c4
-rw-r--r--plugins/gpu_unai/gpu.cpp6
-rw-r--r--plugins/gpu_unai/port.h2
4 files changed, 12 insertions, 5 deletions
diff --git a/libpcsxcore/psxdma.c b/libpcsxcore/psxdma.c
index 1274d93..df79b6d 100644
--- a/libpcsxcore/psxdma.c
+++ b/libpcsxcore/psxdma.c
@@ -167,8 +167,9 @@ void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU
PSXDMA_LOG("*** DMA 2 - GPU dma chain *** %lx addr = %lx size = %lx\n", chcr, madr, bcr);
#endif
- size = gpuDmaChainSize(madr);
- GPU_dmaChain((u32 *)psxM, madr & 0x1fffff);
+ size = GPU_dmaChain((u32 *)psxM, madr & 0x1fffff);
+ if ((int)size <= 0)
+ size = gpuDmaChainSize(madr);
// Tekken 3 = use 1.0 only (not 1.5x)
diff --git a/plugins/dfxvideo/gpu.c b/plugins/dfxvideo/gpu.c
index 9a614de..0d105f8 100644
--- a/plugins/dfxvideo/gpu.c
+++ b/plugins/dfxvideo/gpu.c
@@ -1042,6 +1042,7 @@ long CALLBACK GPUdmaChain(uint32_t * baseAddrL, uint32_t addr)
uint32_t dmaMem;
unsigned char * baseAddrB;
short count;unsigned int DMACommandCounter = 0;
+ long dmaWords = 0;
GPUIsBusy;
@@ -1056,6 +1057,7 @@ long CALLBACK GPUdmaChain(uint32_t * baseAddrL, uint32_t addr)
if(CheckForEndlessLoop(addr)) break;
count = baseAddrB[addr+3];
+ dmaWords += 1 + count;
dmaMem=addr+4;
@@ -1067,7 +1069,7 @@ long CALLBACK GPUdmaChain(uint32_t * baseAddrL, uint32_t addr)
GPUIsIdle;
- return 0;
+ return dmaWords;
}
////////////////////////////////////////////////////////////////////////
diff --git a/plugins/gpu_unai/gpu.cpp b/plugins/gpu_unai/gpu.cpp
index 808c891..9b0a0dc 100644
--- a/plugins/gpu_unai/gpu.cpp
+++ b/plugins/gpu_unai/gpu.cpp
@@ -331,7 +331,7 @@ INLINE int CheckForEndlessLoop(u32 *laddr)
}
///////////////////////////////////////////////////////////////////////////////
-void GPU_dmaChain(u32* baseAddr, u32 dmaVAddr)
+long GPU_dmaChain(u32* baseAddr, u32 dmaVAddr)
{
#ifdef DEBUG_ANALYSIS
dbg_anacnt_GPU_dmaChain++;
@@ -339,6 +339,7 @@ void GPU_dmaChain(u32* baseAddr, u32 dmaVAddr)
pcsx4all_prof_start_with_pause(PCSX4ALL_PROF_GPU,PCSX4ALL_PROF_HW_WRITE);
u32 data, *address, count, offset;
unsigned int DMACommandCounter = 0;
+ long dma_words = 0;
GPU_GP1 &= ~0x14000000;
lUsedAddr[0]=lUsedAddr[1]=lUsedAddr[2]=(u32*)0x1fffff;
@@ -355,9 +356,12 @@ void GPU_dmaChain(u32* baseAddr, u32 dmaVAddr)
else dmaVAddr = 0x1FFFFF;
if(count>0) GPU_writeDataMem(address,count);
+ dma_words += 1 + count;
}
GPU_GP1 = (GPU_GP1 | 0x14000000) & ~0x60000000;
pcsx4all_prof_end_with_resume(PCSX4ALL_PROF_GPU,PCSX4ALL_PROF_HW_WRITE);
+
+ return dma_words;
}
///////////////////////////////////////////////////////////////////////////////
diff --git a/plugins/gpu_unai/port.h b/plugins/gpu_unai/port.h
index 3561acd..238b98b 100644
--- a/plugins/gpu_unai/port.h
+++ b/plugins/gpu_unai/port.h
@@ -23,7 +23,7 @@ extern "C" {
bool GPUinit(void);
void GPUshutdown(void);
void GPUwriteDataMem(u32* dmaAddress, s32 dmaCount);
-void GPUdmaChain(u32* baseAddr, u32 dmaVAddr);
+long GPUdmaChain(u32* baseAddr, u32 dmaVAddr);
void GPUwriteData(u32 data);
void GPUreadDataMem(u32* dmaAddress, s32 dmaCount);
u32 GPUreadData(void);