mirror of
https://github.com/zeldaret/tww.git
synced 2026-05-23 23:05:11 -04:00
180 lines
4.7 KiB
C
180 lines
4.7 KiB
C
#ifndef GXINIT_H
|
|
#define GXINIT_H
|
|
|
|
#include "dolphin/gx/GXEnum.h"
|
|
#include "dolphin/gx/GXStruct.h"
|
|
#include "dolphin/mtx/mtx.h"
|
|
|
|
typedef GXTexRegion* (*GXTexRegionCallback)(const GXTexObj* t_obj, GXTexMapID id);
|
|
typedef GXTlutRegion* (*GXTlutRegionCallback)(u32 idx);
|
|
|
|
typedef struct _GXData {
|
|
// Bypass and vertex info
|
|
/* 0x000 */ u16 vNumNot;
|
|
/* 0x002 */ u16 bpSentNot;
|
|
/* 0x004 */ u16 vNum;
|
|
/* 0x006 */ u16 vLim;
|
|
|
|
// Command process (CP) regs
|
|
/* 0x008 */ u32 cpEnable;
|
|
/* 0x00C */ u32 cpStatus;
|
|
/* 0x010 */ u32 cpClr;
|
|
/* 0x014 */ u32 vcdLo;
|
|
/* 0x018 */ u32 vcdHi;
|
|
/* 0x01C */ u32 vatA[8];
|
|
/* 0x03C */ u32 vatB[8];
|
|
/* 0x05C */ u32 vatC[8];
|
|
/* 0x07C */ u32 lpSize;
|
|
/* 0x080 */ u32 matIdxA;
|
|
/* 0x084 */ u32 matIdxB;
|
|
|
|
// Index loading base/stride regs (pos, nrm, tex, light)
|
|
/* 0x088 */ u32 indexBase[4];
|
|
/* 0x098 */ u32 indexStride[4];
|
|
|
|
// Transform and lighting regs
|
|
/* 0x0A8 */ u32 ambColor[2];
|
|
/* 0x0B0 */ u32 matColor[2];
|
|
|
|
// Setup regs
|
|
/* 0x0B8 */ u32 suTs0[8];
|
|
/* 0x0D8 */ u32 suTs1[8];
|
|
/* 0x0F8 */ u32 suScis0;
|
|
/* 0x0FC */ u32 suScis1;
|
|
|
|
// Raster regs
|
|
/* 0x100 */ u32 tref[8];
|
|
/* 0x120 */ u32 iref;
|
|
|
|
// Bump/Indirect texture regs
|
|
/* 0x124 */ u32 bpMask;
|
|
/* 0x128 */ u32 IndTexScale0;
|
|
/* 0x12C */ u32 IndTexScale1;
|
|
|
|
// Tev regs
|
|
/* 0x130 */ u32 tevc[16];
|
|
/* 0x170 */ u32 teva[16];
|
|
/* 0x1B0 */ u32 tevKsel[8];
|
|
|
|
// Performance regs
|
|
/* 0x1D0 */ u32 cmode0;
|
|
/* 0x1D4 */ u32 cmode1;
|
|
/* 0x1D8 */ u32 zmode;
|
|
/* 0x1DC */ u32 peCtrl;
|
|
|
|
// Display copy regs
|
|
/* 0x1E0 */ u32 cpDispSrc;
|
|
/* 0x1E4 */ u32 cpDispSize;
|
|
/* 0x1E8 */ u32 cpDispStride;
|
|
/* 0x1EC */ u32 cpDisp;
|
|
|
|
// Texture copy regs
|
|
/* 0x1F0 */ u32 cpTexSrc;
|
|
/* 0x1F4 */ u32 cpTexSize;
|
|
/* 0x1F8 */ u32 cpTexStride;
|
|
/* 0x1FC */ u32 cpTex;
|
|
/* 0x200 */ GXBool cpTexZ;
|
|
|
|
// General raster mode
|
|
/* 0x204 */ u32 genMode;
|
|
|
|
// Texture regions
|
|
/* 0x208 */ GXTexRegion TexRegions0[GX_MAX_TEXMAP];
|
|
/* 0x288 */ GXTexRegion TexRegions1[4];
|
|
/* 0x2C8 */ u32 nextTexRgn;
|
|
/* 0x2C8 */ u32 nextTexRgnCI;
|
|
|
|
// Texture lookup table regions
|
|
/* 0x2D0 */ GXTlutRegion TlutRegions[GX_MAX_TLUT_ALL];
|
|
/* 0x410 */ GXTexRegionCallback texRegionCallback;
|
|
/* 0x414 */ GXTlutRegionCallback tlutRegionCallback;
|
|
|
|
// Command processor vars
|
|
/* 0x418 */ GXAttrType nrmType;
|
|
/* 0x41C */ GXBool hasNrms;
|
|
/* 0x41D */ GXBool hasBiNrms;
|
|
/* 0x420 */ u32 projType;
|
|
/* 0x424 */ f32 projMtx[6];
|
|
|
|
// Viewport parms
|
|
/* 0x43C */ f32 vpLeft;
|
|
/* 0x440 */ f32 vpTop;
|
|
/* 0x444 */ f32 vpWd;
|
|
/* 0x448 */ f32 vpHt;
|
|
/* 0x44C */ f32 vpNearz;
|
|
/* 0x450 */ f32 vpFarz;
|
|
/* 0x454 */ f32 zOffset;
|
|
/* 0x458 */ f32 zScale;
|
|
|
|
// Texture regs
|
|
/* 0x45C */ u32 tImage0[8];
|
|
/* 0x47C */ u32 tMode0[8];
|
|
/* 0x49C */ u32 texmapId[16];
|
|
/* 0x4DC */ u32 tcsManEnab;
|
|
/* 0x4E0 */ u32 tevTcEnab;
|
|
|
|
// Performance metrics
|
|
/* 0x4E4 */ GXPerf0 perf0;
|
|
/* 0x4E8 */ GXPerf1 perf1;
|
|
/* 0x4EC */ u32 perfSel;
|
|
|
|
// Flags
|
|
/* 0x4F0 */ GXBool inDispList;
|
|
/* 0x4F1 */ GXBool dlSaveContext;
|
|
/* 0x4F2 */ u8 dirtyVAT;
|
|
/* 0x4F4 */ u32 dirtyState;
|
|
} GXData; // Size: 0x4F8
|
|
|
|
STATIC_ASSERT(sizeof(GXData) == 0x4F8);
|
|
|
|
extern GXData* const gx;
|
|
|
|
// Define register addresses.
|
|
#define GX_CP_ADDR (0x0C000000)
|
|
#define GX_PE_ADDR (0x0C001000)
|
|
#define GX_PI_ADDR (0x0C003000)
|
|
#define GX_MEM_ADDR (0x0C004000)
|
|
|
|
extern u32* __piReg;
|
|
extern u16* __cpReg;
|
|
extern u16* __peReg;
|
|
extern vu16* __memReg;
|
|
|
|
#define GX_GET_MEM_REG(offset) (*(vu16*)((vu16*)(__memReg) + (offset)))
|
|
#define GX_GET_CP_REG(offset) (*(vu16*)((vu16*)(__cpReg) + (offset)))
|
|
#define GX_GET_PE_REG(offset) (*(vu16*)((vu16*)(__peReg) + (offset)))
|
|
#define GX_GET_PI_REG(offset) (*(vu32*)((vu32*)(__piReg) + (offset)))
|
|
|
|
#define GX_SET_MEM_REG(offset, val) (*(vu16*)((vu16*)(__memReg) + (offset)) = val)
|
|
#define GX_SET_CP_REG(offset, val) (*(vu16*)((vu16*)(__cpReg) + (offset)) = val)
|
|
#define GX_SET_PE_REG(offset, val) (*(vu16*)((vu16*)(__peReg) + (offset)) = val)
|
|
#define GX_SET_PI_REG(offset, val) (*(vu32*)((vu32*)(__piReg) + (offset)) = val)
|
|
|
|
inline void GXSetWasteFlags() {
|
|
GXData* data = gx;
|
|
data->dirtyState |= GX_DIRTY_SU_TEX | GX_DIRTY_BP_MASK;
|
|
data->bpSentNot = 0;
|
|
}
|
|
|
|
static inline void set_x2(u16 value)
|
|
{
|
|
gx->bpSentNot = value;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
GXTexRegion* __GXDefaultTexRegionCallback(const GXTexObj* obj, GXTexMapID id);
|
|
GXTlutRegion* __GXDefaultTlutRegionCallback(u32 tlut);
|
|
BOOL __GXShutdown(BOOL final);
|
|
void __GXInitRevisionBits(void);
|
|
GXFifoObj* GXInit(void* base, u32 size);
|
|
void __GXInitGX(void);
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
|
|
#endif /* GXINIT_H */
|