diff options
author | notaz | 2011-06-25 01:49:35 +0300 |
---|---|---|
committer | notaz | 2011-07-08 00:15:08 +0300 |
commit | b03e0caf5e153551cb71065ffaa4361b7f7e492b (patch) | |
tree | c192a2d7f859235c2a4867c32556500996ff8141 | |
parent | 4e44d6f63e9f1af3236fbbe2f59016cd42a67d98 (diff) | |
download | pcsx_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.c | 5 | ||||
-rw-r--r-- | plugins/dfxvideo/gpu.c | 4 | ||||
-rw-r--r-- | plugins/gpu_unai/gpu.cpp | 6 | ||||
-rw-r--r-- | plugins/gpu_unai/port.h | 2 |
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); |