From cdcd88725c5fe3ca094970d07938fecdc9eecaf4 Mon Sep 17 00:00:00 2001 From: mtabachenko Date: Tue, 16 Dec 2008 16:54:50 +0000 Subject: [PATCH] core: - fixed in 3D render and added simulation Geometry FIFO; --- desmume/src/FIFO.cpp | 31 +- desmume/src/FIFO.h | 37 +- desmume/src/MMU.cpp | 283 +------------ desmume/src/MMU.h | 5 +- desmume/src/NDSSystem.cpp | 24 +- desmume/src/gfx3d.cpp | 859 ++++++++++++++++++++++++-------------- desmume/src/gfx3d.h | 4 +- 7 files changed, 633 insertions(+), 610 deletions(-) diff --git a/desmume/src/FIFO.cpp b/desmume/src/FIFO.cpp index 6ef9d10f8..819450a78 100644 --- a/desmume/src/FIFO.cpp +++ b/desmume/src/FIFO.cpp @@ -25,9 +25,10 @@ #include #include "debug.h" +// ========================================================= IPC FIFO void IPC_FIFOclear(IPC_FIFO * fifo) { - memset(fifo, 0, sizeof(fifo)); + memset(fifo, 0, sizeof(IPC_FIFO)); fifo->empty = TRUE; //LOG("FIFO is cleared\n"); @@ -50,7 +51,6 @@ void IPC_FIFOadd(IPC_FIFO * fifo, u32 val) fifo->empty = FALSE; } -extern void NDS_Pause(); u32 IPC_FIFOget(IPC_FIFO * fifo) { if (fifo->empty) @@ -70,3 +70,30 @@ u32 IPC_FIFOget(IPC_FIFO * fifo) return val; } +// ========================================================= GFX FIFO +void GFX_FIFOclear(GFX_FIFO * fifo) +{ + memset(fifo, 0, sizeof(GFX_FIFO)); + + fifo->empty = TRUE; + fifo->half = TRUE; +} + +void GFX_FIFOadd(GFX_FIFO * fifo) +{ + if (fifo->full) + { + //INFO("GFX FIFO send is full\n"); + fifo->error = true; + return; + } + + fifo->size++; + if (fifo->size > 128) + fifo->half = FALSE; + + if (fifo->size == 256) + fifo->full = TRUE; + fifo->empty = FALSE; +} + diff --git a/desmume/src/FIFO.h b/desmume/src/FIFO.h index 311596915..05ad2e9cc 100644 --- a/desmume/src/FIFO.h +++ b/desmume/src/FIFO.h @@ -26,9 +26,10 @@ #include "types.h" +//=================================================== IPC FIFO typedef struct { - u32 buf[16]; // 16 words + u32 buf[16]; // 64K u8 size; // tail BOOL empty; @@ -36,16 +37,33 @@ typedef struct BOOL error; } IPC_FIFO; +extern void IPC_FIFOclear(IPC_FIFO * fifo); +extern void IPC_FIFOadd(IPC_FIFO * fifo, u32 val); +extern u32 IPC_FIFOget(IPC_FIFO * fifo); + +//=================================================== GFX FIFO typedef struct { - u32 buf[16]; // 16 words - u8 size; // tail + u32 size; // tail BOOL empty; + BOOL half; BOOL full; BOOL error; -} GFX_FIFO; + u8 irq; + u32 pipe[4]; // additional 4 entries + u8 pipe_size; // pipe tail + + BOOL pipe_empty; + BOOL pipe_half; + BOOL pipe_full; +} GFX_FIFO; +extern void GFX_FIFOclear(GFX_FIFO * fifo); +extern void GFX_FIFOadd(GFX_FIFO * fifo); + +//=================================================== Display memory FIFO +#if 0 typedef struct { u32 buf[16]; // 16 words @@ -56,12 +74,9 @@ typedef struct BOOL error; } DISP_FIFO; -extern void IPC_FIFOclear(IPC_FIFO * fifo); -extern void IPC_FIFOadd(IPC_FIFO * fifo, u32 val); -extern u32 IPC_FIFOget(IPC_FIFO * fifo); - -//extern void GFX_FIFOclear(GFX_FIFO * fifo); -//extern void GFX_FIFOadd(GFX_FIFO * fifo, u32 val); -//extern u32 GFX_FIFOget(GFX_FIFO * fifo); +extern void DISP_FIFOclear(DISP_FIFO * fifo); +extern void DISP_FIFOadd(DISP_FIFO * fifo, u32 val); +extern u32 DISP_FIFOget(DISP_FIFO * fifo); +#endif #endif diff --git a/desmume/src/MMU.cpp b/desmume/src/MMU.cpp index fd15d5590..8c62b8db9 100644 --- a/desmume/src/MMU.cpp +++ b/desmume/src/MMU.cpp @@ -266,8 +266,6 @@ TWaitState MMU_struct::MMU_WAIT32[2][16] = { }; -u32 gxIRQ = 0; - // VRAM mapping u8 *LCDdst[10] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; u8 *EngineAddr[4] = { NULL, NULL, NULL, NULL }; @@ -304,6 +302,7 @@ void MMU_Init(void) { IPC_FIFOclear(&MMU.ipc_fifo[ARMCPU_ARM9]); IPC_FIFOclear(&MMU.ipc_fifo[ARMCPU_ARM7]); + GFX_FIFOclear(&MMU.gfx_fifo); mc_init(&MMU.fw, MC_TYPE_FLASH); /* init fw device */ mc_alloc(&MMU.fw, NDS_FW_SIZE_V1); @@ -360,6 +359,7 @@ void MMU_clearMem() IPC_FIFOclear(&MMU.ipc_fifo[ARMCPU_ARM9]); IPC_FIFOclear(&MMU.ipc_fifo[ARMCPU_ARM7]); + GFX_FIFOclear(&MMU.gfx_fifo); MMU.DTCMRegion = 0x027C0000; MMU.ITCMRegion = 0x00000000; @@ -2084,13 +2084,6 @@ static void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val) if((adr>>24)==4) { - if (adr >= 0x04000400 && adr < 0x04000440) - { - // Geometry commands (aka Dislay Lists) - Parameters:X - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x400>>2] = val; - gfx3d_glCallList(0xFFFFFFFF, val); - return; - } if(adr >= 0x04000380 && adr <= 0x040003BC) { //toon table @@ -2099,6 +2092,21 @@ static void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val) return; } + if (adr >= 0x04000400 && adr < 0x04000440) + { + // Geometry commands (aka Dislay Lists) - Parameters:X + ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr-0x04000000)>>2] = val; + gfx3d_Add_Command(val); + return; + } + + if (adr >= 0x04000440 && adr < 0x04000600) + { + ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[(adr-0x04000000)>>2] = val; + gfx3d_Add_Command_Direct((adr - 0x04000400) >> 2, val); + return; + } + switch(adr) { // Alpha test reference value - Parameters:1 @@ -2135,250 +2143,10 @@ static void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val) gfx3d_glFogOffset(val); return; } - // Matrix mode - Parameters:1 - case 0x04000440: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x440>>2] = val; - gfx3d_glMatrixMode(val); - return; - } - // Push matrix - Parameters:0 - case 0x04000444: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x444>>2] = val; - gfx3d_glPushMatrix(); - return; - } - // Pop matrix/es - Parameters:1 - case 0x04000448: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x448>>2] = val; - gfx3d_glPopMatrix(val); - return; - } - // Store matrix in the stack - Parameters:1 - case 0x0400044C: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x44C>>2] = val; - gfx3d_glStoreMatrix(val); - return; - } - // Restore matrix from the stack - Parameters:1 - case 0x04000450: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x450>>2] = val; - gfx3d_glRestoreMatrix(val); - return; - } - // Load Identity matrix - Parameters:0 - case 0x04000454: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x454>>2] = val; - gfx3d_glLoadIdentity(); - return; - } - // Load 4x4 matrix - Parameters:16 - case 0x04000458: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x458>>2] = val; - gfx3d_glLoadMatrix4x4(val); - return; - } - // Load 4x3 matrix - Parameters:12 - case 0x0400045C: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x45C>>2] = val; - gfx3d_glLoadMatrix4x3(val); - return; - } - // Multiply 4x4 matrix - Parameters:16 - case 0x04000460: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x460>>2] = val; - gfx3d_glMultMatrix4x4(val); - return; - } - // Multiply 4x3 matrix - Parameters:12 - case 0x04000464: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x464>>2] = val; - gfx3d_glMultMatrix4x3(val); - return; - } - // Multiply 3x3 matrix - Parameters:9 - case 0x04000468 : - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x468>>2] = val; - gfx3d_glMultMatrix3x3(val); - return; - } - // Multiply current matrix by scaling matrix - Parameters:3 - case 0x0400046C: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x46C>>2] = val; - gfx3d_glScale(val); - return; - } - // Multiply current matrix by translation matrix - Parameters:3 - case 0x04000470: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x470>>2] = val; - gfx3d_glTranslate(val); - return; - } - // Set vertex color - Parameters:1 - case 0x04000480: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x480>>2] = val; - gfx3d_glColor3b(val); - return; - } - // Set vertex normal - Parameters:1 - case 0x04000484: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x484>>2] = val; - gfx3d_glNormal(val); - return; - } - // Set vertex texture coordinate - Parameters:1 - case 0x04000488: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x488>>2] = val; - gfx3d_glTexCoord(val); - return; - } - // Set vertex position 16b/coordinate - Parameters:2 - case 0x0400048C: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x48C>>2] = val; - gfx3d_glVertex16b(val); - return; - } - // Set vertex position 10b/coordinate - Parameters:1 - case 0x04000490: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x490>>2] = val; - gfx3d_glVertex10b(val); - return; - } - // Set vertex XY position - Parameters:1 - case 0x04000494: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x494>>2] = val; - gfx3d_glVertex3_cord(0,1,val); - return; - } - // Set vertex XZ position - Parameters:1 - case 0x04000498: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x498>>2] = val; - gfx3d_glVertex3_cord(0,2,val); - return; - } - // Set vertex YZ position - Parameters:1 - case 0x0400049C: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x49C>>2] = val; - gfx3d_glVertex3_cord(1,2,val); - return; - } - // Set vertex difference position (offset from the last vertex) - Parameters:1 - case 0x040004A0: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4A0>>2] = val; - gfx3d_glVertex_rel (val); - return; - } - // Set polygon attributes - Parameters:1 - case 0x040004A4: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4A4>>2] = val; - gfx3d_glPolygonAttrib(val); - return; - } - // Set texture parameteres - Parameters:1 - case 0x040004A8: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4A8>>2] = val; - gfx3d_glTexImage(val); - return; - } - // Set palette base address - Parameters:1 - case 0x040004AC: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4AC>>2] = val&0x1FFF; - gfx3d_glTexPalette(val&0x1FFFF); - return; - } - // Set material diffuse/ambient parameters - Parameters:1 - case 0x040004C0: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4C0>>2] = val; - gfx3d_glMaterial0 (val); - return; - } - // Set material reflection/emission parameters - Parameters:1 - case 0x040004C4: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4C4>>2] = val; - gfx3d_glMaterial1 (val); - return; - } - // Light direction vector - Parameters:1 - case 0x040004C8: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4C8>>2] = val; - gfx3d_glLightDirection(val); - return; - } - // Light color - Parameters:1 - case 0x040004CC: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4CC>>2] = val; - gfx3d_glLightColor(val); - return; - } - // Material Shininess - Parameters:32 - case 0x040004D0: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x4D0>>2] = val; - gfx3d_glShininess(val); - return; - } - // Begin vertex list - Parameters:1 - case 0x04000500: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x500>>2] = val; - gfx3d_glBegin(val); - return; - } - // End vertex list - Parameters:0 - case 0x04000504: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x504>>2] = val; - gfx3d_glEnd(); - return; - } - // Swap rendering engine buffers - Parameters:1 - case 0x04000540: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x540>>2] = val; - gfx3d_glFlush(val); - return; - } - // Set viewport coordinates - Parameters:1 - case 0x04000580: - { - ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x580>>2] = val; - gfx3d_glViewPort(val); - return; - } - - // ==================================================================== end 3D case 0x04000600: // Geometry Engine Status Register (R and R/W) { - gxIRQ = ((val >> 30) & 0x3); + ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x600>>2] = val; return; } case REG_DISPA_WININ: @@ -2898,24 +2666,13 @@ static u32 FASTCALL _MMU_ARM9_read32(u32 adr) adr &= 0x0FFFFFFF; + // Address is an IO register if((adr >> 24) == 4) { - /* Address is an IO register */ switch(adr) { - // This is hacked due to the only current 3D core case 0x04000600: // Geometry Engine Status Register (R and R/W) - { - /* u32 gxstat = ( 2 | - (MMU.fifos[ARMCPU_ARM9].full<<24)| - (MMU.fifos[ARMCPU_ARM9].half<<25)| - (MMU.fifos[ARMCPU_ARM9].empty<<26)| - (MMU.fifos[ARMCPU_ARM9].irq<<30) - );*/ - u32 gxstat = (2 | (3 << 25) | (gxIRQ << 30)); - - return gxstat; - } + return gfx3d_GetGXstatus(); case 0x04000640: case 0x04000644: diff --git a/desmume/src/MMU.h b/desmume/src/MMU.h index 23d66b1d4..014afa11f 100644 --- a/desmume/src/MMU.h +++ b/desmume/src/MMU.h @@ -77,8 +77,11 @@ struct MMU_struct { u8 ARM9_RW_MODE; + // IPC FIFO IPC_FIFO ipc_fifo[2]; // 0 - ARM9 FIFO - // 1 - ARM7 FIFO*/ + // 1 - ARM7 FIFO + // GFX FIFO + GFX_FIFO gfx_fifo; static TWaitState MMU_WAIT16[2][16]; static TWaitState MMU_WAIT32[2][16]; diff --git a/desmume/src/NDSSystem.cpp b/desmume/src/NDSSystem.cpp index 1861a15b2..a3ebaadfa 100644 --- a/desmume/src/NDSSystem.cpp +++ b/desmume/src/NDSSystem.cpp @@ -42,8 +42,6 @@ NDSSystem nds; -extern u32 gxIRQ; - static u32 calc_CRC16( u32 start, const u8 *data, int count) { int i,j; @@ -906,6 +904,8 @@ u32 NDS_exec(s32 nb) LOG(logbuf); } #endif + NDS_makeARM9Int(21); // GX geometry + for (i = 0; i < INSTRUCTIONS_PER_BATCH && (!FORCE) && (execute); i++) { if(NDS_ARM9.waitIRQ) { @@ -1550,26 +1550,6 @@ u32 NDS_exec(s32 nb) } } - /*for (int tt=0; tt<24; tt++) - { - if (tt == 0) continue; //VBlank - if (tt == 1) continue; //HBlank - if (tt == 3) continue; - if (tt == 12) continue; - if (tt == 18) continue; - if (MMU.reg_IE[0]&(1< #include +#include "armcpu.h" #include "debug.h" #include "gfx3d.h" #include "matrix.h" @@ -100,6 +101,9 @@ static int _t=0, _s=0; static float last_t, last_s; static u32 clCmd = 0; static u32 clInd = 0; +static u32 BTind = 0; +static u32 PTind = 0; +static BOOL GFX_busy = FALSE; //raw ds format poly attributes static u32 polyAttr=0,textureFormat=0, texturePalette=0; @@ -206,6 +210,23 @@ void gfx3d_reset() MatrixInit (mtxCurrent[2]); MatrixInit (mtxCurrent[3]); MatrixInit (mtxTemporal); + + clCmd = 0; + clInd = 0; + + ML4x4ind = 0; + ML4x3ind = 0; + MM4x4ind = 0; + MM4x3ind = 0; + MM3x3ind = 0; + + BTind = 0; + PTind = 0; + + _t=0; + _s=0; + last_t = 0; + last_s = 0; } void gfx3d_glViewPort(unsigned long v) @@ -267,11 +288,11 @@ BOOL gfx3d_glLoadMatrix4x4(signed long v) ++ML4x4ind; if(ML4x4ind<16) return FALSE; + ML4x4ind = 0; if (mode == 2) MatrixCopy (mtxCurrent[1], mtxCurrent[2]); - - ML4x4ind = 0; + return TRUE; } @@ -348,9 +369,7 @@ BOOL gfx3d_glTranslate(signed long v) ++transind; - if(transind<3) - return FALSE; - + if(transind<3) return FALSE; transind = 0; MatrixTranslate (mtxCurrent[mode], trans); @@ -368,9 +387,7 @@ BOOL gfx3d_glScale(signed long v) ++scaleind; - if(scaleind<3) - return FALSE; - + if(scaleind<3) return FALSE; scaleind = 0; MatrixScale (mtxCurrent[mymode], scale); @@ -435,7 +452,6 @@ BOOL gfx3d_glMultMatrix4x4(signed long v) MM4x4ind++; if(MM4x4ind<16) return FALSE; - MM4x4ind = 0; MatrixMultiply (mtxCurrent[mode], mtxTemporal); @@ -906,20 +922,18 @@ void gfx3d_glAlphaFunc(unsigned long v) BOOL gfx3d_glBoxTest(unsigned long v) { - static u8 cycles = 0; - cycles++; - if (cycles < 3) return FALSE; - cycles = 0; + BTind++; + if (BTind < 3) return FALSE; + BTind = 0; //INFO("BoxTest=%i\n",val); return TRUE; } BOOL gfx3d_glPosTest(unsigned long v) { - static u8 cycles = 0; - cycles++; - if (cycles < 2) return FALSE; - cycles = 0; + PTind++; + if (BTind < 2) return FALSE; + PTind = 0; //INFO("PosTest=%i\n",val); return TRUE; } @@ -941,304 +955,20 @@ void gfx3d_glGetVecRes(unsigned int index) //return 0; } -void gfx3d_glCallList(u32 addr, u32 cmd) -{ - if (addr != 0xFFFFFFFF) - { - clInd = 4; - clCmd = addr; - } // else FIFO commands - - if (!clInd) - { - clInd = 4; - clCmd = cmd; - return; - } - - //INFO("3D command 0x%02X (full cmd = 0x%08X, val = 0x%08X)\n", clCmd&0xFF, clCmd, cmd); - for (;;) - { - switch (clCmd & 0xFF) - { - // 3D commands without parameters - case 0x00: // NOP - No Operation (for padding packed GXFIFO commands) - { - if (clInd > 0) - { - clCmd >>= 8; - clInd--; - continue; - } - break; - } - case 0x11: // MTX_PUSH - Push Current Matrix on Stack (W) - { - *(u32 *)(ARM9Mem.ARM9_REG + 0x444) = cmd; - gfx3d_glPushMatrix(); - clInd--; - clCmd >>= 8; - continue; - } - case 0x15: // MTX_IDENTITY - Load Unit Matrix to Current Matrix (W) - { - *(u32 *)(ARM9Mem.ARM9_REG + 0x454) = cmd; - gfx3d_glLoadIdentity(); - clInd--; - clCmd >>= 8; - continue; - } - case 0x41: // END_VTXS - End of Vertex List (W) - { - *(u32 *)(ARM9Mem.ARM9_REG + 0x504) = cmd; - gfx3d_glEnd(); - clInd--; - clCmd >>= 8; - continue; - } - } - break; - } - - /*if (addr != 0xFFFFFFFF) - { - if (!clInd) - { - clInd = 4; - clCmd = addr; - return; - } - } // else FIFO commands - */ - - if (!clInd) - { - clInd = 4; - clCmd = cmd; - return; - } - - switch (clCmd & 0xFF) - { - case 0x10: // MTX_MODE - Set Matrix Mode (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x440) = cmd; - gfx3d_glMatrixMode(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x12: // MTX_POP - Pop Current Matrix from Stack (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x448) = cmd; - gfx3d_glPopMatrix(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x13: // MTX_STORE - Store Current Matrix on Stack (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x44C) = cmd; - gfx3d_glStoreMatrix(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x14: // MTX_RESTORE - Restore Current Matrix from Stack (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x450) = cmd; - gfx3d_glRestoreMatrix(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x16: // MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x458) = cmd; - if (!gfx3d_glLoadMatrix4x4(cmd)) break; - clCmd >>= 8; - clInd--; - break; - case 0x17: // MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x45C) = cmd; - if (!gfx3d_glLoadMatrix4x3(cmd)) break; - clCmd >>= 8; - clInd--; - break; - case 0x18: // MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x460) = cmd; - if (!gfx3d_glMultMatrix4x4(cmd)) break; - clCmd >>= 8; - clInd--; - break; - case 0x19: // MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x464) = cmd; - if (!gfx3d_glMultMatrix4x3(cmd)) break; - clCmd >>= 8; - clInd--; - break; - case 0x1A: // MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x468) = cmd; - if (!gfx3d_glMultMatrix3x3(cmd)) break; - clCmd >>= 8; - clInd--; - break; - case 0x1B: // MTX_SCALE - Multiply Current Matrix by Scale Matrix (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x46C) = cmd; - if (!gfx3d_glScale(cmd)) break; - clCmd >>= 8; - clInd--; - break; - case 0x1C: // MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x470) = cmd; - if (!gfx3d_glTranslate(cmd)) break; - clCmd >>= 8; - clInd--; - break; - case 0x20: // COLOR - Directly Set Vertex Color (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x480) = cmd; - gfx3d_glColor3b(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x21: // NORMAL - Set Normal Vector (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x484) = cmd; - gfx3d_glNormal(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x22: // TEXCOORD - Set Texture Coordinates (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x488) = cmd; - gfx3d_glTexCoord(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x23: // VTX_16 - Set Vertex XYZ Coordinates (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x48C) = cmd; - if (!gfx3d_glVertex16b(cmd)) break; - clCmd >>= 8; - clInd--; - break; - case 0x24: // VTX_10 - Set Vertex XYZ Coordinates (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x490) = cmd; - gfx3d_glVertex10b(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x25: // VTX_XY - Set Vertex XY Coordinates (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x494) = cmd; - gfx3d_glVertex3_cord(0, 1, cmd); - clCmd >>= 8; - clInd--; - break; - case 0x26: // VTX_XZ - Set Vertex XZ Coordinates (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x498) = cmd; - gfx3d_glVertex3_cord(0, 2, cmd); - clCmd >>= 8; - clInd--; - break; - case 0x27: // VTX_YZ - Set Vertex YZ Coordinates (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x49C) = cmd; - gfx3d_glVertex3_cord(1, 2, cmd); - clCmd >>= 8; - clInd--; - break; - case 0x28: // VTX_DIFF - Set Relative Vertex Coordinates (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x4A0) = cmd; - gfx3d_glVertex_rel(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x29: // POLYGON_ATTR - Set Polygon Attributes (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x4A4) = cmd; - gfx3d_glPolygonAttrib(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x2A: // TEXIMAGE_PARAM - Set Texture Parameters (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x4A8) = cmd; - gfx3d_glTexImage(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x2B: // PLTT_BASE - Set Texture Palette Base Address (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x4AC) = cmd; - gfx3d_glTexPalette(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x30: // DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x4C0) = cmd; - gfx3d_glMaterial0(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x31: // SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x4C4) = cmd; - gfx3d_glMaterial1(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x32: // LIGHT_VECTOR - Set Light's Directional Vector (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x4C8) = cmd; - gfx3d_glLightDirection(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x33: // LIGHT_COLOR - Set Light Color (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x4CC) = cmd; - gfx3d_glLightColor(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x34: // SHININESS - Specular Reflection Shininess Table (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x4D0) = cmd; - if (!gfx3d_glShininess(cmd)) break; - clCmd >>= 8; - clInd--; - break; - case 0x40: // BEGIN_VTXS - Start of Vertex List (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x500) = cmd; - gfx3d_glBegin(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x50: // SWAP_BUFFERS - Swap Rendering Engine Buffer (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x540) = cmd; - gfx3d_glFlush(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x60: // VIEWPORT - Set Viewport (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x580) = cmd; - gfx3d_glViewPort(cmd); - clCmd >>= 8; - clInd--; - break; - case 0x70: // BOX_TEST - Test if Cuboid Sits inside View Volume (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x5C0) = cmd; - if (!gfx3d_glBoxTest(cmd)) break; - clCmd >>= 8; - clInd--; - break; - case 0x71: // POS_TEST - Set Position Coordinates for Test (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x5C4) = cmd; - if (!gfx3d_glPosTest(cmd)) break; - clCmd >>= 8; - clInd--; - break; - case 0x72: // VEC_TEST - Set Directional Vector for Test (W) - *(u32 *)(ARM9Mem.ARM9_REG + 0x5C8) = cmd; - gfx3d_glVecTest(cmd); - clCmd >>= 8; - clInd--; - break; - default: - INFO("Unknown 3D command 0x%02X in cmd=0x%02X\n", clCmd&0xFF, cmd); - clCmd >>= 8; - clInd--; - //NDS_Pause(); - break; - } -} void gfx3d_glFlush(unsigned long v) { + //INFO("FIFO size=%i\n", MMU.gfx_fifo.size); + GFX_busy = TRUE; flushPending = TRUE; gfx3d.wbuffer = (v&1)!=0; gfx3d.sortmode = ((v>>1)&1)!=0; + // reset + clInd = 0; + clCmd = 0; + GFX_FIFOclear(&MMU.gfx_fifo); + //the renderer wil lget the lists we just built gfx3d.polylist = polylist; gfx3d.vertlist = vertlist; @@ -1261,6 +991,8 @@ void gfx3d_glFlush(unsigned long v) //switch to the new lists twiddleLists(); + + GFX_busy = FALSE; } void gfx3d_VBlankSignal() @@ -1279,6 +1011,507 @@ void gfx3d_VBlankEndSignal() gpu3D->NDS_3D_Render(); } +u32 gfx3d_GetGXstatus() +{ + u32 gxstat = ((u32 *)(MMU.MMU_MEM[ARMCPU_ARM9][0x40]))[0x600>>2]; + + // 0 BoxTest,PositionTest,VectorTest Busy (0=Ready, 1=Busy) + gxstat |= 0x00; + // 1 BoxTest Result (0=All Outside View, 1=Parts or Fully Inside View) + gxstat |= 0x02; + // 2-7 Not used + // + // 8-12 Position & Vector Matrix Stack Level (0..31) (lower 5bit of 6bit value) + gxstat |= 0x00; + // 13 Projection Matrix Stack Level (0..1) + gxstat |= 0x00; // w + // 14 Matrix Stack Busy (0=No, 1=Yes; Currently executing a Push/Pop command) + gxstat |= 0x00; + // 15 Matrix Stack Overflow/Underflow Error (0=No, 1=Error/Acknowledge/Reset) + gxstat |= 0x00; // w + // 16-24 Number of 40bit-entries in Command FIFO (0..256) + gxstat |= (MMU.gfx_fifo.size & 0xFF) << 16; + // 24 Command FIFO Full (MSB of above) (0=No, 1=Yes; Full) + gxstat |= MMU.gfx_fifo.full << 24; + // 25 Command FIFO Less Than Half Full (0=No, 1=Yes; Less than Half-full) + gxstat |= MMU.gfx_fifo.half << 25; + // 26 Command FIFO Empty (0=No, 1=Yes; Empty) + gxstat |= MMU.gfx_fifo.empty << 26; + // 27 Geometry Engine Busy (0=No, 1=Yes; Busy; Commands are executing) + if (GFX_busy) gxstat |= 0x08000000; + // 28-29 Not used + // + // 30-31 Command FIFO IRQ (0=Never, 1=Less than half full, 2=Empty, 3=Reserved) + if (MMU.gfx_fifo.empty) + { + gxstat |= 2 << 30; + MMU.reg_IF[ARMCPU_ARM9] |= (1<<21); + } + if (MMU.gfx_fifo.half) + { + gxstat |= 1 << 30; + MMU.reg_IF[ARMCPU_ARM9] |= (1<<21); + } + + //INFO("GFX FIFO read size=%i value 0x%X\n", MMU.gfx_fifo.size, gxstat); + return gxstat; +} + +#define NOPARAMS() \ + for (;;) \ + {\ + switch (clCmd & 0xFF)\ + {\ + case 0x00:\ + {\ + if (clInd > 0)\ + {\ + clCmd >>= 8;\ + clInd--;\ + continue;\ + }\ + clCmd = 0;\ + break;\ + }\ + case 0x11:\ + {\ + GFX_FIFOadd(&MMU.gfx_fifo);\ + *(u32 *)(ARM9Mem.ARM9_REG + 0x444) = val;\ + gfx3d_glPushMatrix();\ + clCmd >>= 8;\ + clInd--;\ + continue;\ + }\ + case 0x15:\ + {\ + GFX_FIFOadd(&MMU.gfx_fifo);\ + *(u32 *)(ARM9Mem.ARM9_REG + 0x454) = val;\ + gfx3d_glLoadIdentity();\ + clCmd >>= 8;\ + clInd--;\ + continue;\ + }\ + case 0x41:\ + {\ + GFX_FIFOadd(&MMU.gfx_fifo);\ + *(u32 *)(ARM9Mem.ARM9_REG + 0x504) = val;\ + gfx3d_glEnd();\ + clCmd >>= 8;\ + clInd--;\ + continue;\ + }\ + }\ + break;\ + } + +#define SETCOUNTCOMMANDS() \ + if (!clCmd) clInd = 0;\ + else\ + {\ + u32 tmp_chk = 0xFF000000;\ + for (int t = 4; t > 0; t--)\ + {\ + if ((clCmd & tmp_chk))\ + {\ + clInd = t;\ + break;\ + }\ + tmp_chk >>= 8;\ + }\ + } + +void gfx3d_Add_Command(u32 val) +{ + //INFO("3D command 0x%02X (full val = 0x%08X, val = 0x%08X, ind %i)\n", clCmd&0xFF, clCmd, val, clInd); + if (!clInd) + { + if (val == 0) return; + clCmd = val; + SETCOUNTCOMMANDS(); + NOPARAMS(); + return; + } + + switch (clCmd & 0xFF) + { + case 0x10: // MTX_MODE - Set Matrix Mode (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x440) = val; + gfx3d_glMatrixMode(val); + clCmd >>= 8; + clInd--; + break; + case 0x12: // MTX_POP - Pop Current Matrix from Stack (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x448) = val; + gfx3d_glPopMatrix(val); + clCmd >>= 8; + clInd--; + break; + case 0x13: // MTX_STORE - Store Current Matrix on Stack (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x44C) = val; + gfx3d_glStoreMatrix(val); + clCmd >>= 8; + clInd--; + break; + case 0x14: // MTX_RESTORE - Restore Current Matrix from Stack (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x450) = val; + gfx3d_glRestoreMatrix(val); + clCmd >>= 8; + clInd--; + break; + case 0x16: // MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x458) = val; + if (!gfx3d_glLoadMatrix4x4(val)) break; + clCmd >>= 8; + clInd--; + break; + case 0x17: // MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x45C) = val; + if (!gfx3d_glLoadMatrix4x3(val)) break; + clCmd >>= 8; + clInd--; + break; + case 0x18: // MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x460) = val; + if (!gfx3d_glMultMatrix4x4(val)) break; + clCmd >>= 8; + clInd--; + break; + case 0x19: // MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x464) = val; + if (!gfx3d_glMultMatrix4x3(val)) break; + clCmd >>= 8; + clInd--; + break; + case 0x1A: // MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x468) = val; + if (!gfx3d_glMultMatrix3x3(val)) break; + clCmd >>= 8; + clInd--; + break; + case 0x1B: // MTX_SCALE - Multiply Current Matrix by Scale Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x46C) = val; + if (!gfx3d_glScale(val)) break; + clCmd >>= 8; + clInd--; + break; + case 0x1C: // MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x470) = val; + if (!gfx3d_glTranslate(val)) break; + clCmd >>= 8; + clInd--; + break; + case 0x20: // COLOR - Directly Set Vertex Color (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x480) = val; + gfx3d_glColor3b(val); + clCmd >>= 8; + clInd--; + break; + case 0x21: // NORMAL - Set Normal Vector (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x484) = val; + gfx3d_glNormal(val); + clCmd >>= 8; + clInd--; + break; + case 0x22: // TEXCOORD - Set Texture Coordinates (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x488) = val; + gfx3d_glTexCoord(val); + clCmd >>= 8; + clInd--; + break; + case 0x23: // VTX_16 - Set Vertex XYZ Coordinates (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x48C) = val; + if (!gfx3d_glVertex16b(val)) break; + clCmd >>= 8; + clInd--; + break; + case 0x24: // VTX_10 - Set Vertex XYZ Coordinates (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x490) = val; + gfx3d_glVertex10b(val); + clCmd >>= 8; + clInd--; + break; + case 0x25: // VTX_XY - Set Vertex XY Coordinates (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x494) = val; + gfx3d_glVertex3_cord(0, 1, val); + clCmd >>= 8; + clInd--; + break; + case 0x26: // VTX_XZ - Set Vertex XZ Coordinates (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x498) = val; + gfx3d_glVertex3_cord(0, 2, val); + clCmd >>= 8; + clInd--; + break; + case 0x27: // VTX_YZ - Set Vertex YZ Coordinates (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x49C) = val; + gfx3d_glVertex3_cord(1, 2, val); + clCmd >>= 8; + clInd--; + break; + case 0x28: // VTX_DIFF - Set Relative Vertex Coordinates (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4A0) = val; + gfx3d_glVertex_rel(val); + clCmd >>= 8; + clInd--; + break; + case 0x29: // POLYGON_ATTR - Set Polygon Attributes (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4A4) = val; + gfx3d_glPolygonAttrib(val); + clCmd >>= 8; + clInd--; + break; + case 0x2A: // TEXIMAGE_PARAM - Set Texture Parameters (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4A8) = val; + gfx3d_glTexImage(val); + clCmd >>= 8; + clInd--; + break; + case 0x2B: // PLTT_BASE - Set Texture Palette Base Address (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4AC) = val; + gfx3d_glTexPalette(val); + clCmd >>= 8; + clInd--; + break; + case 0x30: // DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4C0) = val; + gfx3d_glMaterial0(val); + clCmd >>= 8; + clInd--; + break; + case 0x31: // SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4C4) = val; + gfx3d_glMaterial1(val); + clCmd >>= 8; + clInd--; + break; + case 0x32: // LIGHT_VECTOR - Set Light's Directional Vector (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4C8) = val; + gfx3d_glLightDirection(val); + clCmd >>= 8; + clInd--; + break; + case 0x33: // LIGHT_COLOR - Set Light Color (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4CC) = val; + gfx3d_glLightColor(val); + clCmd >>= 8; + clInd--; + break; + case 0x34: // SHININESS - Specular Reflection Shininess Table (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4D0) = val; + if (!gfx3d_glShininess(val)) break; + clCmd >>= 8; + clInd--; + break; + case 0x40: // BEGIN_VTXS - Start of Vertex List (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x500) = val; + gfx3d_glBegin(val); + clCmd >>= 8; + clInd--; + break; + case 0x50: // SWAP_BUFFERS - Swap Rendering Engine Buffer (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x540) = val; + gfx3d_glFlush(val); + clCmd >>= 8; + clInd--; + break; + case 0x60: // VIEWPORT - Set Viewport (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x580) = val; + gfx3d_glViewPort(val); + clCmd >>= 8; + clInd--; + break; + case 0x70: // BOX_TEST - Test if Cuboid Sits inside View Volume (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x5C0) = val; + if (!gfx3d_glBoxTest(val)) break; + clCmd >>= 8; + clInd--; + break; + case 0x71: // POS_TEST - Set Position Coordinates for Test (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x5C4) = val; + if (!gfx3d_glPosTest(val)) break; + clCmd >>= 8; + clInd--; + break; + case 0x72: // VEC_TEST - Set Directional Vector for Test (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x5C8) = val; + gfx3d_glVecTest(val); + clCmd >>= 8; + clInd--; + break; + default: + LOG("Unknown 3D command 0x%02X in cmd=0x%02X\n", clCmd&0xFF, val); + clCmd >>= 8; + clInd--; + return; + } + GFX_FIFOadd(&MMU.gfx_fifo); + NOPARAMS(); +} + +void gfx3d_Add_Command_Direct(u32 cmd, u32 val) +{ + if (cmd == 0) return; + + switch (cmd) + { + // 3D commands without parameters + case 0x00: // NOP - No Operation (for padding packed GXFIFO commands) + break; + case 0x11: // MTX_PUSH - Push Current Matrix on Stack (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x444) = val; + gfx3d_glPushMatrix(); + break; + case 0x15: // MTX_IDENTITY - Load Unit Matrix to Current Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x454) = val; + gfx3d_glLoadIdentity(); + break; + case 0x41: // END_VTXS - End of Vertex List (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x504) = val; + gfx3d_glEnd(); + break; + case 0x10: // MTX_MODE - Set Matrix Mode (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x440) = val; + gfx3d_glMatrixMode(val); + break; + case 0x12: // MTX_POP - Pop Current Matrix from Stack (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x448) = val; + gfx3d_glPopMatrix(val); + break; + case 0x13: // MTX_STORE - Store Current Matrix on Stack (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x44C) = val; + gfx3d_glStoreMatrix(val); + break; + case 0x14: // MTX_RESTORE - Restore Current Matrix from Stack (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x450) = val; + gfx3d_glRestoreMatrix(val); + break; + case 0x16: // MTX_LOAD_4x4 - Load 4x4 Matrix to Current Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x458) = val; + if (!gfx3d_glLoadMatrix4x4(val)) break; + break; + case 0x17: // MTX_LOAD_4x3 - Load 4x3 Matrix to Current Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x45C) = val; + if (!gfx3d_glLoadMatrix4x3(val)) break; + break; + case 0x18: // MTX_MULT_4x4 - Multiply Current Matrix by 4x4 Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x460) = val; + if (!gfx3d_glMultMatrix4x4(val)) break; + break; + case 0x19: // MTX_MULT_4x3 - Multiply Current Matrix by 4x3 Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x464) = val; + if (!gfx3d_glMultMatrix4x3(val)) break; + break; + case 0x1A: // MTX_MULT_3x3 - Multiply Current Matrix by 3x3 Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x468) = val; + if (!gfx3d_glMultMatrix3x3(val)) break; + break; + case 0x1B: // MTX_SCALE - Multiply Current Matrix by Scale Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x46C) = val; + if (!gfx3d_glScale(val)) break; + break; + case 0x1C: // MTX_TRANS - Mult. Curr. Matrix by Translation Matrix (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x470) = val; + if (!gfx3d_glTranslate(val)) break; + break; + case 0x20: // COLOR - Directly Set Vertex Color (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x480) = val; + gfx3d_glColor3b(val); + break; + case 0x21: // NORMAL - Set Normal Vector (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x484) = val; + gfx3d_glNormal(val); + break; + case 0x22: // TEXCOORD - Set Texture Coordinates (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x488) = val; + gfx3d_glTexCoord(val); + break; + case 0x23: // VTX_16 - Set Vertex XYZ Coordinates (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x48C) = val; + if (!gfx3d_glVertex16b(val)) break; + break; + case 0x24: // VTX_10 - Set Vertex XYZ Coordinates (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x490) = val; + gfx3d_glVertex10b(val); + break; + case 0x25: // VTX_XY - Set Vertex XY Coordinates (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x494) = val; + gfx3d_glVertex3_cord(0, 1, val); + break; + case 0x26: // VTX_XZ - Set Vertex XZ Coordinates (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x498) = val; + gfx3d_glVertex3_cord(0, 2, val); + break; + case 0x27: // VTX_YZ - Set Vertex YZ Coordinates (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x49C) = val; + gfx3d_glVertex3_cord(1, 2, val); + break; + case 0x28: // VTX_DIFF - Set Relative Vertex Coordinates (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4A0) = val; + gfx3d_glVertex_rel(val); + break; + case 0x29: // POLYGON_ATTR - Set Polygon Attributes (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4A4) = val; + gfx3d_glPolygonAttrib(val); + break; + case 0x2A: // TEXIMAGE_PARAM - Set Texture Parameters (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4A8) = val; + gfx3d_glTexImage(val); + break; + case 0x2B: // PLTT_BASE - Set Texture Palette Base Address (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4AC) = val; + gfx3d_glTexPalette(val); + break; + case 0x30: // DIF_AMB - MaterialColor0 - Diffuse/Ambient Reflect. (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4C0) = val; + gfx3d_glMaterial0(val); + break; + case 0x31: // SPE_EMI - MaterialColor1 - Specular Ref. & Emission (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4C4) = val; + gfx3d_glMaterial1(val); + break; + case 0x32: // LIGHT_VECTOR - Set Light's Directional Vector (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4C8) = val; + gfx3d_glLightDirection(val); + break; + case 0x33: // LIGHT_COLOR - Set Light Color (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4CC) = val; + gfx3d_glLightColor(val); + break; + case 0x34: // SHININESS - Specular Reflection Shininess Table (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x4D0) = val; + if (!gfx3d_glShininess(val)) break; + break; + case 0x40: // BEGIN_VTXS - Start of Vertex List (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x500) = val; + gfx3d_glBegin(val); + break; + case 0x50: // SWAP_BUFFERS - Swap Rendering Engine Buffer (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x540) = val; + gfx3d_glFlush(val); + break; + case 0x60: // VIEWPORT - Set Viewport (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x580) = val; + gfx3d_glViewPort(val); + break; + case 0x70: // BOX_TEST - Test if Cuboid Sits inside View Volume (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x5C0) = val; + if (!gfx3d_glBoxTest(val)) break; + break; + case 0x71: // POS_TEST - Set Position Coordinates for Test (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x5C4) = val; + if (!gfx3d_glPosTest(val)) break; + break; + case 0x72: // VEC_TEST - Set Directional Vector for Test (W) + *(u32 *)(ARM9Mem.ARM9_REG + 0x5C8) = val; + gfx3d_glVecTest(val); + break; + default: + LOG("Execute unknown 3D command 0x%02X in val=0x%02X\n", cmd, val); + return; + } + GFX_FIFOadd(&MMU.gfx_fifo); +} + static void gfx3d_Control_cache() { u32 v = control; @@ -1343,8 +1576,6 @@ void gfx3d_glGetLightColor(unsigned int index, unsigned int* dest) //talks about the state required to process verts in quadlists etc. helpful ideas. //consider building a little state structure that looks exactly like this describes - - SFORMAT SF_GFX3D[]={ { "GCTL", 4, 1, &control}, { "GPAT", 4, 1, &polyAttr}, @@ -1379,6 +1610,14 @@ SFORMAT SF_GFX3D[]={ { "GL_S", 4, 1, &last_s}, { "GLCM", 4, 1, &clCmd}, { "GLIN", 4, 1, &clInd}, + { "GLBT", 4, 1, &BTind}, + { "GLPT", 4, 1, &PTind}, + { "GLBS", 1, 1, &GFX_busy}, + { "GLF1", 1, 1, &MMU.gfx_fifo.empty}, + { "GLF1", 1, 1, &MMU.gfx_fifo.half}, + { "GLF1", 1, 1, &MMU.gfx_fifo.full}, + { "GLF1", 1, 1, &MMU.gfx_fifo.error}, + { "GLF1", 1, 1, &MMU.gfx_fifo.irq}, { "GCOL", 1, 4, colorRGB}, { "GLCO", 4, 4, lightColor}, { "GLDI", 4, 4, lightDirection}, diff --git a/desmume/src/gfx3d.h b/desmume/src/gfx3d.h index 224828b57..f4841cfca 100644 --- a/desmume/src/gfx3d.h +++ b/desmume/src/gfx3d.h @@ -183,11 +183,13 @@ BOOL gfx3d_glPosTest(unsigned long v); void gfx3d_glVecTest(unsigned long v); void gfx3d_glGetPosRes(unsigned int index); void gfx3d_glGetVecRes(unsigned int index); -void gfx3d_glCallList(u32 addr, u32 cmd); void gfx3d_glFlush(unsigned long v); void gfx3d_VBlankSignal(); void gfx3d_VBlankEndSignal(); void gfx3d_Control(unsigned long v); +u32 gfx3d_GetGXstatus(); +void gfx3d_Add_Command_Direct(u32 addr, u32 val); +void gfx3d_Add_Command(u32 val); //other misc stuff void gfx3d_glGetMatrix(unsigned int mode, int index, float* dest);