Super Mario 64 Source
A Super Mario 64 decompilation, brought to you by a bunch of clever folks.
gbi_old.h
Go to the documentation of this file.
1 #ifndef _ULTRA64_GBI_H_
2 #define _ULTRA64_GBI_H_
3 
4 /* Types */
5 
6 /* Vertex (set up for use with colors) */
7 typedef struct
8 {
9  short ob[3]; /* x, y, z */
10  unsigned short flag;
11  short tc[2]; /* texture coord */
12  unsigned char cn[4]; /* color & alpha */
13 } Vtx_t;
14 
15 /* Vertex (set up for use with normals) */
16 typedef struct
17 {
18  short ob[3]; /* x, y, z */
19  unsigned short flag;
20  short tc[2]; /* texture coord */
21  signed char n[3]; /* normal */
22  unsigned char a; /* alpha */
23 } Vtx_tn;
24 
25 typedef union
26 {
27  Vtx_t v; /* Use this one for colors */
28  Vtx_tn n; /* Use this one for normals */
30 } Vtx;
31 
32 
33 typedef struct
34 {
35  short vscale[4]; /* scale, 2 bits fraction */
36  short vtrans[4]; /* translate, 2 bits fraction */
37 } Vp_t;
38 
39 typedef union
40 {
43 } Vp;
44 
45 typedef long int Mtx_t[4][4];
46 typedef union
47 {
50 } Mtx;
51 
52 typedef struct
53 {
54  unsigned int w0;
55  unsigned int w1;
56 } Gwords;
57 
58 /* TODO: fill in the rest of the members */
59 typedef union
60 {
63 } Gfx;
64 
65 #define GPACK_RGBA5551(r, g, b, a) \
66  ((((r) << 8) & 0xF800) | \
67  (((g) << 3) & 0x07C0) | \
68  (((b) >> 2) & 0x003E) | \
69  ((a) & 0x0001))
70 #define GPACK_ZDZ(z, dz) ((z) << 2 | (dz))
71 
72 #define G_SPNOOP 0x00
73 #define G_MTX 0x01
74 #define G_MOVEMEM 0x03
75 #define G_VTX 0x04
76 #define G_DL 0x06
77 #define G_LOAD_UCODE 0xAF
78 #define G_BRANCH_Z 0xB0
79 #ifdef F3DEX_GBI
80 #define G_TRI2 0xB1
81 #endif
82 #ifndef F3DEX_GBI
83 #define G_RDPHALF_CONT 0xB2
84 #else
85 #define G_MODIFYVTX 0xB2
86 #endif
87 #define G_RDPHALF_2 0xB3
88 #define G_RDPHALF_1 0xB4
89 #define G_QUAD 0xB5
90 #define G_CLEARGEOMETRYMODE 0xB6
91 #define G_SETGEOMETRYMODE 0xB7
92 #define G_ENDDL 0xB8
93 #define G_TEXTURE 0xBB
94 #define G_MOVEWORD 0xBC
95 #define G_POPMTX 0xBD
96 #define G_CULLDL 0xBE
97 #define G_TRI1 0xBF
98 #define G_NOOP 0xC0
99 #define G_TEXRECT 0xE4
100 #define G_TEXRECTFLIP 0xE5
101 #define G_RDPLOADSYNC 0xE6
102 #define G_RDPPIPESYNC 0xE7
103 #define G_RDPTILESYNC 0xE8
104 #define G_RDPFULLSYNC 0xE9
105 #define G_SETKEYGB 0xEA
106 #define G_SETKEYR 0xEB
107 #define G_SETCONVERT 0xEC
108 #define G_SETSCISSOR 0xED
109 #define G_SETPRIMDEPTH 0xEE
110 #define G_RDPSETOTHERMODE 0xEF
111 #define G_LOADTLUT 0xF0
112 #define G_SETTILESIZE 0xF2
113 #define G_LOADBLOCK 0xF3
114 #define G_LOADTILE 0xF4
115 #define G_SETTILE 0xF5
116 #define G_FILLRECT 0xF6
117 #define G_SETFILLCOLOR 0xF7
118 #define G_SETFOGCOLOR 0xF8
119 #define G_SETBLENDCOLOR 0xF9
120 #define G_SETPRIMCOLOR 0xFA
121 #define G_SETENVCOLOR 0xFB
122 #define G_SETCOMBINE 0xFC
123 #define G_SETTIMG 0xFD
124 #define G_SETZIMG 0xFE
125 #define G_SETCIMG 0xFF
126 
127 #define G_DL_PUSH 0x00
128 #define G_DL_NOPUSH 0x01
129 
130 /* SETOTHERMODE_L SHIFTS */
131 
132 #define G_MDSFT_ALPHACOMPARE 0
133 #define G_MDSFT_ZSRCSEL 2
134 #define G_MDSFT_RENDERMODE 3
135 #define G_MDSFT_BLENDER 16
136 
137 /* SETOTHERMODE_H SHIFTS */
138 
139 #define G_MDSFT_ALPHADITHER 4
140 #define G_MDSFT_RGBDITHER 6
141 #define G_MDSFT_COMBKEY 8
142 #define G_MDSFT_TEXTCONV 9
143 #define G_MDSFT_TEXTFILT 12
144 #define G_MDSFT_TEXTLUT 14
145 #define G_MDSFT_TEXTLOD 16
146 #define G_MDSFT_TEXTDETAIL 17
147 #define G_MDSFT_TEXTPERSP 19
148 #define G_MDSFT_CYCLETYPE 20
149 #define G_MDSFT_PIPELINE 23
150 
151 #define G_ZBUFFER 0x00000001
152 #define G_TEXTURE_ENABLE 0x00000002
153 #define G_SHADE 0x00000004
154 #define G_SHADING_SMOOTH 0x00000200
155 #define G_CULL_FRONT 0x00001000
156 #define G_CULL_BACK 0x00002000
157 #define G_CULL_BOTH 0x00003000
158 #define G_FOG 0x00010000
159 #define G_LIGHTING 0x00020000
160 #define G_TEXTURE_GEN 0x00040000
161 #define G_TEXTURE_GEN_LINEAR 0x00080000
162 #define G_LOD 0x00100000
163 #define G_CLIPPING 0x00800000
164 
165 #define G_IM_FMT_RGBA 0
166 #define G_IM_FMT_YUV 1
167 #define G_IM_FMT_CI 2
168 #define G_IM_FMT_IA 3
169 #define G_IM_FMT_I 4
170 
171 #define G_IM_SIZ_4b 0
172 #define G_IM_SIZ_8b 1
173 #define G_IM_SIZ_16b 2
174 #define G_IM_SIZ_32b 3
175 #define G_IM_SIZ_DD 5
176 
177 #define G_AC_NONE (0 << 0)
178 #define G_AC_THRESHOLD (1 << 0)
179 #define G_AC_DITHER (3 << 0)
180 
181 #define G_ZS_PIXEL (0 << 2)
182 #define G_ZS_PRIM (1 << 2)
183 
184 #define G_CD_MAGICSQ (0 << 6)
185 #define G_CD_BAYER (1 << 6)
186 #define G_CD_NOISE (2 << 6)
187 
188 #define G_CK_NONE (0 << 8)
189 #define G_CK_KEY (1 << 8)
190 
191 #define G_TC_CONV (0 << 9)
192 #define G_TC_FILTCONV (5 << 9)
193 #define G_TC_FILT (6 << 9)
194 
195 #define G_TF_POINT (0 << 12)
196 #define G_TF_BILERP (2 << 12)
197 #define G_TF_AVERAGE (3 << 12)
198 
199 #define G_TT_NONE (0 << 14)
200 #define G_TT_RGBA16 (2 << 14)
201 #define G_TT_IA16 (3 << 14)
202 
203 #define G_TL_TILE (0 << 16)
204 #define G_TL_LOD (1 << 16)
205 
206 #define G_TD_CLAMP (0 << 17)
207 #define G_TD_SHARPEN (1 << 17)
208 #define G_TD_DETAIL (2 << 17)
209 
210 #define G_TP_NONE (0 << 19)
211 #define G_TP_PERSP (1 << 19)
212 
213 #define G_CYC_1CYCLE (0 << 20)
214 #define G_CYC_2CYCLE (1 << 20)
215 #define G_CYC_COPY (2 << 20)
216 #define G_CYC_FILL (3 << 20)
217 
218 #define G_PM_NPRIMITIVE (0 << 23)
219 #define G_PM_1PRIMITIVE (1 << 23)
220 
221 #define G_SC_NON_INTERLACE 0
222 #define G_SC_ODD_INTERLACE 3
223 #define G_SC_EVEN_INTERLACE 2
224 
225 #define G_TX_LOADTILE 7
226 #define G_TX_RENDERTILE 0
227 
228 #define G_TX_NOMIRROR 0
229 #define G_TX_WRAP 0
230 #define G_TX_MIRROR 1
231 #define G_TX_CLAMP 2
232 #define G_TX_NOMASK 0
233 #define G_TX_NOLOD 0
234 
235 #define G_TX_LDBLK_MAX_TXL 2047
236 
237 #define G_MV_VIEWPORT 0x80
238 #define G_MV_LOOKATY 0x82
239 #define G_MV_LOOKATX 0x84
240 #define G_MV_L0 0x86
241 #define G_MV_L1 0x88
242 #define G_MV_L2 0x8A
243 #define G_MV_L3 0x8C
244 #define G_MV_L4 0x8E
245 #define G_MV_L5 0x90
246 #define G_MV_L6 0x92
247 #define G_MV_L7 0x94
248 #define G_MV_TXTATT 0x96
249 #define G_MV_MATRIX_1 0x9E
250 #define G_MV_MATRIX_2 0x98
251 #define G_MV_MATRIX_3 0x9A
252 #define G_MV_MATRIX_4 0x9C
253 
254 #define G_SETOTHERMODE_L 0xB9
255 #define G_SETOTHERMODE_H 0xBA
256 
257 /* G_SETOTHERMODE_L render modes */
258 
259 #define AA_EN 0x8
260 #define Z_CMP 0x10
261 #define Z_UPD 0x20
262 #define IM_RD 0x40
263 #define CLR_ON_CVG 0x80
264 #define CVG_DST_CLAMP 0
265 #define CVG_DST_WRAP 0x100
266 #define CVG_DST_FULL 0x200
267 #define CVG_DST_SAVE 0x300
268 #define ZMODE_OPA 0
269 #define ZMODE_INTER 0x400
270 #define ZMODE_XLU 0x800
271 #define ZMODE_DEC 0xc00
272 #define CVG_X_ALPHA 0x1000
273 #define ALPHA_CVG_SEL 0x2000
274 #define FORCE_BL 0x4000
275 #define TEX_EDGE 0x0000
276 
277 #define G_BL_CLR_IN 0
278 #define G_BL_CLR_MEM 1
279 #define G_BL_CLR_BL 2
280 #define G_BL_CLR_FOG 3
281 #define G_BL_1MA 0
282 #define G_BL_A_MEM 1
283 #define G_BL_A_IN 0
284 #define G_BL_A_FOG 1
285 #define G_BL_A_SHADE 2
286 #define G_BL_1 2
287 #define G_BL_0 3
288 
289 #define GBL_c1(m1a, m1b, m2a, m2b) \
290  (m1a) << 30 | (m1b) << 26 | (m2a) << 22 | (m2b) << 18
291 #define GBL_c2(m1a, m1b, m2a, m2b) \
292  (m1a) << 28 | (m1b) << 24 | (m2a) << 20 | (m2b) << 16
293 
294 #define RM_AA_ZB_OPA_SURF(clk) \
295  AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \
296  ZMODE_OPA | ALPHA_CVG_SEL | \
297  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
298 
299 #define RM_RA_ZB_OPA_SURF(clk) \
300  AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | \
301  ZMODE_OPA | ALPHA_CVG_SEL | \
302  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
303 
304 #define RM_AA_ZB_XLU_SURF(clk) \
305  AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \
306  FORCE_BL | ZMODE_XLU | \
307  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
308 
309 #define RM_AA_ZB_OPA_DECAL(clk) \
310  AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | ALPHA_CVG_SEL | \
311  ZMODE_DEC | \
312  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
313 
314 #define RM_RA_ZB_OPA_DECAL(clk) \
315  AA_EN | Z_CMP | CVG_DST_WRAP | ALPHA_CVG_SEL | \
316  ZMODE_DEC | \
317  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
318 
319 #define RM_AA_ZB_XLU_DECAL(clk) \
320  AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \
321  FORCE_BL | ZMODE_DEC | \
322  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
323 
324 #define RM_AA_ZB_OPA_INTER(clk) \
325  AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \
326  ALPHA_CVG_SEL | ZMODE_INTER | \
327  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
328 
329 #define RM_RA_ZB_OPA_INTER(clk) \
330  AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | \
331  ALPHA_CVG_SEL | ZMODE_INTER | \
332  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
333 
334 #define RM_AA_ZB_XLU_INTER(clk) \
335  AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \
336  FORCE_BL | ZMODE_INTER | \
337  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
338 
339 #define RM_AA_ZB_XLU_LINE(clk) \
340  AA_EN | Z_CMP | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | \
341  ALPHA_CVG_SEL | FORCE_BL | ZMODE_XLU | \
342  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
343 
344 #define RM_AA_ZB_DEC_LINE(clk) \
345  AA_EN | Z_CMP | IM_RD | CVG_DST_SAVE | CVG_X_ALPHA | \
346  ALPHA_CVG_SEL | FORCE_BL | ZMODE_DEC | \
347  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
348 
349 #define RM_AA_ZB_TEX_EDGE(clk) \
350  AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \
351  CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \
352  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
353 
354 #define RM_AA_ZB_TEX_INTER(clk) \
355  AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \
356  CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_INTER | TEX_EDGE | \
357  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
358 
359 #define RM_AA_ZB_SUB_SURF(clk) \
360  AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | \
361  ZMODE_OPA | ALPHA_CVG_SEL | \
362  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
363 
364 #define RM_AA_ZB_PCL_SURF(clk) \
365  AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \
366  ZMODE_OPA | G_AC_DITHER | \
367  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
368 
369 #define RM_AA_ZB_OPA_TERR(clk) \
370  AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \
371  ZMODE_OPA | ALPHA_CVG_SEL | \
372  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
373 
374 #define RM_AA_ZB_TEX_TERR(clk) \
375  AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \
376  CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \
377  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
378 
379 #define RM_AA_ZB_SUB_TERR(clk) \
380  AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | \
381  ZMODE_OPA | ALPHA_CVG_SEL | \
382  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
383 
384 
385 #define RM_AA_OPA_SURF(clk) \
386  AA_EN | IM_RD | CVG_DST_CLAMP | \
387  ZMODE_OPA | ALPHA_CVG_SEL | \
388  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
389 
390 #define RM_RA_OPA_SURF(clk) \
391  AA_EN | CVG_DST_CLAMP | \
392  ZMODE_OPA | ALPHA_CVG_SEL | \
393  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
394 
395 #define RM_AA_XLU_SURF(clk) \
396  AA_EN | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | \
397  ZMODE_OPA | \
398  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
399 
400 #define RM_AA_XLU_LINE(clk) \
401  AA_EN | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | \
402  ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | \
403  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
404 
405 #define RM_AA_DEC_LINE(clk) \
406  AA_EN | IM_RD | CVG_DST_FULL | CVG_X_ALPHA | \
407  ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | \
408  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
409 
410 #define RM_AA_TEX_EDGE(clk) \
411  AA_EN | IM_RD | CVG_DST_CLAMP | \
412  CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \
413  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
414 
415 #define RM_AA_SUB_SURF(clk) \
416  AA_EN | IM_RD | CVG_DST_FULL | \
417  ZMODE_OPA | ALPHA_CVG_SEL | \
418  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
419 
420 #define RM_AA_PCL_SURF(clk) \
421  AA_EN | IM_RD | CVG_DST_CLAMP | \
422  ZMODE_OPA | G_AC_DITHER | \
423  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
424 
425 #define RM_AA_OPA_TERR(clk) \
426  AA_EN | IM_RD | CVG_DST_CLAMP | \
427  ZMODE_OPA | ALPHA_CVG_SEL | \
428  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
429 
430 #define RM_AA_TEX_TERR(clk) \
431  AA_EN | IM_RD | CVG_DST_CLAMP | \
432  CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \
433  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
434 
435 #define RM_AA_SUB_TERR(clk) \
436  AA_EN | IM_RD | CVG_DST_FULL | \
437  ZMODE_OPA | ALPHA_CVG_SEL | \
438  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
439 
440 
441 #define RM_ZB_OPA_SURF(clk) \
442  Z_CMP | Z_UPD | CVG_DST_FULL | ALPHA_CVG_SEL | \
443  ZMODE_OPA | \
444  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
445 
446 #define RM_ZB_XLU_SURF(clk) \
447  Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_XLU | \
448  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
449 
450 #define RM_ZB_OPA_DECAL(clk) \
451  Z_CMP | CVG_DST_FULL | ALPHA_CVG_SEL | ZMODE_DEC | \
452  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
453 
454 #define RM_ZB_XLU_DECAL(clk) \
455  Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_DEC | \
456  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
457 
458 #define RM_ZB_CLD_SURF(clk) \
459  Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_XLU | \
460  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
461 
462 #define RM_ZB_OVL_SURF(clk) \
463  Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_DEC | \
464  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
465 
466 #define RM_ZB_PCL_SURF(clk) \
467  Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | \
468  G_AC_DITHER | \
469  GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
470 
471 
472 #define RM_OPA_SURF(clk) \
473  CVG_DST_CLAMP | FORCE_BL | ZMODE_OPA | \
474  GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
475 
476 #define RM_XLU_SURF(clk) \
477  IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_OPA | \
478  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
479 
480 #define RM_TEX_EDGE(clk) \
481  CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL |\
482  ZMODE_OPA | TEX_EDGE | AA_EN | \
483  GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
484 
485 #define RM_CLD_SURF(clk) \
486  IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA | \
487  GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
488 
489 #define RM_PCL_SURF(clk) \
490  CVG_DST_FULL | FORCE_BL | ZMODE_OPA | \
491  G_AC_DITHER | \
492  GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
493 
494 #define RM_ADD(clk) \
495  IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA | \
496  GBL_c##clk(G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1)
497 
498 #define RM_NOOP(clk) \
499  GBL_c##clk(0, 0, 0, 0)
500 
501 #define RM_VISCVG(clk) \
502  IM_RD | FORCE_BL | \
503  GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM)
504 
505 /* for rendering to an 8-bit framebuffer */
506 #define RM_OPA_CI(clk) \
507  CVG_DST_CLAMP | ZMODE_OPA | \
508  GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
509 
510 
511 
512 #define G_RM_AA_ZB_OPA_SURF RM_AA_ZB_OPA_SURF(1)
513 #define G_RM_AA_ZB_OPA_SURF2 RM_AA_ZB_OPA_SURF(2)
514 #define G_RM_AA_ZB_XLU_SURF RM_AA_ZB_XLU_SURF(1)
515 #define G_RM_AA_ZB_XLU_SURF2 RM_AA_ZB_XLU_SURF(2)
516 #define G_RM_AA_ZB_OPA_DECAL RM_AA_ZB_OPA_DECAL(1)
517 #define G_RM_AA_ZB_OPA_DECAL2 RM_AA_ZB_OPA_DECAL(2)
518 #define G_RM_AA_ZB_XLU_DECAL RM_AA_ZB_XLU_DECAL(1)
519 #define G_RM_AA_ZB_XLU_DECAL2 RM_AA_ZB_XLU_DECAL(2)
520 #define G_RM_AA_ZB_OPA_INTER RM_AA_ZB_OPA_INTER(1)
521 #define G_RM_AA_ZB_OPA_INTER2 RM_AA_ZB_OPA_INTER(2)
522 #define G_RM_AA_ZB_XLU_INTER RM_AA_ZB_XLU_INTER(1)
523 #define G_RM_AA_ZB_XLU_INTER2 RM_AA_ZB_XLU_INTER(2)
524 #define G_RM_AA_ZB_XLU_LINE RM_AA_ZB_XLU_LINE(1)
525 #define G_RM_AA_ZB_XLU_LINE2 RM_AA_ZB_XLU_LINE(2)
526 #define G_RM_AA_ZB_DEC_LINE RM_AA_ZB_DEC_LINE(1)
527 #define G_RM_AA_ZB_DEC_LINE2 RM_AA_ZB_DEC_LINE(2)
528 #define G_RM_AA_ZB_TEX_EDGE RM_AA_ZB_TEX_EDGE(1)
529 #define G_RM_AA_ZB_TEX_EDGE2 RM_AA_ZB_TEX_EDGE(2)
530 #define G_RM_AA_ZB_TEX_INTER RM_AA_ZB_TEX_INTER(1)
531 #define G_RM_AA_ZB_TEX_INTER2 RM_AA_ZB_TEX_INTER(2)
532 #define G_RM_AA_ZB_SUB_SURF RM_AA_ZB_SUB_SURF(1)
533 #define G_RM_AA_ZB_SUB_SURF2 RM_AA_ZB_SUB_SURF(2)
534 #define G_RM_AA_ZB_PCL_SURF RM_AA_ZB_PCL_SURF(1)
535 #define G_RM_AA_ZB_PCL_SURF2 RM_AA_ZB_PCL_SURF(2)
536 #define G_RM_AA_ZB_OPA_TERR RM_AA_ZB_OPA_TERR(1)
537 #define G_RM_AA_ZB_OPA_TERR2 RM_AA_ZB_OPA_TERR(2)
538 #define G_RM_AA_ZB_TEX_TERR RM_AA_ZB_TEX_TERR(1)
539 #define G_RM_AA_ZB_TEX_TERR2 RM_AA_ZB_TEX_TERR(2)
540 #define G_RM_AA_ZB_SUB_TERR RM_AA_ZB_SUB_TERR(1)
541 #define G_RM_AA_ZB_SUB_TERR2 RM_AA_ZB_SUB_TERR(2)
542 
543 #define G_RM_RA_ZB_OPA_SURF RM_RA_ZB_OPA_SURF(1)
544 #define G_RM_RA_ZB_OPA_SURF2 RM_RA_ZB_OPA_SURF(2)
545 #define G_RM_RA_ZB_OPA_DECAL RM_RA_ZB_OPA_DECAL(1)
546 #define G_RM_RA_ZB_OPA_DECAL2 RM_RA_ZB_OPA_DECAL(2)
547 #define G_RM_RA_ZB_OPA_INTER RM_RA_ZB_OPA_INTER(1)
548 #define G_RM_RA_ZB_OPA_INTER2 RM_RA_ZB_OPA_INTER(2)
549 
550 #define G_RM_AA_OPA_SURF RM_AA_OPA_SURF(1)
551 #define G_RM_AA_OPA_SURF2 RM_AA_OPA_SURF(2)
552 #define G_RM_AA_XLU_SURF RM_AA_XLU_SURF(1)
553 #define G_RM_AA_XLU_SURF2 RM_AA_XLU_SURF(2)
554 #define G_RM_AA_XLU_LINE RM_AA_XLU_LINE(1)
555 #define G_RM_AA_XLU_LINE2 RM_AA_XLU_LINE(2)
556 #define G_RM_AA_DEC_LINE RM_AA_DEC_LINE(1)
557 #define G_RM_AA_DEC_LINE2 RM_AA_DEC_LINE(2)
558 #define G_RM_AA_TEX_EDGE RM_AA_TEX_EDGE(1)
559 #define G_RM_AA_TEX_EDGE2 RM_AA_TEX_EDGE(2)
560 #define G_RM_AA_SUB_SURF RM_AA_SUB_SURF(1)
561 #define G_RM_AA_SUB_SURF2 RM_AA_SUB_SURF(2)
562 #define G_RM_AA_PCL_SURF RM_AA_PCL_SURF(1)
563 #define G_RM_AA_PCL_SURF2 RM_AA_PCL_SURF(2)
564 #define G_RM_AA_OPA_TERR RM_AA_OPA_TERR(1)
565 #define G_RM_AA_OPA_TERR2 RM_AA_OPA_TERR(2)
566 #define G_RM_AA_TEX_TERR RM_AA_TEX_TERR(1)
567 #define G_RM_AA_TEX_TERR2 RM_AA_TEX_TERR(2)
568 #define G_RM_AA_SUB_TERR RM_AA_SUB_TERR(1)
569 #define G_RM_AA_SUB_TERR2 RM_AA_SUB_TERR(2)
570 
571 #define G_RM_RA_OPA_SURF RM_RA_OPA_SURF(1)
572 #define G_RM_RA_OPA_SURF2 RM_RA_OPA_SURF(2)
573 
574 #define G_RM_ZB_OPA_SURF RM_ZB_OPA_SURF(1)
575 #define G_RM_ZB_OPA_SURF2 RM_ZB_OPA_SURF(2)
576 #define G_RM_ZB_XLU_SURF RM_ZB_XLU_SURF(1)
577 #define G_RM_ZB_XLU_SURF2 RM_ZB_XLU_SURF(2)
578 #define G_RM_ZB_OPA_DECAL RM_ZB_OPA_DECAL(1)
579 #define G_RM_ZB_OPA_DECAL2 RM_ZB_OPA_DECAL(2)
580 #define G_RM_ZB_XLU_DECAL RM_ZB_XLU_DECAL(1)
581 #define G_RM_ZB_XLU_DECAL2 RM_ZB_XLU_DECAL(2)
582 #define G_RM_ZB_CLD_SURF RM_ZB_CLD_SURF(1)
583 #define G_RM_ZB_CLD_SURF2 RM_ZB_CLD_SURF(2)
584 #define G_RM_ZB_OVL_SURF RM_ZB_OVL_SURF(1)
585 #define G_RM_ZB_OVL_SURF2 RM_ZB_OVL_SURF(2)
586 #define G_RM_ZB_PCL_SURF RM_ZB_PCL_SURF(1)
587 #define G_RM_ZB_PCL_SURF2 RM_ZB_PCL_SURF(2)
588 
589 #define G_RM_OPA_SURF RM_OPA_SURF(1)
590 #define G_RM_OPA_SURF2 RM_OPA_SURF(2)
591 #define G_RM_XLU_SURF RM_XLU_SURF(1)
592 #define G_RM_XLU_SURF2 RM_XLU_SURF(2)
593 #define G_RM_CLD_SURF RM_CLD_SURF(1)
594 #define G_RM_CLD_SURF2 RM_CLD_SURF(2)
595 #define G_RM_TEX_EDGE RM_TEX_EDGE(1)
596 #define G_RM_TEX_EDGE2 RM_TEX_EDGE(2)
597 #define G_RM_PCL_SURF RM_PCL_SURF(1)
598 #define G_RM_PCL_SURF2 RM_PCL_SURF(2)
599 #define G_RM_ADD RM_ADD(1)
600 #define G_RM_ADD2 RM_ADD(2)
601 #define G_RM_NOOP RM_NOOP(1)
602 #define G_RM_NOOP2 RM_NOOP(2)
603 #define G_RM_VISCVG RM_VISCVG(1)
604 #define G_RM_VISCVG2 RM_VISCVG(2)
605 #define G_RM_OPA_CI RM_OPA_CI(1)
606 #define G_RM_OPA_CI2 RM_OPA_CI(2)
607 
608 
609 #define G_RM_FOG_SHADE_A GBL_c1(G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA)
610 #define G_RM_FOG_PRIM_A GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_IN, G_BL_1MA)
611 #define G_RM_PASS GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
612 
613 #define G_MWO_NUMLIGHT 0x00
614 #define G_MW_NUMLIGHT 0x02
615 #define NUML(n) (((n)+1)*32 + 0x80000000)
616 #define G_MW_PERSPNORM 0x0e
617 
618 #ifndef MAX
619 #define MAX(a, b) ((a) > (b) ? (a) : (b))
620 #endif
621 
622 #ifndef MIN
623 #define MIN(a, b) ((a) < (b) ? (a) : (b))
624 #endif
625 
626 /* DMA macro */
627 
628 #define gDma1p(pkt, c, s, l, p) \
629 { \
630  Gfx *_g = (Gfx *)(pkt); \
631  _g->words.w0 = (_SHIFTL((c), 24, 8) | _SHIFTL((p), 16, 8) | \
632  _SHIFTL((l), 0, 16)); \
633  _g->words.w1 = (unsigned int)(s); \
634 }
635 
636 #define gsDma1p(c, s, l, p) \
637 { \
638  _g->words.w0 = (_SHIFTL((c), 24, 8) | _SHIFTL((p), 16, 8) | \
639  _SHIFTL((l), 0, 16)); \
640  _g->words.w1 = (unsigned int)(s); \
641 }
642 
643 /* Matrix */
644 
645 #define gSPMatrix(pkt, m, p) \
646 { \
647  Gfx *_g = (Gfx *)(pkt); \
648  _g->words.w0 = _SHIFTL(G_MTX, 24, 8) \
649  | _SHIFTL((p), 16, 8) \
650  | _SHIFTL(sizeof(Mtx), 0, 16); \
651  _g->words.w1 = (u32)(m); \
652 }
653 
654 #define gsSPMatrix(m, p) \
655 { \
656  _g->words.w0 = _SHIFTL(G_MTX, 24, 8) \
657  | _SHIFTL((p), 16, 8) \
658  | _SHIFTL(sizeof(Mtx), 0, 16); \
659  _g->words.w1 = (u32)(m); \
660 }
661 
662 /* Vertex */
663 /* Syntax change from Fast3D to Fast3DEX */
664 
665 #ifndef F3DEX_GBI
666 #define gSPVertex(pkt, v, n, v0) \
667 { \
668  Gfx *_g = (Gfx *)(pkt); \
669  _g->words.w0 = _SHIFTL(G_VTX, 24, 8) \
670  | _SHIFTL(((n)-1) << 4 | (v0), 16, 8) \
671  | _SHIFTL(sizeof(Vtx)*(n), 0, 16); \
672  _g->words.w1 = (u32)(v); \
673 }
674 
675 #define gsSPVertex(v, n, v0) \
676 { \
677  _g->words.w0 = _SHIFTL(G_VTX, 24, 8) \
678  | _SHIFTL(((n)-1) << 4 | (v0), 16, 8) \
679  | _SHIFTL(sizeof(Vtx)*(n), 0, 16); \
680  _g->words.w1 = (u32)(v); \
681 }
682 
683 #else /* Fast3DEX */
684 #define gSPVertex(pkt, v, n, v0) \
685 { \
686  Gfx *_g = (Gfx *)(pkt); \
687  _g->words.w0 = _SHIFTL(G_VTX, 24, 8) \
688  | _SHIFTL(((v0)*2), 16, 8) \
689  | _SHIFTL((n << 10) | ((sizeof(Vtx)*(n))-1), 0, 16); \
690  _g->words.w1 = (u32)(v); \
691 }
692 
693 #define gsSPVertex(v, n, v0) \
694 { \
695  _g->words.w0 = _SHIFTL(G_VTX, 24, 8) \
696  | _SHIFTL(((v0)*2), 16, 8) \
697  | _SHIFTL((n << 10) | ((sizeof(Vtx)*(n))-1), 0, 16); \
698  _g->words.w1 = (u32)(v); \
699 }
700 #endif
701 
702 /* LoadSync */
703 
704 #define gDPLoadSync(pkt) \
705 { \
706  Gfx *_g = (Gfx *) (pkt); \
707  _g->words.w0 = _SHIFTL(G_RDPLOADSYNC, 24, 8); \
708  _g->words.w1 = 0x00000000; \
709 }
710 
711 #define gsDPLoadSync() \
712 { \
713  _g->words.w0 = _SHIFTL(G_RDPLOADSYNC, 24, 8); \
714  _g->words.w1 = 0x00000000; \
715 }
716 
717 /* PipeSync */
718 
719 #define gDPPipeSync(pkt) \
720 { \
721  Gfx *_g = (Gfx *) (pkt); \
722  _g->words.w0 = _SHIFTL(G_RDPPIPESYNC, 24, 8); \
723  _g->words.w1 = 0x00000000; \
724 }
725 
726 #define gsDPPipeSync() \
727 { \
728  _g->words.w0 = _SHIFTL(G_RDPPIPESYNC, 24, 8); \
729  _g->words.w1 = 0x00000000; \
730 }
731 
732 /* TileSync */
733 
734 #define gDPTileSync(pkt) \
735 { \
736  Gfx *_g = (Gfx *) (pkt); \
737  _g->words.w0 = _SHIFTL(G_RDPTILESYNC, 24, 8); \
738  _g->words.w1 = 0x00000000; \
739 }
740 
741 #define gsDPTileSync() \
742 { \
743  _g->words.w0 = _SHIFTL(G_RDPTILESYNC, 24, 8); \
744  _g->words.w1 = 0x00000000; \
745 }
746 
747 /* FullSync */
748 
749 #define gDPFullSync(pkt) \
750 { \
751  Gfx *_g = (Gfx *) (pkt); \
752  _g->words.w0 = _SHIFTL(G_RDPFULLSYNC, 24, 8); \
753  _g->words.w1 = 0x00000000; \
754 }
755 
756 #define gsDPFullSync() \
757 { \
758  _g->words.w0 = _SHIFTL(G_RDPFULLSYNC, 24, 8); \
759  _g->words.w1 = 0x00000000; \
760 }
761 
762 /* DisplayList */
763 
764 #define gSPDisplayList(pkt, dl) \
765 { \
766  Gfx *_g = (Gfx *) (pkt); \
767  _g->words.w0 = _SHIFTL(G_DL, 24, 8); \
768  _g->words.w1 = (u32)(dl); \
769 }
770 
771 #define gsSPDisplayList(dl) \
772 { \
773  _g->words.w0 = _SHIFTL(G_DL, 24, 8); \
774  _g->words.w1 = (u32)(dl); \
775 }
776 
777 /* BranchList */
778 
779 #define gSPBranchList(pkt,dl) \
780  gDma1p(pkt, G_DL, dl, 0, G_DL_NOPUSH)
781 
782 #define gsSPBranchList(pkt,dl) \
783  gsDma1p(G_DL, dl, 0, G_DL_NOPUSH)
784 
785 /* EndDisplayList */
786 
787 #define gSPEndDisplayList(pkt) \
788 { \
789  Gfx *_g = (Gfx *) (pkt); \
790  _g->words.w0 = _SHIFTL(G_ENDDL, 24, 8); \
791  _g->words.w1 = 0x00000000; \
792 }
793 
794 #define gsSPEndDisplayList() \
795 { \
796  _g->words.w0 = _SHIFTL(G_ENDDL, 24, 8); \
797  _g->words.w1 = 0x00000000; \
798 }
799 
800 /* SetOtherMode */
801 
802 #define gSPSetOtherMode(pkt, cmd, shift, length, data) \
803 { \
804  Gfx *_g = (Gfx *) (pkt); \
805  _g->words.w0 = _SHIFTL((cmd), 24, 8) \
806  | _SHIFTL((shift), 8, 8) \
807  | _SHIFTL(((length)-1), 0, 8); \
808  _g->words.w1 = (data); \
809 }
810 
811 #define gsSPSetOtherMode(cmd, shift, length, data) \
812 { \
813  _g->words.w0 = _SHIFTL((cmd), 24, 8) \
814  | _SHIFTL((shift), 8, 8) \
815  | _SHIFTL(((length)-1), 0, 8); \
816  _g->words.w1 = (data); \
817 }
818 
819 /* SetCycleType */
820 
821 #define gDPSetCycleType(pkt, type) \
822  gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 3, type)
823 
824 #define gsDPSetCycleType(pkt, type) \
825  gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 3, type)
826 
827 /* PipeLineMode */
828 
829 #define gDPPipelineMode(pkt, mode) \
830  gSPSetOtherMode(pkt, G_SETOTHERMODE_H, 0x17, 2, mode)
831 
832 #define gsDPPipelineMode(mode) \
833  gsSPSetOtherMode(G_SETOTHERMODE_H, 0x17, 2, mode)
834 
835 /* SetScissor */
836 
837 #define gDPSetScissor(pkt, mode, ulx, uly, lrx, lry) \
838 { \
839  Gfx *_g = (Gfx *)(pkt); \
840  _g->words.w0 = _SHIFTL(G_SETSCISSOR, 24, 8) \
841  | _SHIFTL((int)((float)(ulx)*4.0f), 12, 12) \
842  | _SHIFTL((int)((float)(uly)*4.0f), 0, 12); \
843  _g->words.w1 = _SHIFTL((mode), 24, 8) \
844  | _SHIFTL((int)((float)(lrx)*4.0f), 12, 12) \
845  | _SHIFTL((int)((float)(lry)*4.0f), 0, 12); \
846 }
847 
848 #define gsDPSetScissor(mode, ulx, uly, lrx, lry) \
849 { \
850  _g->words.w0 = _SHIFTL(G_SETSCISSOR, 24, 8) \
851  | _SHIFTL((int)((float)(ulx)*4.0f), 12, 12) \
852  | _SHIFTL((int)((float)(uly)*4.0f), 0, 12); \
853  _g->words.w1 = _SHIFTL((mode), 24, 8) \
854  | _SHIFTL((int)((float)(lrx)*4.0f), 12, 12) \
855  | _SHIFTL((int)((float)(lry)*4.0f), 0, 12); \
856 }
857 
858 /* SetCombine */
859 
860 #define gDPSetCombine(pkt, muxs0, muxs1) \
861 { \
862  Gfx *_g = (Gfx *)(pkt); \
863  _g->words.w0 = _SHIFTL(G_SETCOMBINE, 24, 8) \
864  | _SHIFTL((muxs0), 0, 24); \
865  _g->words.w1 = (muxs1); \
866 }
867 
868 #define gsDPSetCombine(muxs0, muxs1) \
869 { \
870  _g->words.w0 = _SHIFTL(G_SETCOMBINE, 24, 8) \
871  | _SHIFTL((muxs0), 0, 24); \
872  _g->words.w1 = (muxs1); \
873 }
874 
875 /* SetTextureLOD */
876 
877 #define gDPSetTextureLOD(pkt, type) \
878  gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 2, type)
879 
880 #define gsDPSetTextureLOD(type) \
881  gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 2, type)
882 
883 /* SetTextureLUT */
884 
885 #define gDPSetTextureLUT(pkt, type) \
886  gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 3, type)
887 
888 #define gsDPSetTextureLUT(type) \
889  gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 3, type)
890 
891 /* SetTextureDetail */
892 
893 #define gDPSetTextureDetail(pkt, type) \
894  gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 3, type)
895 
896 #define gsDPSetTextureDetail(type) \
897  gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 3, type)
898 
899 /* SetTexturePersp */
900 
901 #define gDPSetTexturePersp(pkt, type) \
902  gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 2, type)
903 
904 #define gsDPSetTexturePersp(type) \
905  gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 2, type)
906 
907 /* SetTextureFilter */
908 
909 #define gDPSetTextureFilter(pkt, type) \
910  gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 3, type)
911 
912 #define gsDPSetTextureFilter(type) \
913  gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 3, type)
914 
915 /* SetTextureConvert */
916 
917 #define gDPSetTextureConvert(pkt, type) \
918  gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 4, type)
919 
920 #define gsDPSetTextureConvert(type) \
921  gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 4, type)
922 
923 /* SetCombineKey */
924 
925 #define gDPSetCombineKey(pkt, type) \
926  gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 2, type)
927 
928 #define gsDPSetCombineKey(type) \
929  gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 2, type)
930 
931 /* SetColorDither */
932 
933 #define gDPSetColorDither(pkt, mode) \
934  gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 3, mode)
935 
936 #define gsDPSetColorDither(mode) \
937  gsSPSetOtherMode(G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 3, mode)
938 
939 /* FillColor */
940 
941 #define gDPSetFillColor(pkt, color) \
942 { \
943  Gfx *_g = (Gfx *) (pkt); \
944  _g->words.w0 = _SHIFTL(G_SETFILLCOLOR, 24, 8); \
945  _g->words.w1 = color; \
946 }
947 
948 #define gsDPSetFillColor(color) \
949 { \
950  _g->words.w0 = _SHIFTL(G_SETFILLCOLOR, 24, 8); \
951  _g->words.w1 = color; \
952 }
953 
954 /* FillRectangle */
955 
956 #define gDPFillRectangle(pkt, ulx, uly, lrx, lry) \
957 { \
958  Gfx *_g = (Gfx *)(pkt); \
959  _g->words.w0 = _SHIFTL(G_FILLRECT, 24, 8) \
960  | _SHIFTL((lrx), 14, 10) \
961  | _SHIFTL((lry), 2, 10); \
962  _g->words.w1 = _SHIFTL(0, 24, 8) \
963  | _SHIFTL((ulx), 14, 10) \
964  | _SHIFTL((uly), 2, 10); \
965 }
966 
967 #define gsDPFillRectangle(ulx, uly, lrx, lry) \
968 { \
969  _g->words.w0 = _SHIFTL(G_FILLRECT, 24, 8) \
970  | _SHIFTL((lrx), 14, 10) \
971  | _SHIFTL((lry), 2, 10); \
972  _g->words.w1 = _SHIFTL(0, 24, 8) \
973  | _SHIFTL((ulx), 14, 10) \
974  | _SHIFTL((uly), 2, 10); \
975 }
976 
977 /* SetAlphaCompare */
978 
979 #define gDPSetAlphaCompare(pkt, type) \
980  gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 3, type)
981 
982 #define gsDPSetAlphaCompare(type) \
983  gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 3, type)
984 
985 /* SetDepthSource */
986 
987 #define gDPSetDepthSource(pkt, src) \
988  gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 2, src)
989 
990 #define gsDPSetDepthSource(src) \
991  gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 2, src)
992 
993 /* SetRenderMode */
994 
995 #define gDPSetRenderMode(pkt, c0, c1) \
996  gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 30, (c0) | (c1))
997 
998 #define gsDPSetRenderMode(c0, c1) \
999  gsSPSetOtherMode(G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 30, (c0) | (c1))
1000 
1001 /* ClearGeometryMode */
1002 
1003 #define gSPClearGeometryMode(pkt, mode) \
1004 { \
1005  Gfx *_g = (Gfx *) (pkt); \
1006  _g->words.w0 = _SHIFTL(G_CLEARGEOMETRYMODE, 24, 8); \
1007  _g->words.w1 = mode; \
1008 }
1009 
1010 #define gsSPClearGeometryMode(pkt, mode) \
1011 { \
1012  _g->words.w0 = _SHIFTL(G_CLEARGEOMETRYMODE, 24, 8); \
1013  _g->words.w1 = mode; \
1014 }
1015 
1016 /* SetGeometryMode */
1017 
1018 #define gSPSetGeometryMode(pkt, word) \
1019 { \
1020  Gfx *_g = (Gfx *) (pkt); \
1021  _g->words.w0 = _SHIFTL(G_SETGEOMETRYMODE, 24, 8); \
1022  _g->words.w1 = word; \
1023 }
1024 
1025 #define gsSPSetGeometryMode(word) \
1026 { \
1027  _g->words.w0 = _SHIFTL(G_SETGEOMETRYMODE, 24, 8); \
1028  _g->words.w1 = word; \
1029 }
1030 
1031 /* NumLights */
1032 
1033 #define gSPNumLights(pkt, n) \
1034  gMoveWd(pkt, G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n))
1035 
1036 #define gsSPNumLights(n) \
1037  gsMoveWd(G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n))
1038 
1039 /* Texture */
1040 
1041 #define gSPTexture(pkt, sc, tc, level, tile, on) \
1042 { \
1043  Gfx *_g = (Gfx *)(pkt); \
1044  _g->words.w0 = _SHIFTL(G_TEXTURE, 24, 8) \
1045  | _SHIFTL(0, 16, 8) \
1046  | _SHIFTL((level), 11, 3) \
1047  | _SHIFTL((tile), 8, 3) \
1048  | _SHIFTL((on), 0, 8); \
1049  _g->words.w1 = _SHIFTL((sc), 16, 16) \
1050  | _SHIFTL((tc), 0, 16); \
1051 }
1052 
1053 #define gsSPTexture(sc, tc, level, tile, on) \
1054 { \
1055  _g->words.w0 = _SHIFTL(G_TEXTURE, 24, 8) \
1056  | _SHIFTL(0, 16, 8) \
1057  | _SHIFTL((level), 11, 3) \
1058  | _SHIFTL((tile), 8, 3) \
1059  | _SHIFTL((on), 0, 8); \
1060  _g->words.w1 = _SHIFTL((sc), 16, 16) \
1061  | _SHIFTL((tc), 0, 16); \
1062 }
1063 
1064 /* SetColorImage */
1065 
1066 #define gDPSetColorImage(pkt, fmt, size, width, image) \
1067 { \
1068  Gfx *_g = (Gfx *)(pkt); \
1069  _g->words.w0 = _SHIFTL(G_SETCIMG, 24, 8) \
1070  | _SHIFTL((fmt), 21, 3) \
1071  | _SHIFTL((size), 19, 2) \
1072  | _SHIFTL((width)-1, 0, 12); \
1073  _g->words.w1 = (image); \
1074 }
1075 
1076 #define gsDPSetColorImage(fmt, size, width, image) \
1077 { \
1078  _g->words.w0 = _SHIFTL(G_SETCIMG, 24, 8) \
1079  | _SHIFTL((fmt), 21, 3) \
1080  | _SHIFTL((size), 19, 2) \
1081  | _SHIFTL((width)-1, 0, 12); \
1082  _g->words.w1 = (image); \
1083 }
1084 
1085 /* SetTileSize */
1086 
1087 #define gDPSetTileSize(pkt, tile, uls, ult, lrs, lrt) \
1088 { \
1089  Gfx *_g = (Gfx *)(pkt); \
1090  _g->words.w0 = _SHIFTL(G_SETTILESIZE, 24, 8) \
1091  | _SHIFTL(uls, 12, 12) \
1092  | _SHIFTL(ult, 0, 12); \
1093  _g->words.w1 = _SHIFTL(tile, 24, 3) \
1094  | _SHIFTL(lrs, 12, 12) \
1095  | _SHIFTL(lrt, 0, 12); \
1096 }
1097 
1098 #define gsDPSetTileSize(tile, uls, ult, lrs, lrt) \
1099 { \
1100  _g->words.w0 = _SHIFTL(G_SETTILESIZE, 24, 8) \
1101  | _SHIFTL(uls, 12, 12) \
1102  | _SHIFTL(ult, 0, 12); \
1103  _g->words.w1 = _SHIFTL(tile, 24, 3) \
1104  | _SHIFTL(lrs, 12, 12) \
1105  | _SHIFTL(lrt, 0, 12); \
1106 }
1107 
1108 /* LoadBlock */
1109 
1110 #define gDPLoadBlock(pkt, tile, uls, ult, lrs, dxt) \
1111 { \
1112  Gfx *_g = (Gfx *)(pkt); \
1113  _g->words.w0 = _SHIFTL(G_LOADBLOCK, 24, 8) \
1114  | _SHIFTL((uls), 12, 12) \
1115  | _SHIFTL((ult), 0, 12); \
1116  _g->words.w1 = _SHIFTL((tile), 24, 3) \
1117  | _SHIFTL((MIN((lrs),G_TX_LDBLK_MAX_TXL)), 12, 12) \
1118  | _SHIFTL((dxt), 0, 12); \
1119 }
1120 
1121 #define gsDPLoadBlock(tile, uls, ult, lrs, dxt) \
1122 { \
1123  _g->words.w0 = _SHIFTL(G_LOADBLOCK, 24, 8) \
1124  | _SHIFTL((uls), 12, 12) \
1125  | _SHIFTL((ult), 0, 12); \
1126  _g->words.w1 = _SHIFTL((tile), 24, 3) \
1127  | _SHIFTL((MIN((lrs),G_TX_LDBLK_MAX_TXL)), 12, 12) \
1128  | _SHIFTL((dxt), 0, 12); \
1129 }
1130 
1131 /* SetTile */
1132 
1133 #define gDPSetTile(pkt, fmt, siz, line, tmem, tile, \
1134  palette, cmt, maskt, shiftt, cms, masks, shifts) \
1135 { \
1136  Gfx *_g = (Gfx *)(pkt); \
1137  _g->words.w0 = _SHIFTL(G_SETTILE, 24, 8) \
1138  | _SHIFTL((fmt), 21, 3) \
1139  | _SHIFTL((siz), 19, 2) \
1140  | _SHIFTL((line), 9, 9) \
1141  | _SHIFTL((tmem), 0, 9); \
1142  _g->words.w1 = _SHIFTL((tile), 24, 3) \
1143  | _SHIFTL((palette), 20, 4) \
1144  | _SHIFTL((cmt), 18, 2) \
1145  | _SHIFTL((maskt), 14, 4) \
1146  | _SHIFTL((shiftt), 10, 4) \
1147  | _SHIFTL((cms), 8, 2) \
1148  | _SHIFTL((masks), 4, 4) \
1149  | _SHIFTL((shifts), 0, 4); \
1150 }
1151 
1152 #define gsDPSetTile(fmt, siz, line, tmem, tile, \
1153  palette, cmt, maskt, shiftt, cms, masks, shifts) \
1154 { \
1155  _g->words.w0 = _SHIFTL(G_SETTILE, 24, 8) \
1156  | _SHIFTL((fmt), 21, 3) \
1157  | _SHIFTL((siz), 19, 2) \
1158  | _SHIFTL((line), 9, 9) \
1159  | _SHIFTL((tmem), 0, 9); \
1160  _g->words.w1 = _SHIFTL((tile), 24, 3) \
1161  | _SHIFTL((palette), 20, 4) \
1162  | _SHIFTL((cmt), 18, 2) \
1163  | _SHIFTL((maskt), 14, 4) \
1164  | _SHIFTL((shiftt), 10, 4) \
1165  | _SHIFTL((cms), 8, 2) \
1166  | _SHIFTL((masks), 4, 4) \
1167  | _SHIFTL((shifts), 0, 4); \
1168 }
1169 
1170 /* SetDepthImage */
1171 
1172 #define gDPSetDepthImage(pkt, image) \
1173 { \
1174  Gfx *_g = (Gfx *)(pkt); \
1175  _g->words.w0 = _SHIFTL(G_SETZIMG, 24, 8); \
1176  _g->words.w1 = (image); \
1177 }
1178 
1179 #define gsDPSetDepthImage(image) \
1180 { \
1181  _g->words.w0 = _SHIFTL(G_SETZIMG, 24, 8); \
1182  _g->words.w1 = (image); \
1183 }
1184 
1185 /* SetPrimColor */
1186 
1187 #define gDPSetPrimColor(pkt, m, l, r, g, b, a) \
1188 { \
1189  Gfx *_g = (Gfx *)(pkt); \
1190  _g->words.w0 = _SHIFTL(G_SETPRIMCOLOR, 24, 8) \
1191  | _SHIFTL(m, 8, 8) \
1192  | _SHIFTL(l, 0, 8); \
1193  _g->words.w1 = _SHIFTL(r, 24, 8) \
1194  | _SHIFTL(g, 16, 8) \
1195  | _SHIFTL(b, 8, 8) \
1196  | _SHIFTL(a, 0, 8); \
1197 }
1198 
1199 #define gsDPSetPrimColor(m, l, r, g, b, a) \
1200 { \
1201  _g->words.w0 = _SHIFTL(G_SETPRIMCOLOR, 24, 8) \
1202  | _SHIFTL(m, 8, 8) \
1203  | _SHIFTL(l, 0, 8); \
1204  _g->words.w1 = _SHIFTL(r, 24, 8) \
1205  | _SHIFTL(g, 16, 8) \
1206  | _SHIFTL(b, 8, 8) \
1207  | _SHIFTL(a, 0, 8); \
1208 }
1209 
1210 /* SetEnvColor */
1211 
1212 #define gDPSetEnvColor(pkt, r, g, b, a) \
1213 { \
1214  Gfx *_g = (Gfx *)(pkt); \
1215  _g->words.w0 = _SHIFTL(G_SETENVCOLOR, 24, 8); \
1216  _g->words.w1 = _SHIFTL((r), 24, 8) \
1217  | _SHIFTL((g), 16, 8) \
1218  | _SHIFTL((b), 8, 8) \
1219  | _SHIFTL((a), 0, 8); \
1220 }
1221 
1222 #define gsDPSetEnvColor(r, g, b, a) \
1223 { \
1224  _g->words.w0 = _SHIFTL(G_SETENVCOLOR, 24, 8); \
1225  _g->words.w1 = _SHIFTL((r), 24, 8) \
1226  | _SHIFTL((g), 16, 8) \
1227  | _SHIFTL((b), 8, 8) \
1228  | _SHIFTL((a), 0, 8); \
1229 }
1230 
1231 /* SetTextureImage */
1232 
1233 #define gDPSetTextureImage(pkt, fmt, size, width, img) \
1234 { \
1235  Gfx *_g = (Gfx *)(pkt); \
1236  _g->words.w0 = _SHIFTL(G_SETTIMG, 24, 8) \
1237  | _SHIFTL((fmt), 21, 3) \
1238  | _SHIFTL((size), 19, 2) \
1239  | _SHIFTL((width)-1, 0, 12); \
1240  _g->words.w1 = (u32)(img); \
1241 }
1242 
1243 #define gsDPSetTextureImage(fmt, size, width, img) \
1244 { \
1245  _g->words.w0 = _SHIFTL(G_SETTIMG, 24, 8) \
1246  | _SHIFTL((fmt), 21, 3) \
1247  | _SHIFTL((size), 19, 2) \
1248  | _SHIFTL((width)-1, 0, 12); \
1249  _g->words.w1 = (u32)(img); \
1250 }
1251 
1252 /* MoveWd */
1253 
1254 #define gMoveWd(pkt, index, offset, data) \
1255 { \
1256  Gfx *_g = (Gfx *)(pkt); \
1257  _g->words.w0 = _SHIFTL(G_MOVEWORD, 24, 8) \
1258  | _SHIFTL((offset), 8, 16) \
1259  | _SHIFTL((index), 0, 8); \
1260  _g->words.w1 = (u32)(data); \
1261 }
1262 
1263 #define gsMoveWd(index, offset, data) \
1264 { \
1265  _g->words.w0 = _SHIFTL(G_MOVEWORD, 24, 8) \
1266  | _SHIFTL((offset), 8, 16) \
1267  | _SHIFTL((index), 0, 8); \
1268  _g->words.w1 = (u32)(data); \
1269 }
1270 
1271 /* Matrix Operations */
1272 
1273 #define G_MTX_MODELVIEW 0x00
1274 #define G_MTX_PROJECTION 0x01
1275 #define G_MTX_MUL 0x00
1276 #define G_MTX_LOAD 0x02
1277 #define G_MTX_NOPUSH 0x00
1278 #define G_MTX_PUSH 0x04
1279 
1280 /* PopMatrix */
1281 
1282 #define gSPPopMatrix(pkt, n) \
1283 { \
1284  Gfx *_g = (Gfx *) (pkt); \
1285  _g->words.w0 = 0xBD000000; \
1286  _g->words.w1 = (n); \
1287 }
1288 
1289 #define gsSPPopMatrix(pkt, n) \
1290 { \
1291  _g->words.w0 = 0xBD000000; \
1292  _g->words.w1 = (n); \
1293 }
1294 
1295 /* Viewport */
1296 
1297 #define gSPViewport(pkt, v) \
1298 { \
1299  Gfx *_g = (Gfx *)(pkt); \
1300  _g->words.w0 = _SHIFTL(G_MOVEMEM, 24, 8) \
1301  | _SHIFTL(G_MV_VIEWPORT, 16, 8) \
1302  | _SHIFTL(sizeof(Vp), 0, 16); \
1303  _g->words.w1 = (u32)(v); \
1304 }
1305 
1306 #define gsSPViewport(v) \
1307 { \
1308  _g->words.w0 = _SHIFTL(G_MOVEMEM, 24, 8) \
1309  | _SHIFTL(G_MV_VIEWPORT, 16, 8) \
1310  | _SHIFTL(sizeof(Vp), 0, 16); \
1311  _g->words.w1 = (u32)(v); \
1312 }
1313 
1314 /* 1Triangle */
1315 /* Fast3DEX changes how the triangle incices are stored for G_TRI1 (0xBF) */
1316 
1317 #ifndef F3DEX_GBI
1318 #define gSP1Triangle(pkt, v0, v1, v2, flag) \
1319 { \
1320  Gfx *_g = (Gfx *)(pkt); \
1321  _g->words.w0 = _SHIFTL(G_TRI1, 24, 8); \
1322  _g->words.w1 = _SHIFTL((flag), 24, 8) \
1323  | _SHIFTL((v0)*10, 16, 8) \
1324  | _SHIFTL((v1)*10, 8, 8) \
1325  | _SHIFTL((v2)*10, 0, 8); \
1326 }
1327 
1328 #define gsSP1Triangle(v0, v1, v2, flag) \
1329 { \
1330  _g->words.w0 = _SHIFTL(G_TRI1, 24, 8); \
1331  _g->words.w1 = _SHIFTL((flag), 24, 8) \
1332  | _SHIFTL((v0)*10, 16, 8) \
1333  | _SHIFTL((v1)*10, 8, 8) \
1334  | _SHIFTL((v2)*10, 0, 8); \
1335 }
1336 
1337 #else
1338 #define gSP1Triangle(pkt, v0, v1, v2, flag) \
1339 { \
1340  Gfx *_g = (Gfx *)(pkt); \
1341  _g->words.w0 = _SHIFTL(G_TRI1, 24, 8); \
1342  _g->words.w1 = _SHIFTL((flag), 24, 8) \
1343  | _SHIFTL((v0)*2, 16, 8) \
1344  | _SHIFTL((v1)*2, 8, 8) \
1345  | _SHIFTL((v2)*2, 0, 8); \
1346 }
1347 
1348 #define gsSP1Triangle(v0, v1, v2, flag) \
1349 { \
1350  _g->words.w0 = _SHIFTL(G_TRI1, 24, 8); \
1351  _g->words.w1 = _SHIFTL((flag), 24, 8) \
1352  | _SHIFTL((v0)*2, 16, 8) \
1353  | _SHIFTL((v1)*2, 8, 8) \
1354  | _SHIFTL((v2)*2, 0, 8); \
1355 }
1356 #endif
1357 
1358 
1359 /* TextureRectangle */
1360 /* Last two commands (G_RDPHALF_CONT (which was replaced with G_MODIFYVTX) and G_RDPHALF_2) changed for this macro in Fast3DEX and onwards. */
1361 
1362 #ifndef F3DEX_GBI
1363 #define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
1364 { \
1365  Gfx *_g = (Gfx *)(pkt); \
1366  _g->words.w0 = _SHIFTL(G_TEXRECT, 24, 8) \
1367  | _SHIFTL((xh), 12, 12) \
1368  | _SHIFTL((yh), 0, 12); \
1369  _g->words.w1 = _SHIFTL((tile), 24, 3) \
1370  | _SHIFTL((xl), 12, 12) \
1371  | _SHIFTL((yl), 0, 12); \
1372 } \
1373 { \
1374  Gfx *_g = (Gfx *)(pkt); \
1375  _g->words.w0 = _SHIFTL(G_RDPHALF_2, 24, 8); \
1376  _g->words.w1 = _SHIFTL((s), 16, 16) \
1377  | _SHIFTL((t), 0, 16); \
1378 } \
1379 { \
1380  Gfx *_g = (Gfx *)(pkt); \
1381  _g->words.w0 = _SHIFTL(G_RDPHALF_CONT, 24, 8); \
1382  _g->words.w1 = _SHIFTL((dsdx), 16, 16) \
1383  | _SHIFTL((dtdy), 0, 16); \
1384 }
1385 
1386 #define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
1387 { \
1388  _g->words.w0 = _SHIFTL(G_TEXRECT, 24, 8) \
1389  | _SHIFTL((xh), 12, 12) \
1390  | _SHIFTL((yh), 0, 12); \
1391  _g->words.w1 = _SHIFTL((tile), 24, 3) \
1392  | _SHIFTL((xl), 12, 12) \
1393  | _SHIFTL((yl), 0, 12); \
1394 } \
1395 { \
1396  _g->words.w0 = _SHIFTL(G_RDPHALF_2, 24, 8); \
1397  _g->words.w1 = _SHIFTL((s), 16, 16) \
1398  | _SHIFTL((t), 0, 16); \
1399 } \
1400 { \
1401  _g->words.w0 = _SHIFTL(G_RDPHALF_CONT, 24, 8); \
1402  _g->words.w1 = _SHIFTL((dsdx), 16, 16) \
1403  | _SHIFTL((dtdy), 0, 16); \
1404 }
1405 
1406 #else
1407 #define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
1408 { \
1409  Gfx *_g = (Gfx *)(pkt); \
1410  _g->words.w0 = _SHIFTL(G_TEXRECT, 24, 8) \
1411  | _SHIFTL((xh), 12, 12) \
1412  | _SHIFTL((yh), 0, 12); \
1413  _g->words.w1 = _SHIFTL((tile), 24, 3) \
1414  | _SHIFTL((xl), 12, 12) \
1415  | _SHIFTL((yl), 0, 12); \
1416 } \
1417 { \
1418  Gfx *_g = (Gfx *)(pkt); \
1419  _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
1420  _g->words.w1 = _SHIFTL((s), 16, 16) \
1421  | _SHIFTL((t), 0, 16); \
1422 } \
1423 { \
1424  Gfx *_g = (Gfx *)(pkt); \
1425  _g->words.w0 = _SHIFTL(G_RDPHALF_2, 24, 8); \
1426  _g->words.w1 = _SHIFTL((dsdx), 16, 16) \
1427  | _SHIFTL((dtdy), 0, 16); \
1428 }
1429 
1430 #define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
1431 { \
1432  _g->words.w0 = _SHIFTL(G_TEXRECT, 24, 8) \
1433  | _SHIFTL((xh), 12, 12) \
1434  | _SHIFTL((yh), 0, 12); \
1435  _g->words.w1 = _SHIFTL((tile), 24, 3) \
1436  | _SHIFTL((xl), 12, 12) \
1437  | _SHIFTL((yl), 0, 12); \
1438 } \
1439 { \
1440  _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
1441  _g->words.w1 = _SHIFTL((s), 16, 16) \
1442  | _SHIFTL((t), 0, 16); \
1443 } \
1444 { \
1445  _g->words.w0 = _SHIFTL(G_RDPHALF_2, 24, 8); \
1446  _g->words.w1 = _SHIFTL((dsdx), 16, 16) \
1447  | _SHIFTL((dtdy), 0, 16); \
1448 }
1449 #endif
1450 
1451 /* Lights and Light Operations */
1452 
1453 typedef struct {
1454  unsigned char col[3];
1455  char pad1;
1456  unsigned char colc[3];
1457  char pad2;
1458  signed char dir[3];
1459  char pad3;
1460 } Light_t;
1461 
1462 typedef struct {
1463  unsigned char col[3];
1464  char pad1;
1465  unsigned char colc[3];
1466  char pad2;
1467 } Ambient_t;
1468 
1469 typedef union {
1471  long long int force_structure_alignment[1];
1472 } Ambient;
1473 
1474 typedef union {
1476  long long int force_structure_alignment[2];
1477 } Light;
1478 
1479 typedef struct {
1481  Light l[4];
1482 } Lights4;
1483 
1484 typedef struct {
1485  Light l[2];
1486 } LookAt;
1487 
1488 typedef struct {
1489  int x1, y1, x2, y2;
1490 } Hilite_t;
1491 
1492 typedef union {
1494  long int force_alignmnet[4];
1495 } Hilite;
1496 
1497 /* for gSPNumLights */
1498 #define NUMLIGHTS_0 1
1499 #define NUMLIGHTS_1 1
1500 #define NUMLIGHTS_2 2
1501 #define NUMLIGHTS_3 3
1502 #define NUMLIGHTS_4 4
1503 #define NUMLIGHTS_5 5
1504 #define NUMLIGHTS_6 6
1505 #define NUMLIGHTS_7 7
1506 
1507 /* for gSPLight */
1508 #define LIGHT_1 1
1509 #define LIGHT_2 2
1510 #define LIGHT_3 3
1511 #define LIGHT_4 4
1512 #define LIGHT_5 5
1513 #define LIGHT_6 6
1514 #define LIGHT_7 7
1515 #define LIGHT_8 8
1516 
1517 /* Lights */
1518 
1519 #define gSPLight(pkt, l, n) \
1520 { \
1521  Gfx *_g = (Gfx *)(pkt); \
1522  _g->words.w0 = _SHIFTL(G_MOVEMEM, 24, 8) \
1523  | _SHIFTL(((n)-1)*2+G_MV_L0, 16, 8) \
1524  | _SHIFTL(sizeof(Light), 0, 16); \
1525  _g->words.w1 = (u32)(l); \
1526 }
1527 
1528 #define gsSPLight(l, n) \
1529 { \
1530  _g->words.w0 = _SHIFTL(G_MOVEMEM, 24, 8) \
1531  | _SHIFTL(((n)-1)*2+G_MV_L0, 16, 8) \
1532  | _SHIFTL(sizeof(Light), 0, 16); \
1533  _g->words.w1 = (u32)(l); \
1534 }
1535 
1536 /* LookAtX */
1537 
1538 #define gSPLookAtX(pkt, la) \
1539 { \
1540  Gfx *_g = (Gfx *)(pkt); \
1541  _g->words.w0 = _SHIFTL(G_MOVEMEM, 24, 8) \
1542  | _SHIFTL(G_MV_LOOKATX, 16, 8) \
1543  | _SHIFTL(sizeof(Light), 0, 16); \
1544  _g->words.w1 = (u32)(la); \
1545 }
1546 
1547 #define gsSPLookAtX(la) \
1548 { \
1549  _g->words.w0 = _SHIFTL(G_MOVEMEM, 24, 8) \
1550  | _SHIFTL(G_MV_LOOKATX, 16, 8) \
1551  | _SHIFTL(sizeof(Light), 0, 16); \
1552  _g->words.w1 = (u32)(la); \
1553 }
1554 
1555 /* LookAtY */
1556 
1557 #define gSPLookAtY(pkt, la) \
1558 { \
1559  Gfx *_g = (Gfx *)(pkt); \
1560  _g->words.w0 = _SHIFTL(G_MOVEMEM, 24, 8) \
1561  | _SHIFTL(G_MV_LOOKATY, 16, 8) \
1562  | _SHIFTL(sizeof(Light), 0, 16); \
1563  _g->words.w1 = (u32)(la); \
1564 }
1565 
1566 #define gsSPLookAtY(la) \
1567 { \
1568  _g->words.w0 = _SHIFTL(G_MOVEMEM, 24, 8) \
1569  | _SHIFTL(G_MV_LOOKATY, 16, 8) \
1570  | _SHIFTL(sizeof(Light), 0, 16); \
1571  _g->words.w1 = (u32)(la); \
1572 }
1573 
1574 /* LookAt */
1575 
1576 #define gSPLookAt(pkt, la) \
1577 { \
1578  gSPLookAtX((pkt), (la)) \
1579  gSPLookAtY((pkt), (char *)(la)+16) \
1580 }
1581 
1582 #define gsSPLookAt(la) \
1583 { \
1584  gsSPLookAtX((la)) \
1585  gsSPLookAtY((char *)(la)+16) \
1586 }
1587 
1588 /* PerspNormalize */
1589 
1590 #ifndef F3DEX_GBI
1591 #define gSPPerspNormalize(pkt, s) \
1592 { \
1593  Gfx *g = pkt; \
1594  g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
1595  g->words.w1 = s; \
1596 }
1597 
1598 #define gsSPPerspNormalize(s) \
1599 { \
1600  g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
1601  g->words.w1 = s; \
1602 }
1603 
1604 #else
1605 #define gSPPerspNormalize(pkt, s) \
1606  gMoveWd(pkt, G_MW_PERSPNORM, 0, (s))
1607 
1608 #define gsSPPerspNormalize(s) \
1609  gsMoveWd(G_MW_PERSPNORM, 0, (s))
1610 #endif
1611 
1612 #endif
long long int force_structure_alignment
Definition: gbi_old.h:29
Gwords words
Definition: gbi_old.h:61
Definition: gbi_old.h:1484
Definition: gbi_old.h:59
Vtx_tn n
Definition: gbi_old.h:28
long long int force_structure_alignment
Definition: gbi_old.h:42
Definition: gbi_old.h:1479
long int Mtx_t[4][4]
Definition: gbi_old.h:45
Definition: gbi_old.h:1469
unsigned short flag
Definition: gbi_old.h:19
Definition: gbi_old.h:16
Hilite_t h
Definition: gbi_old.h:1493
char pad1
Definition: gbi_old.h:1455
Ambient_t l
Definition: gbi_old.h:1470
Definition: gbi_old.h:7
Definition: gbi_old.h:1488
Vp_t vp
Definition: gbi_old.h:41
Definition: gbi_old.h:46
Light_t l
Definition: gbi_old.h:1475
Definition: gbi_old.h:25
unsigned short flag
Definition: gbi_old.h:10
char pad2
Definition: gbi_old.h:1466
Definition: gbi_old.h:1474
Definition: gbi_old.h:33
unsigned int w0
Definition: gbi_old.h:54
long long int force_structure_alignment
Definition: gbi_old.h:49
Vtx_t v
Definition: gbi_old.h:27
int y2
Definition: gbi_old.h:1489
Definition: gbi_old.h:39
Definition: gbi_old.h:52
char pad1
Definition: gbi_old.h:1464
Definition: gbi_old.h:1462
Definition: gbi_old.h:1492
unsigned char a
Definition: gbi_old.h:22
long long int force_structure_alignment
Definition: gbi_old.h:62
Mtx_t m
Definition: gbi_old.h:48
char pad2
Definition: gbi_old.h:1457
char pad3
Definition: gbi_old.h:1459
Ambient a
Definition: gbi_old.h:1480
unsigned int w1
Definition: gbi_old.h:55
Definition: gbi_old.h:1453