- some cleanups GXFIFO;

This commit is contained in:
mtabachenko 2009-05-25 16:40:48 +00:00
parent d963afde7f
commit 2d288f338f
4 changed files with 34 additions and 50 deletions

View File

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

View File

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

View File

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

View File

@ -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;i<polycount;i++) {
for(int i=0; i<polycount; i++)
{
POLY &poly = polylist->list[i];
for(int j=0;j<poly.type;j++) {
VERT &vert = vertlist->list[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; j<poly.type; j++)
{
verty = vertlist->list[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