From ee09798adee239c427a14c83fe7f5ac3031b77d2 Mon Sep 17 00:00:00 2001 From: arcum42 Date: Sun, 2 Nov 2008 09:02:28 +0000 Subject: [PATCH] A few minor changes to GS.cpp & GS.h. git-svn-id: http://pcsx2-playground.googlecode.com/svn/trunk@270 a6443dda-0b58-4228-96e9-037be469359c --- pcsx2/GS.cpp | 178 ++++++++++++++++++--------------------------- pcsx2/GS.h | 123 +++++++++++++++---------------- pcsx2/configure.ac | 4 +- 3 files changed, 130 insertions(+), 175 deletions(-) diff --git a/pcsx2/GS.cpp b/pcsx2/GS.cpp index f8e1b3ec93..4c0c40d6d2 100644 --- a/pcsx2/GS.cpp +++ b/pcsx2/GS.cpp @@ -367,9 +367,9 @@ void GSRingBufSimplePacket(int type, int data0, int data1, int data2) } *(u32*)writepos = type; - *(int*)(writepos+4) = data0; - *(int*)(writepos+8) = data1; - *(int*)(writepos+12) = data2; + *(u32*)(writepos+4) = data0; + *(u32*)(writepos+8) = data1; + *(u32*)(writepos+12) = data2; writepos += 16; if( writepos == GS_RINGBUFFEREND ) { @@ -730,6 +730,14 @@ typedef void (*GIFRegHandler)(u32* data); static GIFRegHandler s_GSHandlers[3] = { GSRegHandlerSIGNAL, GSRegHandlerFINISH, GSRegHandlerLABEL }; extern "C" int Path3transfer; +#define TagPathTransfer /*midnight madness cares because the tag is 5 dwords*/ \ + int* psrc = (int*)ptag; \ + int* pdst = (int*)&g_path[path]; \ + pdst[0] = psrc[0]; \ + pdst[1] = psrc[1]; \ + pdst[2] = psrc[2]; \ + pdst[3] = psrc[3]; + // simulates a GIF tag u32 GSgifTransferDummy(int path, u32 *pMem, u32 size) { @@ -749,8 +757,8 @@ u32 GSgifTransferDummy(int path, u32 *pMem, u32 size) while(size > 0) { - if(nloop == 0) { - + if(nloop == 0) + { ptag = (GIFTAG*)pMem; nreg = ptag->nreg == 0 ? 16 : ptag->nreg; @@ -759,44 +767,36 @@ u32 GSgifTransferDummy(int path, u32 *pMem, u32 size) if( path == 2 && ptag->eop) Path3transfer = 0; //fixes SRS and others - if( path == 0 ) { - // if too much data for VU1, just ignore - if( ptag->nloop * nreg > size * (ptag->flg==1?2:1) ) { -#ifdef PCSX2_DEVBUILD - //SysPrintf("MTGS: VU1 too much data\n"); -#endif - g_path[path].nloop = 0; - return ++size; // have to increment or else the GS plugin will process this packet - } - } + if( path == 0 ) + { + // if too much data for VU1, just ignore + if((ptag->nloop * nreg) > (size * (ptag->flg == 1 ? 2 : 1))) { + g_path[path].nloop = 0; + return ++size; // have to increment or else the GS plugin will process this packet + } + } - if(ptag->nloop == 0 ) { - if( path == 0 ) { - - if( ptag->eop ) - return size; - - // ffx hack - if( g_FFXHack ) + if (ptag->nloop == 0 ) { + if (path == 0 ) { + if ((!ptag->eop) && (g_FFXHack)) continue; - - return size; + else + return size; } g_path[path].nloop = 0; // motogp graphics show - if( !ptag->eop ) + if (!ptag->eop ) continue; - - return size; + else + return size; } tempreg = ptag->regs[0]; for(i = 0; i < nreg; ++i, tempreg >>= 4) { - - if( i == 8 ) tempreg = ptag->regs[1]; - s_byRegs[path][i] = tempreg&0xf; + if( i == 8 ) tempreg = ptag->regs[1]; + s_byRegs[path][i] = tempreg&0xf; } nloop = ptag->nloop; @@ -809,20 +809,6 @@ u32 GSgifTransferDummy(int path, u32 *pMem, u32 size) { for(; size > 0; size--, pMem += 4) { -// if( s_byRegs[path][curreg] == 11 ) { -// // pretty bad, just get out -// SysPrintf("MTGS: bad GS stream\n"); -// g_path[path].nloop = 0; -// return 0; -// } - -// // if VU1, make sure pMem never exceeds VU1 mem -// if( path == 0 && (u8*)pMem >= VU1.Mem + 0x4000 ) { -// SysPrintf("MTGS: memory exceeds bounds\n"); -// g_path[path].nloop = 0; -// return size; -// } - if( s_byRegs[path][curreg] == 0xe && (pMem[2]&0xff) >= 0x60 ) { if( (pMem[2]&0xff) < 0x63 ) s_GSHandlers[pMem[2]&0x3](pMem); @@ -841,31 +827,25 @@ u32 GSgifTransferDummy(int path, u32 *pMem, u32 size) if( nloop > 0 ) { assert(size == 0); - // midnight madness cares because the tag is 5 dwords - int* psrc = (int*)ptag; - int* pdst = (int*)&g_path[path]; - pdst[0] = psrc[0]; pdst[1] = psrc[1]; pdst[2] = psrc[2]; pdst[3] = psrc[3]; + TagPathTransfer; g_path[path].nloop = nloop; g_path[path].curreg = curreg; return 0; } - break; } case 1: // REGLIST { size *= 2; - + tempreg = ptag->regs[0]; for(i = 0; i < nreg; ++i, tempreg >>= 4) { - if( i == 8 ) tempreg = ptag->regs[1]; assert( (tempreg&0xf) < 0x64 ); s_byRegs[path][i] = tempreg&0xf; } - for(; size > 0; pMem+= 2, size--) - { + for(; size > 0; pMem+= 2, size--) { if( s_byRegs[path][curreg] >= 0x60 && s_byRegs[path][curreg] < 0x63 ) s_GSHandlers[s_byRegs[path][curreg]&3](pMem); @@ -885,10 +865,7 @@ u32 GSgifTransferDummy(int path, u32 *pMem, u32 size) if( nloop > 0 ) { assert(size == 0); - // midnight madness cares because the tag is 5 dwords - int* psrc = (int*)ptag; - int* pdst = (int*)&g_path[path]; - pdst[0] = psrc[0]; pdst[1] = psrc[1]; pdst[2] = psrc[2]; pdst[3] = psrc[3]; + TagPathTransfer; g_path[path].nloop = nloop; g_path[path].curreg = curreg; return 0; @@ -901,10 +878,7 @@ u32 GSgifTransferDummy(int path, u32 *pMem, u32 size) { // simulate if( (int)size < nloop ) { - // midnight madness cares because the tag is 5 dwords - int* psrc = (int*)ptag; - int* pdst = (int*)&g_path[path]; - pdst[0] = psrc[0]; pdst[1] = psrc[1]; pdst[2] = psrc[2]; pdst[3] = psrc[3]; + TagPathTransfer; g_path[path].nloop = nloop-size; return 0; } @@ -970,40 +944,40 @@ void gsInterrupt() { static u64 s_gstag=0; // used for querying the last tag -#define WRITERING_DMA(pMem, qwc) { \ - psHu32(GIF_STAT) |= 0xE00; \ - Path3transfer = 1; \ - if( CHECK_MULTIGS) { \ - u8* pgsmem = GSRingBufCopy(pMem, (qwc)<<4, GS_RINGTYPE_P3); \ - if( pgsmem != NULL ) { \ - int sizetoread = (qwc)<<4; \ - u32 pendmem = (u32)gif->madr + sizetoread; \ - /* check if page of endmem is valid (dark cloud2) */ \ - if( dmaGetAddr(pendmem-16) == NULL ) { \ - pendmem = ((pendmem-16)&~0xfff)-16; \ - while(dmaGetAddr(pendmem) == NULL) { \ - pendmem = (pendmem&~0xfff)-16; \ - } \ - memcpy_fast(pgsmem, pMem, pendmem-(u32)gif->madr+16); \ - } \ - else memcpy_fast(pgsmem, pMem, sizetoread); \ - \ - GSRINGBUF_DONECOPY(pgsmem, sizetoread); \ - GSgifTransferDummy(2, pMem, qwc); \ - } \ - \ - if( !CHECK_DUALCORE ) GS_SETEVENT(); \ - } \ - else { \ - GSGIFTRANSFER3(pMem, qwc); \ - if( GSgetLastTag != NULL ) { \ - GSgetLastTag(&s_gstag); \ - if( (s_gstag) == 1 ) { \ - Path3transfer = 0; /* fixes SRS and others */ \ - } \ - } \ - } \ -} \ +static __forceinline void WRITERING_DMA(u32 *pMem, u32 qwc) { + psHu32(GIF_STAT) |= 0xE00; + Path3transfer = 1; + if( CHECK_MULTIGS) { + u8* pgsmem = GSRingBufCopy(pMem, (qwc)<<4, GS_RINGTYPE_P3); + if( pgsmem != NULL ) { + int sizetoread = (qwc)<<4; + u32 pendmem = (u32)gif->madr + sizetoread; + /* check if page of endmem is valid (dark cloud2) */ + if( dmaGetAddr(pendmem-16) == NULL ) { + pendmem = ((pendmem-16)&~0xfff)-16; + while(dmaGetAddr(pendmem) == NULL) { + pendmem = (pendmem&~0xfff)-16; + } + memcpy_fast(pgsmem, pMem, pendmem-(u32)gif->madr+16); + } + else memcpy_fast(pgsmem, pMem, sizetoread); + + GSRINGBUF_DONECOPY(pgsmem, sizetoread); + GSgifTransferDummy(2, pMem, qwc); + } + + if( !CHECK_DUALCORE ) GS_SETEVENT(); + } + else { + GSGIFTRANSFER3(pMem, qwc); + if( GSgetLastTag != NULL ) { + GSgetLastTag(&s_gstag); + if( (s_gstag) == 1 ) { + Path3transfer = 0; /* fixes SRS and others */ + } + } + } +} int _GIFchain() { #ifdef GSPATH3FIX @@ -1298,9 +1272,6 @@ int mfifoGIFchain() { mfifocycles+= (mfifoqwc) * 2; /* guessing */ } - - - return 0; } @@ -1791,15 +1762,6 @@ void RunGSState(gzFile f) if( g_SaveGSStream != 3 ) return; - -// if( skipfirst ) { -// ++it; -// it = packets.erase(packets.begin(), it); -// skipfirst = 0; -// } - - //it = packets.begin(); - //continue; break; default: assert(0); diff --git a/pcsx2/GS.h b/pcsx2/GS.h index c2a18de015..3408b3db07 100644 --- a/pcsx2/GS.h +++ b/pcsx2/GS.h @@ -73,34 +73,23 @@ extern u8* g_pGSWritePos; extern FILE* g_fMTGSWrite, *g_fMTGSRead; extern u32 g_MTGSDebug, g_MTGSId; -#define MTGS_RECWRITE(start, size) { \ - if( g_MTGSDebug & 1 ) { \ - u32* pstart = (u32*)(start); \ - u32 cursize = (u32)(size); \ - fprintf(g_fMTGSWrite, "*%x-%x (%d)\n", (u32)(uptr)(start), (u32)(size), ++g_MTGSId); \ - /*while(cursize > 0) { \ - fprintf(g_fMTGSWrite, "%x %x %x %x\n", pstart[0], pstart[1], pstart[2], pstart[3]); \ - pstart += 4; \ - cursize -= 16; \ - }*/ \ - if( g_MTGSDebug & 2 ) fflush(g_fMTGSWrite); \ - } \ -} \ - -#define MTGS_RECREAD(start, size) { \ - if( g_MTGSDebug & 1 ) { \ - u32* pstart = (u32*)(start); \ - u32 cursize = (u32)(size); \ - fprintf(g_fMTGSRead, "*%x-%x (%d)\n", (u32)(uptr)(start), (u32)(size), ++g_MTGSId); \ - /*while(cursize > 0) { \ - fprintf(g_fMTGSRead, "%x %x %x %x\n", pstart[0], pstart[1], pstart[2], pstart[3]); \ - pstart += 4; \ - cursize -= 16; \ - }*/ \ - if( g_MTGSDebug & 4 ) fflush(g_fMTGSRead); \ - } \ -} \ +static __forceinline void MTGS_RECWRITE(u32 *start, u32 size) { + if( g_MTGSDebug & 1 ) { + u32* pstart = (u32*)(start); + u32 cursize = (u32)(size); + fprintf(g_fMTGSWrite, "*%x-%x (%d)\n", (u32)(uptr)(start), (u32)(size), ++g_MTGSId); + if( g_MTGSDebug & 2 ) fflush(g_fMTGSWrite); + } +} +static __forceinline void MTGS_RECREAD(start, size) { + if( g_MTGSDebug & 1 ) { + u32* pstart = (u32*)(start); + u32 cursize = (u32)(size); + fprintf(g_fMTGSRead, "*%x-%x (%d)\n", (u32)(uptr)(start), (u32)(size), ++g_MTGSId); + if( g_MTGSDebug & 4 ) fflush(g_fMTGSRead); + } +} #else #define MTGS_RECWRITE 0&& @@ -109,21 +98,25 @@ extern u32 g_MTGSDebug, g_MTGSId; #endif // mem and size are the ones from GSRingBufCopy -#define GSRINGBUF_DONECOPY(mem, size) { \ - u8* temp = (u8*)(mem) + (size); \ - assert( temp <= GS_RINGBUFFEREND); \ - MTGS_RECWRITE(mem, size); \ - if( temp == GS_RINGBUFFEREND ) temp = GS_RINGBUFFERBASE; \ - InterlockedExchangePointer((void**)&g_pGSWritePos, temp); \ +static __forceinline void GSRINGBUF_DONECOPY(u8 *mem, u32 size) { + u8* temp = (u8*)(mem) + (size); + assert( temp <= GS_RINGBUFFEREND); + MTGS_RECWRITE(mem, size); + if( temp == GS_RINGBUFFEREND ) temp = GS_RINGBUFFERBASE; + InterlockedExchangePointer((void**)&g_pGSWritePos, temp); } #if defined(_WIN32) && !defined(WIN32_PTHREADS) + #define GS_SETEVENT() SetEvent(g_hGsEvent) + #else + #include #include extern sem_t g_semGsThread; #define GS_SETEVENT() sem_post(&g_semGsThread) + #endif u32 GSgifTransferDummy(int path, u32 *pMem, u32 size); @@ -184,45 +177,45 @@ extern int g_SaveGSStream; extern int g_nLeftGSFrames; extern gzFile g_fGSSave; -#define GSGIFTRANSFER1(pMem, addr) { \ - if( g_SaveGSStream == 2) { \ - int type = GSRUN_TRANS1; \ - int size = (0x4000-(addr))/16; \ - gzwrite(g_fGSSave, &type, sizeof(type)); \ +static __forceinline void GSGIFTRANSFER1(u32 *pMem, u32 addr) { + if( g_SaveGSStream == 2) { + u32 type = GSRUN_TRANS1; + u32 size = (0x4000-(addr))/16; + gzwrite(g_fGSSave, &type, sizeof(type)); gzwrite(g_fGSSave, &size, 4); \ - gzwrite(g_fGSSave, ((u8*)pMem)+(addr), size*16); \ - } \ - GSgifTransfer1(pMem, addr); \ + gzwrite(g_fGSSave, ((u8*)pMem)+(addr), size*16); + } + GSgifTransfer1(pMem, addr); } -#define GSGIFTRANSFER2(pMem, size) { \ - if( g_SaveGSStream == 2) { \ - int type = GSRUN_TRANS2; \ - int _size = size; \ - gzwrite(g_fGSSave, &type, sizeof(type)); \ - gzwrite(g_fGSSave, &_size, 4); \ - gzwrite(g_fGSSave, pMem, _size*16); \ - } \ - GSgifTransfer2(pMem, size); \ +static __forceinline void GSGIFTRANSFER2(u32 *pMem, u32 size) { + if( g_SaveGSStream == 2) { + u32 type = GSRUN_TRANS2; + u32 _size = size; + gzwrite(g_fGSSave, &type, sizeof(type)); + gzwrite(g_fGSSave, &_size, 4); + gzwrite(g_fGSSave, pMem, _size*16); + } + GSgifTransfer2(pMem, size); } -#define GSGIFTRANSFER3(pMem, size) { \ - if( g_SaveGSStream == 2 ) { \ - int type = GSRUN_TRANS3; \ - int _size = size; \ - gzwrite(g_fGSSave, &type, sizeof(type)); \ - gzwrite(g_fGSSave, &_size, 4); \ - gzwrite(g_fGSSave, pMem, _size*16); \ - } \ - GSgifTransfer3(pMem, size); \ +static __forceinline void GSGIFTRANSFER3(u32 *pMem, u32 size) { + if( g_SaveGSStream == 2 ) { + u32 type = GSRUN_TRANS3; + u32 _size = size; + gzwrite(g_fGSSave, &type, sizeof(type)); + gzwrite(g_fGSSave, &_size, 4); + gzwrite(g_fGSSave, pMem, _size*16); + } + GSgifTransfer3(pMem, size); } -#define GSVSYNC() { \ - if( g_SaveGSStream == 2 ) { \ - int type = GSRUN_VSYNC; \ - gzwrite(g_fGSSave, &type, sizeof(type)); \ - } \ -} \ +static __forceinline void GSVSYNC(void) { + if( g_SaveGSStream == 2 ) { + u32 type = GSRUN_VSYNC; + gzwrite(g_fGSSave, &type, sizeof(type)); + } +} #else diff --git a/pcsx2/configure.ac b/pcsx2/configure.ac index 12a3c557c6..d0c1da7365 100644 --- a/pcsx2/configure.ac +++ b/pcsx2/configure.ac @@ -17,8 +17,8 @@ CXXFLAGS= CCASFLAGS= WARNING_FLAGS="-Wall -Wno-format -Wno-unused-value" -dnl EXTRA_FLAGS = " -Xlinker -zmuldefs -fpermissive " -NORMAL_FLAGS="-O3 -fomit-frame-pointer ${WARNING_FLAGS}" +dnl EXTRA_FLAGS = " -Xlinker -zmuldefs -fpermissive "-ansi +NORMAL_FLAGS="-march=native -pipe -O3 -fomit-frame-pointer ${WARNING_FLAGS}" DEBUG_FLAGS=" -g ${WARNING_FLAGS}" dnl Check for debug build