From 1068fd8f6ed61fe8eaab07a7ecffe41f697cad9e Mon Sep 17 00:00:00 2001 From: "SND\\shalma_cp" Date: Sat, 13 Nov 2010 19:02:15 +0000 Subject: gpu.c - demolish ugly gpu chain slice hack - now many broken games should run okay again git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@59547 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- libpcsxcore/gpu.c | 666 +----------------------------------------------------- 1 file changed, 2 insertions(+), 664 deletions(-) (limited to 'libpcsxcore/gpu.c') diff --git a/libpcsxcore/gpu.c b/libpcsxcore/gpu.c index 2ec06e1b..41df8d8a 100644 --- a/libpcsxcore/gpu.c +++ b/libpcsxcore/gpu.c @@ -40,526 +40,6 @@ extern unsigned int hSyncCount; #define GPUSTATUS_DITHER 0x00000200 -static __inline int prim__( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain ?? - unknown command\n", addr ); -#endif - - return 0; -} - - -static __inline int prim00( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 00 - reset\n", addr ); -#endif - - return 0; -} - - -static __inline int prim01( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 01 - clear cache\n", addr ); -#endif - - return 0; -} - - -static __inline int prim02( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 02 - clear screen [#2]\n", addr ); -#endif - - return 2; -} - - -static __inline int prim03( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 03 - enable display [#???]\n", addr ); -#endif - - return 0; -} - - -static __inline int prim04( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 04 - dma setup [#???]\n", addr ); -#endif - - return 0; -} - - -static __inline int prim05( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 05 - start display area [#???]\n", addr ); -#endif - - return 0; -} - - -static __inline int prim06( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 06 - h-display area [#???]\n", addr ); -#endif - - return 0; -} - - -static __inline int prim07( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 07 - v-display area [#???]\n", addr ); -#endif - - return 0; -} - - -static __inline int prim08( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 08 - display mode [#???]\n", addr ); -#endif - - return 0; -} - - -static __inline int prim10( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 10 - gpu info [#???]\n", addr ); -#endif - - return 0; -} - - -static __inline int prim20( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 20 - 3-poly mono [#3]\n", addr ); -#endif - - return 3; -} - - -static __inline int prim24( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 24 - 3-poly texture [#6]\n", addr ); -#endif - - return 6; -} - - -static __inline int prim28( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 28 - 4-poly mono [#4]\n", addr ); -#endif - - return 4; -} - - -static __inline int prim2C( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 2c - 4-poly texture [#8]\n", addr ); -#endif - - return 8; -} - - -static __inline int prim30( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 30 - Gouraud tri [#5]\n", addr ); -#endif - - return 5; -} - - -static __inline int prim34( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 34 - Gouraud tri texture [#8]\n", addr ); -#endif - - return 8; -} - - -static __inline int prim38( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 38 - Gouraud quad [#7]\n", addr ); -#endif - - return 7; -} - - -static __inline int prim3C( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 3c - Gouraud quad texture [#11]\n", addr ); -#endif - - return 11; -} - - -static __inline int prim40( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 40 - mono 2-line [#2]\n", addr ); -#endif - - return 2; -} - - -static __inline int prim48( u32 addr ) -{ - int lcv; - -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 48 - mono 3-line [#_#]\n", addr ); -#endif - - lcv = 1; - - while( (psxMu32( addr ) & 0xF000F000) != 0x50005000 ) - { - addr += 4; - lcv++; - } - - return lcv; -} - - -static __inline int prim4C( u32 addr ) -{ - int lcv; - -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 4c - mono 4-line [#_#]\n", addr ); -#endif - - lcv = 1; - - while( (psxMu32( addr ) & 0xF000F000) != 0x50005000 ) - { - addr += 4; - lcv++; - } - - return lcv; -} - - -static __inline int prim50( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 50 - 2-point gradated [#3]\n", addr ); -#endif - - return 3; -} - - -static __inline int prim58( u32 addr ) -{ - int lcv; - -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 58 - 3-point gradated [#__#]\n", addr ); -#endif - - lcv = 1; - - while( (psxMu32( addr ) & 0xF000F000) != 0x50005000 ) - { - addr += 4; - lcv++; - } - - return lcv; -} - - -static __inline int prim5C( u32 addr ) -{ - int lcv; - -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 5c - 4-point gradated [#__#]\n", addr ); -#endif - - lcv = 1; - - while( (psxMu32( addr ) & 0xF000F000) != 0x50005000 ) - { - addr += 4; - lcv++; - } - - return lcv; -} - - -static __inline int prim60( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 60 - rect [#2]\n", addr ); -#endif - - return 2; -} - - -static __inline int prim64( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 64 - sprite [#3]\n", addr ); -#endif - - return 3; -} - - -static __inline int prim68( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 68 - dot [#1]\n", addr ); -#endif - - return 1; -} - - -static __inline int prim70( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 70 - 8x8 rectangle [#1]\n", addr ); -#endif - - return 1; -} - - -static __inline int prim74( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 74 - 8x8 sprite [#2]\n", addr ); -#endif - - return 2; -} - - -static __inline int prim78( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 78 - 16x16 rectangle [#1]\n", addr ); -#endif - - return 1; -} - - -static __inline int prim7C( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 7c - 16x16 sprite [#2]\n", addr ); -#endif - - return 2; -} - - -static __inline int prim80( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain 80 - move image [#3]\n", addr ); -#endif - - return 3; -} - - -static __inline int primA0( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain a0 - send image to [#2+__#]\n", addr ); -#endif - - // count transfer bytes 2 + (h*w) - return 2+0; -} - - -static __inline int primC0( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain c0 - copy image from [#2+__#]\n", addr ); -#endif - - // count transfer bytes 2 + (h*w) - return 2+0; -} - - -static __inline int primE1( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain E1 - draw mode setting\n", addr ); -#endif - - return 0; -} - - -static __inline int primE2( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain E2 - texture window setting\n", addr ); -#endif - - return 0; -} - - -static __inline int primE3( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain E3 - set draw area top left\n", addr ); -#endif - - return 0; -} - - -static __inline int primE4( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain E4 - set draw area bottom right\n", addr ); -#endif - - return 0; -} - - -static __inline int primE5( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain E5 - drawing offset\n", addr ); -#endif - - return 0; -} - - -static __inline int primE6( u32 addr ) -{ -#ifdef CHAIN_LOG - PSXDMA_LOG( "%X @ Chain E6 - mask setting\n", addr ); -#endif - - return 0; -} - - - -// Agemo's idea for chain unrolling -int (*gpuPrim[0x100])( u32 addr ) = -{ - // 00 01 02 03 04 05 06 07 - prim00, prim01, prim02, prim03, prim04, prim05, prim06, prim07, //00-07 - prim08, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //08-0F - prim10, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //10-17 - prim__, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //18-1F - prim20, prim20, prim20, prim20, prim24, prim24, prim24, prim24, //20-27 - prim28, prim28, prim28, prim28, prim2C, prim2C, prim2C, prim2C, //28-2F - prim30, prim30, prim30, prim30, prim34, prim34, prim34, prim34, //30-37 - prim38, prim38, prim38, prim38, prim3C, prim3C, prim3C, prim3C, //38-3F - prim40, prim40, prim40, prim40, prim__, prim__, prim__, prim__, //40-47 - prim48, prim48, prim48, prim48, prim4C, prim4C, prim4C, prim4C, //48-4F - prim50, prim50, prim50, prim50, prim__, prim__, prim__, prim__, //50-57 - prim58, prim58, prim58, prim58, prim5C, prim5C, prim5C, prim5C, //58-5F - prim60, prim60, prim60, prim60, prim64, prim64, prim64, prim64, //60-67 - prim68, prim68, prim68, prim68, prim__, prim__, prim__, prim__, //68-6F - prim70, prim70, prim70, prim70, prim74, prim74, prim74, prim74, //70-77 - prim78, prim78, prim78, prim78, prim7C, prim7C, prim7C, prim7C, //78-7F - prim80, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //80-87 - prim__, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //88-8F - prim__, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //90-97 - prim__, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //98-9F - primA0, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //A0-A7 - prim__, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //A8-AF - prim__, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //B0-B7 - prim__, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //B8-BF - primC0, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //C0-C7 - prim__, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //C8-CF - prim__, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //D0-D7 - prim__, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //D8-DF - prim__, primE1, primE2, primE3, primE4, primE5, primE6, prim__, //E0-E7 - prim__, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //E8-EF - prim__, prim__, prim__, prim__, prim__, prim__, prim__, prim__, //F0-F7 - prim__, prim__, prim__, prim__, prim__, prim__, prim__, prim__ //F8-FF -}; - - -u32 chain_ptr_addr; -u32 chain_ptr_mem; -u8 chain_infinite_loop; - - -/* -DMA2 Chain slicing - -Let GPU run x bytes. Then let game edit linked lists. - - -TODO: -- Monitor chain_ptr_addr for r/w -- Find better way to do sync timing (speed hit) - - -Einhander: 10- -- art gallery images + corruption -- note: pretty picky about timing - -Vampire Hunter D: 5- -- opening menus (perfect - zero black screen flicker) -- note: really picky about timing -*/ - -#define DMA2_CHAIN_PAUSE 5 - - // Taken from PEOPS SOFTGPU u32 lUsedAddr[3]; @@ -584,119 +64,23 @@ static u32 gpuDmaChainSize(u32 addr) { // initial linked list ptr (word) size = 1; - chain_infinite_loop = 0; do { addr &= 0x1ffffc; - DMACommandCounter = size; - if (DMACommandCounter >= DMA2_CHAIN_PAUSE) break; - - - //if (DMACommandCounter++ > 2000000) break; - if (CheckForEndlessLoop(addr)) - { - chain_infinite_loop = 1; - break; - } + if (DMACommandCounter++ > 2000000) break; + if (CheckForEndlessLoop(addr)) break; // # 32-bit blocks to transfer size += psxMu8( addr + 3 ); - - if( psxMu8( addr + 3 ) != 0 ) { - u32 lcv, stop; - - lcv = addr + 4; - stop = addr + 4 + 4 * psxMu8( addr + 3 ); - - - while( lcv < stop ) - { - u32 code; - - code = psxMu8( lcv+3 ); - - lcv += 4; - - - /* - Check for frame buffer transfers (affects GPU dma timing) - - Final Fantasy 4: supercharge to avoid slowdown - - $80: ~1/4 * 1x = slowest possible - - $80: ~1/64 * 1x = fastest possible - */ - if( code == 0x80 ) - { - s16 x0,x1,y0,y1,width, height; - - // PEOPS - x0 = (psxMu32( lcv + 4*1 ) >> 0) & 0xffff; - y0 = (psxMu32( lcv + 4*1 ) >> 16) & 0xffff; - x1 = (psxMu32( lcv + 4*2 ) >> 0) & 0xffff; - y1 = (psxMu32( lcv + 4*2 ) >> 16) & 0xffff; - width = (psxMu32( lcv + 4*3 ) >> 0) & 0xffff; - height = (psxMu32( lcv + 4*3 ) >> 16) & 0xffff; - - x0 &= 0x3ff; - x1 &= 0x3ff; - y0 &= 0x1ff; - y1 &= 0x1ff; - - if( (x0 == x1) && (y0 == y1) ) break; - - - // Xenogears - main menu cursor - if( width <= 0 ) break; - if( height <= 0 ) break; - - - /* - PEOPS - - Final Fantasy 9: battles - Medievil: stage 1 opening - - Intense hang, slowdown if we count as full-blown vram transfer - */ - if( (x0+width) > 1024 || - (y0+height) > 512 || - (x1+width) > 1024 || - (y1+height) > 512 ) break; - - - size += (width * height) / 32; - } - else if( code == 0xa0 ) - {} - else if( code == 0xc0 ) - {} - - - lcv += 4 * gpuPrim[code & 0xff]( lcv ); - } - } - // next 32-bit pointer addr = psxMu32( addr & ~0x3 ) & 0xffffff; size += 1; } while (addr != 0xffffff); - - chain_ptr_addr = addr; - - if( !chain_infinite_loop && addr != 0xffffff ) - { - // save data at stop ptr - chain_ptr_mem = psxMu32( addr ); - - // insert stop ptr - psxMu32ref( addr ) = 0x00ffffff; - } - return size; } @@ -766,13 +150,6 @@ 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 - // Tekken 3 - dma2 overwrite while still running (infinite loop) - if( !chain_infinite_loop && chain_ptr_addr != 0xffffff ) - { - // put back old value first - psxMu32ref( chain_ptr_addr ) = chain_ptr_mem; - } - size = gpuDmaChainSize(madr); GPU_dmaChain((u32 *)psxM, madr & 0x1fffff); @@ -791,45 +168,6 @@ void psxDma2(u32 madr, u32 bcr, u32 chcr) { // GPU } void gpuInterrupt() { - /* - GPU processing during DMA2 chains - - 1 - never updates linked list (99/100 games) - - 2 - updates linked list -before- GPU gets to it - - Einhander: fixes art gallery images + post-gallery corruption (2+ cycles / 4 bytes) - - Vampire Hunter D: shows title screen (3+ cycles / 4 bytes) - - 3 - updates linked list -after- GPU reads it, -before- chain finishes - - Skullmonkeys: fails to show menus - */ - - if( HW_DMA2_CHCR == 0x01000401 ) - { - u32 size,addr; - - - // check valid data left - if( !chain_infinite_loop && chain_ptr_addr != 0xffffff ) - { - // put back old value first - psxMu32ref( chain_ptr_addr ) = chain_ptr_mem; - - - addr = chain_ptr_addr; - size = gpuDmaChainSize( addr ); - - GPU_dmaChain((u32 *)psxM, addr); - - - GPUDMA_INT(size); - - // continue chain - return; - } - } - - HW_DMA2_CHCR &= SWAP32(~0x01000000); DMA_INTERRUPT(2); } -- cgit v1.2.3