F3DEX3
Loading...
Searching...
No Matches
gbi.h
Go to the documentation of this file.
1
6/* List of options; the documentation for each is where it is used below. */
7/* #define REQUIRE_SEMICOLONS_AFTER_GBI_COMMANDS */ /* recommended */
8/* #define NO_SYNCS_IN_TEXTURE_LOADS */ /* see documentation */
9/* #define F3DEX2_SEGMENTS */ /* see documentation */
10/* #define DISABLE_AA */ /* developer taste */
11/* #define RISKY_RDP_SYNCS */ /* see documentation */
12/* #define KAZE_GBI_HACKS */ /* not recommended unless you are Kaze */
13
14#include "ultra64/mbi.h"
15
16#ifndef F3DEX3_H
17#define F3DEX3_H
18
19#define F3DEX_GBI_2 1
20#define F3DEX_GBI_PL 1
21#define F3DEX_GBI_3 1
22
23#ifdef REQUIRE_SEMICOLONS_AFTER_GBI_COMMANDS
24/* OoT style, semicolons required after using macros, cleaner code. If modding
25SM64, will have to fix a few places the codebase omits the semicolons. */
26#define _DW(macro) do {macro} while (0)
27#else
28/* SM64 style, semicolons optional, uglier code, will produce tens of thousands
29of warnings if you use -Wpedantic. */
30#define _DW(macro) macro
31#endif
32
33/*
34 * The following commands are the "generated" RDP commands; the user
35 * never sees them, the RSP microcode generates them.
36 * edge, shade, texture, zbuff bits: estz
37 */
38#define G_TRI_FILL 0xC8 /* fill triangle: 11001000 */
39#define G_TRI_SHADE 0xCC /* shade triangle: 11001100 */
40#define G_TRI_TXTR 0xCA /* texture triangle: 11001010 */
41#define G_TRI_SHADE_TXTR 0xCE /* shade, texture triangle: 11001110 */
42#define G_TRI_FILL_ZBUFF 0xC9 /* fill, zbuff triangle: 11001001 */
43#define G_TRI_SHADE_ZBUFF 0xCD /* shade, zbuff triangle: 11001101 */
44#define G_TRI_TXTR_ZBUFF 0xCB /* texture, zbuff triangle: 11001011 */
45#define G_TRI_SHADE_TXTR_ZBUFF 0xCF /* shade, txtr, zbuff trngl: 11001111 */
46
47/* masks to create the above: */
48#define G_RDP_TRI_FILL_MASK 0x08
49#define G_RDP_TRI_SHADE_MASK 0x04
50#define G_RDP_TRI_TXTR_MASK 0x02
51#define G_RDP_TRI_ZBUFF_MASK 0x01
52
53/*
54 * GBI commands in order
55 */
56/*#define G_SPECIAL_3 0xD3 no-op in F3DEX2 */
57/*#define G_SPECIAL_2 0xD4 no-op in F3DEX2 */
58/*#define G_SPECIAL_1 0xD5 triggered MVP recalculation, not supported in F3DEX3 */
59#define G_MEMSET 0xD5
60#define G_DMA_IO 0xD6
61#define G_TEXTURE 0xD7
62#define G_POPMTX 0xD8
63#define G_GEOMETRYMODE 0xD9
64#define G_MTX 0xDA
65#define G_MOVEWORD 0xDB
66#define G_MOVEMEM 0xDC
67#define G_LOAD_UCODE 0xDD
68#define G_DL 0xDE
69#define G_ENDDL 0xDF
70#define G_SPNOOP 0xE0
71#define G_RDPHALF_1 0xE1
72#define G_SETOTHERMODE_L 0xE2
73#define G_SETOTHERMODE_H 0xE3
74#define G_TEXRECT 0xE4
75#define G_TEXRECTFLIP 0xE5
76#define G_RDPLOADSYNC 0xE6
77#define G_RDPPIPESYNC 0xE7
78#define G_RDPTILESYNC 0xE8
79#define G_RDPFULLSYNC 0xE9
80#define G_SETKEYGB 0xEA
81#define G_SETKEYR 0xEB
82#define G_SETCONVERT 0xEC
83#define G_SETSCISSOR 0xED
84#define G_SETPRIMDEPTH 0xEE
85#define G_RDPSETOTHERMODE 0xEF
86#define G_LOADTLUT 0xF0
87#define G_RDPHALF_2 0xF1
88#define G_SETTILESIZE 0xF2
89#define G_LOADBLOCK 0xF3
90#define G_LOADTILE 0xF4
91#define G_SETTILE 0xF5
92#define G_FILLRECT 0xF6
93#define G_SETFILLCOLOR 0xF7
94#define G_SETFOGCOLOR 0xF8
95#define G_SETBLENDCOLOR 0xF9
96#define G_SETPRIMCOLOR 0xFA
97#define G_SETENVCOLOR 0xFB
98#define G_SETCOMBINE 0xFC
99#define G_SETTIMG 0xFD
100#define G_SETZIMG 0xFE
101#define G_SETCIMG 0xFF
102#define G_NOOP 0x00
103#define G_VTX 0x01
104#define G_MODIFYVTX 0x02
105#define G_CULLDL 0x03
106#define G_BRANCH_WZ 0x04
107#define G_TRI1 0x05
108#define G_TRI2 0x06
109#define G_QUAD 0x07
110#define G_TRISTRIP 0x08 /* = G_LINE3D was a no-op in F3DEX2, has been removed */
111#define G_TRIFAN 0x09
112#define G_LIGHTTORDP 0x0A
113#define G_RELSEGMENT 0x0B
114
115/* names differ between F3DEX2 and F3DZEX */
116#define G_BRANCH_Z G_BRANCH_WZ
117#define G_BRANCH_W G_BRANCH_WZ
118
119/*
120 * RSP command argument and misc defines
121 */
122
123/* Maximum number of transformed vertices kept in buffer in RSP DMEM */
124#define G_MAX_VERTS 56
125
126/* Maximum number of directional / point lights, not counting ambient */
127#define G_MAX_LIGHTS 9
128
129/* Maximum number of display list commands loaded at once into RSP DMEM */
130#define G_INPUT_BUFFER_CMDS 21
131
132/*
133 * flags for G_SETGEOMETRYMODE
134 *
135 * Note that flat shading, i.e. not G_SHADING_SMOOTH, sets shade RGB for all
136 * three verts to the value of the first vertex in the triangle. Shade alpha is
137 * still separate for each vertex, which is desired behavior for fog but not for
138 * any other F3DEX3 effects which use shade alpha.
139 */
140#define G_ZBUFFER 0x00000001
141#define G_TEXTURE_ENABLE 0x00000000 /* actually 2, but controlled by SPTexture */
142#define G_SHADE 0x00000004
143#define G_AMBOCCLUSION 0x00000040
144#define G_ATTROFFSET_Z_ENABLE 0x00000080
145#define G_ATTROFFSET_ST_ENABLE 0x00000100
146#define G_CULL_NEITHER 0x00000000
147#define G_CULL_FRONT 0x00000200
148#define G_CULL_BACK 0x00000400
149#define G_CULL_BOTH 0x00000600 /* useless but supported */
150#define G_PACKED_NORMALS 0x00000800
151#define G_LIGHTTOALPHA 0x00001000
152#define G_LIGHTING_SPECULAR 0x00002000
153#define G_FRESNEL_COLOR 0x00004000
154#define G_FRESNEL_ALPHA 0x00008000
155#define G_FOG 0x00010000
156#define G_LIGHTING 0x00020000
157#define G_TEXTURE_GEN 0x00040000
158#define G_TEXTURE_GEN_LINEAR 0x00080000
159#define G_LOD 0x00100000 /* Ignored by all F3DEX* variants */
160#define G_SHADING_SMOOTH 0x00200000
161#define G_LIGHTING_POSITIONAL 0x00400000 /* Ignored by F3DEX3, assumed always on */
162#define G_CLIPPING 0x00800000 /* Ignored by all F3DEX* variants */
163
164/* See SPDisplayList / SPBranchList */
165#define G_DL_PUSH 0
166#define G_DL_NOPUSH 1
167
168/* See SPMatrix */
173#define G_MTX_MODELVIEW 0x00 /* matrix types */
178#define G_MTX_PROJECTION 0x04
183#define G_MTX_MUL 0x00 /* concat or load */
188#define G_MTX_LOAD 0x02
193#define G_MTX_NOPUSH 0x00 /* push or not */
198#define G_MTX_PUSH 0x01
199
200/* See SPNormalsMode */
201#define G_NORMALS_MODE_FAST 0x00
202#define G_NORMALS_MODE_AUTO 0x01
203#define G_NORMALS_MODE_MANUAL 0x02
204
205/* See SPAlphaCompareCull */
206#define G_ALPHA_COMPARE_CULL_DISABLE 0
207#define G_ALPHA_COMPARE_CULL_BELOW 1
208#define G_ALPHA_COMPARE_CULL_ABOVE -1
209
210/*
211 * MOVEMEM indices
212 * Each of these indexes an entry in a dmem table which points to an arbitrarily
213 * sized block of dmem in which to store the result of a DMA.
214 */
215#define G_MV_TEMPMTX0 0 /* for internal use by G_MTX multiply mode */
216#define G_MV_MMTX 2
217#define G_MV_TEMPMTX1 4 /* for internal use by G_MTX multiply mode */
218#define G_MV_VPMTX 6
219#define G_MV_VIEWPORT 8
220#define G_MV_LIGHT 10
221/* G_MV_POINT is no longer supported because the internal vertex format is no
222longer a multiple of 8 (DMA word). This was not used in any command anyway. */
223/* G_MV_MATRIX is no longer supported because there is no MVP matrix in F3DEX3. */
224#define G_MV_PMTX G_MV_VPMTX /* backwards compatibility */
225
226/*
227 * MOVEWORD indices
228 * Each of these indexes an entry in a dmem table which points to a word in dmem
229 * where an immediate word will be stored.
230 */
231#define G_MW_FX 0x00 /* replaces G_MW_MATRIX which is no longer supported */
232#define G_MW_NUMLIGHT 0x02
233/* nothing for 0x04; G_MW_CLIP is no longer supported */
234#define G_MW_SEGMENT 0x06
235#define G_MW_FOG 0x08
236#define G_MW_LIGHTCOL 0x0A
237/* G_MW_FORCEMTX is no longer supported because there is no MVP matrix in F3DEX3. */
238/* G_MW_PERSPNORM is removed; perspective norm is now set via G_MW_FX. */
239
240#define G_MW_HALFWORD_FLAG 0x8000 /* indicates store 2 bytes instead of 4 */
241
242/*
243 * These are offsets from the address in the dmem table
244 */
245#define G_MWO_NUMLIGHT 0x00
246#define G_MWO_FOG 0x00
247
248#define G_MWO_SEGMENT_0 0x00
249#define G_MWO_SEGMENT_1 0x01
250#define G_MWO_SEGMENT_2 0x02
251#define G_MWO_SEGMENT_3 0x03
252#define G_MWO_SEGMENT_4 0x04
253#define G_MWO_SEGMENT_5 0x05
254#define G_MWO_SEGMENT_6 0x06
255#define G_MWO_SEGMENT_7 0x07
256#define G_MWO_SEGMENT_8 0x08
257#define G_MWO_SEGMENT_9 0x09
258#define G_MWO_SEGMENT_A 0x0A
259#define G_MWO_SEGMENT_B 0x0B
260#define G_MWO_SEGMENT_C 0x0C
261#define G_MWO_SEGMENT_D 0x0D
262#define G_MWO_SEGMENT_E 0x0E
263#define G_MWO_SEGMENT_F 0x0F
264
265/* These are deprecated and no longer needed. */
266#define G_MWO_aLIGHT_1 0x00
267#define G_MWO_bLIGHT_1 0x04
268#define G_MWO_aLIGHT_2 0x10
269#define G_MWO_bLIGHT_2 0x14
270#define G_MWO_aLIGHT_3 0x20
271#define G_MWO_bLIGHT_3 0x24
272#define G_MWO_aLIGHT_4 0x30
273#define G_MWO_bLIGHT_4 0x34
274#define G_MWO_aLIGHT_5 0x40
275#define G_MWO_bLIGHT_5 0x44
276#define G_MWO_aLIGHT_6 0x50
277#define G_MWO_bLIGHT_6 0x54
278#define G_MWO_aLIGHT_7 0x60
279#define G_MWO_bLIGHT_7 0x64
280#define G_MWO_aLIGHT_8 0x70
281#define G_MWO_bLIGHT_8 0x74
282#define G_MWO_aLIGHT_9 0x80
283#define G_MWO_bLIGHT_9 0x84
284#define G_MWO_aLIGHT_10 0x90
285#define G_MWO_bLIGHT_10 0x94
286
291#define G_MWO_POINT_RGBA 0x10
296#define G_MWO_POINT_ST 0x14
302#define G_MWO_POINT_XYSCREEN 0x18
308#define G_MWO_POINT_ZSCREEN 0x1C
309
310#define G_MWO_AO_AMBIENT 0x00
311#define G_MWO_AO_DIRECTIONAL 0x02
312#define G_MWO_AO_POINT 0x04
313#define G_MWO_PERSPNORM 0x06
314#define G_MWO_FRESNEL_SCALE 0x0C
315#define G_MWO_FRESNEL_OFFSET 0x0E
316#define G_MWO_ATTR_OFFSET_S 0x10
317#define G_MWO_ATTR_OFFSET_T 0x12
318#define G_MWO_ATTR_OFFSET_Z 0x14
319#define G_MWO_ALPHA_COMPARE_CULL 0x16
320#define G_MWO_NORMALS_MODE 0x18
321#define G_MWO_LAST_MAT_DL_ADDR 0x1A
322
323/*
324 * RDP command argument defines
325 */
326
327/*
328 * Coordinate shift values, number of bits of fraction
329 */
330#define G_TEXTURE_IMAGE_FRAC 2
331#define G_TEXTURE_SCALE_FRAC 16
332#define G_SCALE_FRAC 8
333#define G_ROTATE_FRAC 16
334
335/*
336 * Maximum z-buffer value, used to initialize the z-buffer.
337 * Note : this number is NOT the viewport z-scale constant.
338 * See the comment next to G_MAXZ for more info.
339 */
340#define G_MAXFBZ 0x3FFF /* 3b exp, 11b mantissa */
341
342#define GPACK_RGBA5551(r, g, b, a) \
343 ((((r) << 8) & 0xF800) | \
344 (((g) << 3) & 0x07C0) | \
345 (((b) >> 2) & 0x003E) | \
346 ((a) & 1))
347
348#define GPACK_IA16(i, a) (((i) << 8) | (a))
349
350#define GPACK_ZDZ(z, dz) (((z) << 2) | (dz))
351
352/*
353 * G_SETIMG fmt: set image formats
354 */
355#define G_IM_FMT_RGBA 0
356#define G_IM_FMT_YUV 1
357#define G_IM_FMT_CI 2
358#define G_IM_FMT_IA 3
359#define G_IM_FMT_I 4
360
361/*
362 * G_SETIMG siz: set image pixel size
363 */
364#define G_IM_SIZ_4b 0
365#define G_IM_SIZ_8b 1
366#define G_IM_SIZ_16b 2
367#define G_IM_SIZ_32b 3
368#define G_IM_SIZ_DD 5
369
370#define G_IM_SIZ_4b_BYTES 0
371#define G_IM_SIZ_4b_TILE_BYTES G_IM_SIZ_4b_BYTES
372#define G_IM_SIZ_4b_LINE_BYTES G_IM_SIZ_4b_BYTES
373
374#define G_IM_SIZ_8b_BYTES 1
375#define G_IM_SIZ_8b_TILE_BYTES G_IM_SIZ_8b_BYTES
376#define G_IM_SIZ_8b_LINE_BYTES G_IM_SIZ_8b_BYTES
377
378#define G_IM_SIZ_16b_BYTES 2
379#define G_IM_SIZ_16b_TILE_BYTES G_IM_SIZ_16b_BYTES
380#define G_IM_SIZ_16b_LINE_BYTES G_IM_SIZ_16b_BYTES
381
382#define G_IM_SIZ_32b_BYTES 4
383#define G_IM_SIZ_32b_TILE_BYTES 2
384#define G_IM_SIZ_32b_LINE_BYTES 2
385
386#define G_IM_SIZ_4b_LOAD_BLOCK G_IM_SIZ_16b
387#define G_IM_SIZ_8b_LOAD_BLOCK G_IM_SIZ_16b
388#define G_IM_SIZ_16b_LOAD_BLOCK G_IM_SIZ_16b
389#define G_IM_SIZ_32b_LOAD_BLOCK G_IM_SIZ_32b
390
391#define G_IM_SIZ_4b_SHIFT 2
392#define G_IM_SIZ_8b_SHIFT 1
393#define G_IM_SIZ_16b_SHIFT 0
394#define G_IM_SIZ_32b_SHIFT 0
395
396#define G_IM_SIZ_4b_INCR 3
397#define G_IM_SIZ_8b_INCR 1
398#define G_IM_SIZ_16b_INCR 0
399#define G_IM_SIZ_32b_INCR 0
400
401/*
402 * G_SETCOMBINE: color combine modes
403 */
404/* Color combiner constants: */
405#define G_CCMUX_COMBINED 0
406#define G_CCMUX_TEXEL0 1
407#define G_CCMUX_TEXEL1 2
408#define G_CCMUX_PRIMITIVE 3
409#define G_CCMUX_SHADE 4
410#define G_CCMUX_ENVIRONMENT 5
411#define G_CCMUX_CENTER 6
412#define G_CCMUX_SCALE 6
413#define G_CCMUX_COMBINED_ALPHA 7
414#define G_CCMUX_TEXEL0_ALPHA 8
415#define G_CCMUX_TEXEL1_ALPHA 9
416#define G_CCMUX_PRIMITIVE_ALPHA 10
417#define G_CCMUX_SHADE_ALPHA 11
418#define G_CCMUX_ENV_ALPHA 12
419#define G_CCMUX_LOD_FRACTION 13
420#define G_CCMUX_PRIM_LOD_FRAC 14
421#define G_CCMUX_NOISE 7
422#define G_CCMUX_K4 7
423#define G_CCMUX_K5 15
424#define G_CCMUX_1 6
425#define G_CCMUX_0 31
426
427/* Alpha combiner constants: */
428#define G_ACMUX_COMBINED 0
429#define G_ACMUX_TEXEL0 1
430#define G_ACMUX_TEXEL1 2
431#define G_ACMUX_PRIMITIVE 3
432#define G_ACMUX_SHADE 4
433#define G_ACMUX_ENVIRONMENT 5
434#define G_ACMUX_LOD_FRACTION 0
435#define G_ACMUX_PRIM_LOD_FRAC 6
436#define G_ACMUX_1 6
437#define G_ACMUX_0 7
438
439/* typical CC cycle 1 modes */
440
441/* typical CC cycle 1 modes */
442#define G_CC_PRIMITIVE 0, 0, 0, PRIMITIVE, 0, 0, 0, PRIMITIVE
443#define G_CC_SHADE 0, 0, 0, SHADE, 0, 0, 0, SHADE
444
445#define G_CC_MODULATEI TEXEL0, 0, SHADE, 0, 0, 0, 0, SHADE
446#define G_CC_MODULATEIDECALA TEXEL0, 0, SHADE, 0, 0, 0, 0, TEXEL0
447#define G_CC_MODULATEIFADE TEXEL0, 0, SHADE, 0, 0, 0, 0, ENVIRONMENT
448
449#define G_CC_MODULATERGB G_CC_MODULATEI
450#define G_CC_MODULATERGBDECALA G_CC_MODULATEIDECALA
451#define G_CC_MODULATERGBFADE G_CC_MODULATEIFADE
452
453#define G_CC_MODULATEIA TEXEL0, 0, SHADE, 0, TEXEL0, 0, SHADE, 0
454#define G_CC_MODULATEIFADEA TEXEL0, 0, SHADE, 0, TEXEL0, 0, ENVIRONMENT, 0
455
456#define G_CC_MODULATEFADE TEXEL0, 0, SHADE, 0, ENVIRONMENT, 0, TEXEL0, 0
457
458#define G_CC_MODULATERGBA G_CC_MODULATEIA
459#define G_CC_MODULATERGBFADEA G_CC_MODULATEIFADEA
460
461#define G_CC_MODULATEI_PRIM TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE
462#define G_CC_MODULATEIA_PRIM TEXEL0, 0, PRIMITIVE, 0, TEXEL0, 0, PRIMITIVE, 0
463#define G_CC_MODULATEIDECALA_PRIM TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, TEXEL0
464
465#define G_CC_MODULATERGB_PRIM G_CC_MODULATEI_PRIM
466#define G_CC_MODULATERGBA_PRIM G_CC_MODULATEIA_PRIM
467#define G_CC_MODULATERGBDECALA_PRIM G_CC_MODULATEIDECALA_PRIM
468
469#define G_CC_FADE SHADE, 0, ENVIRONMENT, 0, SHADE, 0, ENVIRONMENT, 0
470#define G_CC_FADEA TEXEL0, 0, ENVIRONMENT, 0, TEXEL0, 0, ENVIRONMENT, 0
471
472#define G_CC_DECALRGB 0, 0, 0, TEXEL0, 0, 0, 0, SHADE
473#define G_CC_DECALRGBA 0, 0, 0, TEXEL0, 0, 0, 0, TEXEL0
474#define G_CC_DECALFADE 0, 0, 0, TEXEL0, 0, 0, 0, ENVIRONMENT
475
476#define G_CC_DECALFADEA 0, 0, 0, TEXEL0, TEXEL0, 0, ENVIRONMENT, 0
477
478#define G_CC_BLENDI ENVIRONMENT, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE
479#define G_CC_BLENDIA ENVIRONMENT, SHADE, TEXEL0, SHADE, TEXEL0, 0, SHADE, 0
480#define G_CC_BLENDIDECALA ENVIRONMENT, SHADE, TEXEL0, SHADE, 0, 0, 0, TEXEL0
481
482#define G_CC_BLENDRGBA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, SHADE
483#define G_CC_BLENDRGBDECALA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, TEXEL0
484#define G_CC_BLENDRGBFADEA TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, 0, 0, 0, ENVIRONMENT
485
486#define G_CC_ADDRGB TEXEL0, 0, TEXEL0, SHADE, 0, 0, 0, SHADE
487#define G_CC_ADDRGBDECALA TEXEL0, 0, TEXEL0, SHADE, 0, 0, 0, TEXEL0
488#define G_CC_ADDRGBFADE TEXEL0, 0, TEXEL0, SHADE, 0, 0, 0, ENVIRONMENT
489
490#define G_CC_REFLECTRGB ENVIRONMENT, 0, TEXEL0, SHADE, 0, 0, 0, SHADE
491#define G_CC_REFLECTRGBDECALA ENVIRONMENT, 0, TEXEL0, SHADE, 0, 0, 0, TEXEL0
492
493#define G_CC_HILITERGB PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE
494#define G_CC_HILITERGBA PRIMITIVE, SHADE, TEXEL0, SHADE, PRIMITIVE, SHADE, TEXEL0, SHADE
495#define G_CC_HILITERGBDECALA PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, TEXEL0
496
497#define G_CC_SHADEDECALA 0, 0, 0, SHADE, 0, 0, 0, TEXEL0
498#define G_CC_SHADEFADEA 0, 0, 0, SHADE, 0, 0, 0, ENVIRONMENT
499
500#define G_CC_BLENDPE PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, SHADE, 0
501#define G_CC_BLENDPEDECALA PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, 0, 0, 0, TEXEL0
502
503/* oddball modes */
504#define _G_CC_BLENDPE ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, TEXEL0, 0, SHADE, 0
505#define _G_CC_BLENDPEDECALA ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, 0, 0, 0, TEXEL0
506#define _G_CC_TWOCOLORTEX PRIMITIVE, SHADE, TEXEL0, SHADE, 0, 0, 0, SHADE
507/* used for 1-cycle sparse mip-maps, primitive color has color of lowest LOD */
508#define _G_CC_SPARSEST PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0, PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0
509#define G_CC_TEMPLERP TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0
510
511/* typical CC cycle 1 modes, usually followed by other cycle 2 modes */
512#define G_CC_TRILERP TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0, TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0
513#define G_CC_INTERFERENCE TEXEL0, 0, TEXEL1, 0, TEXEL0, 0, TEXEL1, 0
514
515/*
516 * One-cycle color convert operation
517 */
518#define G_CC_1CYUV2RGB TEXEL0, K4, K5, TEXEL0, 0, 0, 0, SHADE
519
520/*
521 * NOTE: YUV2RGB expects TF step1 color conversion to occur in 2nd clock.
522 * Therefore, CC looks for step1 results in TEXEL1
523 */
524#define G_CC_YUV2RGB TEXEL1, K4, K5, TEXEL1, 0, 0, 0, 0
525
526/* typical CC cycle 2 modes */
527#define G_CC_PASS2 0, 0, 0, COMBINED, 0, 0, 0, COMBINED
528#define G_CC_MODULATEI2 COMBINED, 0, SHADE, 0, 0, 0, 0, SHADE
529#define G_CC_MODULATEIA2 COMBINED, 0, SHADE, 0, COMBINED, 0, SHADE, 0
530#define G_CC_MODULATERGB2 G_CC_MODULATEI2
531#define G_CC_MODULATERGBA2 G_CC_MODULATEIA2
532#define G_CC_MODULATEI_PRIM2 COMBINED, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE
533#define G_CC_MODULATEIA_PRIM2 COMBINED, 0, PRIMITIVE, 0, COMBINED, 0, PRIMITIVE, 0
534#define G_CC_MODULATERGB_PRIM2 G_CC_MODULATEI_PRIM2
535#define G_CC_MODULATERGBA_PRIM2 G_CC_MODULATEIA_PRIM2
536#define G_CC_DECALRGB2 0, 0, 0, COMBINED, 0, 0, 0, SHADE
537/*
538 * ?
539#define G_CC_DECALRGBA2 COMBINED, SHADE, COMBINED_ALPHA, SHADE, 0, 0, 0, SHADE
540*/
541#define G_CC_BLENDI2 ENVIRONMENT, SHADE, COMBINED, SHADE, 0, 0, 0, SHADE
542#define G_CC_BLENDIA2 ENVIRONMENT, SHADE, COMBINED, SHADE, COMBINED, 0, SHADE, 0
543#define G_CC_CHROMA_KEY2 TEXEL0, CENTER, SCALE, 0, 0, 0, 0, 0
544#define G_CC_HILITERGB2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, SHADE
545#define G_CC_HILITERGBA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, ENVIRONMENT, COMBINED, TEXEL0, COMBINED
546#define G_CC_HILITERGBDECALA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, TEXEL0
547#define G_CC_HILITERGBPASSA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, COMBINED
548
549
550/*
551 * One-cycle color convert operation
552 */
553#define G_CC_1CYUV2RGB TEXEL0, K4, K5, TEXEL0, 0, 0, 0, SHADE
554
555/*
556 * NOTE: YUV2RGB expects TF step1 color conversion to occur in 2nd clock.
557 * Therefore, CC looks for step1 results in TEXEL1
558 */
559#define G_CC_YUV2RGB TEXEL1, K4, K5, TEXEL1, 0, 0, 0, 0
560
561/* typical CC cycle 2 modes */
562#define G_CC_PASS2 0, 0, 0, COMBINED, 0, 0, 0, COMBINED
563#define G_CC_MODULATEI2 COMBINED, 0, SHADE, 0, 0, 0, 0, SHADE
564#define G_CC_MODULATEIA2 COMBINED, 0, SHADE, 0, COMBINED, 0, SHADE, 0
565#define G_CC_MODULATERGB2 G_CC_MODULATEI2
566#define G_CC_MODULATERGBA2 G_CC_MODULATEIA2
567#define G_CC_MODULATEI_PRIM2 COMBINED, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE
568#define G_CC_MODULATEIA_PRIM2 COMBINED, 0, PRIMITIVE, 0, COMBINED, 0, PRIMITIVE, 0
569#define G_CC_MODULATERGB_PRIM2 G_CC_MODULATEI_PRIM2
570#define G_CC_MODULATERGBA_PRIM2 G_CC_MODULATEIA_PRIM2
571#define G_CC_DECALRGB2 0, 0, 0, COMBINED, 0, 0, 0, SHADE
572/*
573 * ?
574#define G_CC_DECALRGBA2 COMBINED, SHADE, COMBINED_ALPHA, SHADE, 0, 0, 0, SHADE
575*/
576#define G_CC_BLENDI2 ENVIRONMENT, SHADE, COMBINED, SHADE, 0, 0, 0, SHADE
577#define G_CC_BLENDIA2 ENVIRONMENT, SHADE, COMBINED, SHADE, COMBINED, 0, SHADE, 0
578#define G_CC_CHROMA_KEY2 TEXEL0, CENTER, SCALE, 0, 0, 0, 0, 0
579#define G_CC_HILITERGB2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, SHADE
580#define G_CC_HILITERGBA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, ENVIRONMENT, COMBINED, TEXEL0, COMBINED
581#define G_CC_HILITERGBDECALA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, TEXEL0
582#define G_CC_HILITERGBPASSA2 ENVIRONMENT, COMBINED, TEXEL0, COMBINED, 0, 0, 0, COMBINED
583
584/*
585 * G_SETOTHERMODE_L sft: shift count
586 */
587#define G_MDSFT_ALPHACOMPARE 0
588#define G_MDSFT_ZSRCSEL 2
589#define G_MDSFT_RENDERMODE 3
590#define G_MDSFT_BLENDER 16
591
592/*
593 * G_SETOTHERMODE_H sft: shift count
594 */
595#define G_MDSFT_ALPHADITHER 4
596#define G_MDSFT_RGBDITHER 6
597#define G_MDSFT_COMBKEY 8
598#define G_MDSFT_TEXTCONV 9
599#define G_MDSFT_TEXTFILT 12
600#define G_MDSFT_TEXTLUT 14
601#define G_MDSFT_TEXTLOD 16
602#define G_MDSFT_TEXTDETAIL 17
603#define G_MDSFT_TEXTPERSP 19
604#define G_MDSFT_CYCLETYPE 20
605#define G_MDSFT_COLORDITHER 22 /* Needed for OoT ucode_disas even though HW 1.0 only */
606#define G_MDSFT_PIPELINE 23
607
608/* G_SETOTHERMODE_H gPipelineMode */
609#define G_PM_1PRIMITIVE (1 << G_MDSFT_PIPELINE)
610#define G_PM_NPRIMITIVE (0 << G_MDSFT_PIPELINE)
611
612/* G_SETOTHERMODE_H gSetCycleType */
613#define G_CYC_1CYCLE (0 << G_MDSFT_CYCLETYPE)
614#define G_CYC_2CYCLE (1 << G_MDSFT_CYCLETYPE)
615#define G_CYC_COPY (2 << G_MDSFT_CYCLETYPE)
616#define G_CYC_FILL (3 << G_MDSFT_CYCLETYPE)
617
618/* G_SETOTHERMODE_H gSetTexturePersp */
619#define G_TP_NONE (0 << G_MDSFT_TEXTPERSP)
620#define G_TP_PERSP (1 << G_MDSFT_TEXTPERSP)
621
622/* G_SETOTHERMODE_H gSetTextureDetail */
623#define G_TD_CLAMP (0 << G_MDSFT_TEXTDETAIL)
624#define G_TD_SHARPEN (1 << G_MDSFT_TEXTDETAIL)
625#define G_TD_DETAIL (2 << G_MDSFT_TEXTDETAIL)
626
627/* G_SETOTHERMODE_H gSetTextureLOD */
628#define G_TL_TILE (0 << G_MDSFT_TEXTLOD)
629#define G_TL_LOD (1 << G_MDSFT_TEXTLOD)
630
631/* G_SETOTHERMODE_H gSetTextureLUT */
632#define G_TT_NONE (0 << G_MDSFT_TEXTLUT)
633#define G_TT_RGBA16 (2 << G_MDSFT_TEXTLUT)
634#define G_TT_IA16 (3 << G_MDSFT_TEXTLUT)
635
636/* G_SETOTHERMODE_H gSetTextureFilter */
637#define G_TF_POINT (0 << G_MDSFT_TEXTFILT)
638#define G_TF_AVERAGE (3 << G_MDSFT_TEXTFILT)
639#define G_TF_BILERP (2 << G_MDSFT_TEXTFILT)
640
641/* G_SETOTHERMODE_H gSetTextureConvert */
642#define G_TC_CONV (0 << G_MDSFT_TEXTCONV)
643#define G_TC_FILTCONV (5 << G_MDSFT_TEXTCONV)
644#define G_TC_FILT (6 << G_MDSFT_TEXTCONV)
645
646/* G_SETOTHERMODE_H gSetCombineKey */
647#define G_CK_NONE (0 << G_MDSFT_COMBKEY)
648#define G_CK_KEY (1 << G_MDSFT_COMBKEY)
649
650/* G_SETOTHERMODE_H gSetColorDither */
651#define G_CD_MAGICSQ (0 << G_MDSFT_RGBDITHER)
652#define G_CD_BAYER (1 << G_MDSFT_RGBDITHER)
653#define G_CD_NOISE (2 << G_MDSFT_RGBDITHER)
654#define G_CD_DISABLE (3 << G_MDSFT_RGBDITHER)
655
656/* G_SETOTHERMODE_H gSetAlphaDither */
657#define G_AD_PATTERN (0 << G_MDSFT_ALPHADITHER)
658#define G_AD_NOTPATTERN (1 << G_MDSFT_ALPHADITHER)
659#define G_AD_NOISE (2 << G_MDSFT_ALPHADITHER)
660#define G_AD_DISABLE (3 << G_MDSFT_ALPHADITHER)
661
662/* G_SETOTHERMODE_L gSetAlphaCompare */
663#define G_AC_NONE (0 << G_MDSFT_ALPHACOMPARE)
664#define G_AC_THRESHOLD (1 << G_MDSFT_ALPHACOMPARE)
665#define G_AC_DITHER (3 << G_MDSFT_ALPHACOMPARE)
666
667/* G_SETOTHERMODE_L gSetDepthSource */
668#define G_ZS_PIXEL (0 << G_MDSFT_ZSRCSEL)
669#define G_ZS_PRIM (1 << G_MDSFT_ZSRCSEL)
670
671#ifdef DISABLE_AA
672/* Disables antialiasing in all preset rendermodes, saving RDP time. Note that
673this does NOT disable antialiasing in manually written rendermodes, e.g.
674exported from fast64 with advanced options enabled. We can't redefine the real
675IM_RD because IM_RD is needed for transparency also, and we can't distinguish
676between a manually written rendermode using IM_RD for transparency and one using
677it for antialiasing. */
678#define AA_DEF 0
679#define RD_DEF 0
680#else
681#define AA_DEF AA_EN
682#define RD_DEF IM_RD
683#endif
684
685/* G_SETOTHERMODE_L gSetRenderMode */
686#define AA_EN 0x0008
687#define Z_CMP 0x0010
688#define Z_UPD 0x0020
689#define IM_RD 0x0040
690#define CLR_ON_CVG 0x0080
691#define CVG_DST_CLAMP 0x0000
692#define CVG_DST_WRAP 0x0100
693#define CVG_DST_FULL 0x0200
694#define CVG_DST_SAVE 0x0300
695#define ZMODE_OPA 0x0000
696#define ZMODE_INTER 0x0400
697#define ZMODE_XLU 0x0800
698#define ZMODE_DEC 0x0C00
699#define CVG_X_ALPHA 0x1000
700#define ALPHA_CVG_SEL 0x2000
701#define FORCE_BL 0x4000
702#define TEX_EDGE 0x0000 /* not in HW V2; is 0x8000 in older HW */
703
704#define G_BL_CLR_IN 0
705#define G_BL_CLR_MEM 1
706#define G_BL_CLR_BL 2
707#define G_BL_CLR_FOG 3
708#define G_BL_1MA 0
709#define G_BL_A_MEM 1
710#define G_BL_A_IN 0
711#define G_BL_A_FOG 1
712#define G_BL_A_SHADE 2
713#define G_BL_1 2
714#define G_BL_0 3
715
716#define GBL_c1(m1a, m1b, m2a, m2b) \
717 (m1a) << 30 | (m1b) << 26 | (m2a) << 22 | (m2b) << 18
718#define GBL_c2(m1a, m1b, m2a, m2b) \
719 (m1a) << 28 | (m1b) << 24 | (m2a) << 20 | (m2b) << 16
720
721#define RM_AA_ZB_OPA_SURF(clk) \
722 AA_DEF | Z_CMP | Z_UPD | RD_DEF | CVG_DST_CLAMP | \
723 ZMODE_OPA | ALPHA_CVG_SEL | \
724 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
725
726#define RM_RA_ZB_OPA_SURF(clk) \
727 AA_DEF | Z_CMP | Z_UPD | CVG_DST_CLAMP | \
728 ZMODE_OPA | ALPHA_CVG_SEL | \
729 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
730
731#define RM_AA_ZB_XLU_SURF(clk) \
732 AA_DEF | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \
733 FORCE_BL | ZMODE_XLU | \
734 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
735
736#define RM_AA_ZB_OPA_DECAL(clk) \
737 AA_DEF | Z_CMP | RD_DEF | CVG_DST_WRAP | ALPHA_CVG_SEL | \
738 ZMODE_DEC | \
739 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
740
741#define RM_RA_ZB_OPA_DECAL(clk) \
742 AA_DEF | Z_CMP | CVG_DST_WRAP | ALPHA_CVG_SEL | \
743 ZMODE_DEC | \
744 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
745
746#define RM_AA_ZB_XLU_DECAL(clk) \
747 AA_DEF | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \
748 FORCE_BL | ZMODE_DEC | \
749 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
750
751#define RM_AA_ZB_OPA_INTER(clk) \
752 AA_DEF | Z_CMP | Z_UPD | RD_DEF | CVG_DST_CLAMP | \
753 ALPHA_CVG_SEL | ZMODE_INTER | \
754 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
755
756#define RM_RA_ZB_OPA_INTER(clk) \
757 AA_DEF | Z_CMP | Z_UPD | CVG_DST_CLAMP | \
758 ALPHA_CVG_SEL | ZMODE_INTER | \
759 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
760
761#define RM_AA_ZB_XLU_INTER(clk) \
762 AA_DEF | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \
763 FORCE_BL | ZMODE_INTER | \
764 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
765
766#define RM_AA_ZB_XLU_LINE(clk) \
767 AA_DEF | Z_CMP | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | \
768 ALPHA_CVG_SEL | FORCE_BL | ZMODE_XLU | \
769 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
770
771#define RM_AA_ZB_DEC_LINE(clk) \
772 AA_DEF | Z_CMP | IM_RD | CVG_DST_SAVE | CVG_X_ALPHA | \
773 ALPHA_CVG_SEL | FORCE_BL | ZMODE_DEC | \
774 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
775
776/* Note that this uses AA_EN not AA_DEF */
777#define RM_AA_ZB_TEX_EDGE(clk) \
778 AA_EN | Z_CMP | Z_UPD | RD_DEF | CVG_DST_CLAMP | \
779 CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \
780 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
781
782#define RM_AA_ZB_TEX_INTER(clk) \
783 AA_DEF | Z_CMP | Z_UPD | RD_DEF | CVG_DST_CLAMP | \
784 CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_INTER | TEX_EDGE | \
785 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
786
787#define RM_AA_ZB_SUB_SURF(clk) \
788 AA_DEF | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | \
789 ZMODE_OPA | ALPHA_CVG_SEL | \
790 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
791
792#define RM_AA_ZB_PCL_SURF(clk) \
793 AA_DEF | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \
794 ZMODE_OPA | G_AC_DITHER | \
795 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
796
797#define RM_AA_ZB_OPA_TERR(clk) \
798 AA_DEF | Z_CMP | Z_UPD | RD_DEF | CVG_DST_CLAMP | \
799 ZMODE_OPA | ALPHA_CVG_SEL | \
800 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
801
802#define RM_AA_ZB_TEX_TERR(clk) \
803 AA_DEF | Z_CMP | Z_UPD | RD_DEF | CVG_DST_CLAMP | \
804 CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \
805 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
806
807#define RM_AA_ZB_SUB_TERR(clk) \
808 AA_DEF | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | \
809 ZMODE_OPA | ALPHA_CVG_SEL | \
810 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
811
812
813#define RM_AA_OPA_SURF(clk) \
814 AA_DEF | RD_DEF | CVG_DST_CLAMP | \
815 ZMODE_OPA | ALPHA_CVG_SEL | \
816 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
817
818#define RM_RA_OPA_SURF(clk) \
819 AA_DEF | CVG_DST_CLAMP | \
820 ZMODE_OPA | ALPHA_CVG_SEL | \
821 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
822
823#define RM_AA_XLU_SURF(clk) \
824 AA_DEF | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | \
825 ZMODE_OPA | \
826 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
827
828#define RM_AA_XLU_LINE(clk) \
829 AA_DEF | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | \
830 ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | \
831 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
832
833#define RM_AA_DEC_LINE(clk) \
834 AA_DEF | IM_RD | CVG_DST_FULL | CVG_X_ALPHA | \
835 ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | \
836 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
837
838/* Note that this uses AA_EN not AA_DEF */
839#define RM_AA_TEX_EDGE(clk) \
840 AA_EN | RD_DEF | CVG_DST_CLAMP | \
841 CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \
842 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
843
844#define RM_AA_SUB_SURF(clk) \
845 AA_DEF | IM_RD | CVG_DST_FULL | \
846 ZMODE_OPA | ALPHA_CVG_SEL | \
847 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
848
849#define RM_AA_PCL_SURF(clk) \
850 AA_DEF | IM_RD | CVG_DST_CLAMP | \
851 ZMODE_OPA | G_AC_DITHER | \
852 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
853
854#define RM_AA_OPA_TERR(clk) \
855 AA_DEF | RD_DEF | CVG_DST_CLAMP | \
856 ZMODE_OPA | ALPHA_CVG_SEL | \
857 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
858
859#define RM_AA_TEX_TERR(clk) \
860 AA_DEF | RD_DEF | CVG_DST_CLAMP | \
861 CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \
862 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
863
864#define RM_AA_SUB_TERR(clk) \
865 AA_DEF | IM_RD | CVG_DST_FULL | \
866 ZMODE_OPA | ALPHA_CVG_SEL | \
867 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
868
869
870#define RM_ZB_OPA_SURF(clk) \
871 Z_CMP | Z_UPD | CVG_DST_FULL | ALPHA_CVG_SEL | \
872 ZMODE_OPA | \
873 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
874
875#define RM_ZB_XLU_SURF(clk) \
876 Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_XLU | \
877 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
878
879#define RM_ZB_OPA_DECAL(clk) \
880 Z_CMP | CVG_DST_FULL | ALPHA_CVG_SEL | ZMODE_DEC | \
881 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
882
883#define RM_ZB_XLU_DECAL(clk) \
884 Z_CMP | IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_DEC | \
885 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
886
887#define RM_ZB_CLD_SURF(clk) \
888 Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_XLU | \
889 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
890
891#define RM_ZB_OVL_SURF(clk) \
892 Z_CMP | IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_DEC | \
893 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
894
895#define RM_ZB_PCL_SURF(clk) \
896 Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | \
897 G_AC_DITHER | \
898 GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
899
900
901#define RM_OPA_SURF(clk) \
902 CVG_DST_CLAMP | FORCE_BL | ZMODE_OPA | \
903 GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
904
905#define RM_XLU_SURF(clk) \
906 IM_RD | CVG_DST_FULL | FORCE_BL | ZMODE_OPA | \
907 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
908
909#define RM_TEX_EDGE(clk) \
910 CVG_DST_CLAMP | CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | \
911 ZMODE_OPA | TEX_EDGE | AA_EN | \
912 GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
913
914#define RM_CLD_SURF(clk) \
915 IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA | \
916 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
917
918#define RM_PCL_SURF(clk) \
919 CVG_DST_FULL | FORCE_BL | ZMODE_OPA | \
920 G_AC_DITHER | \
921 GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
922
923#define RM_ADD(clk) \
924 IM_RD | CVG_DST_SAVE | FORCE_BL | ZMODE_OPA | \
925 GBL_c##clk(G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1)
926
927#define RM_NOOP(clk) \
928 GBL_c##clk(0, 0, 0, 0)
929
930#define RM_VISCVG(clk) \
931 IM_RD | FORCE_BL | \
932 GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM)
933
934/* for rendering to an 8-bit framebuffer */
935#define RM_OPA_CI(clk) \
936 CVG_DST_CLAMP | ZMODE_OPA | \
937 GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
938
939/* Custom version of RM_AA_ZB_XLU_SURF with Z_UPD */
940#define RM_CUSTOM_AA_ZB_XLU_SURF(clk) \
941 RM_AA_ZB_XLU_SURF(clk) | Z_UPD
942
943#define G_RM_CUSTOM_AA_ZB_XLU_SURF RM_CUSTOM_AA_ZB_XLU_SURF(1)
944#define G_RM_CUSTOM_AA_ZB_XLU_SURF2 RM_CUSTOM_AA_ZB_XLU_SURF(2)
945
946#define G_RM_AA_ZB_OPA_SURF RM_AA_ZB_OPA_SURF(1)
947#define G_RM_AA_ZB_OPA_SURF2 RM_AA_ZB_OPA_SURF(2)
948#define G_RM_AA_ZB_XLU_SURF RM_AA_ZB_XLU_SURF(1)
949#define G_RM_AA_ZB_XLU_SURF2 RM_AA_ZB_XLU_SURF(2)
950#define G_RM_AA_ZB_OPA_DECAL RM_AA_ZB_OPA_DECAL(1)
951#define G_RM_AA_ZB_OPA_DECAL2 RM_AA_ZB_OPA_DECAL(2)
952#define G_RM_AA_ZB_XLU_DECAL RM_AA_ZB_XLU_DECAL(1)
953#define G_RM_AA_ZB_XLU_DECAL2 RM_AA_ZB_XLU_DECAL(2)
954#define G_RM_AA_ZB_OPA_INTER RM_AA_ZB_OPA_INTER(1)
955#define G_RM_AA_ZB_OPA_INTER2 RM_AA_ZB_OPA_INTER(2)
956#define G_RM_AA_ZB_XLU_INTER RM_AA_ZB_XLU_INTER(1)
957#define G_RM_AA_ZB_XLU_INTER2 RM_AA_ZB_XLU_INTER(2)
958#define G_RM_AA_ZB_XLU_LINE RM_AA_ZB_XLU_LINE(1)
959#define G_RM_AA_ZB_XLU_LINE2 RM_AA_ZB_XLU_LINE(2)
960#define G_RM_AA_ZB_DEC_LINE RM_AA_ZB_DEC_LINE(1)
961#define G_RM_AA_ZB_DEC_LINE2 RM_AA_ZB_DEC_LINE(2)
962#define G_RM_AA_ZB_TEX_EDGE RM_AA_ZB_TEX_EDGE(1)
963#define G_RM_AA_ZB_TEX_EDGE2 RM_AA_ZB_TEX_EDGE(2)
964#define G_RM_AA_ZB_TEX_INTER RM_AA_ZB_TEX_INTER(1)
965#define G_RM_AA_ZB_TEX_INTER2 RM_AA_ZB_TEX_INTER(2)
966#define G_RM_AA_ZB_SUB_SURF RM_AA_ZB_SUB_SURF(1)
967#define G_RM_AA_ZB_SUB_SURF2 RM_AA_ZB_SUB_SURF(2)
968#define G_RM_AA_ZB_PCL_SURF RM_AA_ZB_PCL_SURF(1)
969#define G_RM_AA_ZB_PCL_SURF2 RM_AA_ZB_PCL_SURF(2)
970#define G_RM_AA_ZB_OPA_TERR RM_AA_ZB_OPA_TERR(1)
971#define G_RM_AA_ZB_OPA_TERR2 RM_AA_ZB_OPA_TERR(2)
972#define G_RM_AA_ZB_TEX_TERR RM_AA_ZB_TEX_TERR(1)
973#define G_RM_AA_ZB_TEX_TERR2 RM_AA_ZB_TEX_TERR(2)
974#define G_RM_AA_ZB_SUB_TERR RM_AA_ZB_SUB_TERR(1)
975#define G_RM_AA_ZB_SUB_TERR2 RM_AA_ZB_SUB_TERR(2)
976
977#define G_RM_RA_ZB_OPA_SURF RM_RA_ZB_OPA_SURF(1)
978#define G_RM_RA_ZB_OPA_SURF2 RM_RA_ZB_OPA_SURF(2)
979#define G_RM_RA_ZB_OPA_DECAL RM_RA_ZB_OPA_DECAL(1)
980#define G_RM_RA_ZB_OPA_DECAL2 RM_RA_ZB_OPA_DECAL(2)
981#define G_RM_RA_ZB_OPA_INTER RM_RA_ZB_OPA_INTER(1)
982#define G_RM_RA_ZB_OPA_INTER2 RM_RA_ZB_OPA_INTER(2)
983
984#define G_RM_AA_OPA_SURF RM_AA_OPA_SURF(1)
985#define G_RM_AA_OPA_SURF2 RM_AA_OPA_SURF(2)
986#define G_RM_AA_XLU_SURF RM_AA_XLU_SURF(1)
987#define G_RM_AA_XLU_SURF2 RM_AA_XLU_SURF(2)
988#define G_RM_AA_XLU_LINE RM_AA_XLU_LINE(1)
989#define G_RM_AA_XLU_LINE2 RM_AA_XLU_LINE(2)
990#define G_RM_AA_DEC_LINE RM_AA_DEC_LINE(1)
991#define G_RM_AA_DEC_LINE2 RM_AA_DEC_LINE(2)
992#define G_RM_AA_TEX_EDGE RM_AA_TEX_EDGE(1)
993#define G_RM_AA_TEX_EDGE2 RM_AA_TEX_EDGE(2)
994#define G_RM_AA_SUB_SURF RM_AA_SUB_SURF(1)
995#define G_RM_AA_SUB_SURF2 RM_AA_SUB_SURF(2)
996#define G_RM_AA_PCL_SURF RM_AA_PCL_SURF(1)
997#define G_RM_AA_PCL_SURF2 RM_AA_PCL_SURF(2)
998#define G_RM_AA_OPA_TERR RM_AA_OPA_TERR(1)
999#define G_RM_AA_OPA_TERR2 RM_AA_OPA_TERR(2)
1000#define G_RM_AA_TEX_TERR RM_AA_TEX_TERR(1)
1001#define G_RM_AA_TEX_TERR2 RM_AA_TEX_TERR(2)
1002#define G_RM_AA_SUB_TERR RM_AA_SUB_TERR(1)
1003#define G_RM_AA_SUB_TERR2 RM_AA_SUB_TERR(2)
1004
1005#define G_RM_RA_OPA_SURF RM_RA_OPA_SURF(1)
1006#define G_RM_RA_OPA_SURF2 RM_RA_OPA_SURF(2)
1007
1008#define G_RM_ZB_OPA_SURF RM_ZB_OPA_SURF(1)
1009#define G_RM_ZB_OPA_SURF2 RM_ZB_OPA_SURF(2)
1010#define G_RM_ZB_XLU_SURF RM_ZB_XLU_SURF(1)
1011#define G_RM_ZB_XLU_SURF2 RM_ZB_XLU_SURF(2)
1012#define G_RM_ZB_OPA_DECAL RM_ZB_OPA_DECAL(1)
1013#define G_RM_ZB_OPA_DECAL2 RM_ZB_OPA_DECAL(2)
1014#define G_RM_ZB_XLU_DECAL RM_ZB_XLU_DECAL(1)
1015#define G_RM_ZB_XLU_DECAL2 RM_ZB_XLU_DECAL(2)
1016#define G_RM_ZB_CLD_SURF RM_ZB_CLD_SURF(1)
1017#define G_RM_ZB_CLD_SURF2 RM_ZB_CLD_SURF(2)
1018#define G_RM_ZB_OVL_SURF RM_ZB_OVL_SURF(1)
1019#define G_RM_ZB_OVL_SURF2 RM_ZB_OVL_SURF(2)
1020#define G_RM_ZB_PCL_SURF RM_ZB_PCL_SURF(1)
1021#define G_RM_ZB_PCL_SURF2 RM_ZB_PCL_SURF(2)
1022
1023#define G_RM_OPA_SURF RM_OPA_SURF(1)
1024#define G_RM_OPA_SURF2 RM_OPA_SURF(2)
1025#define G_RM_XLU_SURF RM_XLU_SURF(1)
1026#define G_RM_XLU_SURF2 RM_XLU_SURF(2)
1027#define G_RM_CLD_SURF RM_CLD_SURF(1)
1028#define G_RM_CLD_SURF2 RM_CLD_SURF(2)
1029#define G_RM_TEX_EDGE RM_TEX_EDGE(1)
1030#define G_RM_TEX_EDGE2 RM_TEX_EDGE(2)
1031#define G_RM_PCL_SURF RM_PCL_SURF(1)
1032#define G_RM_PCL_SURF2 RM_PCL_SURF(2)
1033#define G_RM_ADD RM_ADD(1)
1034#define G_RM_ADD2 RM_ADD(2)
1035#define G_RM_NOOP RM_NOOP(1)
1036#define G_RM_NOOP2 RM_NOOP(2)
1037#define G_RM_VISCVG RM_VISCVG(1)
1038#define G_RM_VISCVG2 RM_VISCVG(2)
1039#define G_RM_OPA_CI RM_OPA_CI(1)
1040#define G_RM_OPA_CI2 RM_OPA_CI(2)
1041
1042
1043#define G_RM_FOG_SHADE_A GBL_c1(G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA)
1044#define G_RM_FOG_PRIM_A GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_IN, G_BL_1MA)
1045#define G_RM_PASS GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
1046
1047/*
1048 * G_SETCONVERT: K0-5
1049 */
1050#define G_CV_K0 175
1051#define G_CV_K1 -43
1052#define G_CV_K2 -89
1053#define G_CV_K3 222
1054#define G_CV_K4 114
1055#define G_CV_K5 42
1056
1057/*
1058 * G_SETSCISSOR: interlace mode
1059 */
1060#define G_SC_NON_INTERLACE 0
1061#define G_SC_ODD_INTERLACE 3
1062#define G_SC_EVEN_INTERLACE 2
1063
1064/*
1065 * Data Structures
1066 */
1067
1071typedef struct {
1072 short ob[3];
1073 unsigned short flag;
1074 short tc[2];
1075 unsigned char cn[4];
1076} Vtx_t;
1077
1081typedef struct {
1082 short ob[3];
1083 unsigned short flag;
1084 short tc[2];
1085 signed char n[3];
1086 unsigned char a;
1087} Vtx_tn;
1088
1092typedef union {
1093 Vtx_t v;
1096} Vtx;
1097
1098typedef struct {
1099 short pos[3];
1100 short pad;
1101} PlainVtx_t;
1102
1103typedef union {
1104 PlainVtx_t c;
1105 long long int force_structure_alignment;
1106} PlainVtx;
1107
1111typedef struct {
1112 unsigned char flag;
1113 unsigned char v[3];
1114} Tri;
1115
1121typedef long int Mtx_t[4][4];
1122typedef union {
1123 Mtx_t m;
1124 struct {
1125 u16 intPart[4][4];
1126 u16 fracPart[4][4];
1127 };
1128 long long int force_structure_alignment;
1129} Mtx;
1130
1131#define IPART(x) (((s32)((x) * 0x10000) >> 16) & 0xFFFF)
1132#define FPART(x) ((s32)((x) * 0x10000) & 0xFFFF)
1133
1134#define gdSPDefMtx( \
1135 xx, xy, xz, xw, \
1136 yx, yy, yz, yw, \
1137 zx, zy, zz, zw, \
1138 wx, wy, wz, ww) \
1139 { { \
1140 (IPART(xx) << 16) | IPART(yx), \
1141 (IPART(zx) << 16) | IPART(wx), \
1142 (IPART(xy) << 16) | IPART(yy), \
1143 (IPART(zy) << 16) | IPART(wy), \
1144 (IPART(xz) << 16) | IPART(yz), \
1145 (IPART(zz) << 16) | IPART(wz), \
1146 (IPART(xw) << 16) | IPART(yw), \
1147 (IPART(zw) << 16) | IPART(ww), \
1148 (FPART(xx) << 16) | FPART(yx), \
1149 (FPART(zx) << 16) | FPART(wx), \
1150 (FPART(xy) << 16) | FPART(yy), \
1151 (FPART(zy) << 16) | FPART(wy), \
1152 (FPART(xz) << 16) | FPART(yz), \
1153 (FPART(zz) << 16) | FPART(wz), \
1154 (FPART(xw) << 16) | FPART(yw), \
1155 (FPART(zw) << 16) | FPART(ww), \
1156 } }
1157
1158/*
1159 * Viewport
1160 */
1161
1162/*
1163 * This magic value is the maximum INTEGER z-range of the hardware
1164 * (there are also 16-bits of fraction, which are introduced during
1165 * any transformations). This is not just a good idea, it's the law.
1166 * Feeding the hardware eventual z-coordinates (after any transforms
1167 * or scaling) bigger than this, will not work.
1168 *
1169 * This number is DIFFERENT than G_MAXFBZ, which is the maximum value
1170 * you want to use to initialize the z-buffer.
1171 *
1172 * The reason these are different is mildly interesting, but too long
1173 * to explain here. It is basically the result of optimizations in the
1174 * hardware. A more generic API might hide this detail from the users,
1175 * but we don't have the ucode to do that...
1176 *
1177 */
1178#define G_MAXZ 0x03FF /* 10 bits of integer screen-Z precision */
1179
1191typedef struct {
1192 short vscale[4];
1193 short vtrans[4];
1194 /* both the above arrays are padded to 64-bit boundary */
1195} Vp_t;
1196
1197typedef union {
1198 Vp_t vp;
1199 long long int force_structure_alignment[2];
1200} Vp;
1201
1208typedef struct {
1209 unsigned char col[3];
1210 unsigned char type;
1211 unsigned char colc[3];
1212 char pad2;
1213 signed char dir[3];
1214 char pad3;
1215 char pad4[3];
1216 unsigned char size;
1217} Light_t;
1218
1225typedef struct {
1226 unsigned char col[3];
1227 unsigned char kc;
1228 unsigned char colc[3];
1229 unsigned char kl;
1230 short pos[3];
1231 unsigned char kq;
1232 unsigned char size;
1233} PointLight_t;
1234
1238typedef struct {
1239 unsigned char col[3];
1240 char pad1;
1241 unsigned char colc[3];
1242 char pad2;
1243} Ambient_t;
1244
1245typedef struct {
1246 signed char dir[3];
1247 char pad1;
1248} LookAt_t;
1249
1250typedef struct {
1251 LookAt_t l;
1252} LookAtWrapper;
1253
1254typedef struct {
1255 /* texture offsets for highlight 1/2 */
1256 int x1;
1257 int y1;
1258 int x2;
1259 int y2;
1260} Hilite_t;
1261
1262typedef struct {
1263 short c0;
1264 short c1;
1265 short c2;
1266 short c3;
1267 short c4;
1268 short c5;
1269 short c6;
1270 short c7;
1271 short kx;
1272 short ky;
1273 short kz;
1274 short kc;
1275} OcclusionPlane_t;
1276
1277typedef struct {
1278 struct {
1279 short x;
1280 short y;
1281 short z;
1282 } v[4];
1283 float weight;
1284} OcclusionPlaneCandidate;
1285
1286typedef union {
1287 Light_t l;
1288 PointLight_t p;
1289 long long int force_structure_alignment[2];
1290} Light;
1291
1292typedef union {
1293 Ambient_t l;
1294 long long int force_structure_alignment[1];
1295} Ambient;
1296
1297typedef union {
1298 LookAtWrapper l[2];
1299 long long int force_structure_alignment[1];
1300} LookAt;
1301
1302typedef union {
1303 Hilite_t h;
1304 long int force_structure_alignment;
1305} Hilite;
1306
1307typedef union {
1308 OcclusionPlane_t o;
1309 short c[12];
1310 long long int force_structure_alignment[3];
1311} OcclusionPlane;
1312
1313typedef struct {
1314 Light l[9];
1315 Ambient a;
1316} Lightsn;
1317
1318typedef struct {
1319 /* F3DEX3 properly supports zero lights, unlike F3DEX2 where you need
1320 to include one black directional light. */
1321 Ambient a;
1322} Lights0;
1323
1324typedef struct {
1325 Light l[1];
1326 Ambient a;
1327} Lights1;
1328
1329typedef struct {
1330 Light l[2];
1331 Ambient a;
1332} Lights2;
1333
1334typedef struct {
1335 Light l[3];
1336 Ambient a;
1337} Lights3;
1338
1339typedef struct {
1340 Light l[4];
1341 Ambient a;
1342} Lights4;
1343
1344typedef struct {
1345 Light l[5];
1346 Ambient a;
1347} Lights5;
1348
1349typedef struct {
1350 Light l[6];
1351 Ambient a;
1352} Lights6;
1353
1354typedef struct {
1355 Light l[7];
1356 Ambient a;
1357} Lights7;
1358
1359typedef struct {
1360 Light l[8];
1361 Ambient a;
1362} Lights8;
1363
1364typedef struct {
1365 Light l[9];
1366 Ambient a;
1367} Lights9;
1368
1369#define gDefAmbient(r, g, b) \
1370 {{ \
1371 { (r), (g), (b) }, 0, \
1372 { (r), (g), (b) }, 0, \
1373 }}
1374
1375#define gDefLight(r, g, b, x, y, z) \
1376 {{ \
1377 { (r), (g), (b) }, 0, \
1378 { (r), (g), (b) }, 0, \
1379 { (x), (y), (z) }, 0, \
1380 { 0, 0, 0 }, 0, \
1381 }}
1382
1383#define gdSPDefLights0(ar, ag, ab) \
1384 { \
1385 gDefAmbient(ar, ag, ab), \
1386 }
1387
1388#define gdSPDefLights1(ar, ag, ab, \
1389 r1, g1, b1, x1, y1, z1) \
1390 { \
1391 { \
1392 gDefLight(r1, g1, b1, x1, y1, z1), \
1393 }, \
1394 gDefAmbient(ar, ag, ab), \
1395 }
1396
1397#define gdSPDefLights2(ar, ag, ab, \
1398 r1, g1, b1, x1, y1, z1, \
1399 r2, g2, b2, x2, y2, z2) \
1400 { \
1401 { \
1402 gDefLight(r1, g1, b1, x1, y1, z1), \
1403 gDefLight(r2, g2, b2, x2, y2, z2), \
1404 }, \
1405 gDefAmbient(ar, ag, ab), \
1406 }
1407
1408#define gdSPDefLights3(ar, ag, ab, \
1409 r1, g1, b1, x1, y1, z1, \
1410 r2, g2, b2, x2, y2, z2) \
1411 r3, g3, b3, x3, y3, z3) \
1412 { \
1413 { \
1414 gDefLight(r1, g1, b1, x1, y1, z1), \
1415 gDefLight(r2, g2, b2, x2, y2, z2), \
1416 gDefLight(r3, g3, b3, x3, y3, z3), \
1417 }, \
1418 gDefAmbient(ar, ag, ab), \
1419 }
1420
1421#define gdSPDefLights4(ar, ag, ab, \
1422 r1, g1, b1, x1, y1, z1, \
1423 r2, g2, b2, x2, y2, z2, \
1424 r3, g3, b3, x3, y3, z3, \
1425 r4, g4, b4, x4, y4, z4) \
1426 { \
1427 { \
1428 gDefLight(r1, g1, b1, x1, y1, z1), \
1429 gDefLight(r2, g2, b2, x2, y2, z2), \
1430 gDefLight(r3, g3, b3, x3, y3, z3), \
1431 gDefLight(r4, g4, b4, x4, y4, z4), \
1432 }, \
1433 gDefAmbient(ar, ag, ab), \
1434 }
1435
1436#define gdSPDefLights5(ar, ag, ab, \
1437 r1, g1, b1, x1, y1, z1, \
1438 r2, g2, b2, x2, y2, z2, \
1439 r3, g3, b3, x3, y3, z3, \
1440 r4, g4, b4, x4, y4, z4, \
1441 r5, g5, b5, x5, y5, z5) \
1442 { \
1443 { \
1444 gDefLight(r1, g1, b1, x1, y1, z1), \
1445 gDefLight(r2, g2, b2, x2, y2, z2), \
1446 gDefLight(r3, g3, b3, x3, y3, z3), \
1447 gDefLight(r4, g4, b4, x4, y4, z4), \
1448 gDefLight(r5, g5, b5, x5, y5, z5), \
1449 }, \
1450 gDefAmbient(ar, ag, ab), \
1451 }
1452
1453#define gdSPDefLights6(ar, ag, ab, \
1454 r1, g1, b1, x1, y1, z1, \
1455 r2, g2, b2, x2, y2, z2, \
1456 r3, g3, b3, x3, y3, z3, \
1457 r4, g4, b4, x4, y4, z4, \
1458 r5, g5, b5, x5, y5, z5, \
1459 r6, g6, b6, x6, y6, z6) \
1460 { \
1461 { \
1462 gDefLight(r1, g1, b1, x1, y1, z1), \
1463 gDefLight(r2, g2, b2, x2, y2, z2), \
1464 gDefLight(r3, g3, b3, x3, y3, z3), \
1465 gDefLight(r4, g4, b4, x4, y4, z4), \
1466 gDefLight(r5, g5, b5, x5, y5, z5), \
1467 gDefLight(r6, g6, b6, x6, y6, z6), \
1468 }, \
1469 gDefAmbient(ar, ag, ab), \
1470 }
1471
1472#define gdSPDefLights7(ar, ag, ab, \
1473 r1, g1, b1, x1, y1, z1, \
1474 r2, g2, b2, x2, y2, z2, \
1475 r3, g3, b3, x3, y3, z3, \
1476 r4, g4, b4, x4, y4, z4, \
1477 r5, g5, b5, x5, y5, z5, \
1478 r6, g6, b6, x6, y6, z6, \
1479 r7, g7, b7, x7, y7, z7) \
1480 { \
1481 { \
1482 gDefLight(r1, g1, b1, x1, y1, z1), \
1483 gDefLight(r2, g2, b2, x2, y2, z2), \
1484 gDefLight(r3, g3, b3, x3, y3, z3), \
1485 gDefLight(r4, g4, b4, x4, y4, z4), \
1486 gDefLight(r5, g5, b5, x5, y5, z5), \
1487 gDefLight(r6, g6, b6, x6, y6, z6), \
1488 gDefLight(r7, g7, b7, x7, y7, z7), \
1489 }, \
1490 gDefAmbient(ar, ag, ab), \
1491 }
1492
1493#define gdSPDefLights8(ar, ag, ab, \
1494 r1, g1, b1, x1, y1, z1, \
1495 r2, g2, b2, x2, y2, z2, \
1496 r3, g3, b3, x3, y3, z3, \
1497 r4, g4, b4, x4, y4, z4, \
1498 r5, g5, b5, x5, y5, z5, \
1499 r6, g6, b6, x6, y6, z6, \
1500 r7, g7, b7, x7, y7, z7, \
1501 r8, g8, b8, x8, y8, z8) \
1502 { \
1503 { \
1504 gDefLight(r1, g1, b1, x1, y1, z1), \
1505 gDefLight(r2, g2, b2, x2, y2, z2), \
1506 gDefLight(r3, g3, b3, x3, y3, z3), \
1507 gDefLight(r4, g4, b4, x4, y4, z4), \
1508 gDefLight(r5, g5, b5, x5, y5, z5), \
1509 gDefLight(r6, g6, b6, x6, y6, z6), \
1510 gDefLight(r7, g7, b7, x7, y7, z7), \
1511 gDefLight(r8, g8, b8, x8, y8, z8), \
1512 }, \
1513 gDefAmbient(ar, ag, ab), \
1514 }
1515
1516#define gdSPDefLights9(ar, ag, ab, \
1517 r1, g1, b1, x1, y1, z1, \
1518 r2, g2, b2, x2, y2, z2, \
1519 r3, g3, b3, x3, y3, z3, \
1520 r4, g4, b4, x4, y4, z4, \
1521 r5, g5, b5, x5, y5, z5, \
1522 r6, g6, b6, x6, y6, z6, \
1523 r7, g7, b7, x7, y7, z7, \
1524 r8, g8, b8, x8, y8, z8, \
1525 r9, g9, b9, x9, y9, z9) \
1526 { \
1527 { \
1528 gDefLight(r1, g1, b1, x1, y1, z1), \
1529 gDefLight(r2, g2, b2, x2, y2, z2), \
1530 gDefLight(r3, g3, b3, x3, y3, z3), \
1531 gDefLight(r4, g4, b4, x4, y4, z4), \
1532 gDefLight(r5, g5, b5, x5, y5, z5), \
1533 gDefLight(r6, g6, b6, x6, y6, z6), \
1534 gDefLight(r7, g7, b7, x7, y7, z7), \
1535 gDefLight(r8, g8, b8, x8, y8, z8), \
1536 gDefLight(r9, g9, b9, x9, y9, z9), \
1537 }, \
1538 gDefAmbient(ar, ag, ab), \
1539 }
1540
1541#define gDefPointLight(r, g, b, x, y, z, kc, kl, kq) \
1542 {{ \
1543 { (r1), (g1), (b1) }, (kc), \
1544 { (r1), (g1), (b1) }, (kl), \
1545 { (x1), (y1), (z1) }, (kq), \
1546 0, \
1547 }}
1548
1549#define gdSPDefPointLights0(ar, ag, ab) \
1550 { \
1551 gDefAmbient(ar, ag, ab), \
1552 }
1553
1554#define gdSPDefPointLights1(ar, ag, ab, \
1555 r1, g1, b1, x1, y1, z1, c1, l1, q1) \
1556 { \
1557 { \
1558 gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \
1559 }, \
1560 gDefAmbient(ar, ag, ab), \
1561 }
1562
1563#define gdSPDefPointLights2(ar, ag, ab, \
1564 r1, g1, b1, x1, y1, z1, c1, l1, q1, \
1565 r2, g2, b2, x2, y2, z2, c2, l2, q2) \
1566 { \
1567 { \
1568 gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \
1569 gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \
1570 }, \
1571 gDefAmbient(ar, ag, ab), \
1572 }
1573
1574#define gdSPDefPointLights3(ar, ag, ab, \
1575 r1, g1, b1, x1, y1, z1, c1, l1, q1, \
1576 r2, g2, b2, x2, y2, z2, c2, l2, q2, \
1577 r3, g3, b3, x3, y3, z3, c3, l3, q3) \
1578 { \
1579 { \
1580 gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \
1581 gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \
1582 gDefPointLight(r3, g3, b3, x3, y3, z3, c3, l3, q3), \
1583 }, \
1584 gDefAmbient(ar, ag, ab), \
1585 }
1586
1587#define gdSPDefPointLights4(ar, ag, ab, \
1588 r1, g1, b1, x1, y1, z1, c1, l1, q1, \
1589 r2, g2, b2, x2, y2, z2, c2, l2, q2, \
1590 r3, g3, b3, x3, y3, z3, c3, l3, q3, \
1591 r4, g4, b4, x4, y4, z4, c4, l4, q4) \
1592 { \
1593 { \
1594 gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \
1595 gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \
1596 gDefPointLight(r3, g3, b3, x3, y3, z3, c3, l3, q3), \
1597 gDefPointLight(r4, g4, b4, x4, y4, z4, c4, l4, q4), \
1598 }, \
1599 gDefAmbient(ar, ag, ab), \
1600 }
1601
1602#define gdSPDefPointLights5(ar, ag, ab, \
1603 r1, g1, b1, x1, y1, z1, c1, l1, q1, \
1604 r2, g2, b2, x2, y2, z2, c2, l2, q2, \
1605 r3, g3, b3, x3, y3, z3, c3, l3, q3, \
1606 r4, g4, b4, x4, y4, z4, c4, l4, q4, \
1607 r5, g5, b5, x5, y5, z5, c5, l5, q5) \
1608 { \
1609 { \
1610 gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \
1611 gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \
1612 gDefPointLight(r3, g3, b3, x3, y3, z3, c3, l3, q3), \
1613 gDefPointLight(r4, g4, b4, x4, y4, z4, c4, l4, q4), \
1614 gDefPointLight(r5, g5, b5, x5, y5, z5, c5, l5, q5), \
1615 }, \
1616 gDefAmbient(ar, ag, ab), \
1617 }
1618
1619#define gdSPDefPointLights6(ar, ag, ab, \
1620 r1, g1, b1, x1, y1, z1, c1, l1, q1, \
1621 r2, g2, b2, x2, y2, z2, c2, l2, q2, \
1622 r3, g3, b3, x3, y3, z3, c3, l3, q3, \
1623 r4, g4, b4, x4, y4, z4, c4, l4, q4, \
1624 r5, g5, b5, x5, y5, z5, c5, l5, q5, \
1625 r6, g6, b6, x6, y6, z6, c6, l6, q6) \
1626 { \
1627 { \
1628 gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \
1629 gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \
1630 gDefPointLight(r3, g3, b3, x3, y3, z3, c3, l3, q3), \
1631 gDefPointLight(r4, g4, b4, x4, y4, z4, c4, l4, q4), \
1632 gDefPointLight(r5, g5, b5, x5, y5, z5, c5, l5, q5), \
1633 gDefPointLight(r6, g6, b6, x6, y6, z6, c6, l6, q6), \
1634 }, \
1635 gDefAmbient(ar, ag, ab), \
1636 }
1637
1638#define gdSPDefPointLights7(ar, ag, ab, \
1639 r1, g1, b1, x1, y1, z1, c1, l1, q1, \
1640 r2, g2, b2, x2, y2, z2, c2, l2, q2, \
1641 r3, g3, b3, x3, y3, z3, c3, l3, q3, \
1642 r4, g4, b4, x4, y4, z4, c4, l4, q4, \
1643 r5, g5, b5, x5, y5, z5, c5, l5, q5, \
1644 r6, g6, b6, x6, y6, z6, c6, l6, q6, \
1645 r7, g7, b7, x7, y7, z7, c7, l7, q7) \
1646 { \
1647 { \
1648 gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \
1649 gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \
1650 gDefPointLight(r3, g3, b3, x3, y3, z3, c3, l3, q3), \
1651 gDefPointLight(r4, g4, b4, x4, y4, z4, c4, l4, q4), \
1652 gDefPointLight(r5, g5, b5, x5, y5, z5, c5, l5, q5), \
1653 gDefPointLight(r6, g6, b6, x6, y6, z6, c6, l6, q6), \
1654 gDefPointLight(r7, g7, b7, x7, y7, z7, c7, l7, q7), \
1655 }, \
1656 gDefAmbient(ar, ag, ab), \
1657 }
1658
1659#define gdSPDefPointLights8(ar, ag, ab, \
1660 r1, g1, b1, x1, y1, z1, c1, l1, q1, \
1661 r2, g2, b2, x2, y2, z2, c2, l2, q2, \
1662 r3, g3, b3, x3, y3, z3, c3, l3, q3, \
1663 r4, g4, b4, x4, y4, z4, c4, l4, q4, \
1664 r5, g5, b5, x5, y5, z5, c5, l5, q5, \
1665 r6, g6, b6, x6, y6, z6, c6, l6, q6, \
1666 r7, g7, b7, x7, y7, z7, c7, l7, q7, \
1667 r8, g8, b8, x8, y8, z8, c8, l8, q8) \
1668 { \
1669 { \
1670 gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \
1671 gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \
1672 gDefPointLight(r3, g3, b3, x3, y3, z3, c3, l3, q3), \
1673 gDefPointLight(r4, g4, b4, x4, y4, z4, c4, l4, q4), \
1674 gDefPointLight(r5, g5, b5, x5, y5, z5, c5, l5, q5), \
1675 gDefPointLight(r6, g6, b6, x6, y6, z6, c6, l6, q6), \
1676 gDefPointLight(r7, g7, b7, x7, y7, z7, c7, l7, q7), \
1677 gDefPointLight(r8, g8, b8, x8, y8, z8, c8, l8, q8), \
1678 }, \
1679 gDefAmbient(ar, ag, ab), \
1680 }
1681
1682#define gdSPDefPointLights9(ar, ag, ab, \
1683 r1, g1, b1, x1, y1, z1, c1, l1, q1, \
1684 r2, g2, b2, x2, y2, z2, c2, l2, q2, \
1685 r3, g3, b3, x3, y3, z3, c3, l3, q3, \
1686 r4, g4, b4, x4, y4, z4, c4, l4, q4, \
1687 r5, g5, b5, x5, y5, z5, c5, l5, q5, \
1688 r6, g6, b6, x6, y6, z6, c6, l6, q6, \
1689 r7, g7, b7, x7, y7, z7, c7, l7, q7, \
1690 r8, g8, b8, x8, y8, z8, c8, l8, q8, \
1691 r9, g9, b9, x9, y9, z9, c9, l9, q9) \
1692 { \
1693 { \
1694 gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \
1695 gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \
1696 gDefPointLight(r3, g3, b3, x3, y3, z3, c3, l3, q3), \
1697 gDefPointLight(r4, g4, b4, x4, y4, z4, c4, l4, q4), \
1698 gDefPointLight(r5, g5, b5, x5, y5, z5, c5, l5, q5), \
1699 gDefPointLight(r6, g6, b6, x6, y6, z6, c6, l6, q6), \
1700 gDefPointLight(r7, g7, b7, x7, y7, z7, c7, l7, q7), \
1701 gDefPointLight(r8, g8, b8, x8, y8, z8, c8, l8, q8), \
1702 gDefPointLight(r9, g9, b9, x9, y9, z9, c9, l9, q9), \
1703 }, \
1704 gDefAmbient(ar, ag, ab), \
1705 }
1706
1707#define gdSPDefLookAt(rightx, righty, rightz, upx, upy, upz) \
1708 { \
1709 {{{ rightx, righty, rightz }, 0 }}, \
1710 {{{ upx, upy, upz }, 0 }}, \
1711 }
1712
1713typedef struct {
1714 int cmd : 8;
1715 unsigned int type : 8;
1716 unsigned int len : 16;
1717 union {
1718 /* The exact form of this callback is intentionally left unspecified, a display list
1719 parser may choose the return value and parameters so long as it is consistent. */
1720 void (*callback)();
1721 const char* str;
1722 unsigned int u32;
1723 float f32;
1724 void* addr;
1725 } value;
1726} Gnoop;
1727
1731typedef struct {
1732 int cmd : 8;
1733 unsigned int par : 8;
1734 unsigned int len : 16;
1735 unsigned int addr;
1736} Gdma;
1737
1741typedef struct {
1742 int cmd : 8;
1743 unsigned int len : 8;
1744 unsigned int ofs : 8;
1745 unsigned int par : 8;
1746 unsigned int addr;
1747} Gdma2;
1748
1752typedef struct {
1753 int cmd : 8;
1754 unsigned int index : 8;
1755 unsigned int offset : 16;
1756 unsigned int data;
1757} Gmovewd;
1758
1762typedef struct {
1763 int cmd : 8;
1764 unsigned int size : 8;
1765 unsigned int offset : 8;
1766 unsigned int index : 8;
1767 unsigned int data;
1768} Gmovemem;
1769
1773typedef struct {
1774 int cmd : 8;
1775 int pad : 24;
1776 Tri tri;
1777} Gtri;
1778
1779typedef struct {
1780 Tri tri1; /* flag is the command byte */
1781 Tri tri2;
1782} Gtri2;
1783
1784typedef struct {
1785 Tri tri1; /* flag is the command byte */
1786 Tri tri2;
1787} Gquad;
1788
1789typedef struct {
1790 int cmd : 8;
1791 unsigned int pad : 8;
1792 unsigned short vstart_x2;
1793 unsigned short pad2;
1794 unsigned short vend_x2;
1795} Gcull;
1796
1797typedef struct {
1798 int cmd : 8;
1799 unsigned int pad : 24;
1800 unsigned short z;
1801 unsigned short dz;
1802} Gsetprimdepth;
1803
1804typedef struct {
1805 int cmd : 8;
1806 int pad1 : 24;
1807 unsigned int param;
1808} Gpopmtx;
1809
1810typedef struct {
1811 int cmd : 8;
1812 int mw_index : 8;
1813 int pad0 : 8;
1814 int number : 8;
1815 int pad1 : 8;
1816 int base : 24;
1817} Gsegment;
1818
1819typedef struct {
1820 int cmd : 8;
1821 int pad0 : 8;
1822 unsigned int sft : 8;
1823 unsigned int len : 8;
1824 unsigned int data : 32;
1825} GsetothermodeL;
1826
1827typedef struct {
1828 int cmd : 8;
1829 int pad0 : 8;
1830 unsigned int sft : 8;
1831 unsigned int len : 8;
1832 unsigned int data : 32;
1833} GsetothermodeH;
1834
1835typedef struct {
1836 unsigned char cmd;
1837 unsigned char lodscale;
1838 unsigned char pad : 2;
1839 unsigned char level : 3;
1840 unsigned char tile : 3;
1841 unsigned char on;
1842 unsigned short s;
1843 unsigned short t;
1844} Gtexture;
1845
1846typedef struct {
1847 int cmd : 8;
1848 int pad1 : 24;
1849 short int pad2;
1850 short int scale;
1851} Gperspnorm;
1852
1853
1857typedef struct {
1858 int cmd : 8;
1859 unsigned int fmt : 3;
1860 unsigned int siz : 2;
1861 unsigned int pad : 7;
1862 unsigned int wd : 12; /* really only 10 bits, extra */
1863 unsigned int dram; /* to account for 1024 */
1864} Gsetimg;
1865
1866typedef struct {
1867 int cmd : 8;
1868 /* muxs0 */
1869 unsigned int a0 : 4;
1870 unsigned int c0 : 5;
1871 unsigned int Aa0 : 3;
1872 unsigned int Ac0 : 3;
1873 unsigned int a1 : 4;
1874 unsigned int c1 : 5;
1875 /* muxs1 */
1876 unsigned int b0 : 4;
1877 unsigned int b1 : 4;
1878 unsigned int Aa1 : 3;
1879 unsigned int Ac1 : 3;
1880 unsigned int d0 : 3;
1881 unsigned int Ab0 : 3;
1882 unsigned int Ad0 : 3;
1883 unsigned int d1 : 3;
1884 unsigned int Ab1 : 3;
1885 unsigned int Ad1 : 3;
1886} Gsetcombine;
1887
1888typedef struct {
1889 int cmd : 8;
1890 unsigned char pad;
1891 unsigned char prim_min_level;
1892 unsigned char prim_level;
1893 union {
1894 unsigned long color;
1895 struct {
1896 unsigned char r;
1897 unsigned char g;
1898 unsigned char b;
1899 unsigned char a;
1900 };
1901 };
1902} Gsetcolor;
1903
1904typedef struct {
1905 int cmd : 8;
1906 int x0 : 10;
1907 int x0frac : 2;
1908 int y0 : 10;
1909 int y0frac : 2;
1910 unsigned int pad : 8;
1911 int x1 : 10;
1912 int x1frac : 2;
1913 int y1 : 10;
1914 int y1frac : 2;
1915} Gfillrect;
1916
1917typedef struct {
1918 int cmd : 8;
1919 unsigned int fmt : 3;
1920 unsigned int siz : 2;
1921 unsigned int pad0 : 1;
1922 unsigned int line : 9;
1923 unsigned int tmem : 9;
1924 unsigned int pad1 : 5;
1925 unsigned int tile : 3;
1926 unsigned int palette : 4;
1927 unsigned int ct : 1;
1928 unsigned int mt : 1;
1929 unsigned int maskt : 4;
1930 unsigned int shiftt : 4;
1931 unsigned int cs : 1;
1932 unsigned int ms : 1;
1933 unsigned int masks : 4;
1934 unsigned int shifts : 4;
1935} Gsettile;
1936
1937typedef struct {
1938 int cmd : 8;
1939 unsigned int sl : 12;
1940 unsigned int tl : 12;
1941 int pad : 5;
1942 unsigned int tile : 3;
1943 unsigned int sh : 12;
1944 unsigned int th : 12;
1945} Gloadtile;
1946
1947typedef Gloadtile Gloadblock;
1948
1949typedef Gloadtile Gsettilesize;
1950
1951typedef Gloadtile Gloadtlut;
1952
1953typedef struct {
1954 unsigned int cmd : 8; /* command */
1955 unsigned int xl : 12; /* X coordinate of upper left */
1956 unsigned int yl : 12; /* Y coordinate of upper left */
1957 unsigned int pad1 : 5; /* Padding */
1958 unsigned int tile : 3; /* Tile descriptor index */
1959 unsigned int xh : 12; /* X coordinate of lower right */
1960 unsigned int yh : 12; /* Y coordinate of lower right */
1961 unsigned int s : 16; /* S texture coord at top left */
1962 unsigned int t : 16; /* T texture coord at top left */
1963 unsigned int dsdx : 16; /* Change in S per change in X */
1964 unsigned int dtdy : 16; /* Change in T per change in Y */
1965} Gtexrect;
1966
1967#define MakeTexRect(xh,yh,flip,tile,xl,yl,s,t,dsdx,dtdy) \
1968 G_TEXRECT, xh, yh, 0, flip, 0, tile, xl, yl, s, t, dsdx, dtdy
1969
1973typedef struct {
1974 unsigned long w0;
1975 unsigned long w1;
1976 unsigned long w2;
1977 unsigned long w3;
1978} TexRect;
1979
1980typedef struct {
1981 int cmd : 8;
1982 unsigned int pad : 4;
1983 unsigned int len : 8; /* n */
1984 unsigned int pad2 : 4;
1985 unsigned char par; /* v0 */
1986 unsigned int addr;
1987} Gvtx;
1988
1992typedef struct {
1993 unsigned int w0;
1994 unsigned int w1;
1995} Gwords;
1996
2001typedef union {
2002 Gwords words;
2003 Gnoop noop;
2004 Gdma dma;
2005 Gdma2 dma2;
2006 Gvtx vtx;
2007 Gtri tri;
2008 Gtri2 tri2;
2009 Gquad quad;
2010 Gcull cull;
2011 Gmovewd movewd;
2012 Gmovemem movemem;
2013 Gpopmtx popmtx;
2014 Gsegment segment;
2015 GsetothermodeH setothermodeH;
2016 GsetothermodeL setothermodeL;
2017 Gtexture texture;
2018 Gperspnorm perspnorm;
2019 Gsetimg setimg;
2020 Gsetcombine setcombine;
2021 Gsetcolor setcolor;
2022 Gfillrect fillrect; /* use for setscissor also */
2023 Gsettile settile;
2024 Gloadtile loadtile; /* use for loadblock also, th is dxt */
2025 Gsettilesize settilesize;
2026 Gloadtlut loadtlut;
2027 Gsetprimdepth setprimdepth;
2028 long long int force_structure_alignment;
2029} Gfx;
2030
2031/*
2032 * Macros to assemble the graphics display list
2033 */
2034
2035/*
2036 * DMA macros
2037 */
2038#define gDma0p(pkt, c, s, l) \
2039_DW({ \
2040 Gfx *_g = (Gfx *)(pkt); \
2041 \
2042 _g->words.w0 = (_SHIFTL((c), 24, 8) | \
2043 _SHIFTL((l), 0, 24)); \
2044 _g->words.w1 = (unsigned int)(s); \
2045})
2046
2047#define gsDma0p(c, s, l) \
2048{ \
2049 (_SHIFTL((c), 24, 8) | \
2050 _SHIFTL((l), 0, 24)), \
2051 (unsigned int)(s) \
2052}
2053
2054#define gDma1p(pkt, c, s, l, p) \
2055_DW({ \
2056 Gfx *_g = (Gfx *)(pkt); \
2057 \
2058 _g->words.w0 = (_SHIFTL((c), 24, 8) | \
2059 _SHIFTL((p), 16, 8) | \
2060 _SHIFTL((l), 0, 16)); \
2061 _g->words.w1 = (unsigned int)(s); \
2062})
2063
2064#define gsDma1p(c, s, l, p) \
2065{ \
2066 (_SHIFTL((c), 24, 8) | \
2067 _SHIFTL((p), 16, 8) | \
2068 _SHIFTL((l), 0, 16)), \
2069 (unsigned int)(s) \
2070}
2071
2072#define gDma2p(pkt, c, adrs, len, idx, ofs) \
2073_DW({ \
2074 Gfx *_g = (Gfx *)(pkt); \
2075 \
2076 _g->words.w0 = (_SHIFTL((c), 24, 8) | \
2077 _SHIFTL(((len) - 1) / 8, 19, 5) | \
2078 _SHIFTL((ofs) / 8, 8, 8) | \
2079 _SHIFTL((idx), 0, 8)); \
2080 _g->words.w1 = (unsigned int)(adrs); \
2081})
2082
2083#define gsDma2p(c, adrs, len, idx, ofs) \
2084{ \
2085 (_SHIFTL((c), 24, 8) | \
2086 _SHIFTL(((len) - 1) / 8, 19, 5) | \
2087 _SHIFTL((ofs) / 8, 8, 8) | \
2088 _SHIFTL((idx), 0, 8)), \
2089 (unsigned int)(adrs) \
2090}
2091
2092#define gSPNoOp(pkt) gDma0p(pkt, G_SPNOOP, 0, 0)
2093#define gsSPNoOp() gsDma0p( G_SPNOOP, 0, 0)
2094
2153#define gSPMatrix(pkt, m, p) \
2154 gDma2p((pkt),G_MTX, (m), sizeof(Mtx), (p) ^ G_MTX_PUSH, 0)
2160#define gsSPMatrix(m, p) \
2161 gsDma2p( G_MTX, (m), sizeof(Mtx), (p) ^ G_MTX_PUSH, 0)
2162
2176#define gSPPopMatrixN(pkt, n, num) gDma2p((pkt), G_POPMTX, (num) * 64, 64, 2, 0)
2182#define gsSPPopMatrixN(n, num) gsDma2p( G_POPMTX, (num) * 64, 64, 2, 0)
2195#define gSPPopMatrix(pkt, n) gSPPopMatrixN((pkt), (n), 1)
2201#define gsSPPopMatrix(n) gsSPPopMatrixN( (n), 1)
2202
2228#define gSPVertex(pkt, v, n, v0) \
2229_DW({ \
2230 Gfx *_g = (Gfx *)(pkt); \
2231 \
2232 _g->words.w0 = (_SHIFTL(G_VTX, 24, 8) | \
2233 _SHIFTL((n), 12, 8) | \
2234 _SHIFTL((v0) + (n), 1, 7)); \
2235 _g->words.w1 = (unsigned int)(v); \
2236})
2237
2243#define gsSPVertex(v, n, v0) \
2244{ \
2245 (_SHIFTL(G_VTX, 24, 8) | \
2246 _SHIFTL((n), 12, 8) | \
2247 _SHIFTL((v0) + (n), 1, 7)), \
2248 (unsigned int)(v) \
2249}
2250
2251#define gSPViewport(pkt, v) \
2252 gDma2p((pkt), G_MOVEMEM, (v), sizeof(Vp), G_MV_VIEWPORT, 0)
2253#define gsSPViewport(v) \
2254 gsDma2p( G_MOVEMEM, (v), sizeof(Vp), G_MV_VIEWPORT, 0)
2255
2256/*
2257 * Display list control flow
2258 */
2259
2260#define _gSPDisplayListRaw(pkt,dl,hint) gDma1p(pkt, G_DL, dl, hint, G_DL_PUSH)
2261#define _gsSPDisplayListRaw( dl,hint) gsDma1p( G_DL, dl, hint, G_DL_PUSH)
2262
2263#define _gSPBranchListRaw(pkt,dl,hint) gDma1p(pkt, G_DL, dl, hint, G_DL_NOPUSH)
2264#define _gsSPBranchListRaw( dl,hint) gsDma1p( G_DL, dl, hint, G_DL_NOPUSH)
2265
2266#define _gSPEndDisplayListRaw(pkt,hint) gDma0p(pkt, G_ENDDL, 0, hint)
2267#define _gsSPEndDisplayListRaw(hint) gsDma0p( G_ENDDL, 0, hint)
2268
2269/*
2270 * Converts a total expected count of DL commands to a number of bytes to
2271 * initially NOT load into the DL command buffer.
2272 */
2273#define _DLHINTVALUE(count) \
2274 (((count) > 0 && ((count) % G_INPUT_BUFFER_CMDS) > 0) ? \
2275 ((G_INPUT_BUFFER_CMDS - ((count) % G_INPUT_BUFFER_CMDS)) << 3) : 0)
2276
2288#define gSPDisplayListHint(pkt, dl, count) _gSPDisplayListRaw(pkt, dl, _DLHINTVALUE(count))
2292#define gsSPDisplayListHint( dl, count) _gsSPDisplayListRaw( dl, _DLHINTVALUE(count))
2293
2297#define gSPBranchListHint(pkt, dl, count) _gSPBranchListRaw( pkt, dl, _DLHINTVALUE(count))
2298
2302#define gsSPBranchListHint( dl, count) _gsSPBranchListRaw( dl, _DLHINTVALUE(count))
2303
2307#define gSPEndDisplayListHint(pkt, count) _gSPEndDisplayListRaw( pkt, _DLHINTVALUE(count))
2308
2312#define gsSPEndDisplayListHint( count) _gsSPEndDisplayListRaw( _DLHINTVALUE(count))
2313
2317#define gSPDisplayList(pkt, dl) _gSPDisplayListRaw(pkt, dl, 0)
2321#define gsSPDisplayList( dl) _gsSPDisplayListRaw( dl, 0)
2322
2326#define gSPBranchList(pkt, dl) _gSPBranchListRaw( pkt, dl, 0)
2330#define gsSPBranchList( dl) _gsSPBranchListRaw( dl, 0)
2331
2335#define gSPEndDisplayList(pkt) _gSPEndDisplayListRaw( pkt, 0)
2339#define gsSPEndDisplayList( ) _gsSPEndDisplayListRaw( 0)
2340
2341
2348#define gSPLoadUcodeEx(pkt, uc_start, uc_dstart, uc_dsize) \
2349_DW({ \
2350 Gfx *_g = (Gfx *)(pkt); \
2351 \
2352 _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
2353 _g->words.w1 = (unsigned int)(uc_dstart); \
2354 \
2355 _g = (Gfx *)(pkt); \
2356 \
2357 _g->words.w0 = (_SHIFTL(G_LOAD_UCODE, 24, 8) | \
2358 _SHIFTL((int)(uc_dsize) - 1, 0, 16)); \
2359 _g->words.w1 = (unsigned int)(uc_start); \
2360})
2361
2365#define gsSPLoadUcodeEx(uc_start, uc_dstart, uc_dsize) \
2366{ \
2367 _SHIFTL(G_RDPHALF_1, 24, 8), \
2368 (unsigned int)(uc_dstart), \
2369}, \
2370{ \
2371 (_SHIFTL(G_LOAD_UCODE, 24, 8) | \
2372 _SHIFTL((int)(uc_dsize) - 1, 0, 16)), \
2373 (unsigned int)(uc_start), \
2374}
2375
2376#define gSPLoadUcode(pkt, uc_start, uc_dstart) \
2377 gSPLoadUcodeEx((pkt), (uc_start), (uc_dstart), SP_UCODE_DATA_SIZE)
2378#define gsSPLoadUcode(uc_start, uc_dstart) \
2379 gsSPLoadUcodeEx((uc_start), (uc_dstart), SP_UCODE_DATA_SIZE)
2380
2381#define gSPLoadUcodeL(pkt, ucode) \
2382 gSPLoadUcode((pkt), OS_K0_TO_PHYSICAL(& ucode##TextStart), \
2383 OS_K0_TO_PHYSICAL(& ucode##DataStart))
2384#define gsSPLoadUcodeL(ucode) \
2385 gsSPLoadUcode( OS_K0_TO_PHYSICAL(& ucode##TextStart), \
2386 OS_K0_TO_PHYSICAL(& ucode##DataStart))
2387
2391#define gSPDma_io(pkt, flag, dmem, dram, size) \
2392_DW({ \
2393 Gfx *_g = (Gfx *)(pkt); \
2394 \
2395 _g->words.w0 = (_SHIFTL(G_DMA_IO, 24, 8) | \
2396 _SHIFTL((flag), 23, 1) | \
2397 _SHIFTL((dmem) / 8, 13, 10) | \
2398 _SHIFTL((size) - 1, 0, 12)); \
2399 _g->words.w1 = (unsigned int)(dram); \
2400})
2401
2405#define gsSPDma_io(flag, dmem, dram, size) \
2406{ \
2407 (_SHIFTL(G_DMA_IO, 24, 8) | \
2408 _SHIFTL((flag), 23, 1) | \
2409 _SHIFTL((dmem) / 8, 13, 10) | \
2410 _SHIFTL((size) - 1, 0, 12)), \
2411 (unsigned int)(dram) \
2412}
2413
2414#define gSPDmaRead(pkt,dmem,dram,size) gSPDma_io((pkt),0,(dmem),(dram),(size))
2415#define gsSPDmaRead(dmem,dram,size) gsSPDma_io( 0,(dmem),(dram),(size))
2416#define gSPDmaWrite(pkt,dmem,dram,size) gSPDma_io((pkt),1,(dmem),(dram),(size))
2417#define gsSPDmaWrite(dmem,dram,size) gsSPDma_io( 1,(dmem),(dram),(size))
2418
2429#define gSPMemset(pkt, dram, value, size) \
2430_DW({ \
2431 gImmp1(pkt, G_RDPHALF_1, ((value) & 0xFFFF)); \
2432 gDma0p(pkt, G_MEMSET, (dram), ((size) & 0xFFFFF0)); \
2433})
2434
2438#define gsSPMemset(pkt, dram, value, size) \
2439 gsImmp1(G_RDPHALF_1, ((value) & 0xFFFF)), \
2440 gsDma0p(G_MEMSET, (dram), ((size) & 0xFFFFF0))
2441
2445#define gImmp0(pkt, c) \
2446_DW({ \
2447 Gfx *_g = (Gfx *)(pkt); \
2448 \
2449 _g->words.w0 = _SHIFTL((c), 24, 8); \
2450})
2451
2455#define gsImmp0(c) \
2456{ \
2457 _SHIFTL((c), 24, 8) \
2458}
2459
2460#define gImmp1(pkt, c, p0) \
2461_DW({ \
2462 Gfx *_g = (Gfx *)(pkt); \
2463 \
2464 _g->words.w0 = _SHIFTL((c), 24, 8); \
2465 _g->words.w1 = (unsigned int)(p0); \
2466})
2467
2468#define gsImmp1(c, p0) \
2469{ \
2470 _SHIFTL((c), 24, 8), \
2471 (unsigned int)(p0) \
2472}
2473
2474#define gImmp2(pkt, c, p0, p1) \
2475_DW({ \
2476 Gfx *_g = (Gfx *)(pkt); \
2477 \
2478 _g->words.w0 = _SHIFTL((c), 24, 8); \
2479 _g->words.w1 = (_SHIFTL((p0), 16, 16) | \
2480 _SHIFTL((p1), 8, 8)); \
2481})
2482
2483#define gsImmp2(c, p0, p1) \
2484{ \
2485 _SHIFTL((c), 24, 8), \
2486 (_SHIFTL((p0), 16, 16) | \
2487 _SHIFTL((p1), 8, 8)) \
2488}
2489
2490#define gImmp3(pkt, c, p0, p1, p2) \
2491_DW({ \
2492 Gfx *_g = (Gfx *)(pkt); \
2493 \
2494 _g->words.w0 = _SHIFTL((c), 24, 8); \
2495 _g->words.w1 = (_SHIFTL((p0), 16, 16) | \
2496 _SHIFTL((p1), 8, 8) | \
2497 _SHIFTL((p2), 0, 8)); \
2498})
2499
2500#define gsImmp3(c, p0, p1, p2) \
2501{ \
2502 _SHIFTL((c), 24, 8), \
2503 (_SHIFTL((p0), 16, 16) | \
2504 _SHIFTL((p1), 8, 8) | \
2505 _SHIFTL((p2), 0, 8)) \
2506}
2507
2508#define gImmp21(pkt, c, p0, p1, dat) \
2509_DW({ \
2510 Gfx *_g = (Gfx *)(pkt); \
2511 \
2512 _g->words.w0 = (_SHIFTL((c), 24, 8) | \
2513 _SHIFTL((p0), 8, 16) | \
2514 _SHIFTL((p1), 0, 8)); \
2515 _g->words.w1 = (unsigned int) (dat); \
2516})
2517
2518#define gsImmp21(c, p0, p1, dat) \
2519{ \
2520 (_SHIFTL((c), 24, 8) | \
2521 _SHIFTL((p0), 8, 16) | \
2522 _SHIFTL((p1), 0, 8)), \
2523 (unsigned int) (dat) \
2524}
2525
2526#define gMoveWd(pkt, index, offset, data) \
2527 gDma1p((pkt), G_MOVEWORD, data, (offset & 0xFFF), index)
2528#define gsMoveWd( index, offset, data) \
2529 gsDma1p( G_MOVEWORD, data, (offset & 0xFFF), index)
2530
2531#define gMoveHalfwd(pkt, index, offset, data) \
2532 gDma1p((pkt), G_MOVEWORD, data, (offset & 0xFFF) | G_MW_HALFWORD_FLAG, index)
2533#define gsMoveHalfwd( index, offset, data) \
2534 gsDma1p( G_MOVEWORD, data, (offset & 0xFFF) | G_MW_HALFWORD_FLAG, index)
2535
2536
2537/*
2538 * Triangle commands
2539 */
2540
2541#define __gsSP1Triangle_w1(v0, v1, v2) \
2542 (_SHIFTL((v0) * 2, 16, 8) | \
2543 _SHIFTL((v1) * 2, 8, 8) | \
2544 _SHIFTL((v2) * 2, 0, 8))
2545
2546#define __gsSP1Triangle_w1f(v0, v1, v2, flag) \
2547 (((flag) == 0) ? __gsSP1Triangle_w1(v0, v1, v2) : \
2548 ((flag) == 1) ? __gsSP1Triangle_w1(v1, v2, v0) : \
2549 __gsSP1Triangle_w1(v2, v0, v1))
2550
2551#define __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag) \
2552 (((flag) == 0) ? __gsSP1Triangle_w1(v0, v1, v2) : \
2553 ((flag) == 1) ? __gsSP1Triangle_w1(v1, v2, v3) : \
2554 ((flag) == 2) ? __gsSP1Triangle_w1(v2, v3, v0) : \
2555 __gsSP1Triangle_w1(v3, v0, v1))
2556
2557#define __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag) \
2558 (((flag) == 0) ? __gsSP1Triangle_w1(v0, v2, v3) : \
2559 ((flag) == 1) ? __gsSP1Triangle_w1(v1, v3, v0) : \
2560 ((flag) == 2) ? __gsSP1Triangle_w1(v2, v0, v1) : \
2561 __gsSP1Triangle_w1(v3, v1, v2))
2562
2563
2567#define gSP1Triangle(pkt, v0, v1, v2, flag) \
2568_DW({ \
2569 Gfx *_g = (Gfx *)(pkt); \
2570 _g->words.w0 = (_SHIFTL(G_TRI1, 24, 8) | \
2571 __gsSP1Triangle_w1f(v0, v1, v2, flag)); \
2572 _g->words.w1 = 0; \
2573})
2577#define gsSP1Triangle(v0, v1, v2, flag) \
2578{ \
2579 (_SHIFTL(G_TRI1, 24, 8) | \
2580 __gsSP1Triangle_w1f(v0, v1, v2, flag)), \
2581 0 \
2582}
2583
2587#define gSP1Quadrangle(pkt, v0, v1, v2, v3, flag) \
2588_DW({ \
2589 Gfx *_g = (Gfx *)(pkt); \
2590 _g->words.w0 = (_SHIFTL(G_QUAD, 24, 8) | \
2591 __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)); \
2592 _g->words.w1 = (__gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag)); \
2593})
2594
2598#define gsSP1Quadrangle(v0, v1, v2, v3, flag) \
2599{ \
2600 (_SHIFTL(G_QUAD, 24, 8) | \
2601 __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)), \
2602 __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag) \
2603}
2604
2608#define gSP2Triangles(pkt, v00, v01, v02, flag0, v10, v11, v12, flag1) \
2609_DW({ \
2610 Gfx *_g = (Gfx *)(pkt); \
2611 _g->words.w0 = (_SHIFTL(G_TRI2, 24, 8) | \
2612 __gsSP1Triangle_w1f(v00, v01, v02, flag0)); \
2613 _g->words.w1 = __gsSP1Triangle_w1f(v10, v11, v12, flag1); \
2614})
2615
2619#define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \
2620{ \
2621 (_SHIFTL(G_TRI2, 24, 8) | \
2622 __gsSP1Triangle_w1f(v00, v01, v02, flag0)), \
2623 __gsSP1Triangle_w1f(v10, v11, v12, flag1) \
2624}
2625
2626/*
2627 * 5 Triangles base commands
2628 */
2629#define _gSP5Triangles(pkt, cmd, v1, v2, v3, v4, v5, v6, v7) \
2630_DW({ \
2631 Gfx *_g = (Gfx *)(pkt); \
2632 _g->words.w0 = (_SHIFTL(cmd, 24, 8) | \
2633 _SHIFTL((v1)*2, 16, 8) | \
2634 _SHIFTL((v2)*2, 8, 8) | \
2635 _SHIFTL((v3)*2, 0, 8)); \
2636 _g->words.w1 = (_SHIFTL((v4)*2, 24, 8) | \
2637 _SHIFTL((v5)*2, 16, 8) | \
2638 _SHIFTL((v6)*2, 8, 8) | \
2639 _SHIFTL((v7)*2, 0, 8)); \
2640})
2641#define _gsSP5Triangles(cmd, v1, v2, v3, v4, v5, v6, v7) \
2642{ \
2643 (_SHIFTL(cmd, 24, 8) | \
2644 _SHIFTL((v1)*2, 16, 8) | \
2645 _SHIFTL((v2)*2, 8, 8) | \
2646 _SHIFTL((v3)*2, 0, 8)), \
2647 (_SHIFTL((v4)*2, 24, 8) | \
2648 _SHIFTL((v5)*2, 16, 8) | \
2649 _SHIFTL((v6)*2, 8, 8) | \
2650 _SHIFTL((v7)*2, 0, 8)) \
2651}
2662#define gSPTriStrip(pkt, v1, v2, v3, v4, v5, v6, v7) \
2663 _gSP5Triangles(pkt, G_TRISTRIP, v1, v2, v3, v4, v5, v6, v7)
2667#define gsSPTriStrip(v1, v2, v3, v4, v5, v6, v7) \
2668 _gsSP5Triangles(G_TRISTRIP, v1, v2, v3, v4, v5, v6, v7)
2674#define gSPTriFan(pkt, v1, v2, v3, v4, v5, v6, v7) \
2675 _gSP5Triangles(pkt, G_TRIFAN, v1, v2, v3, v4, v5, v6, v7)
2679#define gsSPTriFan(v1, v2, v3, v4, v5, v6, v7) \
2680 _gsSP5Triangles(G_TRIFAN, v1, v2, v3, v4, v5, v6, v7)
2681
2682
2683/*
2684 * Moveword commands
2685 */
2686#ifdef F3DEX2_SEGMENTS
2687/* Use F3DEX2 style segment setup binary encoding. F3DEX3 supports both the
2688F3DEX2 encoding and the F3DEX3 encoding, but the former does not have the
2689relative segment resolution behavior. */
2690#define gSPSegment(pkt, segment, base) \
2691 gMoveWd(pkt, G_MW_SEGMENT, (segment) * 4, (base))
2692#define gsSPSegment(segment, base) \
2693 gsMoveWd( G_MW_SEGMENT, (segment) * 4, (base))
2694#else
2695/* F3DEX3 style segment setup, which resolves segment addresses relative to
2696other segments. */
2697#define gSPSegment(pkt, segment, base) \
2698 gDma1p((pkt), G_RELSEGMENT, (base), ((segment) * 4) & 0xFFF, G_MW_SEGMENT)
2699#define gsSPSegment(segment, base) \
2700 gsDma1p( G_RELSEGMENT, (base), ((segment) * 4) & 0xFFF, G_MW_SEGMENT)
2701#endif
2702
2703#define gSPPerspNormalize(pkt, s) gMoveHalfwd(pkt, G_MW_FX, G_MWO_PERSPNORM, (s))
2704#define gsSPPerspNormalize(s) gsMoveHalfwd( G_MW_FX, G_MWO_PERSPNORM, (s))
2705
2711#define gSPClipRatio(pkt, r) gSPNoOp(pkt)
2717#define gsSPClipRatio(r) gsSPNoOp()
2718
2725#define gSPForceMatrix(pkt, mptr) gSPNoOp(pkt)
2731#define gsSPForceMatrix(mptr) gsSPNoOp()
2732
2768#define gSPAmbOcclusionAmb(pkt, amb) gMoveHalfwd(pkt, G_MW_FX, G_MWO_AO_AMBIENT, amb)
2772#define gsSPAmbOcclusionAmb(amb) gsMoveHalfwd( G_MW_FX, G_MWO_AO_AMBIENT, amb)
2776#define gSPAmbOcclusionDir(pkt, dir) gMoveHalfwd(pkt, G_MW_FX, G_MWO_AO_DIRECTIONAL, dir)
2780#define gsSPAmbOcclusionDir(dir) gsMoveHalfwd( G_MW_FX, G_MWO_AO_DIRECTIONAL, dir)
2784#define gSPAmbOcclusionPoint(pkt, point) gMoveHalfwd(pkt, G_MW_FX, G_MWO_AO_POINT, point)
2788#define gsSPAmbOcclusionPoint(point) gsMoveHalfwd( G_MW_FX, G_MWO_AO_POINT, point)
2789
2790#define gSPAmbOcclusionAmbDir(pkt, amb, dir) \
2791 gMoveWd(pkt, G_MW_FX, G_MWO_AO_AMBIENT, \
2792 (_SHIFTL((amb), 16, 16) | _SHIFTL((dir), 0, 16)))
2793#define gsSPAmbOcclusionAmbDir(amb, dir) \
2794 gsMoveWd(G_MW_FX, G_MWO_AO_AMBIENT, \
2795 (_SHIFTL((amb), 16, 16) | _SHIFTL((dir), 0, 16)))
2796#define gSPAmbOcclusionDirPoint(pkt, dir, point) \
2797 gMoveWd(pkt, G_MW_FX, G_MWO_AO_DIRECTIONAL, \
2798 (_SHIFTL((dir), 16, 16) | _SHIFTL((point), 0, 16)))
2799#define gsSPAmbOcclusionDirPoint(dir, point) \
2800 gsMoveWd(G_MW_FX, G_MWO_AO_DIRECTIONAL, \
2801 (_SHIFTL((dir), 16, 16) | _SHIFTL((point), 0, 16)))
2802
2803#define gSPAmbOcclusion(pkt, amb, dir, point) \
2804_DW({ \
2805 gSPAmbOcclusionAmbDir(pkt, amb, dir); \
2806 gSPAmbOcclusionPoint(pkt, point); \
2807})
2808#define gsSPAmbOcclusion(amb, dir, point) \
2809 gsSPAmbOcclusionAmbDir(amb, dir), \
2810 gsSPAmbOcclusionPoint(point)
2811
2845#define gSPFresnelScale(pkt, scale) \
2846 gMoveHalfwd(pkt, G_MW_FX, G_MWO_FRESNEL_SCALE, scale)
2850#define gsSPFresnelScale(scale) \
2851 gsMoveHalfwd(G_MW_FX, G_MWO_FRESNEL_SCALE, scale)
2855#define gSPFresnelOffset(pkt, offset) \
2856 gMoveHalfwd(pkt, G_MW_FX, G_MWO_FRESNEL_OFFSET, offset)
2860#define gsSPFresnelOffset(offset) \
2861 gsMoveHalfwd(G_MW_FX, G_MWO_FRESNEL_OFFSET, offset)
2865#define gSPFresnel(pkt, scale, offset) \
2866 gMoveWd(pkt, G_MW_FX, G_MWO_FRESNEL_SCALE, \
2867 (_SHIFTL((scale), 16, 16) | _SHIFTL((offset), 0, 16)))
2871#define gsSPFresnel(scale, offset) \
2872 gsMoveWd(G_MW_FX, G_MWO_FRESNEL_SCALE, \
2873 (_SHIFTL((scale), 16, 16) | _SHIFTL((offset), 0, 16)))
2874
2888#define gSPAttrOffsetST(pkt, s, t) \
2889 gMoveWd(pkt, G_MW_FX, G_MWO_ATTR_OFFSET_S, \
2890 (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)))
2894#define gsSPAttrOffsetST(s, t) \
2895 gsMoveWd(G_MW_FX, G_MWO_ATTR_OFFSET_S, \
2896 (_SHIFTL((s), 16, 16) | _SHIFTL((t), 0, 16)))
2900#define gSPAttrOffsetZ(pkt, z) \
2901 gMoveHalfwd(pkt, G_MW_FX, G_MWO_ATTR_OFFSET_Z, z)
2905#define gsSPAttrOffsetZ(z) \
2906 gsMoveHalfwd(G_MW_FX, G_MWO_ATTR_OFFSET_Z, z)
2907
2944#define gSPAlphaCompareCull(pkt, mode, thresh) \
2945 gMoveHalfwd(pkt, G_MW_FX, G_MWO_ALPHA_COMPARE_CULL, \
2946 (_SHIFTL((mode), 8, 8) | _SHIFTL((thresh), 0, 8)))
2950#define gsSPAlphaCompareCull(mode, thresh) \
2951 gsMoveHalfwd(G_MW_FX, G_MWO_ALPHA_COMPARE_CULL, \
2952 (_SHIFTL((mode), 8, 8) | _SHIFTL((thresh), 0, 8)))
2953
2989#define gSPNormalsMode(pkt, mode) \
2990 gMoveHalfwd(pkt, G_MW_FX, G_MWO_NORMALS_MODE, (mode) & 0xFF)
2994#define gsSPNormalsMode(mode) \
2995 gsMoveHalfwd(G_MW_FX, G_MWO_NORMALS_MODE, (mode) & 0xFF)
2996
3025#define gSPDontSkipTexLoadsAcross(pkt) \
3026 gMoveWd(pkt, G_MW_FX, G_MWO_LAST_MAT_DL_ADDR, 0xFFFFFFFF)
3030#define gsSPDontSkipTexLoadsAcross() \
3031 gsMoveWd(G_MW_FX, G_MWO_LAST_MAT_DL_ADDR, 0xFFFFFFFF)
3032
3033typedef union {
3034 struct {
3035 s16 intPart[3][4];
3036 u16 fracPart[3][4];
3037 };
3038 long long int force_structure_alignment;
3039} MITMtx;
3040
3054#define gSPMITMatrix(pkt, mit) \
3055 gDma2p((pkt), G_MOVEMEM, (mit), sizeof(MITMtx), G_MV_MMTX, 0x80)
3059#define gsSPMITMatrix(mtx) \
3060 gsDma2p( G_MOVEMEM, (mit), sizeof(MITMtx), G_MV_MMTX, 0x80)
3061
3062
3112# define gSPModifyVertex(pkt, vtx, where, val) \
3113_DW({ \
3114 Gfx *_g = (Gfx *)(pkt); \
3115 \
3116 _g->words.w0 = (_SHIFTL(G_MODIFYVTX, 24, 8) | \
3117 _SHIFTL((where), 16, 8) | \
3118 _SHIFTL((vtx) * 2, 0, 16)); \
3119 _g->words.w1 = (unsigned int)(val); \
3120})
3126# define gsSPModifyVertex(vtx, where, val) \
3127{ \
3128 (_SHIFTL(G_MODIFYVTX, 24, 8) | \
3129 _SHIFTL((where), 16, 8) | \
3130 _SHIFTL((vtx) * 2, 0, 16)), \
3131 (unsigned int)(val) \
3132}
3133
3134/*
3135 * Display list optimization / object culling
3136 */
3137
3143#define gSPCullDisplayList(pkt,vstart,vend) \
3144_DW({ \
3145 Gfx *_g = (Gfx *)(pkt); \
3146 \
3147 _g->words.w0 = (_SHIFTL(G_CULLDL, 24, 8) | \
3148 _SHIFTL((vstart) * 2, 0, 16)); \
3149 _g->words.w1 = _SHIFTL((vend) * 2, 0, 16); \
3150})
3154#define gsSPCullDisplayList(vstart,vend) \
3155{ \
3156 (_SHIFTL(G_CULLDL, 24, 8) | \
3157 _SHIFTL((vstart) * 2, 0, 16)), \
3158 _SHIFTL((vend) * 2, 0, 16) \
3159}
3160
3161/*
3162 * gSPBranchLessZ Branch DL if (vtx.z) less than or equal (zval).
3163 * Note that this uses W in F3DZEX / CFG_G_BRANCH_W, in which case all the
3164 * Z calculations below are wrong and raw values must be used.
3165 *
3166 * dl = DL branch to
3167 * vtx = Vertex
3168 * zval = Screen depth
3169 * near = Near plane
3170 * far = Far plane
3171 * flag = G_BZ_PERSP or G_BZ_ORTHO
3172 */
3173
3174/* From gu.h */
3175#ifndef FTOFIX32
3176# define FTOFIX32(x) (long)((x) * (float)0x00010000)
3177#endif
3178
3179#define G_BZ_PERSP 0
3180#define G_BZ_ORTHO 1
3181
3182#define G_DEPTOZSrg(zval, near, far, flag, zmin, zmax) \
3183 (((unsigned int)FTOFIX32(((flag) == G_BZ_PERSP ? \
3184 (1.0f - (float)(near) / (float)(zval)) / \
3185 (1.0f - (float)(near) / (float)(far )) : \
3186 ((float)(zval) - (float)(near)) / \
3187 ((float)(far ) - (float)(near))))) * \
3188 (((int)((zmax) - (zmin))) & ~1) + (int)FTOFIX32(zmin))
3189
3190#define G_DEPTOZS(zval, near, far, flag) \
3191 G_DEPTOZSrg(zval, near, far, flag, 0, G_MAXZ)
3192
3193#define gSPBranchLessZrg(pkt, dl, vtx, zval, near, far, flag, zmin, zmax) \
3194_DW({ \
3195 Gfx *_g = (Gfx *)(pkt); \
3196 \
3197 _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
3198 _g->words.w1 = (unsigned int)(dl); \
3199 \
3200 _g = (Gfx *)(pkt); \
3201 \
3202 _g->words.w0 = (_SHIFTL(G_BRANCH_Z, 24, 8) | \
3203 _SHIFTL((vtx) * 5, 12, 12) | \
3204 _SHIFTL((vtx) * 2, 0, 12)); \
3205 _g->words.w1 = G_DEPTOZSrg(zval, near, far, flag, zmin, zmax); \
3206})
3207
3208#define gsSPBranchLessZrg(dl, vtx, zval, near, far, flag, zmin, zmax) \
3209{ \
3210 _SHIFTL(G_RDPHALF_1, 24, 8), \
3211 (unsigned int)(dl), \
3212}, \
3213{ \
3214 (_SHIFTL(G_BRANCH_Z, 24, 8) | \
3215 _SHIFTL((vtx) * 5, 12, 12) | \
3216 _SHIFTL((vtx) * 2, 0, 12)), \
3217 G_DEPTOZSrg(zval, near, far, flag, zmin, zmax), \
3218}
3219
3220#define gSPBranchLessZ(pkt, dl, vtx, zval, near, far, flag) \
3221 gSPBranchLessZrg(pkt, dl, vtx, zval, near, far, flag, 0, G_MAXZ)
3222#define gsSPBranchLessZ(dl, vtx, zval, near, far, flag) \
3223 gsSPBranchLessZrg(dl, vtx, zval, near, far, flag, 0, G_MAXZ)
3224
3232#define gSPBranchLessZraw(pkt, dl, vtx, zval) \
3233_DW({ \
3234 Gfx *_g = (Gfx *)(pkt); \
3235 \
3236 _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
3237 _g->words.w1 = (unsigned int)(dl); \
3238 \
3239 _g = (Gfx *)(pkt); \
3240 \
3241 _g->words.w0 = (_SHIFTL(G_BRANCH_Z, 24, 8) | \
3242 _SHIFTL((vtx) * 5, 12, 12) | \
3243 _SHIFTL((vtx) * 2, 0, 12)); \
3244 _g->words.w1 = (unsigned int)(zval); \
3245})
3246
3250#define gsSPBranchLessZraw(dl, vtx, zval) \
3251{ \
3252 _SHIFTL(G_RDPHALF_1, 24, 8), \
3253 (unsigned int)(dl), \
3254}, \
3255{ \
3256 (_SHIFTL(G_BRANCH_Z, 24, 8) | \
3257 _SHIFTL((vtx) * 5, 12, 12) | \
3258 _SHIFTL((vtx) * 2, 0, 12)), \
3259 (unsigned int)(zval), \
3260}
3261
3262
3263/*
3264 * Lighting Commands
3265 */
3266
3267#define NUML(n) ((n) * 0x10)
3268/*
3269 * F3DEX3 properly supports zero lights, so there is no need to use these macros
3270 * anymore.
3271 */
3272#define NUMLIGHTS_0 0
3273#define NUMLIGHTS_1 1
3274#define NUMLIGHTS_2 2
3275#define NUMLIGHTS_3 3
3276#define NUMLIGHTS_4 4
3277#define NUMLIGHTS_5 5
3278#define NUMLIGHTS_6 6
3279#define NUMLIGHTS_7 7
3280#define NUMLIGHTS_8 8
3281#define NUMLIGHTS_9 9
3282
3287#define gSPNumLights(pkt, n) \
3288 gMoveWd(pkt, G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n))
3292#define gsSPNumLights(n) \
3293 gsMoveWd( G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n))
3294
3295/* There is also no need to use these macros. */
3296#define LIGHT_1 1
3297#define LIGHT_2 2
3298#define LIGHT_3 3
3299#define LIGHT_4 4
3300#define LIGHT_5 5
3301#define LIGHT_6 6
3302#define LIGHT_7 7
3303#define LIGHT_8 8
3304#define LIGHT_9 9
3305#define LIGHT_10 10
3306
3307#define _LIGHT_TO_OFFSET(n) (((n) - 1) * 0x10 + 0x10) /* The + 0x10 skips cam pos and lookat */
3308
3320#define gSPLight(pkt, l, n) \
3321 gDma2p((pkt), G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, _LIGHT_TO_OFFSET(n))
3325#define gsSPLight(l, n) \
3326 gsDma2p( G_MOVEMEM, (l), sizeof(Light), G_MV_LIGHT, _LIGHT_TO_OFFSET(n))
3327
3332#define gSPAmbient(pkt, l, n) \
3333 gDma2p((pkt), G_MOVEMEM, (l), sizeof(Ambient), G_MV_LIGHT, _LIGHT_TO_OFFSET(n))
3337#define gsSPAmbient(l, n) \
3338 gsDma2p( G_MOVEMEM, (l), sizeof(Ambient), G_MV_LIGHT, _LIGHT_TO_OFFSET(n))
3339
3348#define gSPLightColor(pkt, n, col) \
3349_DW({ \
3350 gMoveWd(pkt, G_MW_LIGHTCOL, ((((n) - 1) * 0x10) + 0), ((col) & 0xFFFFFF00)); \
3351 gMoveWd(pkt, G_MW_LIGHTCOL, ((((n) - 1) * 0x10) + 4), ((col) & 0xFFFFFF00)); \
3352})
3356#define gsSPLightColor(n, col) \
3357 gsMoveWd(G_MW_LIGHTCOL, ((((n) - 1) * 0x10) + 0), ((col) & 0xFFFFFF00)), \
3358 gsMoveWd(G_MW_LIGHTCOL, ((((n) - 1) * 0x10) + 4), ((col) & 0xFFFFFF00))
3359/*
3360 * Version for point lights. (col1 & 0xFF) must be set to the point light constant
3361 * factor (must be nonzero), and (col2 & 0xFF) must be set to the point light
3362 * linear factor.
3363 * n should be an integer 1-10 to apply to light 0-9.
3364 */
3365#define _gSPLightColor2(pkt, n, col1, col2) \
3366_DW({\
3367 gMoveWd(pkt, G_MW_LIGHTCOL, ((((n) - 1) * 0x10) + 0), col1); \
3368 gMoveWd(pkt, G_MW_LIGHTCOL, ((((n) - 1) * 0x10) + 4), col2); \
3369})
3370#define _gsSPLightColor2(n, col1, col2) \
3371 gsMoveWd(G_MW_LIGHTCOL, ((((n) - 1) * 0x10) + 0), col1), \
3372 gsMoveWd(G_MW_LIGHTCOL, ((((n) - 1) * 0x10) + 4), col2)
3373
3374
3399#define gSPSetLights(pkt, n, name) \
3400_DW({ \
3401 gSPNumLights(pkt, n); \
3402 gDma2p((pkt), G_MOVEMEM, &(name), (n) * 0x10 + 8, G_MV_LIGHT, 0x10); \
3403})
3407#define gsSPSetLights(n, name) \
3408 gsSPNumLights(n), \
3409 gsDma2p(G_MOVEMEM, &(name), (n) * 0x10 + 8, G_MV_LIGHT, 0x10)
3410
3411#define gSPSetLights0(pkt, name) gSPSetLights(pkt, 0, name)
3412#define gsSPSetLights0(name) gsSPSetLights( 0, name)
3413#define gSPSetLights1(pkt, name) gSPSetLights(pkt, 1, name)
3414#ifdef KAZE_GBI_HACKS
3415#define gsSPSetLights1(name) gsSPNoOp()
3416#else
3417#define gsSPSetLights1(name) gsSPSetLights( 1, name)
3418#endif
3419#define gSPSetLights2(pkt, name) gSPSetLights(pkt, 2, name)
3420#define gsSPSetLights2(name) gsSPSetLights( 2, name)
3421#define gSPSetLights3(pkt, name) gSPSetLights(pkt, 3, name)
3422#define gsSPSetLights3(name) gsSPSetLights( 3, name)
3423#define gSPSetLights4(pkt, name) gSPSetLights(pkt, 4, name)
3424#define gsSPSetLights4(name) gsSPSetLights( 4, name)
3425#define gSPSetLights5(pkt, name) gSPSetLights(pkt, 5, name)
3426#define gsSPSetLights5(name) gsSPSetLights( 5, name)
3427#define gSPSetLights6(pkt, name) gSPSetLights(pkt, 6, name)
3428#define gsSPSetLights6(name) gsSPSetLights( 6, name)
3429#define gSPSetLights7(pkt, name) gSPSetLights(pkt, 7, name)
3430#define gsSPSetLights7(name) gsSPSetLights( 7, name)
3431#define gSPSetLights8(pkt, name) gSPSetLights(pkt, 8, name)
3432#define gsSPSetLights8(name) gsSPSetLights( 8, name)
3433#define gSPSetLights9(pkt, name) gSPSetLights(pkt, 9, name)
3434#define gsSPSetLights9(name) gsSPSetLights( 9, name)
3435
3436
3441#define gSPCameraWorld(pkt, cam) \
3442 gDma2p((pkt), G_MOVEMEM, (cam), sizeof(PlainVtx), G_MV_LIGHT, 0)
3446#define gsSPCameraWorld(cam) \
3447 gsDma2p( G_MOVEMEM, (cam), sizeof(PlainVtx), G_MV_LIGHT, 0)
3448
3449
3454#define gSPLookAt(pkt, la) \
3455 gDma2p((pkt), G_MOVEMEM, (la), sizeof(LookAt), G_MV_LIGHT, 8)
3459#define gsSPLookAt(la) \
3460 gsDma2p( G_MOVEMEM, (la), sizeof(LookAt), G_MV_LIGHT, 8)
3461
3471#define gSPLookAtX(pkt, l) gSPLookAt(pkt, l)
3475#define gsSPLookAtX(l) gsSPLookAt(l)
3479#define gSPLookAtY(pkt, l) gSPNoOp(pkt)
3483#define gsSPLookAtY(l) gsSPNoOp()
3484
3485
3486#define gDPSetHilite1Tile(pkt, tile, hilite, width, height) \
3487 gDPSetTileSize(pkt, tile, \
3488 (hilite)->h.x1 & 0xFFF, \
3489 (hilite)->h.y1 & 0xFFF, \
3490 ((((width) - 1) * 4) + (hilite)->h.x1) & 0xFFF, \
3491 ((((height) - 1) * 4) + (hilite)->h.y1) & 0xFFF)
3492#define gsDPSetHilite1Tile(tile, hilite, width, height) \
3493 gsDPSetTileSize(tile, \
3494 (hilite)->h.x1 & 0xFFF, \
3495 (hilite)->h.y1 & 0xFFF, \
3496 ((((width) - 1) * 4) + (hilite)->h.x1) & 0xFFF, \
3497 ((((height) - 1) * 4) + (hilite)->h.y1) & 0xFFF)
3498
3499#define gDPSetHilite2Tile(pkt, tile, hilite, width, height) \
3500 gDPSetTileSize(pkt, tile, \
3501 (hilite)->h.x2 & 0xFFF, \
3502 (hilite)->h.y2 & 0xFFF, \
3503 ((((width) - 1) * 4) + (hilite)->h.x2) & 0xFFF, \
3504 ((((height) - 1) * 4) + (hilite)->h.y2) & 0xFFF)
3505#define gsDPSetHilite2Tile(tile, hilite, width, height) \
3506 gsDPSetTileSize(tile, \
3507 (hilite)->h.x2 & 0xFFF, \
3508 (hilite)->h.y2 & 0xFFF, \
3509 ((((width) - 1) * 4) + (hilite)->h.x2) & 0xFFF, \
3510 ((((height) - 1) * 4) + (hilite)->h.y2) & 0xFFF)
3511
3512
3525#define gSPOcclusionPlane(pkt, o) \
3526 gDma2p((pkt), G_MOVEMEM, (o), sizeof(OcclusionPlane), G_MV_LIGHT, \
3527 (G_MAX_LIGHTS * 0x10) + 0x18)
3531#define gsSPOcclusionPlane(o) \
3532 gsDma2p( G_MOVEMEM, (o), sizeof(OcclusionPlane), G_MV_LIGHT, \
3533 (G_MAX_LIGHTS * 0x10) + 0x18)
3534
3535
3549#define gSPFogFactor(pkt, fm, fo) \
3550 gMoveWd(pkt, G_MW_FOG, G_MWO_FOG, \
3551 (_SHIFTL(fm, 16, 16) | _SHIFTL(fo, 0, 16)))
3552
3556#define gsSPFogFactor(fm, fo) \
3557 gsMoveWd(G_MW_FOG, G_MWO_FOG, \
3558 (_SHIFTL(fm, 16, 16) | _SHIFTL(fo, 0, 16)))
3559
3560#define gSPFogPosition(pkt, min, max) \
3561 gMoveWd(pkt, G_MW_FOG, G_MWO_FOG, \
3562 (_SHIFTL((128000 / ((max) - (min))), 16, 16) | \
3563 _SHIFTL(((500 - (min)) * 256 / ((max) - (min))), 0, 16)))
3564
3565#define gsSPFogPosition(min, max) \
3566 gsMoveWd(G_MW_FOG, G_MWO_FOG, \
3567 (_SHIFTL((128000 / ((max) - (min))), 16, 16) | \
3568 _SHIFTL(((500 - (min)) * 256 / ((max) - (min))), 0, 16)))
3569
3570
3574#define gSPTexture(pkt, s, t, level, tile, on) \
3575_DW({ \
3576 Gfx *_g = (Gfx *)(pkt); \
3577 \
3578 _g->words.w0 = (_SHIFTL(G_TEXTURE, 24, 8) | \
3579 _SHIFTL((level), 11, 3) | \
3580 _SHIFTL((tile), 8, 3) | \
3581 _SHIFTL((on), 1, 7)); \
3582 _g->words.w1 = (_SHIFTL((s), 16, 16) | \
3583 _SHIFTL((t), 0, 16)); \
3584})
3588#define gsSPTexture(s, t, level, tile, on) \
3589{ \
3590 (_SHIFTL(G_TEXTURE, 24, 8) | \
3591 _SHIFTL((level), 11, 3) | \
3592 _SHIFTL((tile), 8, 3) | \
3593 _SHIFTL((on), 1, 7)), \
3594 (_SHIFTL((s), 16, 16) | \
3595 _SHIFTL((t), 0, 16)) \
3596}
3597
3602#define gSPTextureL(pkt, s, t, level, bowtie, tile, on) \
3603 gSPTexture(pkt, s, t, level, tile, on)
3607#define gsSPTextureL(s, t, level, bowtie, tile, on) \
3608 gsSPTexture(s, t, level, tile, on)
3609
3618#define gSPGeometryMode(pkt, c, s) \
3619_DW({ \
3620 Gfx *_g = (Gfx *)(pkt); \
3621 \
3622 _g->words.w0 = (_SHIFTL(G_GEOMETRYMODE, 24, 8) | \
3623 _SHIFTL(~(u32)(c), 0, 24)); \
3624 _g->words.w1 = (u32)(s); \
3625})
3626
3630#define gsSPGeometryMode(c, s) \
3631{ \
3632 (_SHIFTL(G_GEOMETRYMODE, 24, 8) | \
3633 _SHIFTL(~(u32)(c), 0, 24)), \
3634 (u32)(s) \
3635}
3636
3637#define gSPSetGeometryMode(pkt, word) gSPGeometryMode((pkt), 0, (word))
3638#define gsSPSetGeometryMode(word) gsSPGeometryMode( 0, (word))
3639#define gSPClearGeometryMode(pkt, word) gSPGeometryMode((pkt), (word), 0)
3640#define gsSPClearGeometryMode(word) gsSPGeometryMode( (word), 0)
3641#define gSPLoadGeometryMode(pkt, word) gSPGeometryMode((pkt), -1, (word))
3642#define gsSPLoadGeometryMode(word) gsSPGeometryMode( -1, (word))
3643
3644#define gsSPGeometryModeSetFirst(c, s) gsSPGeometryMode(c, s)
3645
3646#define gSPSetOtherMode(pkt, cmd, sft, len, data) \
3647_DW({ \
3648 Gfx *_g = (Gfx *)(pkt); \
3649 \
3650 _g->words.w0 = (_SHIFTL(cmd, 24, 8) | \
3651 _SHIFTL(32 - (sft) - (len), 8, 8) | \
3652 _SHIFTL((len) - 1, 0, 8)); \
3653 _g->words.w1 = (unsigned int)(data); \
3654})
3655
3656#define gsSPSetOtherMode(cmd, sft, len, data) \
3657{ \
3658 (_SHIFTL(cmd, 24, 8) | \
3659 _SHIFTL(32 - (sft) - (len), 8, 8) | \
3660 _SHIFTL((len) - 1, 0, 8)), \
3661 (unsigned int)(data) \
3662}
3663
3667#define gDPPipelineMode(pkt, mode) \
3668 gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_PIPELINE, 1, mode)
3672#define gsDPPipelineMode(mode) \
3673 gsSPSetOtherMode( G_SETOTHERMODE_H, G_MDSFT_PIPELINE, 1, mode)
3674
3675#define gDPSetCycleType(pkt, type) \
3676 gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 2, type)
3677#define gsDPSetCycleType(type) \
3678 gsSPSetOtherMode( G_SETOTHERMODE_H, G_MDSFT_CYCLETYPE, 2, type)
3679
3680#define gDPSetTexturePersp(pkt, type) \
3681 gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 1, type)
3682#define gsDPSetTexturePersp(type) \
3683 gsSPSetOtherMode( G_SETOTHERMODE_H, G_MDSFT_TEXTPERSP, 1, type)
3684
3685#define gDPSetTextureDetail(pkt, type) \
3686 gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 2, type)
3687#define gsDPSetTextureDetail(type) \
3688 gsSPSetOtherMode( G_SETOTHERMODE_H, G_MDSFT_TEXTDETAIL, 2, type)
3689
3690#define gDPSetTextureLOD(pkt, type) \
3691 gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 1, type)
3692#define gsDPSetTextureLOD(type) \
3693 gsSPSetOtherMode( G_SETOTHERMODE_H, G_MDSFT_TEXTLOD, 1, type)
3694
3695#define gDPSetTextureLUT(pkt, type) \
3696 gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 2, type)
3697#define gsDPSetTextureLUT(type) \
3698 gsSPSetOtherMode( G_SETOTHERMODE_H, G_MDSFT_TEXTLUT, 2, type)
3699
3700#define gDPSetTextureFilter(pkt, type) \
3701 gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 2, type)
3702#define gsDPSetTextureFilter(type) \
3703 gsSPSetOtherMode( G_SETOTHERMODE_H, G_MDSFT_TEXTFILT, 2, type)
3704
3705#define gDPSetTextureConvert(pkt, type) \
3706 gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 3, type)
3707#define gsDPSetTextureConvert(type) \
3708 gsSPSetOtherMode( G_SETOTHERMODE_H, G_MDSFT_TEXTCONV, 3, type)
3709
3710#define gDPSetCombineKey(pkt, type) \
3711 gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 1, type)
3712#define gsDPSetCombineKey(type) \
3713 gsSPSetOtherMode( G_SETOTHERMODE_H, G_MDSFT_COMBKEY, 1, type)
3714
3715#define gDPSetColorDither(pkt, mode) \
3716 gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 2, mode)
3717#define gsDPSetColorDither(mode) \
3718 gsSPSetOtherMode( G_SETOTHERMODE_H, G_MDSFT_RGBDITHER, 2, mode)
3719
3720#define gDPSetAlphaDither(pkt, mode) \
3721 gSPSetOtherMode(pkt, G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 2, mode)
3722#define gsDPSetAlphaDither(mode) \
3723 gsSPSetOtherMode( G_SETOTHERMODE_H, G_MDSFT_ALPHADITHER, 2, mode)
3724
3731#define gDPSetBlendMask(pkt, mask) gSPNoOp(pkt)
3735#define gsDPSetBlendMask(mask) gsSPNoOp()
3736
3737#define gDPSetAlphaCompare(pkt, type) \
3738 gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 2, type)
3739#define gsDPSetAlphaCompare(type) \
3740 gsSPSetOtherMode( G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 2, type)
3741
3742#define gDPSetDepthSource(pkt, src) \
3743 gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 1, src)
3744#define gsDPSetDepthSource(src) \
3745 gsSPSetOtherMode( G_SETOTHERMODE_L, G_MDSFT_ZSRCSEL, 1, src)
3746
3747#define gDPSetRenderMode(pkt, c0, c1) \
3748 gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 29, (c0) | (c1))
3749#define gsDPSetRenderMode(c0, c1) \
3750 gsSPSetOtherMode( G_SETOTHERMODE_L, G_MDSFT_RENDERMODE, 29, (c0) | (c1))
3751
3752#define gSetImage(pkt, cmd, fmt, siz, width, i) \
3753_DW({ \
3754 Gfx *_g = (Gfx *)(pkt); \
3755 \
3756 _g->words.w0 = (_SHIFTL(cmd, 24, 8) | \
3757 _SHIFTL(fmt, 21, 3) | \
3758 _SHIFTL(siz, 19, 2) | \
3759 _SHIFTL((width) - 1, 0, 12)); \
3760 _g->words.w1 = (unsigned int)(i); \
3761})
3762
3763#define gsSetImage(cmd, fmt, siz, width, i) \
3764{ \
3765 (_SHIFTL(cmd, 24, 8) | \
3766 _SHIFTL(fmt, 21, 3) | \
3767 _SHIFTL(siz, 19, 2) | \
3768 _SHIFTL((width) - 1, 0, 12)), \
3769 (unsigned int)(i) \
3770}
3771
3772#define gDPSetColorImage(pkt, f, s, w, i) gSetImage(pkt, G_SETCIMG, f, s, w, i)
3773#define gsDPSetColorImage(f, s, w, i) gsSetImage( G_SETCIMG, f, s, w, i)
3774
3775
3776/* use these for new code */
3777#define gDPSetDepthImage(pkt, i) gSetImage(pkt, G_SETZIMG, 0, 0, 1, i)
3778#define gsDPSetDepthImage(i) gsSetImage( G_SETZIMG, 0, 0, 1, i)
3779/* kept for compatibility */
3780#define gDPSetMaskImage(pkt, i) gDPSetDepthImage(pkt, i)
3781#define gsDPSetMaskImage(i) gsDPSetDepthImage( i)
3782
3783#define gDPSetTextureImage(pkt, f, s, w, i) gSetImage(pkt, G_SETTIMG, f, s, w, i)
3784#define gsDPSetTextureImage(f, s, w, i) gsSetImage( G_SETTIMG, f, s, w, i)
3785
3786/*
3787 * RDP macros
3788 */
3789
3790#define gDPSetCombine(pkt, muxs0, muxs1) \
3791_DW({ \
3792 Gfx *_g = (Gfx *)(pkt); \
3793 \
3794 _g->words.w0 = (_SHIFTL(G_SETCOMBINE, 24, 8) | \
3795 _SHIFTL(muxs0, 0, 24)); \
3796 _g->words.w1 = (unsigned int)(muxs1); \
3797})
3798
3799#define gsDPSetCombine(muxs0, muxs1) \
3800{ \
3801 (_SHIFTL(G_SETCOMBINE, 24, 8) | \
3802 _SHIFTL(muxs0, 0, 24)), \
3803 (unsigned int)(muxs1) \
3804}
3805
3806#define GCCc0w0(saRGB0, mRGB0, saA0, mA0) \
3807 (_SHIFTL((saRGB0), 20, 4) | \
3808 _SHIFTL((mRGB0), 15, 5) | \
3809 _SHIFTL((saA0), 12, 3) | \
3810 _SHIFTL((mA0), 9, 3))
3811
3812#define GCCc1w0(saRGB1, mRGB1) \
3813 (_SHIFTL((saRGB1), 5, 4) | \
3814 _SHIFTL((mRGB1), 0, 5))
3815
3816#define GCCc0w1(sbRGB0, aRGB0, sbA0, aA0) \
3817 (_SHIFTL((sbRGB0), 28, 4) | \
3818 _SHIFTL((aRGB0), 15, 3) | \
3819 _SHIFTL((sbA0), 12, 3) | \
3820 _SHIFTL((aA0), 9, 3))
3821
3822#define GCCc1w1(sbRGB1, saA1, mA1, aRGB1, sbA1, aA1) \
3823 (_SHIFTL((sbRGB1), 24, 4) | \
3824 _SHIFTL((saA1), 21, 3) | \
3825 _SHIFTL((mA1), 18, 3) | \
3826 _SHIFTL((aRGB1), 6, 3) | \
3827 _SHIFTL((sbA1), 3, 3) | \
3828 _SHIFTL((aA1), 0, 3))
3829
3830#define gDPSetCombineLERP(pkt, a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
3831 a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
3832_DW({ \
3833 Gfx *_g = (Gfx *)(pkt); \
3834 \
3835 _g->words.w0 = (_SHIFTL(G_SETCOMBINE, 24, 8) | \
3836 _SHIFTL(GCCc0w0(G_CCMUX_##a0, G_CCMUX_##c0, \
3837 G_ACMUX_##Aa0, G_ACMUX_##Ac0) | \
3838 GCCc1w0(G_CCMUX_##a1, G_CCMUX_##c1), \
3839 0, 24)); \
3840 _g->words.w1 = (unsigned int)(GCCc0w1(G_CCMUX_##b0, G_CCMUX_##d0, \
3841 G_ACMUX_##Ab0, G_ACMUX_##Ad0) | \
3842 GCCc1w1(G_CCMUX_##b1, G_ACMUX_##Aa1, \
3843 G_ACMUX_##Ac1, G_CCMUX_##d1, \
3844 G_ACMUX_##Ab1, G_ACMUX_##Ad1)); \
3845})
3846
3847#define gsDPSetCombineLERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
3848 a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
3849{ \
3850 (_SHIFTL(G_SETCOMBINE, 24, 8) | \
3851 _SHIFTL(GCCc0w0(G_CCMUX_##a0, G_CCMUX_##c0, \
3852 G_ACMUX_##Aa0, G_ACMUX_##Ac0) | \
3853 GCCc1w0(G_CCMUX_##a1, G_CCMUX_##c1), \
3854 0, 24)), \
3855 (unsigned int)(GCCc0w1(G_CCMUX_##b0, G_CCMUX_##d0, \
3856 G_ACMUX_##Ab0, G_ACMUX_##Ad0) | \
3857 GCCc1w1(G_CCMUX_##b1, G_ACMUX_##Aa1, \
3858 G_ACMUX_##Ac1, G_CCMUX_##d1, \
3859 G_ACMUX_##Ab1, G_ACMUX_##Ad1)) \
3860}
3861
3871#define gDPSetCombineMode(pkt, a, b) gDPSetCombineLERP(pkt, a, b)
3875#define gsDPSetCombineMode(a, b) gsDPSetCombineLERP( a, b)
3876
3877#define gDPSetColor(pkt, c, d) \
3878_DW({ \
3879 Gfx *_g = (Gfx *)(pkt); \
3880 \
3881 _g->words.w0 = _SHIFTL(c, 24, 8); \
3882 _g->words.w1 = (unsigned int)(d); \
3883})
3884
3885#define gsDPSetColor(c, d) \
3886{ \
3887 _SHIFTL(c, 24, 8), \
3888 (unsigned int)(d) \
3889}
3890
3891#define DPRGBColor(pkt, cmd, r, g, b, a) \
3892 gDPSetColor(pkt, cmd, \
3893 (_SHIFTL(r, 24, 8) | \
3894 _SHIFTL(g, 16, 8) | \
3895 _SHIFTL(b, 8, 8) | \
3896 _SHIFTL(a, 0, 8)))
3897
3898#define sDPRGBColor(cmd, r, g, b, a) \
3899 gsDPSetColor(cmd, \
3900 (_SHIFTL(r, 24, 8) | \
3901 _SHIFTL(g, 16, 8) | \
3902 _SHIFTL(b, 8, 8) | \
3903 _SHIFTL(a, 0, 8)))
3904
3905#define gDPSetEnvColor(pkt, r, g, b, a) \
3906 DPRGBColor(pkt, G_SETENVCOLOR, r, g, b, a)
3907
3908#ifdef KAZE_GBI_HACKS
3909#define gsDPSetEnvColor(r, g, b, a) \
3910 gsSPNoOp()
3911#else
3912#define gsDPSetEnvColor(r, g, b, a) \
3913 sDPRGBColor( G_SETENVCOLOR, r, g, b, a)
3914#endif
3915
3916#define gDPSetBlendColor(pkt, r, g, b, a) \
3917 DPRGBColor(pkt, G_SETBLENDCOLOR, r, g, b, a)
3918
3919#define gsDPSetBlendColor(r, g, b, a) \
3920 sDPRGBColor( G_SETBLENDCOLOR, r, g, b, a)
3921
3922#define gDPSetFogColor(pkt, r, g, b, a) \
3923 DPRGBColor(pkt, G_SETFOGCOLOR, r, g, b, a)
3924
3925#define gsDPSetFogColor(r, g, b, a) \
3926 sDPRGBColor( G_SETFOGCOLOR, r, g, b, a)
3927
3928#define gDPSetFillColor(pkt, d) \
3929 gDPSetColor(pkt, G_SETFILLCOLOR, (d))
3930
3931#define gsDPSetFillColor(d) \
3932 gsDPSetColor( G_SETFILLCOLOR, (d))
3933
3934#define gDPSetPrimDepth(pkt, z, dz) \
3935 gDPSetColor(pkt, G_SETPRIMDEPTH, \
3936 _SHIFTL(z, 16, 16) | _SHIFTL(dz, 0, 16))
3937
3938#define gsDPSetPrimDepth(z, dz) \
3939 gsDPSetColor(G_SETPRIMDEPTH, \
3940 _SHIFTL(z, 16, 16) | _SHIFTL(dz, 0, 16))
3941
3942#define gDPSetPrimColor(pkt, m, l, r, g, b, a) \
3943_DW({ \
3944 Gfx *_g = (Gfx *)(pkt); \
3945 \
3946 _g->words.w0 = (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | \
3947 _SHIFTL(m, 8, 8) | \
3948 _SHIFTL(l, 0, 8)); \
3949 _g->words.w1 = (_SHIFTL(r, 24, 8) | \
3950 _SHIFTL(g, 16, 8) | \
3951 _SHIFTL(b, 8, 8) | \
3952 _SHIFTL(a, 0, 8)); \
3953})
3954
3955#define gsDPSetPrimColor(m, l, r, g, b, a) \
3956{ \
3957 (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | \
3958 _SHIFTL(m, 8, 8) | \
3959 _SHIFTL(l, 0, 8)), \
3960 (_SHIFTL(r, 24, 8) | \
3961 _SHIFTL(g, 16, 8) | \
3962 _SHIFTL(b, 8, 8) | \
3963 _SHIFTL(a, 0, 8)) \
3964}
3965
3976#define gSPLightToRDP(pkt, light, alpha, word0) \
3977_DW({ \
3978 Gfx *_g = (Gfx *)(pkt); \
3979 _g->words.w0 = (_SHIFTL(G_LIGHTTORDP, 24, 8) | \
3980 _SHIFTL(light * 0x10, 8, 8) | \
3981 _SHIFTL(alpha, 0, 8)); \
3982 _g->words.w1 = (word0); \
3983})
3987#define gsSPLightToRDP(light, alpha, word0) \
3988{ \
3989 (_SHIFTL(G_LIGHTTORDP, 24, 8) | \
3990 _SHIFTL(light * 0x10, 8, 8) | \
3991 _SHIFTL(alpha, 0, 8)), \
3992 (word0) \
3993}
3994#define gSPLightToPrimColor(pkt, light, alpha, m, l) \
3995 gSPLightToRDP(pkt, light, alpha, \
3996 (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | _SHIFTL(m, 8, 8) | _SHIFTL(l, 0, 8)))
3997#define gsSPLightToPrimColor(light, alpha, m, l) \
3998 gsSPLightToRDP(light, alpha, \
3999 (_SHIFTL(G_SETPRIMCOLOR, 24, 8) | _SHIFTL(m, 8, 8) | _SHIFTL(l, 0, 8)))
4000#define gSPLightToFogColor(pkt, light, alpha) \
4001 gSPLightToRDP(pkt, light, alpha, _SHIFTL(G_SETFOGCOLOR, 24, 8))
4002#define gsSPLightToFogColor(light, alpha) \
4003 gsSPLightToRDP(light, alpha, _SHIFTL(G_SETFOGCOLOR, 24, 8))
4004
4033#define gDPSetOtherMode(pkt, mode0, mode1) \
4034_DW({ \
4035 Gfx *_g = (Gfx *)(pkt); \
4036 \
4037 _g->words.w0 = (_SHIFTL(G_RDPSETOTHERMODE, 24, 8) | \
4038 _SHIFTL(mode0, 0, 24)); \
4039 _g->words.w1 = (unsigned int)(mode1); \
4040})
4041
4045#define gsDPSetOtherMode(mode0, mode1) \
4046{ \
4047 (_SHIFTL(G_RDPSETOTHERMODE, 24, 8) | \
4048 _SHIFTL(mode0, 0, 24)), \
4049 (unsigned int)(mode1) \
4050}
4051
4052/*
4053 * Texturing macros
4054 */
4055
4056#define G_TX_LOADTILE 7
4057#define G_TX_RENDERTILE 0
4058
4059/*
4060 * Define this to remove syncs from texture loading multi-command macros.
4061 *
4062 * You should convert your romhack codebase to F3DEX3 without this defined
4063 * first, then once everything is stable, define it and fix any crashes or
4064 * graphical issues that arise.
4065 *
4066 * How the syncs work: load, tile, and pipe sync all delay the RDP by fixed
4067 * numbers of cycles. It is the smallest number for load, a medium number for
4068 * tile, and the largest number for pipe. These syncs do NOT wait until
4069 * something is finished being used; they just stall for a fixed time.
4070 * (DPFullSync is different and DOES wait for writebacks to memory to be done;
4071 * that is not considered in this explanation.)
4072 *
4073 * Syncs always happen after rendering something and before changing some
4074 * settings. In other words:
4075 * - gsSP2Triangles(), gsSPTextureRectangle(), etc.
4076 * - gsDPSomeSync(),
4077 * - gsDPSetSomething()
4078 * You never need the opposite, i.e. you never need a sync after changing
4079 * settings but before rendering.
4080 *
4081 * Which sync you use depends on which settings you are changing. If you are
4082 * doing a texture load (DPLoadBlock or DPLoadTile), you need a load sync (or
4083 * either of the other syncs which wait for even longer). If you are changing
4084 * tile settings, you need a tile sync (or pipe sync which is longer). If you
4085 * are changing CC, othermode, env color, or other things like that, you need
4086 * a pipe sync.
4087 *
4088 * Display lists overall should be structured like:
4089 *
4090 * - ...
4091 * - previous draw tris
4092 * - pipe sync
4093 * - texture load, CC settings, othermode, etc. (no syncs within these)
4094 * - (no sync here)
4095 * - draw tris
4096 * - pipe sync
4097 * - next material setup
4098 * - ...
4099 *
4100 * In SM64, the pipe sync is at the end of each object or sub-object; in OoT
4101 * it is at the start of each display list. This ends up being the same thing
4102 * when the display lists are effectively concatenated: you have a pipe sync
4103 * after each set of rendering things, and before each new set of changing
4104 * settings.
4105 *
4106 * If you are doing multitexture and/or CI texture loads, use a different tile
4107 * for each load, and then you don't need any syncs in the loads. As an extreme
4108 * example with two CI textures:
4109 * - previous pipe sync, either at the start of this DL or the end of the last
4110 * - set tile 7 to load texture 0 CIs (no syncs)
4111 * - load block on tile 7 (no syncs)
4112 * - set tile 5 to load texture 0 palette (no syncs)
4113 * - load block on tile 5 (no syncs)
4114 * - set tile 6 to load texture 1 CIs (no syncs)
4115 * - load block on tile 6 (no syncs)
4116 * - set tile 4 to load texture 1 palette (no syncs)
4117 * - load block on tile 4 (no syncs)
4118 * - set tile 0 for render texture 0 (no syncs)
4119 * - set tile 1 for render texture 0 (no syncs)
4120 * - set othermode, CC, etc. (no syncs)
4121 * - draw tris (no syncs)
4122 * - next pipe sync, either at the end of this DL or the start of the next
4123 * Both fast64 and the multi-command macros in this GBI if
4124 * NO_SYNCS_IN_TEXTURE_LOADS is enabled do this, but if you wrote the DLs by
4125 * hand or they were vanilla DLs not using the multi-command macros, they may
4126 * need to be updated. (Then again, in that case the syncs are also written by
4127 * hand, so these syncs changes do not affect them.)
4128 *
4129 * If you are writing GUI display lists with texture rectangle which look like
4130 * - load tex
4131 * - tex rect
4132 * - load tex
4133 * - tex rect
4134 * you need a load sync before each load tex, and you don't need any other
4135 * syncs.
4136 */
4137#ifdef NO_SYNCS_IN_TEXTURE_LOADS
4138#define gDPLoadSyncInTexLoad(pkt) (void)0
4139#define gDPTileSyncInTexLoad(pkt) (void)0
4140#define gDPPipeSyncInTexLoad(pkt) (void)0
4141#define gsDPLoadSyncInTexLoad
4142#define gsDPTileSyncInTexLoad
4143#define gsDPPipeSyncInTexLoad
4144#define gsDPPipeSyncEndOfTexLoad
4145#define _G_TEXLOADTILE(rtile) (G_TX_LOADTILE - (rtile))
4146#define _G_PALLOADTILE(rtile) (G_TX_LOADTILE - 2 - (rtile))
4147#else
4148#define gDPLoadSyncInTexLoad(pkt) gDPLoadSync(pkt)
4149#define gDPTileSyncInTexLoad(pkt) gDPTileSync(pkt)
4150#define gDPPipeSyncInTexLoad(pkt) gDPPipeSync(pkt)
4151#define gsDPLoadSyncInTexLoad gsDPLoadSync(),
4152#define gsDPTileSyncInTexLoad gsDPTileSync(),
4153#define gsDPPipeSyncInTexLoad gsDPPipeSync(),
4154#define gsDPPipeSyncEndOfTexLoad , gsDPPipeSync()
4155#define _G_TEXLOADTILE(rtile) G_TX_LOADTILE
4156#define _G_PALLOADTILE(rtile) G_TX_LOADTILE
4157#endif
4158
4159
4160#define G_TX_NOMIRROR (0 << 0)
4161#define G_TX_WRAP (0 << 1)
4162#define G_TX_MIRROR (1 << 0)
4163#define G_TX_CLAMP (1 << 1)
4164#define G_TX_NOMASK 0
4165#define G_TX_NOLOD 0
4166
4167#ifndef MAX
4168#define MAX(a, b) ((a) > (b) ? (a) : (b))
4169#endif
4170
4171#ifndef MIN
4172#define MIN(a, b) ((a) < (b) ? (a) : (b))
4173#endif
4174
4175/*
4176 * Dxt is the inverse of the number of 64-bit words in a line of
4177 * the texture being loaded using the load_block command. If
4178 * there are any 1's to the right of the 11th fractional bit,
4179 * dxt should be rounded up. The following macros accomplish
4180 * this. The 4b macros are a special case since 4-bit textures
4181 * are loaded as 8-bit textures. Dxt is fixed point 1.11. RJM
4182 */
4183#define G_TX_DXT_FRAC 11
4184
4185/*
4186 * For RCP 2.0, the maximum number of texels that can be loaded
4187 * using a load_block command is 2048. In order to load the total
4188 * 4kB of Tmem, change the texel size when loading to be G_IM_SIZ_16b,
4189 * then change the tile to the proper texel size after the load.
4190 * The g*DPLoadTextureBlock macros already do this, so this change
4191 * will be transparent if you use these macros. If you use
4192 * the g*DPLoadBlock macros directly, you will need to handle this
4193 * tile manipulation yourself. RJM.
4194 */
4195#define G_TX_LDBLK_MAX_TXL 2047
4196
4197#define TXL2WORDS(txls, b_txl) \
4198 MAX(1, ((txls) * (b_txl) / 8))
4199
4200#define CALC_DXT(width, b_txl) \
4201 (((1 << G_TX_DXT_FRAC) + TXL2WORDS(width, b_txl) - 1) / TXL2WORDS(width, b_txl))
4202
4203#define TXL2WORDS_4b(txls) \
4204 MAX(1, ((txls) / 16))
4205
4206#define CALC_DXT_4b(width) \
4207 (((1 << G_TX_DXT_FRAC) + TXL2WORDS_4b(width) - 1) / TXL2WORDS_4b(width))
4208
4209#define gDPLoadTileGeneric(pkt, c, tile, uls, ult, lrs, lrt) \
4210_DW({ \
4211 Gfx *_g = (Gfx *)(pkt); \
4212 \
4213 _g->words.w0 = (_SHIFTL(c, 24, 8) | \
4214 _SHIFTL(uls, 12, 12) | \
4215 _SHIFTL(ult, 0, 12)); \
4216 _g->words.w1 = (_SHIFTL(tile, 24, 3) | \
4217 _SHIFTL(lrs, 12, 12) | \
4218 _SHIFTL(lrt, 0, 12)); \
4219})
4220
4221#define gsDPLoadTileGeneric(c, tile, uls, ult, lrs, lrt) \
4222{ \
4223 (_SHIFTL(c, 24, 8) | \
4224 _SHIFTL(uls, 12, 12) | \
4225 _SHIFTL(ult, 0, 12)), \
4226 (_SHIFTL(tile, 24, 3) | \
4227 _SHIFTL(lrs, 12, 12) | \
4228 _SHIFTL(lrt, 0, 12)) \
4229}
4230
4231#define gDPSetTileSize(pkt, t, uls, ult, lrs, lrt) \
4232 gDPLoadTileGeneric(pkt, G_SETTILESIZE, t, uls, ult, lrs, lrt)
4233#define gsDPSetTileSize(t, uls, ult, lrs, lrt) \
4234 gsDPLoadTileGeneric( G_SETTILESIZE, t, uls, ult, lrs, lrt)
4235#define gDPLoadTile(pkt, t, uls, ult, lrs, lrt) \
4236 gDPLoadTileGeneric(pkt, G_LOADTILE, t, uls, ult, lrs, lrt)
4237#define gsDPLoadTile(t, uls, ult, lrs, lrt) \
4238 gsDPLoadTileGeneric( G_LOADTILE, t, uls, ult, lrs, lrt)
4239
4240#define gDPSetTile(pkt, fmt, siz, line, tmem, tile, palette, cmt, \
4241 maskt, shiftt, cms, masks, shifts) \
4242_DW({ \
4243 Gfx *_g = (Gfx *)(pkt); \
4244 \
4245 _g->words.w0 = (_SHIFTL(G_SETTILE, 24, 8) | \
4246 _SHIFTL(fmt, 21, 3) | \
4247 _SHIFTL(siz, 19, 2) | \
4248 _SHIFTL(line, 9, 9) | \
4249 _SHIFTL(tmem, 0, 9)); \
4250 _g->words.w1 = (_SHIFTL(tile, 24, 3) | \
4251 _SHIFTL(palette, 20, 4) | \
4252 _SHIFTL(cmt, 18, 2) | \
4253 _SHIFTL(maskt, 14, 4) | \
4254 _SHIFTL(shiftt, 10, 4) | \
4255 _SHIFTL(cms, 8, 2) | \
4256 _SHIFTL(masks, 4, 4) | \
4257 _SHIFTL(shifts, 0, 4)); \
4258})
4259
4260#define gsDPSetTile(fmt, siz, line, tmem, tile, palette, cmt, \
4261 maskt, shiftt, cms, masks, shifts) \
4262{ \
4263 (_SHIFTL(G_SETTILE, 24, 8) | \
4264 _SHIFTL(fmt, 21, 3) | \
4265 _SHIFTL(siz, 19, 2) | \
4266 _SHIFTL(line, 9, 9) | \
4267 _SHIFTL(tmem, 0, 9)), \
4268 (_SHIFTL(tile, 24, 3) | \
4269 _SHIFTL(palette, 20, 4) | \
4270 _SHIFTL(cmt, 18, 2) | \
4271 _SHIFTL(maskt, 14, 4) | \
4272 _SHIFTL(shiftt, 10, 4) | \
4273 _SHIFTL(cms, 8, 2) | \
4274 _SHIFTL(masks, 4, 4) | \
4275 _SHIFTL(shifts, 0, 4)) \
4276}
4277
4278#define gDPLoadBlock(pkt, tile, uls, ult, lrs, dxt) \
4279_DW({ \
4280 Gfx *_g = (Gfx *)(pkt); \
4281 _g->words.w0 = (_SHIFTL(G_LOADBLOCK, 24, 8) | \
4282 _SHIFTL(uls, 12, 12) | \
4283 _SHIFTL(ult, 0, 12)); \
4284 _g->words.w1 = (_SHIFTL(tile, 24, 3) | \
4285 _SHIFTL(MIN(lrs, G_TX_LDBLK_MAX_TXL), 12, 12) | \
4286 _SHIFTL(dxt, 0, 12)); \
4287})
4288
4289#define gsDPLoadBlock(tile, uls, ult, lrs, dxt) \
4290{ \
4291 (_SHIFTL(G_LOADBLOCK, 24, 8) | \
4292 _SHIFTL(uls, 12, 12) | \
4293 _SHIFTL(ult, 0, 12)), \
4294 (_SHIFTL(tile, 24, 3) | \
4295 _SHIFTL((MIN(lrs, G_TX_LDBLK_MAX_TXL)), 12, 12) | \
4296 _SHIFTL(dxt, 0, 12)) \
4297}
4298
4299#define gDPLoadTLUTCmd(pkt, tile, count) \
4300_DW({ \
4301 Gfx *_g = (Gfx *)pkt; \
4302 \
4303 _g->words.w0 = _SHIFTL(G_LOADTLUT, 24, 8); \
4304 _g->words.w1 = (_SHIFTL((tile), 24, 3) | \
4305 _SHIFTL((count), 14, 10)); \
4306})
4307
4308#define gsDPLoadTLUTCmd(tile, count) \
4309{ \
4310 _SHIFTL(G_LOADTLUT, 24, 8), \
4311 (_SHIFTL((tile), 24, 3) | \
4312 _SHIFTL((count), 14, 10)) \
4313}
4314
4315#define gDPLoadTextureBlock(pkt, timg, fmt, siz, width, height, pal, \
4316 cms, cmt, masks, maskt, shifts, shiftt) \
4317_DW({ \
4318 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
4319 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, \
4320 0, cmt, maskt, shiftt, cms, masks, shifts); \
4321 gDPLoadSyncInTexLoad(pkt); \
4322 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \
4323 (((width) * (height) + siz##_INCR) >> siz##_SHIFT) -1, \
4324 CALC_DXT(width, siz##_BYTES)); \
4325 gDPPipeSyncInTexLoad(pkt); \
4326 gDPSetTile(pkt, fmt, siz, \
4327 (((width) * siz##_LINE_BYTES) + 7) >> 3, 0, \
4328 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4329 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \
4330 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4331 ((height) - 1) << G_TEXTURE_IMAGE_FRAC); \
4332})
4333
4334#define gDPLoadTextureBlockYuv(pkt, timg, fmt, siz, width, height, pal, \
4335 cms, cmt, masks, maskt, shifts, shiftt) \
4336_DW({ \
4337 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
4338 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, \
4339 0, cmt, maskt, shiftt, cms, masks, shifts); \
4340 gDPLoadSyncInTexLoad(pkt); \
4341 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \
4342 (((width) * (height) + siz##_INCR) >> siz##_SHIFT) -1, \
4343 CALC_DXT(width, siz##_BYTES)); \
4344 gDPPipeSyncInTexLoad(pkt); \
4345 gDPSetTile(pkt, fmt, siz, \
4346 (((width) * 1) + 7) >> 3, 0, \
4347 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4348 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \
4349 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4350 ((height) - 1) << G_TEXTURE_IMAGE_FRAC); \
4351})
4352
4353/* Load fix rww 27jun95 */
4354/* The S at the end means odd lines are already word Swapped */
4355
4356#define gDPLoadTextureBlockS(pkt, timg, fmt, siz, width, height, pal, \
4357 cms, cmt, masks, maskt, shifts, shiftt) \
4358_DW({ \
4359 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
4360 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, \
4361 0, cmt, maskt, shiftt, cms, masks, shifts); \
4362 gDPLoadSyncInTexLoad(pkt); \
4363 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \
4364 (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0); \
4365 gDPPipeSyncInTexLoad(pkt); \
4366 gDPSetTile(pkt, fmt, siz, \
4367 (((width) * siz##_LINE_BYTES) + 7) >> 3, 0, \
4368 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4369 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \
4370 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4371 ((height) - 1) << G_TEXTURE_IMAGE_FRAC); \
4372})
4373
4378#define gDPLoadMultiBlockS(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, \
4379 cms, cmt, masks, maskt, shifts, shiftt) \
4380_DW({ \
4381 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
4382 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, _G_TEXLOADTILE(rtile), \
4383 0, cmt, maskt, shiftt, cms, masks, shifts); \
4384 gDPLoadSyncInTexLoad(pkt); \
4385 gDPLoadBlock(pkt, _G_TEXLOADTILE(rtile), 0, 0, \
4386 (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1,0); \
4387 gDPPipeSyncInTexLoad(pkt); \
4388 gDPSetTile(pkt, fmt, siz, \
4389 (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, \
4390 rtile, pal, cmt, maskt, shiftt, cms, masks, \
4391 shifts); \
4392 gDPSetTileSize(pkt, rtile, 0, 0, \
4393 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4394 ((height) - 1) << G_TEXTURE_IMAGE_FRAC); \
4395})
4396
4397
4398#define gDPLoadTextureBlockYuvS(pkt, timg, fmt, siz, width, height, pal, \
4399 cms, cmt, masks, maskt, shifts, shiftt) \
4400_DW({ \
4401 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
4402 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, \
4403 0, cmt, maskt, shiftt, cms, masks, shifts); \
4404 gDPLoadSyncInTexLoad(pkt); \
4405 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \
4406 (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1,0); \
4407 gDPPipeSyncInTexLoad(pkt); \
4408 gDPSetTile(pkt, fmt, siz, \
4409 (((width) * 1) + 7) >> 3, 0, \
4410 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4411 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \
4412 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4413 ((height) - 1) << G_TEXTURE_IMAGE_FRAC); \
4414})
4415
4416/*
4417 * allows tmem address to be specified
4418 */
4419#define _gDPLoadTextureBlock(pkt, timg, tmem, fmt, siz, width, height, pal, \
4420 cms, cmt, masks, maskt, shifts, shiftt) \
4421_DW({ \
4422 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
4423 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, \
4424 0, cmt, maskt, shiftt, cms, masks, shifts); \
4425 gDPLoadSyncInTexLoad(pkt); \
4426 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \
4427 (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
4428 CALC_DXT(width, siz##_BYTES)); \
4429 gDPPipeSyncInTexLoad(pkt); \
4430 gDPSetTile(pkt, fmt, siz, \
4431 (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, \
4432 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4433 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \
4434 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4435 ((height) - 1) << G_TEXTURE_IMAGE_FRAC); \
4436})
4437
4438/*
4439 * allows tmem address and render tile to be specified
4440 */
4441#define _gDPLoadTextureBlockTile(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, \
4442 cms, cmt, masks, maskt, shifts, shiftt) \
4443_DW({ \
4444 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
4445 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, _G_TEXLOADTILE(rtile), \
4446 0, cmt, maskt, shiftt, cms, masks, shifts); \
4447 gDPLoadSyncInTexLoad(pkt); \
4448 gDPLoadBlock(pkt, _G_TEXLOADTILE(rtile), 0, 0, \
4449 (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
4450 CALC_DXT(width, siz##_BYTES)); \
4451 gDPPipeSyncInTexLoad(pkt); \
4452 gDPSetTile(pkt, fmt, siz, \
4453 (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, \
4454 rtile, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4455 gDPSetTileSize(pkt, rtile, 0, 0, \
4456 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4457 ((height) - 1) << G_TEXTURE_IMAGE_FRAC); \
4458})
4459
4463#define gDPLoadMultiBlock(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, \
4464 cms, cmt, masks, maskt, shifts, shiftt) \
4465_DW({ \
4466 gDPSetTextureImage(pkt, fmt, siz##_LOAD_BLOCK, 1, timg); \
4467 gDPSetTile(pkt, fmt, siz##_LOAD_BLOCK, 0, tmem, _G_TEXLOADTILE(rtile), \
4468 0, cmt, maskt, shiftt, cms, masks, shifts); \
4469 gDPLoadSyncInTexLoad(pkt); \
4470 gDPLoadBlock(pkt, _G_TEXLOADTILE(rtile), 0, 0, \
4471 (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
4472 CALC_DXT(width, siz##_BYTES)); \
4473 gDPPipeSyncInTexLoad(pkt); \
4474 gDPSetTile(pkt, fmt, siz, \
4475 (((width) * siz##_LINE_BYTES) + 7) >> 3, tmem, \
4476 rtile, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4477 gDPSetTileSize(pkt, rtile, 0, 0, \
4478 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4479 ((height) - 1) << G_TEXTURE_IMAGE_FRAC); \
4480})
4481
4482#define gsDPLoadTextureBlock(timg, fmt, siz, width, height, pal, \
4483 cms, cmt, masks, maskt, shifts, shiftt) \
4484 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
4485 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, \
4486 0, cmt, maskt, shiftt, cms, masks, shifts), \
4487 gsDPLoadSyncInTexLoad \
4488 gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \
4489 (((width)*(height) + siz##_INCR) >> siz##_SHIFT) - 1, \
4490 CALC_DXT(width, siz##_BYTES)), \
4491 gsDPPipeSyncInTexLoad \
4492 gsDPSetTile(fmt, siz, \
4493 ((((width) * siz##_LINE_BYTES) + 7) >> 3), 0, \
4494 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts), \
4495 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \
4496 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4497 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
4498
4499/* Here is the static form of the pre-swapped texture block loading */
4500/* See gDPLoadTextureBlockS() for reference. Basically, just don't
4501 calculate DxT, use 0 */
4502
4503#define gsDPLoadTextureBlockS(timg, fmt, siz, width, height, pal, \
4504 cms, cmt, masks, maskt, shifts, shiftt) \
4505 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
4506 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, 0, G_TX_LOADTILE, \
4507 0, cmt, maskt,shiftt, cms, masks, shifts), \
4508 gsDPLoadSyncInTexLoad \
4509 gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \
4510 (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0), \
4511 gsDPPipeSyncInTexLoad \
4512 gsDPSetTile(fmt, siz, \
4513 ((((width) * siz##_LINE_BYTES) + 7) >> 3), 0, \
4514 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \
4515 shifts), \
4516 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \
4517 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4518 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
4519
4520/*
4521 * Allow tmem address to be specified
4522 */
4523#define _gsDPLoadTextureBlock(timg, tmem, fmt, siz, width, height, pal, \
4524 cms, cmt, masks, maskt, shifts, shiftt) \
4525 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
4526 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, G_TX_LOADTILE, \
4527 0, cmt, maskt, shiftt, cms, masks, shifts), \
4528 gsDPLoadSyncInTexLoad \
4529 gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \
4530 (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
4531 CALC_DXT(width, siz##_BYTES)), \
4532 gsDPPipeSyncInTexLoad \
4533 gsDPSetTile(fmt, siz, \
4534 ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, \
4535 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, \
4536 shifts), \
4537 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \
4538 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4539 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
4540
4541
4542/*
4543 * Allow tmem address and render_tile to be specified
4544 */
4545#define _gsDPLoadTextureBlockTile(timg, tmem, rtile, fmt, siz, width, height, pal, \
4546 cms, cmt, masks, maskt, shifts, shiftt) \
4547 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
4548 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, _G_TEXLOADTILE(rtile), \
4549 0, cmt, maskt, shiftt, cms, masks, shifts), \
4550 gsDPLoadSyncInTexLoad \
4551 gsDPLoadBlock(_G_TEXLOADTILE(rtile), 0, 0, \
4552 (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
4553 CALC_DXT(width, siz##_BYTES)), \
4554 gsDPPipeSyncInTexLoad \
4555 gsDPSetTile(fmt, siz, \
4556 ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, \
4557 rtile, pal, cmt, maskt, shiftt, cms, masks, \
4558 shifts), \
4559 gsDPSetTileSize(rtile, 0, 0, \
4560 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4561 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
4562
4563
4568#define gsDPLoadMultiBlock(timg, tmem, rtile, fmt, siz, width, height, pal, \
4569 cms, cmt, masks, maskt, shifts, shiftt) \
4570 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
4571 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, _G_TEXLOADTILE(rtile), \
4572 0, cmt, maskt, shiftt, cms, masks, shifts), \
4573 gsDPLoadSyncInTexLoad \
4574 gsDPLoadBlock(_G_TEXLOADTILE(rtile), 0, 0, \
4575 (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, \
4576 CALC_DXT(width, siz##_BYTES)), \
4577 gsDPPipeSyncInTexLoad \
4578 gsDPSetTile(fmt, siz, \
4579 ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, \
4580 rtile, pal, cmt, maskt, shiftt, cms, masks, shifts), \
4581 gsDPSetTileSize(rtile, 0, 0, \
4582 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4583 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
4584
4593#define gsDPLoadMultiBlockS(timg, tmem, rtile, fmt, siz, width, height, pal, \
4594 cms, cmt, masks, maskt, shifts, shiftt) \
4595 gsDPSetTextureImage(fmt, siz##_LOAD_BLOCK, 1, timg), \
4596 gsDPSetTile(fmt, siz##_LOAD_BLOCK, 0, tmem, _G_TEXLOADTILE(rtile), \
4597 0, cmt, maskt,shiftt, cms, masks, shifts), \
4598 gsDPLoadSyncInTexLoad \
4599 gsDPLoadBlock(_G_TEXLOADTILE(rtile), 0, 0, \
4600 (((width) * (height) + siz##_INCR) >> siz##_SHIFT) - 1, 0), \
4601 gsDPPipeSyncInTexLoad \
4602 gsDPSetTile(fmt, siz, \
4603 ((((width) * siz##_LINE_BYTES) + 7) >> 3), tmem, \
4604 rtile, pal, cmt, maskt, shiftt, cms, masks, shifts), \
4605 gsDPSetTileSize(rtile, 0, 0, \
4606 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4607 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
4608
4609
4610#define gDPLoadTextureBlock_4b(pkt, timg, fmt, width, height, pal, \
4611 cms, cmt, masks, maskt, shifts, shiftt) \
4612_DW({ \
4613 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
4614 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, \
4615 0, cmt, maskt, shiftt, cms, masks, shifts); \
4616 gDPLoadSyncInTexLoad(pkt); \
4617 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \
4618 (((width) * (height) + 3) >> 2) - 1, \
4619 CALC_DXT_4b(width)); \
4620 gDPPipeSyncInTexLoad(pkt); \
4621 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, \
4622 ((((width) >> 1) + 7) >> 3), 0, \
4623 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4624 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \
4625 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4626 ((height) - 1) << G_TEXTURE_IMAGE_FRAC); \
4627})
4628
4629/* Load fix rww 27jun95 */
4630/* The S at the end means odd lines are already word Swapped */
4631
4632#define gDPLoadTextureBlock_4bS(pkt, timg, fmt, width, height, pal, \
4633 cms, cmt, masks, maskt, shifts, shiftt) \
4634_DW({ \
4635 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
4636 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, \
4637 0, cmt, maskt, shiftt, cms, masks, shifts); \
4638 gDPLoadSyncInTexLoad(pkt); \
4639 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \
4640 (((width) * (height) + 3) >> 2) - 1, \
4641 0); \
4642 gDPPipeSyncInTexLoad(pkt); \
4643 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, \
4644 ((((width) >> 1) + 7) >> 3), 0, \
4645 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4646 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \
4647 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4648 ((height) - 1) << G_TEXTURE_IMAGE_FRAC); \
4649})
4650
4654#define gDPLoadMultiBlock_4b(pkt, timg, tmem, rtile, fmt, width, height, pal, \
4655 cms, cmt, masks, maskt, shifts, shiftt) \
4656_DW({ \
4657 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
4658 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, _G_TEXLOADTILE(rtile), \
4659 0, cmt, maskt, shiftt, cms, masks, shifts); \
4660 gDPLoadSyncInTexLoad(pkt); \
4661 gDPLoadBlock(pkt, _G_TEXLOADTILE(rtile), 0, 0, \
4662 (((width) * (height) + 3) >> 2) - 1, \
4663 CALC_DXT_4b(width)); \
4664 gDPPipeSyncInTexLoad(pkt); \
4665 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, \
4666 ((((width) >> 1) + 7) >> 3), tmem, \
4667 rtile, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4668 gDPSetTileSize(pkt, rtile, 0, 0, \
4669 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4670 ((height) - 1) << G_TEXTURE_IMAGE_FRAC); \
4671})
4672
4677#define gDPLoadMultiBlock_4bS(pkt, timg, tmem, rtile, fmt, width, height, pal, \
4678 cms, cmt, masks, maskt, shifts, shiftt) \
4679_DW({ \
4680 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
4681 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, _G_TEXLOADTILE(rtile), \
4682 0, cmt, maskt, shiftt, cms, masks, shifts); \
4683 gDPLoadSyncInTexLoad(pkt); \
4684 gDPLoadBlock(pkt, _G_TEXLOADTILE(rtile), 0, 0, \
4685 (((width) * (height) + 3) >> 2) - 1, \
4686 0); \
4687 gDPPipeSyncInTexLoad(pkt); \
4688 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, \
4689 ((((width) >> 1) + 7) >> 3), tmem, \
4690 rtile, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4691 gDPSetTileSize(pkt, rtile, 0, 0, \
4692 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4693 ((height) - 1) << G_TEXTURE_IMAGE_FRAC); \
4694})
4695
4696
4697#define _gDPLoadTextureBlock_4b(pkt, timg, tmem, fmt, width, height, pal, \
4698 cms, cmt, masks, maskt, shifts, shiftt) \
4699_DW({ \
4700 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_16b, 1, timg); \
4701 gDPSetTile(pkt, fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, \
4702 0, cmt, maskt, shiftt, cms, masks, shifts); \
4703 gDPLoadSyncInTexLoad(pkt); \
4704 gDPLoadBlock(pkt, G_TX_LOADTILE, 0, 0, \
4705 (((width) * (height) + 3) >> 2) - 1, \
4706 CALC_DXT_4b(width)); \
4707 gDPPipeSyncInTexLoad(pkt); \
4708 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, \
4709 ((((width) >> 1) + 7) >> 3), tmem, \
4710 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4711 gDPSetTileSize(pkt, G_TX_RENDERTILE, 0, 0, \
4712 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4713 ((height) - 1) << G_TEXTURE_IMAGE_FRAC); \
4714})
4715
4716#define gsDPLoadTextureBlock_4b(timg, fmt, width, height, pal, \
4717 cms, cmt, masks, maskt, shifts, shiftt) \
4718 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
4719 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, \
4720 0, cmt, maskt, shiftt, cms, masks, shifts), \
4721 gsDPLoadSyncInTexLoad \
4722 gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \
4723 (((width) * (height) + 3) >> 2) - 1, \
4724 CALC_DXT_4b(width)), \
4725 gsDPPipeSyncInTexLoad \
4726 gsDPSetTile(fmt, G_IM_SIZ_4b, \
4727 ((((width) >> 1) + 7) >> 3), 0, \
4728 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts), \
4729 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \
4730 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4731 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
4732
4733#define gsDPLoadTextureBlock_4bS(timg, fmt, width, height, pal, \
4734 cms, cmt, masks, maskt, shifts, shiftt) \
4735 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
4736 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, \
4737 0, cmt, maskt, shiftt, cms, masks, shifts), \
4738 gsDPLoadSyncInTexLoad \
4739 gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \
4740 (((width) * (height) + 3) >> 2) - 1, \
4741 0), \
4742 gsDPPipeSyncInTexLoad \
4743 gsDPSetTile(fmt, G_IM_SIZ_4b, \
4744 ((((width) >> 1) + 7) >> 3), 0, \
4745 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts), \
4746 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \
4747 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4748 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
4749
4754#define gsDPLoadMultiBlock_4b(timg, tmem, rtile, fmt, width, height, pal, \
4755 cms, cmt, masks, maskt, shifts, shiftt) \
4756 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
4757 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, _G_TEXLOADTILE(rtile), \
4758 0, cmt, maskt, shiftt, cms, masks, shifts), \
4759 gsDPLoadSyncInTexLoad \
4760 gsDPLoadBlock(_G_TEXLOADTILE(rtile), 0, 0, \
4761 (((width) * (height) + 3) >> 2) - 1, \
4762 CALC_DXT_4b(width)), \
4763 gsDPPipeSyncInTexLoad \
4764 gsDPSetTile(fmt, G_IM_SIZ_4b, \
4765 ((((width) >> 1) + 7) >> 3), tmem, \
4766 rtile, pal, cmt, maskt, shiftt, cms, masks, shifts), \
4767 gsDPSetTileSize(rtile, 0, 0, \
4768 ((width)-1) << G_TEXTURE_IMAGE_FRAC, \
4769 ((height)-1) << G_TEXTURE_IMAGE_FRAC)
4770
4771
4776#define gsDPLoadMultiBlock_4bS(timg, tmem, rtile, fmt, width, height, pal, \
4777 cms, cmt, masks, maskt, shifts, shiftt) \
4778 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
4779 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, _G_TEXLOADTILE(rtile), \
4780 0, cmt, maskt, shiftt, cms, masks, shifts), \
4781 gsDPLoadSyncInTexLoad \
4782 gsDPLoadBlock(_G_TEXLOADTILE(rtile), 0, 0, \
4783 (((width) * (height) + 3) >> 2) - 1, \
4784 0), \
4785 gsDPPipeSyncInTexLoad \
4786 gsDPSetTile(fmt, G_IM_SIZ_4b, \
4787 ((((width) >> 1) + 7) >> 3), tmem, \
4788 rtile, pal, cmt, maskt, shiftt, cms, masks, shifts), \
4789 gsDPSetTileSize(rtile, 0, 0, \
4790 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4791 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
4792
4793
4794/*
4795 * Allows tmem address to be specified
4796 */
4797#define _gsDPLoadTextureBlock_4b(timg, tmem, fmt, width, height, pal, \
4798 cms, cmt, masks, maskt, shifts, shiftt) \
4799 gsDPSetTextureImage(fmt, G_IM_SIZ_16b, 1, timg), \
4800 gsDPSetTile(fmt, G_IM_SIZ_16b, 0, tmem, G_TX_LOADTILE, \
4801 0, cmt, maskt, shiftt, cms, masks, shifts), \
4802 gsDPLoadSyncInTexLoad \
4803 gsDPLoadBlock(G_TX_LOADTILE, 0, 0, \
4804 (((width) * (height) + 3) >> 2) - 1, \
4805 CALC_DXT_4b(width)), \
4806 gsDPPipeSyncInTexLoad \
4807 gsDPSetTile(fmt, G_IM_SIZ_4b, \
4808 ((((width) >> 1) + 7) >> 3), tmem, \
4809 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts), \
4810 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \
4811 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4812 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
4813
4814#define gDPLoadTextureTile(pkt, timg, fmt, siz, width, height, \
4815 uls, ult, lrs, lrt, pal, \
4816 cms, cmt, masks, maskt, shifts, shiftt) \
4817_DW({ \
4818 gDPSetTextureImage(pkt, fmt, siz, width, timg); \
4819 gDPSetTile(pkt, fmt, siz, \
4820 (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), 0, \
4821 G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, \
4822 shifts); \
4823 gDPLoadSyncInTexLoad(pkt); \
4824 gDPLoadTile(pkt, G_TX_LOADTILE, \
4825 (uls) << G_TEXTURE_IMAGE_FRAC, \
4826 (ult) << G_TEXTURE_IMAGE_FRAC, \
4827 (lrs) << G_TEXTURE_IMAGE_FRAC, \
4828 (lrt) << G_TEXTURE_IMAGE_FRAC); \
4829 gDPPipeSyncInTexLoad(pkt); \
4830 gDPSetTile(pkt, fmt, siz, \
4831 (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), 0, \
4832 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4833 gDPSetTileSize(pkt, G_TX_RENDERTILE, \
4834 (uls) << G_TEXTURE_IMAGE_FRAC, \
4835 (ult) << G_TEXTURE_IMAGE_FRAC, \
4836 (lrs) << G_TEXTURE_IMAGE_FRAC, \
4837 (lrt) << G_TEXTURE_IMAGE_FRAC); \
4838})
4839
4844#define gDPLoadMultiTile(pkt, timg, tmem, rtile, fmt, siz, width, height, \
4845 uls, ult, lrs, lrt, pal, \
4846 cms, cmt, masks, maskt, shifts, shiftt) \
4847_DW({ \
4848 gDPSetTextureImage(pkt, fmt, siz, width, timg); \
4849 gDPSetTile(pkt, fmt, siz, \
4850 (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), tmem, \
4851 _G_TEXLOADTILE(rtile), 0, cmt, maskt, shiftt, cms, masks, shifts); \
4852 gDPLoadSyncInTexLoad(pkt); \
4853 gDPLoadTile(pkt, _G_TEXLOADTILE(rtile), \
4854 (uls) << G_TEXTURE_IMAGE_FRAC, \
4855 (ult) << G_TEXTURE_IMAGE_FRAC, \
4856 (lrs) << G_TEXTURE_IMAGE_FRAC, \
4857 (lrt) << G_TEXTURE_IMAGE_FRAC); \
4858 gDPPipeSyncInTexLoad(pkt); \
4859 gDPSetTile(pkt, fmt, siz, \
4860 (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), tmem, \
4861 rtile, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4862 gDPSetTileSize(pkt, rtile, \
4863 (uls) << G_TEXTURE_IMAGE_FRAC, \
4864 (ult) << G_TEXTURE_IMAGE_FRAC, \
4865 (lrs) << G_TEXTURE_IMAGE_FRAC, \
4866 (lrt) << G_TEXTURE_IMAGE_FRAC); \
4867})
4868
4869
4870#define gsDPLoadTextureTile(timg, fmt, siz, width, height, \
4871 uls, ult, lrs, lrt, pal, \
4872 cms, cmt, masks, maskt, shifts, shiftt) \
4873 gsDPSetTextureImage(fmt, siz, width, timg), \
4874 gsDPSetTile(fmt, siz, \
4875 (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), 0, \
4876 G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
4877 gsDPLoadSyncInTexLoad \
4878 gsDPLoadTile(G_TX_LOADTILE, \
4879 (uls) << G_TEXTURE_IMAGE_FRAC, \
4880 (ult) << G_TEXTURE_IMAGE_FRAC, \
4881 (lrs) << G_TEXTURE_IMAGE_FRAC, \
4882 (lrt) << G_TEXTURE_IMAGE_FRAC), \
4883 gsDPPipeSyncInTexLoad \
4884 gsDPSetTile(fmt, siz, \
4885 (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), 0, \
4886 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts), \
4887 gsDPSetTileSize(G_TX_RENDERTILE, \
4888 (uls) << G_TEXTURE_IMAGE_FRAC, \
4889 (ult) << G_TEXTURE_IMAGE_FRAC, \
4890 (lrs) << G_TEXTURE_IMAGE_FRAC, \
4891 (lrt) << G_TEXTURE_IMAGE_FRAC)
4892
4897#define gsDPLoadMultiTile(timg, tmem, rtile, fmt, siz, width, height, \
4898 uls, ult, lrs, lrt, pal, \
4899 cms, cmt, masks, maskt, shifts, shiftt) \
4900 gsDPSetTextureImage(fmt, siz, width, timg), \
4901 gsDPSetTile(fmt, siz, \
4902 (((((lrs) - (uls) + 1) * siz##_TILE_BYTES) + 7) >> 3), tmem, \
4903 _G_TEXLOADTILE(rtile), 0, cmt, maskt, shiftt, cms, masks, shifts), \
4904 gsDPLoadSyncInTexLoad \
4905 gsDPLoadTile(_G_TEXLOADTILE(rtile), \
4906 (uls) << G_TEXTURE_IMAGE_FRAC, \
4907 (ult) << G_TEXTURE_IMAGE_FRAC, \
4908 (lrs) << G_TEXTURE_IMAGE_FRAC, \
4909 (lrt) << G_TEXTURE_IMAGE_FRAC), \
4910 gsDPPipeSyncInTexLoad \
4911 gsDPSetTile(fmt, siz, \
4912 (((((lrs) - (uls) + 1) * siz##_LINE_BYTES) + 7) >> 3), \
4913 tmem, rtile, pal, cmt, maskt, shiftt, cms, masks, shifts), \
4914 gsDPSetTileSize(rtile, \
4915 (uls) << G_TEXTURE_IMAGE_FRAC, \
4916 (ult) << G_TEXTURE_IMAGE_FRAC, \
4917 (lrs) << G_TEXTURE_IMAGE_FRAC, \
4918 (lrt) << G_TEXTURE_IMAGE_FRAC)
4919
4920#define gDPLoadTextureTile_4b(pkt, timg, fmt, width, height, \
4921 uls, ult, lrs, lrt, pal, \
4922 cms, cmt, masks, maskt, shifts, shiftt) \
4923_DW({ \
4924 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_8b, ((width) >> 1), timg); \
4925 gDPSetTile(pkt, fmt, G_IM_SIZ_8b, \
4926 (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, \
4927 G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts); \
4928 gDPLoadSyncInTexLoad(pkt); \
4929 gDPLoadTile(pkt, G_TX_LOADTILE, \
4930 (uls) << (G_TEXTURE_IMAGE_FRAC - 1), \
4931 (ult) << (G_TEXTURE_IMAGE_FRAC), \
4932 (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), \
4933 (lrt) << (G_TEXTURE_IMAGE_FRAC)); \
4934 gDPPipeSyncInTexLoad(pkt); \
4935 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, \
4936 (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, \
4937 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4938 gDPSetTileSize(pkt, G_TX_RENDERTILE, \
4939 (uls) << G_TEXTURE_IMAGE_FRAC, \
4940 (ult) << G_TEXTURE_IMAGE_FRAC, \
4941 (lrs) << G_TEXTURE_IMAGE_FRAC, \
4942 (lrt) << G_TEXTURE_IMAGE_FRAC); \
4943})
4944
4949#define gDPLoadMultiTile_4b(pkt, timg, tmem, rtile, fmt, width, height, \
4950 uls, ult, lrs, lrt, pal, \
4951 cms, cmt, masks, maskt, shifts, shiftt) \
4952_DW({ \
4953 gDPSetTextureImage(pkt, fmt, G_IM_SIZ_8b, ((width) >> 1), timg); \
4954 gDPSetTile(pkt, fmt, G_IM_SIZ_8b, \
4955 (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, \
4956 _G_TEXLOADTILE(rtile), 0, cmt, maskt, shiftt, cms, masks, shifts); \
4957 gDPLoadSyncInTexLoad(pkt); \
4958 gDPLoadTile(pkt, _G_TEXLOADTILE(rtile), \
4959 (uls) << (G_TEXTURE_IMAGE_FRAC - 1), \
4960 (ult) << (G_TEXTURE_IMAGE_FRAC), \
4961 (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), \
4962 (lrt) << (G_TEXTURE_IMAGE_FRAC)); \
4963 gDPPipeSyncInTexLoad(pkt); \
4964 gDPSetTile(pkt, fmt, G_IM_SIZ_4b, \
4965 (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, \
4966 rtile, pal, cmt, maskt, shiftt, cms, masks, shifts); \
4967 gDPSetTileSize(pkt, rtile, \
4968 (uls) << G_TEXTURE_IMAGE_FRAC, \
4969 (ult) << G_TEXTURE_IMAGE_FRAC, \
4970 (lrs) << G_TEXTURE_IMAGE_FRAC, \
4971 (lrt) << G_TEXTURE_IMAGE_FRAC); \
4972})
4973
4974#define gsDPLoadTextureTile_4b(timg, fmt, width, height, \
4975 uls, ult, lrs, lrt, pal, \
4976 cms, cmt, masks, maskt, shifts, shiftt) \
4977 gsDPSetTextureImage(fmt, G_IM_SIZ_8b, ((width) >> 1), timg), \
4978 gsDPSetTile(fmt, G_IM_SIZ_8b, \
4979 (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, \
4980 G_TX_LOADTILE, 0, cmt, maskt, shiftt, cms, masks, shifts), \
4981 gsDPLoadSyncInTexLoad \
4982 gsDPLoadTile(G_TX_LOADTILE, \
4983 (uls) << (G_TEXTURE_IMAGE_FRAC - 1), \
4984 (ult) << (G_TEXTURE_IMAGE_FRAC), \
4985 (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), \
4986 (lrt) << (G_TEXTURE_IMAGE_FRAC)), \
4987 gsDPPipeSyncInTexLoad \
4988 gsDPSetTile(fmt, G_IM_SIZ_4b, \
4989 (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), 0, \
4990 G_TX_RENDERTILE, pal, cmt, maskt, shiftt, cms, masks, shifts), \
4991 gsDPSetTileSize(G_TX_RENDERTILE, \
4992 (uls) << G_TEXTURE_IMAGE_FRAC, \
4993 (ult) << G_TEXTURE_IMAGE_FRAC, \
4994 (lrs) << G_TEXTURE_IMAGE_FRAC, \
4995 (lrt) << G_TEXTURE_IMAGE_FRAC)
4996
5000#define gsDPLoadMultiTile_4b(timg, tmem, rtile, fmt, width, height, \
5001 uls, ult, lrs, lrt, pal, \
5002 cms, cmt, masks, maskt, shifts, shiftt) \
5003 \
5004 gsDPSetTextureImage(fmt, G_IM_SIZ_8b, ((width) >> 1), timg), \
5005 gsDPSetTile(fmt, G_IM_SIZ_8b, \
5006 (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, \
5007 _G_TEXLOADTILE(rtile), 0, cmt, maskt, shiftt, cms, masks, shifts), \
5008 gsDPLoadSyncInTexLoad \
5009 gsDPLoadTile(_G_TEXLOADTILE(rtile), \
5010 (uls) << (G_TEXTURE_IMAGE_FRAC - 1), \
5011 (ult) << (G_TEXTURE_IMAGE_FRAC), \
5012 (lrs) << (G_TEXTURE_IMAGE_FRAC - 1), \
5013 (lrt) << (G_TEXTURE_IMAGE_FRAC)), \
5014 gsDPPipeSyncInTexLoad \
5015 gsDPSetTile(fmt, G_IM_SIZ_4b, \
5016 (((((lrs) - (uls) + 1) >> 1) + 7) >> 3), tmem, \
5017 rtile, pal, cmt, maskt, shiftt, cms, masks, shifts), \
5018 gsDPSetTileSize(rtile, \
5019 (uls) << G_TEXTURE_IMAGE_FRAC, \
5020 (ult) << G_TEXTURE_IMAGE_FRAC, \
5021 (lrs) << G_TEXTURE_IMAGE_FRAC, \
5022 (lrt) << G_TEXTURE_IMAGE_FRAC)
5023
5030#define gDPLoadTLUT_pal16(pkt, pal, dram) \
5031_DW({ \
5032 gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \
5033 gDPTileSyncInTexLoad(pkt); \
5034 gDPSetTile(pkt, 0, 0, 0, (256 + (((pal) & 0xF) * 16)), \
5035 _G_PALLOADTILE((pal) & 1), 0, 0, 0, 0, 0, 0, 0); \
5036 gDPLoadSyncInTexLoad(pkt); \
5037 gDPLoadTLUTCmd(pkt, _G_PALLOADTILE((pal) & 1), 15); \
5038 gDPPipeSyncInTexLoad(pkt); \
5039})
5043#define gsDPLoadTLUT_pal16(pal, dram) \
5044 gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), \
5045 gsDPTileSyncInTexLoad \
5046 gsDPSetTile(0, 0, 0, (256 + (((pal) & 0xF) * 16)), \
5047 _G_PALLOADTILE((pal) & 1), 0, 0, 0, 0, 0, 0, 0), \
5048 gsDPLoadSyncInTexLoad \
5049 gsDPLoadTLUTCmd(_G_PALLOADTILE((pal) & 1), 15) \
5050 gsDPPipeSyncEndOfTexLoad
5051
5056#define gDPLoadTLUT_pal256(pkt, dram) \
5057_DW({ \
5058 gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \
5059 gDPTileSyncInTexLoad(pkt); \
5060 gDPSetTile(pkt, 0, 0, 0, 256, \
5061 _G_PALLOADTILE(0), 0, 0, 0, 0, 0, 0, 0); \
5062 gDPLoadSyncInTexLoad(pkt); \
5063 gDPLoadTLUTCmd(pkt, _G_PALLOADTILE(0), 255); \
5064 gDPPipeSyncInTexLoad(pkt); \
5065})
5066
5070#define gsDPLoadTLUT_pal256(dram) \
5071 gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), \
5072 gsDPTileSyncInTexLoad \
5073 gsDPSetTile(0, 0, 0, 256, \
5074 _G_PALLOADTILE(0), 0, 0, 0, 0, 0, 0, 0), \
5075 gsDPLoadSyncInTexLoad \
5076 gsDPLoadTLUTCmd(_G_PALLOADTILE(0), 255) \
5077 gsDPPipeSyncEndOfTexLoad
5078
5079/*
5080 * Assumes that the starting TMEM address is calculated like in DPLoadTLUT_pal16
5081 * (which is the only sane way to do it if you are loading two palettes for
5082 * multitexture)
5083 */
5084#define _G_PALTMEMTOTILE(tmemaddr) _G_PALLOADTILE(((tmemaddr) >> 4) & 1)
5085
5086#define gDPLoadTLUT(pkt, count, tmemaddr, dram) \
5087_DW({ \
5088 gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \
5089 gDPTileSyncInTexLoad(pkt); \
5090 gDPSetTile(pkt, 0, 0, 0, tmemaddr, \
5091 _G_PALTMEMTOTILE(tmemaddr), 0, 0, 0, 0, 0, 0, 0); \
5092 gDPLoadSyncInTexLoad(pkt); \
5093 gDPLoadTLUTCmd(pkt, _G_PALTMEMTOTILE(tmemaddr), ((count) - 1)); \
5094 gDPPipeSyncInTexLoad(pkt); \
5095})
5096
5097#define gsDPLoadTLUT(count, tmemaddr, dram) \
5098 gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), \
5099 gsDPTileSyncInTexLoad \
5100 gsDPSetTile(0, 0, 0, tmemaddr, \
5101 _G_PALTMEMTOTILE(tmemaddr), 0, 0, 0, 0, 0, 0, 0), \
5102 gsDPLoadSyncInTexLoad \
5103 gsDPLoadTLUTCmd(_G_PALTMEMTOTILE(tmemaddr), ((count) - 1)) \
5104 gsDPPipeSyncEndOfTexLoad
5105
5106
5107
5108#define gDPSetScissor(pkt, mode, ulx, uly, lrx, lry) \
5109_DW({ \
5110 Gfx *_g = (Gfx *)pkt; \
5111 \
5112 _g->words.w0 = (_SHIFTL(G_SETSCISSOR, 24, 8) | \
5113 _SHIFTL((int)((float)(ulx) * 4.0f), 12, 12) | \
5114 _SHIFTL((int)((float)(uly) * 4.0f), 0, 12)); \
5115 _g->words.w1 = (_SHIFTL(mode, 24, 2) | \
5116 _SHIFTL((int)((float)(lrx) * 4.0f), 12, 12) | \
5117 _SHIFTL((int)((float)(lry) * 4.0f), 0, 12)); \
5118})
5119
5120
5121#define gDPSetScissorFrac(pkt, mode, ulx, uly, lrx, lry) \
5122_DW({ \
5123 Gfx *_g = (Gfx *)pkt; \
5124 \
5125 _g->words.w0 = (_SHIFTL(G_SETSCISSOR, 24, 8) | \
5126 _SHIFTL((int)((ulx)), 12, 12) | \
5127 _SHIFTL((int)((uly)), 0, 12)); \
5128 _g->words.w1 = (_SHIFTL(mode, 24, 2) | \
5129 _SHIFTL((int)((lrx)), 12, 12) | \
5130 _SHIFTL((int)((lry)), 0, 12)); \
5131})
5132
5133#define gsDPSetScissor(mode, ulx, uly, lrx, lry) \
5134{ \
5135 (_SHIFTL(G_SETSCISSOR, 24, 8) | \
5136 _SHIFTL((int)((float)(ulx) * 4.0f), 12, 12) | \
5137 _SHIFTL((int)((float)(uly) * 4.0f), 0, 12)), \
5138 (_SHIFTL(mode, 24, 2) | \
5139 _SHIFTL((int)((float)(lrx) * 4.0f), 12, 12) | \
5140 _SHIFTL((int)((float)(lry) * 4.0f), 0, 12)) \
5141}
5142
5143#define gsDPSetScissorFrac(mode, ulx, uly, lrx, lry) \
5144{ \
5145 (_SHIFTL(G_SETSCISSOR, 24, 8) | \
5146 _SHIFTL((int)((ulx)), 12, 12) | \
5147 _SHIFTL((int)((uly)), 0, 12)), \
5148 (_SHIFTL(mode, 24, 2) | \
5149 _SHIFTL((int)(lrx), 12, 12) | \
5150 _SHIFTL((int)(lry), 0, 12)) \
5151}
5152
5153/* Fraction never used in fill */
5154#define gDPFillRectangle(pkt, ulx, uly, lrx, lry) \
5155_DW({ \
5156 Gfx *_g = (Gfx *)(pkt); \
5157 \
5158 _g->words.w0 = (_SHIFTL(G_FILLRECT, 24, 8) | \
5159 _SHIFTL((lrx), 14, 10) | \
5160 _SHIFTL((lry), 2, 10)); \
5161 _g->words.w1 = (_SHIFTL((ulx), 14, 10) | \
5162 _SHIFTL((uly), 2, 10)); \
5163})
5164
5165#define gsDPFillRectangle(ulx, uly, lrx, lry) \
5166{ \
5167 (_SHIFTL(G_FILLRECT, 24, 8) | \
5168 _SHIFTL((lrx), 14, 10) | \
5169 _SHIFTL((lry), 2, 10)), \
5170 (_SHIFTL((ulx), 14, 10) | \
5171 _SHIFTL((uly), 2, 10)) \
5172}
5173
5174/* like gDPFillRectangle but accepts negative arguments */
5175#define gDPScisFillRectangle(pkt, ulx, uly, lrx, lry) \
5176_DW({ \
5177 Gfx *_g = (Gfx *)(pkt); \
5178 \
5179 _g->words.w0 = (_SHIFTL(G_FILLRECT, 24, 8) | \
5180 _SHIFTL(MAX((lrx), 0), 14, 10) | \
5181 _SHIFTL(MAX((lry), 0), 2, 10)); \
5182 _g->words.w1 = (_SHIFTL(MAX((ulx), 0), 14, 10) | \
5183 _SHIFTL(MAX((uly), 0), 2, 10)); \
5184})
5185
5186#define gDPSetConvert(pkt, k0, k1, k2, k3, k4, k5) \
5187_DW({ \
5188 Gfx *_g = (Gfx *)(pkt); \
5189 \
5190 _g->words.w0 = (_SHIFTL(G_SETCONVERT, 24, 8) | \
5191 _SHIFTL(k0, 13, 9) | \
5192 _SHIFTL(k1, 4, 9) | \
5193 _SHIFTR(k2, 5, 4)); \
5194 _g->words.w1 = (_SHIFTL(k2, 27, 5) | \
5195 _SHIFTL(k3, 18, 9) | \
5196 _SHIFTL(k4, 9, 9) | \
5197 _SHIFTL(k5, 0, 9)); \
5198})
5199
5200#define gsDPSetConvert(k0, k1, k2, k3, k4, k5) \
5201{ \
5202 (_SHIFTL(G_SETCONVERT, 24, 8) | \
5203 _SHIFTL(k0, 13, 9) | \
5204 _SHIFTL(k1, 4, 9) | \
5205 _SHIFTL(k2, 5, 4)), \
5206 (_SHIFTL(k2, 27, 5) | \
5207 _SHIFTL(k3, 18, 9) | \
5208 _SHIFTL(k4, 9, 9) | \
5209 _SHIFTL(k5, 0, 9)) \
5210}
5211
5212#define gDPSetKeyR(pkt, cR, sR, wR) \
5213_DW({ \
5214 Gfx *_g = (Gfx *)(pkt); \
5215 \
5216 _g->words.w0 = _SHIFTL(G_SETKEYR, 24, 8); \
5217 _g->words.w1 = (_SHIFTL(wR, 16, 12) | \
5218 _SHIFTL(cR, 8, 8) | \
5219 _SHIFTL(sR, 0, 8)); \
5220})
5221
5222#define gsDPSetKeyR(cR, sR, wR) \
5223{ \
5224 _SHIFTL(G_SETKEYR, 24, 8), \
5225 (_SHIFTL(wR, 16, 12) | \
5226 _SHIFTL(cR, 8, 8) | \
5227 _SHIFTL(sR, 0, 8)) \
5228}
5229
5230#define gDPSetKeyGB(pkt, cG, sG, wG, cB, sB, wB) \
5231_DW({ \
5232 Gfx *_g = (Gfx *)(pkt); \
5233 \
5234 _g->words.w0 = (_SHIFTL(G_SETKEYGB, 24, 8) | \
5235 _SHIFTL(wG, 12, 12) | \
5236 _SHIFTL(wB, 0, 12)); \
5237 _g->words.w1 = (_SHIFTL(cG, 24, 8) | \
5238 _SHIFTL(sG, 16, 8) | \
5239 _SHIFTL(cB, 8, 8) | \
5240 _SHIFTL(sB, 0, 8)); \
5241})
5242
5243#define gsDPSetKeyGB(cG, sG, wG, cB, sB, wB) \
5244{ \
5245 (_SHIFTL(G_SETKEYGB, 24, 8) | \
5246 _SHIFTL(wG, 12, 12) | \
5247 _SHIFTL(wB, 0, 12)), \
5248 (_SHIFTL(cG, 24, 8) | \
5249 _SHIFTL(sG, 16, 8) | \
5250 _SHIFTL(cB, 8, 8) | \
5251 _SHIFTL(sB, 0, 8)) \
5252}
5253
5254#define gDPNoParam(pkt, cmd) \
5255_DW({ \
5256 Gfx *_g = (Gfx *)(pkt); \
5257 \
5258 _g->words.w0 = _SHIFTL(cmd, 24, 8); \
5259 _g->words.w1 = 0; \
5260})
5261
5262#define gsDPNoParam(cmd) \
5263{ \
5264 _SHIFTL(cmd, 24, 8), \
5265 0 \
5266}
5267
5268#define gDPParam(pkt, cmd, param) \
5269_DW({ \
5270 Gfx *_g = (Gfx *)(pkt); \
5271 \
5272 _g->words.w0 = _SHIFTL(cmd, 24, 8); \
5273 _g->words.w1 = (param); \
5274})
5275
5276#define gsDPParam(cmd, param) \
5277{ \
5278 _SHIFTL(cmd, 24, 8), \
5279 (param) \
5280}
5281
5288#define gsDPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
5289{ \
5290 (_SHIFTL(G_TEXRECT, 24, 8) | \
5291 _SHIFTL(xh, 12, 12) | \
5292 _SHIFTL(yh, 0, 12)), \
5293 (_SHIFTL(tile, 24, 3) | \
5294 _SHIFTL(xl, 12, 12) | \
5295 _SHIFTL(yl, 0, 12)), \
5296}, \
5297{ \
5298 (_SHIFTL(s, 16, 16) | \
5299 _SHIFTL(t, 0, 16)), \
5300 (_SHIFTL(dsdx, 16, 16) | \
5301 _SHIFTL(dtdy, 0, 16)) \
5302}
5303
5307#define gDPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
5308_DW({ \
5309 Gfx *_g = (Gfx *)(pkt); \
5310 if (pkt); \
5311 _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | \
5312 _SHIFTL(xh, 12, 12) | \
5313 _SHIFTL(yh, 0, 12)); \
5314 _g->words.w1 = (_SHIFTL(tile, 24, 3) | \
5315 _SHIFTL(xl, 12, 12) | \
5316 _SHIFTL(yl, 0, 12)); \
5317 _g ++; \
5318 _g->words.w0 = (_SHIFTL(s, 16, 16) | \
5319 _SHIFTL(t, 0, 16)); \
5320 _g->words.w1 = (_SHIFTL(dsdx, 16, 16) | \
5321 _SHIFTL(dtdy, 0, 16)); \
5322})
5323
5324#define gsDPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
5325{ \
5326 (_SHIFTL(G_TEXRECTFLIP, 24, 8) | \
5327 _SHIFTL(xh, 12, 12) | \
5328 _SHIFTL(yh, 0, 12)), \
5329 (_SHIFTL(tile, 24, 3) | \
5330 _SHIFTL(xl, 12, 12) | \
5331 _SHIFTL(yl, 0, 12)), \
5332}, \
5333{ \
5334 (_SHIFTL(s, 16, 16) | \
5335 _SHIFTL(t, 0, 16)), \
5336 (_SHIFTL(dsdx, 16, 16) | \
5337 _SHIFTL(dtdy, 0, 16)) \
5338}
5339
5340#define gDPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
5341_DW({ \
5342 Gfx *_g = (Gfx *)(pkt); \
5343 if (pkt); \
5344 _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | \
5345 _SHIFTL(xh, 12, 12) | \
5346 _SHIFTL(yh, 0, 12)); \
5347 _g->words.w1 = (_SHIFTL(tile, 24, 3) | \
5348 _SHIFTL(xl, 12, 12) | \
5349 _SHIFTL(yl, 0, 12)); \
5350 _g ++; \
5351 _g->words.w0 = (_SHIFTL(s, 16, 16) | \
5352 _SHIFTL(t, 0, 16)); \
5353 _g->words.w1 = (_SHIFTL(dsdx, 16, 16) | \
5354 _SHIFTL(dtdy, 0, 16)); \
5355})
5356
5357#define gsSPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
5358 (_SHIFTL(G_TEXRECT, 24, 8) | \
5359 _SHIFTL(xh, 12, 12) | \
5360 _SHIFTL(yh, 0, 12)), \
5361 (_SHIFTL(tile, 24, 3) | \
5362 _SHIFTL(xl, 12, 12) | \
5363 _SHIFTL(yl, 0, 12)), \
5364 gsImmp1(G_RDPHALF_1, \
5365 (_SHIFTL(s, 16, 16) | \
5366 _SHIFTL(t, 0, 16))), \
5367 gsImmp1(G_RDPHALF_2, \
5368 (_SHIFTL(dsdx, 16, 16) | \
5369 _SHIFTL(dtdy, 0, 16)))
5370
5371#define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
5372_DW({ \
5373 Gfx *_g = (Gfx *)(pkt); \
5374 \
5375 _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | \
5376 _SHIFTL(xh, 12, 12) | \
5377 _SHIFTL(yh, 0, 12)); \
5378 _g->words.w1 = (_SHIFTL(tile, 24, 3) | \
5379 _SHIFTL(xl, 12, 12) | \
5380 _SHIFTL(yl, 0, 12)); \
5381 gImmp1(pkt, G_RDPHALF_1, \
5382 (_SHIFTL(s, 16, 16) | \
5383 _SHIFTL(t, 0, 16))); \
5384 gImmp1(pkt, G_RDPHALF_2, \
5385 (_SHIFTL(dsdx, 16, 16) | \
5386 _SHIFTL(dtdy, 0, 16))); \
5387})
5388
5389/* like gSPTextureRectangle but accepts negative position arguments */
5390#define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
5391_DW({ \
5392 Gfx *_g = (Gfx *)(pkt); \
5393 \
5394 _g->words.w0 = (_SHIFTL(G_TEXRECT, 24, 8) | \
5395 _SHIFTL(MAX((s16)(xh),0), 12, 12) | \
5396 _SHIFTL(MAX((s16)(yh),0), 0, 12)); \
5397 _g->words.w1 = (_SHIFTL((tile), 24, 3) | \
5398 _SHIFTL(MAX((s16)(xl),0), 12, 12) | \
5399 _SHIFTL(MAX((s16)(yl),0), 0, 12)); \
5400 gImmp1(pkt, G_RDPHALF_1, \
5401 (_SHIFTL(((s) - \
5402 (((s16)(xl) < 0) ? \
5403 (((s16)(dsdx) < 0) ? \
5404 (MAX((((s16)(xl) * (s16)(dsdx)) >> 7), 0)) : \
5405 (MIN((((s16)(xl) * (s16)(dsdx)) >> 7), 0))) : 0)), 16, 16) | \
5406 _SHIFTL(((t) - \
5407 (( (yl) < 0) ? \
5408 (((s16)(dtdy) < 0) ? \
5409 (MAX((((s16)(yl) * (s16)(dtdy)) >> 7), 0)) : \
5410 (MIN((((s16)(yl) * (s16)(dtdy)) >> 7), 0))) : 0)), 0, 16))); \
5411 gImmp1(pkt, G_RDPHALF_2, \
5412 (_SHIFTL((dsdx), 16, 16) | \
5413 _SHIFTL((dtdy), 0, 16))); \
5414})
5415
5416#define gsSPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
5417 (_SHIFTL(G_TEXRECTFLIP, 24, 8) | \
5418 _SHIFTL(xh, 12, 12) | \
5419 _SHIFTL(yh, 0, 12)), \
5420 (_SHIFTL(tile, 24, 3) | \
5421 _SHIFTL(xl, 12, 12) | \
5422 _SHIFTL(yl, 0, 12)), \
5423 gsImmp1(G_RDPHALF_1, \
5424 (_SHIFTL(s, 16, 16) | \
5425 _SHIFTL(t, 0, 16))), \
5426 gsImmp1(G_RDPHALF_2, \
5427 (_SHIFTL(dsdx, 16, 16) | \
5428 _SHIFTL(dtdy, 0, 16)))
5429
5430#define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
5431_DW({ \
5432 Gfx *_g = (Gfx *)(pkt); \
5433 \
5434 _g->words.w0 = (_SHIFTL(G_TEXRECTFLIP, 24, 8) | \
5435 _SHIFTL(xh, 12, 12) | \
5436 _SHIFTL(yh, 0, 12)); \
5437 _g->words.w1 = (_SHIFTL(tile, 24, 3) | \
5438 _SHIFTL(xl, 12, 12) | \
5439 _SHIFTL(yl, 0, 12)); \
5440 gImmp1(pkt, G_RDPHALF_1, \
5441 (_SHIFTL(s, 16, 16) | \
5442 _SHIFTL(t, 0, 16))); \
5443 gImmp1(pkt, G_RDPHALF_2, \
5444 (_SHIFTL(dsdx, 16, 16) | \
5445 _SHIFTL(dtdy, 0, 16))); \
5446})
5447
5448#define gsDPWord(wordhi, wordlo) \
5449 gsImmp1(G_RDPHALF_1, (unsigned int)(wordhi)), \
5450 gsImmp1(G_RDPHALF_2, (unsigned int)(wordlo))
5451
5452#define gDPWord(pkt, wordhi, wordlo) \
5453_DW({ \
5454 Gfx *_g = (Gfx *)(pkt); \
5455 gImmp1(pkt, G_RDPHALF_1, (unsigned int)(wordhi)); \
5456 gImmp1(pkt, G_RDPHALF_2, (unsigned int)(wordlo)); \
5457})
5458
5459#ifdef RISKY_RDP_SYNCS
5460/*
5461 * The community has found that in nearly all instances, a tile sync is
5462 * sufficient where a pipe sync is normally used--between rendering something
5463 * and changing critical RDP settings. However, we are not 100% sure this is
5464 * true for all obscure settings, so it is risky.
5465*/
5466#define G_USEASPIPESYNC G_RDPTILESYNC
5467#else
5468#define G_USEASPIPESYNC G_RDPPIPESYNC
5469#endif
5470
5471#define gDPFullSync(pkt) gDPNoParam(pkt, G_RDPFULLSYNC)
5472#define gsDPFullSync() gsDPNoParam( G_RDPFULLSYNC)
5473#define gDPTileSync(pkt) gDPNoParam(pkt, G_RDPTILESYNC)
5474#define gsDPTileSync() gsDPNoParam( G_RDPTILESYNC)
5475#define gDPPipeSync(pkt) gDPNoParam(pkt, G_USEASPIPESYNC)
5476#define gsDPPipeSync() gsDPNoParam( G_USEASPIPESYNC)
5477#define gDPLoadSync(pkt) gDPNoParam(pkt, G_RDPLOADSYNC)
5478#define gsDPLoadSync() gsDPNoParam( G_RDPLOADSYNC)
5479#define gDPNoOp(pkt) gDPNoParam(pkt, G_NOOP)
5480#define gsDPNoOp() gsDPNoParam( G_NOOP)
5481#define gDPNoOpTag(pkt, tag) gDPParam(pkt, G_NOOP, tag)
5482#define gsDPNoOpTag(tag) gsDPParam( G_NOOP, tag)
5483
5484#define gDPNoOpHere(pkt, file, line) gDma1p(pkt, G_NOOP, file, line, 1)
5485#define gDPNoOpString(pkt, data, n) gDma1p(pkt, G_NOOP, data, n, 2)
5486#define gDPNoOpWord(pkt, data, n) gDma1p(pkt, G_NOOP, data, n, 3)
5487#define gDPNoOpFloat(pkt, data, n) gDma1p(pkt, G_NOOP, data, n, 4)
5488#define gDPNoOpQuiet(pkt) gDma1p(pkt, G_NOOP, 0, 0, 5)
5489#define gDPNoOpVerbose(pkt, n) gDma1p(pkt, G_NOOP, 0, n, 5)
5490#define gDPNoOpCallBack(pkt, callback, arg) gDma1p(pkt, G_NOOP, callback, arg, 6)
5491#define gDPNoOpOpenDisp(pkt, file, line) gDma1p(pkt, G_NOOP, file, line, 7)
5492#define gDPNoOpCloseDisp(pkt, file, line) gDma1p(pkt, G_NOOP, file, line, 8)
5493#define gDPNoOpTag3(pkt, type, data, n) gDma1p(pkt, G_NOOP, data, n, type)
5494
5495#endif /* F3DEX3_H */
long int Mtx_t[4][4]
Definition gbi.h:1121
Definition gbi.h:1238
char pad1
Definition gbi.h:1240
char pad2
Definition gbi.h:1242
Definition gbi.h:1741
Definition gbi.h:1731
Definition gbi.h:1762
Definition gbi.h:1752
Definition gbi.h:1857
Definition gbi.h:1773
Definition gbi.h:1992
Definition gbi.h:1208
char pad3
Definition gbi.h:1214
unsigned char type
Definition gbi.h:1210
char pad2
Definition gbi.h:1212
Definition gbi.h:1225
unsigned char kq
Definition gbi.h:1231
unsigned char size
Definition gbi.h:1232
unsigned char kc
Definition gbi.h:1227
unsigned char kl
Definition gbi.h:1229
Definition gbi.h:1973
Definition gbi.h:1111
Definition gbi.h:1191
Definition gbi.h:1071
unsigned short flag
Definition gbi.h:1073
Definition gbi.h:1081
unsigned char a
Definition gbi.h:1086
unsigned short flag
Definition gbi.h:1083
Definition gbi.h:2001
Definition gbi.h:1092
long long int force_structure_alignment
Definition gbi.h:1095
Vtx_tn n
Definition gbi.h:1094