- fixed in 3D render and added simulation Geometry FIFO;
This commit is contained in:
mtabachenko 2008-12-16 16:54:50 +00:00
parent 014f42d293
commit cdcd88725c
7 changed files with 633 additions and 610 deletions

View File

@ -25,9 +25,10 @@
#include <string.h>
#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;
}

View File

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

View File

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

View File

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

View File

@ -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<<tt)) INFO("wait IRQ%i\n", tt);
}*/
//if(MMU.reg_IE[0]&(1<<0)) gfx3d_VBlankSignal();
if(MMU.reg_IE[0]&(1<<21)) // IRQ21
{
// if (MMU.fifos[0].irq==1) NDS_makeARM9Int(21);
// if (MMU.fifos[0].irq==2) NDS_makeARM9Int(21);
if (gxIRQ == 1) NDS_makeARM9Int(21);
if (gxIRQ == 2) NDS_makeARM9Int(21);
}
if((MMU.reg_IF[0]&MMU.reg_IE[0]) && (MMU.reg_IME[0]))
{
#ifdef GDB_STUB

View File

@ -24,6 +24,7 @@
#include <algorithm>
#include <math.h>
#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},

View File

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