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
This commit is contained in:
arcum42 2008-11-02 09:02:28 +00:00 committed by Gregory Hainaut
parent d799884153
commit ee09798ade
3 changed files with 130 additions and 175 deletions

View File

@ -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);

View File

@ -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 <pthread.h>
#include <semaphore.h>
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

View File

@ -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