From 2d288f338f61840f6bc0e996a9285288912de22e Mon Sep 17 00:00:00 2001 From: mtabachenko Date: Mon, 25 May 2009 16:40:48 +0000 Subject: [PATCH] - some cleanups GXFIFO; --- desmume/src/FIFO.cpp | 7 ------- desmume/src/MMU.cpp | 16 ++-------------- desmume/src/OGLRender.cpp | 23 ++++++++++++----------- desmume/src/gfx3d.cpp | 38 ++++++++++++++++++++------------------ 4 files changed, 34 insertions(+), 50 deletions(-) diff --git a/desmume/src/FIFO.cpp b/desmume/src/FIFO.cpp index a3f349d3a..773d03be2 100644 --- a/desmume/src/FIFO.cpp +++ b/desmume/src/FIFO.cpp @@ -70,7 +70,6 @@ void IPC_FIFOsend(u8 proc, u32 val) T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l); T1WriteWord(MMU.MMU_MEM[proc_remote][0x40], 0x184, cnt_r); -// MMU.reg_IF[proc_remote] |= ( (cnt_l & 0x0400) << 8 ); setIF(proc_remote, ((cnt_l & 0x0400)<<8)); } @@ -112,7 +111,6 @@ u32 IPC_FIFOrecv(u8 proc) T1WriteWord(MMU.MMU_MEM[proc][0x40], 0x184, cnt_l); T1WriteWord(MMU.MMU_MEM[proc_remote][0x40], 0x184, cnt_r); - //MMU.reg_IF[proc_remote] |= ( (cnt_l & 0x0004) << 15); setIF(proc_remote, ((cnt_l & 0x0004)<<15)); return (val); @@ -147,7 +145,6 @@ void GFX_FIFOclear() gxFIFO.tail = 0; gxstat |= 0x06000000; - gxstat |= 0x00000002; // this is hack (must be removed later) T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x600, gxstat); } @@ -158,7 +155,6 @@ void GFX_FIFOsend(u8 cmd, u32 param) if (gxstat & 0x01000000) return; // full gxstat &= 0x0000FFFF; - gxstat |= 0x00000002; // this is hack (must be removed later) gxFIFO.cmd[gxFIFO.tail] = cmd; gxFIFO.param[gxFIFO.tail] = param; @@ -184,7 +180,6 @@ BOOL GFX_FIFOrecv(u8 *cmd, u32 *param) { u32 gxstat = T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x600); gxstat &= 0xF000FFFF; - gxstat |= 0x00000002; // this is hack (must be removed later) if (!gxFIFO.tail) // empty { //gxstat |= (0x01FF << 16); @@ -234,8 +229,6 @@ void GFX_FIFOcnt(u32 val) if (gxstat & 0xC0000000) { - //NDS_makeARM9Int(21); - //MMU.reg_IF[0] = (1<<21); setIF(0, (1<<21)); } } diff --git a/desmume/src/MMU.cpp b/desmume/src/MMU.cpp index 446d5ba4d..76db69c2f 100644 --- a/desmume/src/MMU.cpp +++ b/desmume/src/MMU.cpp @@ -1313,7 +1313,7 @@ static INLINE void MMU_IPCSync(u8 proc, u32 val) T1WriteLong(MMU.MMU_MEM[proc^1][0x40], 0x180, sync_r); if ((val & 0x2000) && (sync_r & 0x4000)) - MMU.reg_IF[proc^1] |= ( 1 << 16 ); + setIF(proc^1, ( 1 << 16 )); } //================================================================================================== ARM9 * @@ -2255,6 +2255,7 @@ void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val) return; case 0x04000600: + ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x600>>2] = val; GFX_FIFOcnt(val); return; // Alpha test reference value - Parameters:1 @@ -2825,19 +2826,6 @@ u32 FASTCALL _MMU_ARM9_read32(u32 adr) { switch(adr) { -#ifndef USE_GEOMETRY_FIFO_EMULATION - case 0x04000600: // Geometry Engine Status Register (R and R/W) - { - - u32 gxstat = T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][(adr >> 20)], - adr & MMU.MMU_MASK[ARMCPU_ARM9][(adr >> 20)]); - - // this is hack - //gxstat |= 0x00000002; - return gxstat; - } -#endif - case 0x04000640: case 0x04000644: case 0x04000648: diff --git a/desmume/src/OGLRender.cpp b/desmume/src/OGLRender.cpp index 8d77d4685..cfa4c21f5 100644 --- a/desmume/src/OGLRender.cpp +++ b/desmume/src/OGLRender.cpp @@ -351,8 +351,9 @@ static void BindTexture(u32 tx) glLoadIdentity (); glScaled (texcache[tx].invSizeX, texcache[tx].invSizeY, 1.0f); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (BIT16(texcache[tx].frm) ? (BIT18(texcache[tx].frm)?GL_MIRRORED_REPEAT:GL_REPEAT) : GL_CLAMP)); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (BIT17(texcache[tx].frm) ? (BIT19(texcache[tx].frm)?GL_MIRRORED_REPEAT:GL_REPEAT) : GL_CLAMP)); } @@ -814,20 +815,20 @@ static void OGLRender() glBegin(GL_TRIANGLES); - for(int j = 1; j < (type-1); j++) - { - VERT *vert0 = &gfx3d.vertlist->list[poly->vertIndexes[0]]; - VERT *vert1 = &gfx3d.vertlist->list[poly->vertIndexes[j]]; - VERT *vert2 = &gfx3d.vertlist->list[poly->vertIndexes[j+1]]; - - u8 alpha = material_5bit_to_8bit[poly->getAlpha()]; - - u8 color0[4] = { + VERT *vert0 = &gfx3d.vertlist->list[poly->vertIndexes[0]]; + u8 alpha = material_5bit_to_8bit[poly->getAlpha()]; + u8 color0[4] = { material_5bit_to_8bit[vert0->color[0]], material_5bit_to_8bit[vert0->color[1]], material_5bit_to_8bit[vert0->color[2]], alpha }; + + for(int j = 1; j < (type-1); j++) + { + VERT *vert1 = &gfx3d.vertlist->list[poly->vertIndexes[j]]; + VERT *vert2 = &gfx3d.vertlist->list[poly->vertIndexes[j+1]]; + u8 color1[4] = { material_5bit_to_8bit[vert1->color[0]], material_5bit_to_8bit[vert1->color[1]], diff --git a/desmume/src/gfx3d.cpp b/desmume/src/gfx3d.cpp index 5981adbc8..90f060140 100644 --- a/desmume/src/gfx3d.cpp +++ b/desmume/src/gfx3d.cpp @@ -383,7 +383,7 @@ void gfx3d_glFogOffset (u32 v) void gfx3d_glClearDepth(u32 v) { //formula from http://nocash.emubase.de/gbatek.htm#ds3drearplane - v &= 0x7FFFF; + v &= 0x7FFF; gfx3d.clearDepth = (v*0x200)+((v+1)/0x8000)*0x01FF; } @@ -1115,6 +1115,7 @@ void gfx3d_glAlphaFunc(u32 v) BOOL gfx3d_glBoxTest(u32 v) { u32 gxstat = T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x600); + gxstat &= 0xFFFFFFFD; // clear boxtest bit gxstat |= 0x00000001; // busy T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x600, gxstat); @@ -1203,7 +1204,8 @@ faceInside: gxstat |= 0x2; noFaceInside:*/ - gxstat &= 0xFFFFFFFE; + gxstat &= 0xFFFFFFFE; // clear busy bit + gxstat |= 0x00000002; // hack T1WriteLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x600, gxstat); return TRUE; } @@ -1410,16 +1412,11 @@ static bool gfx3d_ysort_compare(int num1, int num2) const POLY &poly1 = polylist->list[num1]; const POLY &poly2 = polylist->list[num2]; - if(poly1.maxy > poly2.maxy) - return true; - else if(poly1.maxy < poly2.maxy) - return false; - else if(poly1.miny < poly2.miny) - return true; - else if(poly1.miny > poly2.miny) - return false; - else - return false; //equal should always return false "strict weak ordering" + if (poly1.maxy > poly2.maxy) return true; + if (poly1.maxy < poly2.maxy) return false; + if (poly1.miny < poly2.miny) return true; + if (poly1.miny > poly2.miny) return false; + return false; //equal should always return false "strict weak ordering" } static void gfx3d_doFlush() @@ -1440,12 +1437,17 @@ static void gfx3d_doFlush() //find the min and max y values for each poly. //TODO - this could be a small waste of time if we are manual sorting the translucent polys - for(int i=0;ilist[i]; - for(int j=0;jlist[poly.vertIndexes[j]]; - poly.miny = j==0?vert.y:min(poly.miny,vert.y); - poly.maxy = j==0?vert.y:max(poly.maxy,vert.y); + float verty = 0.0f; + poly.miny = poly.maxy = vertlist->list[poly.vertIndexes[0]].y; + + for(int j=1; jlist[poly.vertIndexes[j]].y; + poly.miny = min(poly.miny, verty); + poly.maxy = max(poly.maxy, verty); } } @@ -1470,7 +1472,7 @@ static void gfx3d_doFlush() //should this be done after clipping?? //this must be a stable sort or else advance wars DOR will flicker in the main map mode std::stable_sort(gfx3d.indexlist, gfx3d.indexlist + opaqueCount, gfx3d_ysort_compare); - + if(!gfx3d.sortmode) { //if we are autosorting translucent polys, we need to do this also