diff --git a/plugins/zzogl-pg/opengl/GifTransfer.cpp b/plugins/zzogl-pg/opengl/GifTransfer.cpp index 052bde33c..b07e47fe8 100644 --- a/plugins/zzogl-pg/opengl/GifTransfer.cpp +++ b/plugins/zzogl-pg/opengl/GifTransfer.cpp @@ -25,37 +25,6 @@ static int count = 0; #endif -/*void _GSgifPacket(pathInfo *path, u32 *pMem) // 128bit -{ - FUNCLOG - - int reg = (int)((path->regs >> path->regn) & 0xf); - g_GIFPackedRegHandlers[reg](pMem); - - path->regn += 4; - if (path->nreg == path->regn) - { - path->regn = 0; - path->nloop--; - } -} - -void _GSgifRegList(pathInfo *path, u32 *pMem) // 64bit -{ - FUNCLOG - - int reg = (int)((path->regs >> path->regn) & 0xf); - - g_GIFRegHandlers[reg](pMem); - - path->regn += 4; - if (path->nreg == path->regn) - { - path->regn = 0; - path->nloop--; - } -}*/ - static int nPath3Hack = 0; void CALLBACK GSgetLastTag(u64* ptag) @@ -73,12 +42,12 @@ extern HANDLE g_hCurrentThread; __forceinline void gifTransferLog(int index, u32 *pMem, u32 size) { -#ifdef _DEBUG +#ifdef DEBUG_TRANSFER if (conf.log /*& 0x20*/) { static int nSaveIndex = 0; - ZZLog::GS_Log("%d: p:%d %x", nSaveIndex++, index + 1, size); + ZZLog::Debug_Log("%d: p:%d %x", nSaveIndex++, index + 1, size); int vals[4] = {0}; for (u32 i = 0; i < size; i++) @@ -87,13 +56,12 @@ __forceinline void gifTransferLog(int index, u32 *pMem, u32 size) vals[j] ^= pMem[4*i+j]; } - ZZLog::GS_Log("%x %x %x %x", vals[0], vals[1], vals[2], vals[3]); + ZZLog::Debug_Log("%x %x %x %x", vals[0], vals[1], vals[2], vals[3]); } #endif } -#ifdef NEW_GIF_TRANSFER extern int g_GSMultiThreaded; template void _GSgifTransfer(u32 *pMem, u32 size) @@ -294,240 +262,3 @@ void CALLBACK GSgifTransfer3(u32 *pMem, u32 size) _GSgifTransfer<2>(pMem, size); } -#else - -template void _GSgifTransfer(u32 *pMem, u32 size) -{ - FUNCLOG - - pathInfo *path = &gs.path[index]; - -#ifdef _WIN32 - assert(g_hCurrentThread == GetCurrentThread()); -#endif - -#ifdef _DEBUG - gifTransferLog(index, pMem, size); -#endif - - while (size > 0) - { - //LOG(_T("Transfer(%08x, %d) START\n"), pMem, size); - if (path->nloop == 0) - { - path->setTag(pMem); - gs.q = 1; - pMem += 4; - size--; - - if ((conf.settings() & GAME_PATH3HACK) && (index == 2) && path->eop) nPath3Hack = 1; - - if (index == 0) - { - if (path->mode == GIF_FLG_PACKED) - { - // check if 0xb is in any reg, if yes, exit (kh2) - for (int i = 0; i < path->nreg; i += 4) - { - if (((path->regs >> i) & 0xf) == 11) - { - ERROR_LOG_SPAM("Invalid unpack type\n"); - path->nloop = 0; - return; - } - } - } - } - - if (path->nloop == 0) - { - if (index == 0) - { - // ffx hack - if (path->eop) return; - - continue; - } - - /*if( !path->eop ) - { - //ZZLog::Debug_Log("Continuing from eop."); - continue; - }*/ - - // Issue 174 fix! - continue; - } - } - - switch (path->mode) - { - - case GIF_FLG_PACKED: - { - assert(path->nloop > 0); - - for (; size > 0; size--, pMem += 4) - { - int reg = (int)((path->regs >> path->regn) & 0xf); - - g_GIFPackedRegHandlers[reg](pMem); - - path->regn += 4; - - if (path->nreg == path->regn) - { - path->regn = 0; - - if (path->nloop-- <= 1) - { - size--; - pMem += 4; - break; - } - } - } - - break; - } - - case GIF_FLG_REGLIST: - { - //GS_LOG("%8.8x%8.8x %d L", ((u32*)&gs.regs)[1], *(u32*)&gs.regs, path->tag.nreg/4); - assert(path->nloop > 0); - size *= 2; - - for (; size > 0; pMem += 2, size--) - { - int reg = (int)((path->regs >> path->regn) & 0xf); - - g_GIFRegHandlers[reg](pMem); - - path->regn += 4; - - if (path->nreg == path->regn) - { - path->regn = 0; - - if (path->nloop-- <= 1) - { - size--; - pMem += 2; - break; - } - } - } - - if (size & 1) pMem += 2; - - size /= 2; - - break; - } - - case GIF_FLG_IMAGE: // FROM_VFRAM - case GIF_FLG_IMAGE2: // Used in the DirectX version, so we'll use it here too. - { - if (gs.imageTransfer >= 0 && gs.imageTransfer <= 1) - { - int process = min((int)size, path->nloop); - - if (process > 0) - { - if (gs.imageTransfer) - ZeroGS::TransferLocalHost(pMem, process); - else - ZeroGS::TransferHostLocal(pMem, process*4); - - path->nloop -= process; - - pMem += process * 4; - - size -= process; - - assert(size == 0 || path->nloop == 0); - } - - break; - } - else - { - // simulate - int process = min((int)size, path->nloop); - - path->nloop -= process; - pMem += process * 4; - size -= process; - } - - break; - } - - default: // GIF_IMAGE - ZZLog::GS_Log("*** WARNING **** Unexpected GIFTag flag."); - assert(0); - path->nloop = 0; - break; - } - - if ((index == 0) && path->eop) return; - } - - // This is the case when not all data was readed from one try: VU1 has too much data. - // So we should redo reading from the start. - if ((index == 0) && size == 0 && path->nloop > 0) - { - ERROR_LOG_SPAMA("VU1 too much data, ignore if gfx are fine %d\n", path->nloop) - // TODO: this code is not working correctly. Anyway, ringing work only in single-threaded mode. - // _GSgifTransfer(&gs.path[0], (u32*)((u8*)pMem-0x4000), (0x4000)/16); - } -} - -void CALLBACK GSgifTransfer1(u32 *pMem, u32 addr) -{ - FUNCLOG - - pathInfo *path = &gs.path[0]; - - //ZZLog::GS_Log("GSgifTransfer1 0x%x (mode %d).", addr, path->mode); - -// addr &= 0x3fff; - -#ifdef _DEBUG - ZZLog::Prim_Log("count: %d\n", count); - count++; -#endif - - path->nloop = 0; - path->eop = 0; - _GSgifTransfer<0>((u32*)((u8*)pMem + addr), (0x4000 - addr) / 16); - - if (!path->eop && (path->nloop > 0)) - { - assert((addr&0xf) == 0); //BUG - path->nloop = 0; - ZZLog::Debug_Log("Transfer1 - 2."); - return; - } -} - -void CALLBACK GSgifTransfer2(u32 *pMem, u32 size) -{ - FUNCLOG - - //ZZLog::GS_Log("GSgifTransfer2 size = %lx (mode %d, gs.path2.tag.nloop = %d).", size, gs.path[1].mode, gs.path[1].tag.nloop); - - _GSgifTransfer<1>(pMem, size); -} - -void CALLBACK GSgifTransfer3(u32 *pMem, u32 size) -{ - FUNCLOG - - //ZZLog::GS_Log("GSgifTransfer3 size = %lx (mode %d, gs.path3.tag.nloop = %d).", size, gs.path[2].mode, gs.path[2].tag.nloop); - - nPath3Hack = 0; - _GSgifTransfer<2>(pMem, size); -} - -#endif diff --git a/plugins/zzogl-pg/opengl/GifTransfer.h b/plugins/zzogl-pg/opengl/GifTransfer.h index 52b6218f5..555d41c56 100644 --- a/plugins/zzogl-pg/opengl/GifTransfer.h +++ b/plugins/zzogl-pg/opengl/GifTransfer.h @@ -22,9 +22,6 @@ #include "Regs.h" #include "Util.h" -// If you notice bugs in the newest revisions, you might try disabling this, -// to see if they are related. -#define NEW_GIF_TRANSFER enum GIF_FLG { GIF_FLG_PACKED = 0, @@ -73,7 +70,6 @@ union GIFTag typedef struct { -#ifdef NEW_GIF_TRANSFER u32 mode; int reg; u64 regs; @@ -82,18 +78,7 @@ typedef struct int nreg; u32 adonly; GIFTag tag; -#else - int mode; - int regn; - u64 regs; - int nloop; - int eop; - int nreg; - u32 adonly; - GIFTag tag; -#endif -#ifdef NEW_GIF_TRANSFER void setTag(u32 *data) { tag.set(data); @@ -133,43 +118,6 @@ typedef struct return true; } -#else - void setTag(u32 *data) - { - tag.set(data); - - nloop = tag.NLOOP; - eop = tag.EOP; - u32 tagpre = tag.PRE; - u32 tagprim = tag.PRIM; - u32 tagflg = tag.FLG; - - // Hmm.... - nreg = tag.NREG << 2; - if (nreg == 0) nreg = 64; - - // ZZLog::GS_Log("GIFtag: %8.8lx_%8.8lx_%8.8lx_%8.8lx: EOP=%d, NLOOP=%x, FLG=%x, NREG=%d, PRE=%d", - // data[3], data[2], data[1], data[0], - // path->eop, path->nloop, tagflg, path->nreg, tagpre); - - mode = tagflg; - - switch (mode) - { - case GIF_FLG_PACKED: - regs = *(u64 *)(data + 2); - regn = 0; - if (tagpre) GIFRegHandlerPRIM((u32*)&tagprim); - break; - - case GIF_FLG_REGLIST: - regs = *(u64 *)(data + 2); - regn = 0; - break; - } - } - -#endif } pathInfo; void _GSgifPacket(pathInfo *path, u32 *pMem); diff --git a/plugins/zzogl-pg/opengl/Regs.h b/plugins/zzogl-pg/opengl/Regs.h index 1cd8b2541..8df41b154 100644 --- a/plugins/zzogl-pg/opengl/Regs.h +++ b/plugins/zzogl-pg/opengl/Regs.h @@ -178,6 +178,26 @@ void __fastcall GIFRegHandlerLABEL(u32* data); // GifReg & GifPackedReg structs from GSdx, slightly modified +enum GS_ATST +{ + ATST_NEVER = 0, + ATST_ALWAYS = 1, + ATST_LESS = 2, + ATST_LEQUAL = 3, + ATST_EQUAL = 4, + ATST_GEQUAL = 5, + ATST_GREATER = 6, + ATST_NOTEQUAL = 7, +}; + +enum GS_AFAIL +{ + AFAIL_KEEP = 0, + AFAIL_FB_ONLY = 1, + AFAIL_ZB_ONLY = 2, + AFAIL_RGB_ONLY = 3, +}; + // GIFReg REG64_(GIFReg, ALPHA) @@ -439,9 +459,9 @@ REG64_(GIFReg, TEST) u32 _PAD1:13; u32 _PAD2:32; REG_END2 - __forceinline bool DoFirstPass() {/*return !ATE || ATST != ATST_NEVER;*/} // not all pixels fail automatically - __forceinline bool DoSecondPass() {/*return ATE && ATST != ATST_ALWAYS && AFAIL != AFAIL_KEEP;*/} // pixels may fail, write fb/z - __forceinline bool NoSecondPass() {/*return ATE && ATST != ATST_ALWAYS && AFAIL == AFAIL_KEEP;*/} // pixels may fail, no output + __forceinline bool DoFirstPass() {return !ATE || ATST != ATST_NEVER;} // not all pixels fail automatically + __forceinline bool DoSecondPass() {return ATE && ATST != ATST_ALWAYS && AFAIL != AFAIL_KEEP;} // pixels may fail, write fb/z + __forceinline bool NoSecondPass() {return ATE && ATST != ATST_ALWAYS && AFAIL == AFAIL_KEEP;} // pixels may fail, no output REG_END2 REG64_(GIFReg, TEX0)