gpus: return DMA word count to avoid 1 list walk
authornotaz <notasas@gmail.com>
Fri, 24 Jun 2011 22:49:35 +0000 (01:49 +0300)
committernotaz <notasas@gmail.com>
Thu, 7 Jul 2011 21:15:08 +0000 (00:15 +0300)
libpcsxcore/psxdma.c
plugins/dfxvideo/gpu.c
plugins/gpu_unai/gpu.cpp
plugins/gpu_unai/port.h

index 1274d93..df79b6d 100644 (file)
@@ -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)
 
index 9a614de..0d105f8 100644 (file)
@@ -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;
 }
 
 ////////////////////////////////////////////////////////////////////////
index 808c891..9b0a0dc 100644 (file)
@@ -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;
 }
 
 ///////////////////////////////////////////////////////////////////////////////
index 3561acd..238b98b 100644 (file)
@@ -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);