summaryrefslogtreecommitdiff
path: root/include/dolphin/gx/GXInit.h
blob: d360345c1fd3c351b93ab837e0c367ee22bccdee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#ifndef GXINIT_H
#define GXINIT_H

#include "dolphin/gx/GXTexture.h"

typedef struct _GXData {
    // Bypass and vertex info
	u16 vNumNot;   // _000, !(# flush verts to send)
	u16 bpSentNot; // _002, !(bypass reg sent last?)
	u16 vNum;      // _004, # flush verts to send
	u16 vLim;      // _006, max vert size

	// Command process (CP) regs
	u32 cpEnable; // _008
	u32 cpStatus; // _00C
	u32 cpClr;    // _010
	u32 vcdLo;    // _014
	u32 vcdHi;    // _018
	u32 vatA[8];  // _01C
	u32 vatB[8];  // _03C
	u32 vatC[8];  // _05C
	u32 lpSize;   // _07C
	u32 matIdxA;  // _080
	u32 matIdxB;  // _084

	// Index loading base/stride regs (pos, nrm, tex, light)
	u32 indexBase[4];   // _088
	u32 indexStride[4]; // _098

	// Transform and lighting regs
	u32 ambColor[2]; // _0A8
	u32 matColor[2]; // _0B0

	// Setup regs
	u32 suTs0[8]; // _0B8
	u32 suTs1[8]; // _0D8
	u32 suScis0;  // _0F8
	u32 suScis1;  // _0FC

	// Raster regs
	u32 tref[8]; // _100
	u32 iref;    // _120

	// Bump/Indirect texture regs
	u32 bpMask;       // _124
	u32 IndTexScale0; // _128
	u32 IndTexScale1; // _12C

	// Tev regs
	u32 tevc[16];   // _130
	u32 teva[16];   // _170
	u32 tevKsel[8]; // _1B0

	// Performance regs
	u32 cmode0; // _1D0
	u32 cmode1; // _1D4
	u32 zmode;  // _1D8
	u32 peCtrl; // _1DC

	// Display copy regs
	u32 cpDispSrc;    // _1E0
	u32 cpDispSize;   // _1E4
	u32 cpDispStride; // _1E8
	u32 cpDisp;       // _1EC

	// Texture copy regs
	u32 cpTexSrc;    // _1F0
	u32 cpTexSize;   // _1F4
	u32 cpTexStride; // _1F8
	u32 cpTex;       // _1FC
	GXBool cpTexZ;   // _200

	// General raster mode
	u32 genMode; // _204

	// Texture regions
	GXTexRegion TexRegions0[GX_MAX_TEXMAP]; // _208
	GXTexRegion TexRegions1[GX_MAX_TEXMAP]; // _288
	GXTexRegion TexRegions2[GX_MAX_TEXMAP]; // _308

	// Texture lookup table regions
	GXTlutRegion TlutRegions[GX_MAX_TLUT_ALL]; // _388
	GXTexRegionCallback texRegionCallback;     // _4C8
	GXTlutRegionCallback tlutRegionCallback;   // _4CC

	// Command processor vars
	GXAttrType nrmType; // _4D0
	GXBool hasNrms;     // _4D4
	GXBool hasBiNrms;   // _4D5
	u32 projType;       // _4D8
	f32 projMtx[6];     // _4DC

	// Viewport parms
	f32 vpLeft;  // _4F4
	f32 vpTop;   // _4F8
	f32 vpWd;    // _4FC
	f32 vpHt;    // _500
	f32 vpNearz; // _504
	f32 vpFarz;  // _508
	f32 zOffset; // _50C
	f32 zScale;  // _510

	// Texture regs
	u32 tImage0[8];   // _514
	u32 tMode0[8];    // _534
	u32 texmapId[16]; // _554
	u32 tcsManEnab;   // _594
	u32 tevTcEnab;    // _598

	// Performance metrics
	GXPerf0 perf0; // _59C
	GXPerf1 perf1; // _5A0
	u32 perfSel;   // _5A4

	// Flags
	GXBool inDispList;    // _5A8
	GXBool dlSaveContext; // _5A9
	GXBool abtWaitPECopy; // _5AA
	u8 dirtyVAT;          // _5AB
	u32 dirtyState;       // _5AC
} GXData;  // Size: 0x5B0

STATIC_ASSERT(sizeof(GXData) == 0x5B0);

extern GXData* const __GXData;

// 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 = __GXData;
	data->dirtyState |= GX_DIRTY_SU_TEX | GX_DIRTY_BP_MASK;
	data->bpSentNot = 0;
}

static inline void set_x2(u16 value)
{
    __GXData->bpSentNot = value;
}

#ifdef __cplusplus
extern "C" {
#endif

static inline u32 GXReadMEMReg(u32 addrLo, u32 addrHi)
{
	u32 hiStart, hiNew, lo;
	hiStart = GX_GET_MEM_REG(addrHi);
	do {
		hiNew   = hiStart;
		lo      = GX_GET_MEM_REG(addrLo);
		hiStart = GX_GET_MEM_REG(addrHi);
	} while (hiStart != hiNew);

	return ((hiStart << 16) | lo);
}

GXTexRegion* __GXDefaultTexRegionCallback(const GXTexObj* obj, GXTexMapID mapID);
GXTlutRegion* __GXDefaultTlutRegionCallback(u32 tlut);
BOOL __GXShutdown(BOOL);
void __GXInitRevisionBits(void);
GXFifoObj* GXInit(void* base, u32 size);
void __GXInitGX(void);

#ifdef __cplusplus
};
#endif

#endif /* GXINIT_H */