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