14#include "ultra64/mbi.h"
28#include "ultra64/sptask.h"
29#if OS_YIELD_DATA_SIZE != 0xC00
30#error "F3DEX3 requires OS_YIELD_DATA_SIZE == 0xC00"
33#ifdef REQUIRE_SEMICOLONS_AFTER_GBI_COMMANDS
36#define _DW(macro) do {macro} while (0)
40#define _DW(macro) macro
48#define G_TRI_FILL 0xC8
49#define G_TRI_SHADE 0xCC
50#define G_TRI_TXTR 0xCA
51#define G_TRI_SHADE_TXTR 0xCE
52#define G_TRI_FILL_ZBUFF 0xC9
53#define G_TRI_SHADE_ZBUFF 0xCD
54#define G_TRI_TXTR_ZBUFF 0xCB
55#define G_TRI_SHADE_TXTR_ZBUFF 0xCF
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
74#define G_GEOMETRYMODE 0xD9
76#define G_MOVEWORD 0xDB
78#define G_LOAD_UCODE 0xDD
82#define G_RDPHALF_1 0xE1
83#define G_SETOTHERMODE_L 0xE2
84#define G_SETOTHERMODE_H 0xE3
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
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
115#define G_MODIFYVTX 0x02
117#define G_BRANCH_WZ 0x04
122#define G_TRISNAKE 0x08
124#define G_LIGHTTORDP 0x0A
125#define G_RELSEGMENT 0x0B
128#define G_BRANCH_Z G_BRANCH_WZ
129#define G_BRANCH_W G_BRANCH_WZ
136#define G_MAX_VERTS 56
139#define G_MAX_LIGHTS 9
142#define G_INPUT_BUFFER_CMDS 21
152#define G_ZBUFFER 0x00000001
153#define G_TEXTURE_ENABLE 0x00000000
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
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
171#define G_SHADING_SMOOTH 0x00200000
172#define G_LIGHTING_POSITIONAL 0x00400000
173#define G_CLIPPING 0x00800000
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
228#define G_ALPHA_COMPARE_CULL_DISABLE 0
229#define G_ALPHA_COMPARE_CULL_BELOW 1
230#define G_ALPHA_COMPARE_CULL_ABOVE -1
238#define G_MV_TEMPMTX0 2
240#define G_MV_TEMPMTX1 6
241#define G_MV_VIEWPORT 8
246#define G_MV_PMTX G_MV_VPMTX
254#define G_MW_NUMLIGHT 0x02
256#define G_MW_SEGMENT 0x06
258#define G_MW_LIGHTCOL 0x0A
262#define G_MW_HALFWORD_FLAG 0x8000
267#define G_MWO_NUMLIGHT 0x00
268#define G_MWO_FOG 0x00
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
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
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
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
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
360#define G_MAXFBZ 0x3FFF
362#define GPACK_RGBA5551(r, g, b, a) \
363 ((((r) << 8) & 0xF800) | \
364 (((g) << 3) & 0x07C0) | \
365 (((b) >> 2) & 0x003E) | \
368#define GPACK_IA16(i, a) (((i) << 8) | (a))
370#define GPACK_ZDZ(z, dz) (((z) << 2) | (dz))
375#define G_IM_FMT_RGBA 0
376#define G_IM_FMT_YUV 1
386#define G_IM_SIZ_16b 2
387#define G_IM_SIZ_32b 3
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
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
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
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
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
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
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
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
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
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
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
469#define G_CC_MODULATERGB G_CC_MODULATEI
470#define G_CC_MODULATERGBDECALA G_CC_MODULATEIDECALA
471#define G_CC_MODULATERGBFADE G_CC_MODULATEIFADE
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
476#define G_CC_MODULATEFADE TEXEL0, 0, SHADE, 0, ENVIRONMENT, 0, TEXEL0, 0
478#define G_CC_MODULATERGBA G_CC_MODULATEIA
479#define G_CC_MODULATERGBFADEA G_CC_MODULATEIFADEA
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
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
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
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
496#define G_CC_DECALFADEA 0, 0, 0, TEXEL0, TEXEL0, 0, ENVIRONMENT, 0
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
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
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
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
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
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
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
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
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
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
539#define G_CC_1CYUV2RGB TEXEL0, K4, K5, TEXEL0, 0, 0, 0, SHADE
545#define G_CC_YUV2RGB TEXEL1, K4, K5, TEXEL1, 0, 0, 0, 0
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
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
573#define G_MDSFT_ALPHACOMPARE 0
574#define G_MDSFT_ZSRCSEL 2
575#define G_MDSFT_RENDERMODE 3
576#define G_MDSFT_BLENDER 16
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
592#define G_MDSFT_PIPELINE 23
595#define G_PM_NPRIMITIVE (0 << G_MDSFT_PIPELINE)
597#define G_PM_1PRIMITIVE G_PM_NPRIMITIVE
599#define G_PM_1PRIMITIVE (1 << G_MDSFT_PIPELINE)
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)
609#define G_TP_NONE (0 << G_MDSFT_TEXTPERSP)
610#define G_TP_PERSP (1 << G_MDSFT_TEXTPERSP)
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)
618#define G_TL_TILE (0 << G_MDSFT_TEXTLOD)
619#define G_TL_LOD (1 << G_MDSFT_TEXTLOD)
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)
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)
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)
637#define G_CK_NONE (0 << G_MDSFT_COMBKEY)
638#define G_CK_KEY (1 << G_MDSFT_COMBKEY)
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)
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)
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)
658#define G_ZS_PIXEL (0 << G_MDSFT_ZSRCSEL)
659#define G_ZS_PRIM (1 << G_MDSFT_ZSRCSEL)
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
695#define G_BL_CLR_MEM 1
697#define G_BL_CLR_FOG 3
702#define G_BL_A_SHADE 2
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
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)
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)
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)
726#define RM_AA_ZB_OPA_DECAL(clk) \
727 AA_DEF | Z_CMP | RD_DEF | CVG_DST_WRAP | ALPHA_CVG_SEL | \
729 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
731#define RM_RA_ZB_OPA_DECAL(clk) \
732 AA_DEF | Z_CMP | CVG_DST_WRAP | ALPHA_CVG_SEL | \
734 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
813#define RM_AA_XLU_SURF(clk) \
814 AA_DEF | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | \
816 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)
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)
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)
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)
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)
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)
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)
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)
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)
860#define RM_ZB_OPA_SURF(clk) \
861 Z_CMP | Z_UPD | CVG_DST_FULL | ALPHA_CVG_SEL | \
863 GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM)
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)
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)
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)
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)
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)
885#define RM_ZB_PCL_SURF(clk) \
886 Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | \
888 GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
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)
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)
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)
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)
908#define RM_PCL_SURF(clk) \
909 CVG_DST_FULL | FORCE_BL | ZMODE_OPA | \
911 GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
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)
917#define RM_NOOP(clk) \
918 GBL_c##clk(0, 0, 0, 0)
920#define RM_VISCVG(clk) \
922 GBL_c##clk(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM)
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)
930#define RM_CUSTOM_AA_ZB_XLU_SURF(clk) \
931 RM_AA_ZB_XLU_SURF(clk) | Z_UPD
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)
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)
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)
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)
995#define G_RM_RA_OPA_SURF RM_RA_OPA_SURF(1)
996#define G_RM_RA_OPA_SURF2 RM_RA_OPA_SURF(2)
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)
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)
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)
1050#define G_SC_NON_INTERLACE 0
1051#define G_SC_ODD_INTERLACE 3
1052#define G_SC_EVEN_INTERLACE 2
1065 unsigned char cn[4];
1095 long long int force_structure_alignment;
1118 long long int force_structure_alignment;
1121#define IPART(x) (((s32)((x) * 0x10000) >> 16) & 0xFFFF)
1122#define FPART(x) ((s32)((x) * 0x10000) & 0xFFFF)
1124#define gdSPDefMtx( \
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), \
1186#define G_MAXZ Error_please_update_viewport_Z_and_Y_see_GBI
1191#define G_NEW_MAXZ 0x7FFF
1212 long long int force_structure_alignment[2];
1221#define LIGHT_TYPE_DIR 0
1225#define LIGHT_TYPE_POINT(kc) kc
1234 unsigned char col[3];
1236 unsigned char colc[3];
1251 unsigned char col[3];
1253 unsigned char colc[3];
1264 unsigned char col[3];
1266 unsigned char colc[3];
1309} OcclusionPlaneCandidate;
1314 long long int force_structure_alignment[2];
1319 long long int force_structure_alignment[1];
1324 long long int force_structure_alignment[1];
1329 long int force_structure_alignment;
1335 long long int force_structure_alignment[3];
1394#define gDefAmbient(r, g, b) \
1396 { (r), (g), (b) }, 0, \
1397 { (r), (g), (b) }, 0, \
1400#define gDefLight(r, g, b, x, y, z) \
1402 { (r), (g), (b) }, 0, \
1403 { (r), (g), (b) }, 0, \
1404 { (x), (y), (z) }, 0, \
1408#define gdSPDefLights0(ar, ag, ab) \
1410 gDefAmbient(ar, ag, ab), \
1413#define gdSPDefLights1(ar, ag, ab, \
1414 r1, g1, b1, x1, y1, z1) \
1417 gDefLight(r1, g1, b1, x1, y1, z1), \
1419 gDefAmbient(ar, ag, ab), \
1422#define gdSPDefLights2(ar, ag, ab, \
1423 r1, g1, b1, x1, y1, z1, \
1424 r2, g2, b2, x2, y2, z2) \
1427 gDefLight(r1, g1, b1, x1, y1, z1), \
1428 gDefLight(r2, g2, b2, x2, y2, z2), \
1430 gDefAmbient(ar, ag, ab), \
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) \
1439 gDefLight(r1, g1, b1, x1, y1, z1), \
1440 gDefLight(r2, g2, b2, x2, y2, z2), \
1441 gDefLight(r3, g3, b3, x3, y3, z3), \
1443 gDefAmbient(ar, ag, ab), \
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) \
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), \
1458 gDefAmbient(ar, ag, ab), \
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) \
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), \
1475 gDefAmbient(ar, ag, ab), \
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) \
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), \
1494 gDefAmbient(ar, ag, ab), \
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) \
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), \
1515 gDefAmbient(ar, ag, ab), \
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) \
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), \
1538 gDefAmbient(ar, ag, ab), \
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) \
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), \
1563 gDefAmbient(ar, ag, ab), \
1566#define gDefPointLight(r, g, b, x, y, z, kc, kl, kq) \
1568 { (r1), (g1), (b1) }, (kc), \
1569 { (r1), (g1), (b1) }, (kl), \
1570 { (x1), (y1), (z1) }, (kq), \
1574#define gdSPDefPointLights0(ar, ag, ab) \
1576 gDefAmbient(ar, ag, ab), \
1579#define gdSPDefPointLights1(ar, ag, ab, \
1580 r1, g1, b1, x1, y1, z1, c1, l1, q1) \
1583 gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \
1585 gDefAmbient(ar, ag, ab), \
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) \
1593 gDefPointLight(r1, g1, b1, x1, y1, z1, c1, l1, q1), \
1594 gDefPointLight(r2, g2, b2, x2, y2, z2, c2, l2, q2), \
1596 gDefAmbient(ar, ag, ab), \
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) \
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), \
1609 gDefAmbient(ar, ag, ab), \
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) \
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), \
1624 gDefAmbient(ar, ag, ab), \
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) \
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), \
1641 gDefAmbient(ar, ag, ab), \
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) \
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), \
1660 gDefAmbient(ar, ag, ab), \
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) \
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), \
1681 gDefAmbient(ar, ag, ab), \
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) \
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), \
1704 gDefAmbient(ar, ag, ab), \
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) \
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), \
1729 gDefAmbient(ar, ag, ab), \
1732#define gdSPDefLookAt(rightx, righty, rightz, upx, upy, upz) \
1734 {{{ rightx, righty, rightz }, 0 }}, \
1735 {{{ upx, upy, upz }, 0 }}, \
1740 unsigned int type : 8;
1741 unsigned int len : 16;
1758 unsigned int par : 8;
1759 unsigned int len : 16;
1768 unsigned int len : 8;
1769 unsigned int ofs : 8;
1770 unsigned int par : 8;
1779 unsigned int index : 8;
1780 unsigned int offset : 16;
1789 unsigned int size : 8;
1790 unsigned int offset : 8;
1791 unsigned int index : 8;
1816 unsigned int pad : 8;
1817 unsigned short vstart_x2;
1818 unsigned short pad2;
1819 unsigned short vend_x2;
1824 unsigned int pad : 24;
1847 unsigned int sft : 8;
1848 unsigned int len : 8;
1849 unsigned int data : 32;
1855 unsigned int sft : 8;
1856 unsigned int len : 8;
1857 unsigned int data : 32;
1862 unsigned char lodscale;
1863 unsigned char pad : 2;
1864 unsigned char level : 3;
1865 unsigned char tile : 3;
1884 unsigned int fmt : 3;
1885 unsigned int siz : 2;
1886 unsigned int pad : 7;
1887 unsigned int wd : 12;
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;
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;
1916 unsigned char prim_min_level;
1917 unsigned char prim_level;
1919 unsigned long color;
1935 unsigned int pad : 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;
1964 unsigned int sl : 12;
1965 unsigned int tl : 12;
1967 unsigned int tile : 3;
1968 unsigned int sh : 12;
1969 unsigned int th : 12;
1972typedef Gloadtile Gloadblock;
1974typedef Gloadtile Gsettilesize;
1976typedef Gloadtile Gloadtlut;
1979 unsigned int cmd : 8;
1980 unsigned int xl : 12;
1981 unsigned int yl : 12;
1982 unsigned int pad1 : 5;
1983 unsigned int tile : 3;
1984 unsigned int xh : 12;
1985 unsigned int yh : 12;
1986 unsigned int s : 16;
1987 unsigned int t : 16;
1988 unsigned int dsdx : 16;
1989 unsigned int dtdy : 16;
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
2007 unsigned int pad : 4;
2008 unsigned int len : 8;
2009 unsigned int pad2 : 4;
2040 GsetothermodeH setothermodeH;
2041 GsetothermodeL setothermodeL;
2043 Gperspnorm perspnorm;
2045 Gsetcombine setcombine;
2050 Gsettilesize settilesize;
2052 Gsetprimdepth setprimdepth;
2053 long long int force_structure_alignment;
2064#define g1Word(pkt, c, l) \
2066 Gfx *_g = (Gfx *)(pkt); \
2067 _g->words.w0 = (_SHIFTL((c), 24, 8) | \
2068 _SHIFTL((l), 0, 24)); \
2073#define gs1Word(c, l) \
2075 (_SHIFTL((c), 24, 8) | \
2076 _SHIFTL((l), 0, 24)), \
2083#define gDma0p(pkt, c, s, l) \
2085 Gfx *_g = (Gfx *)(pkt); \
2087 _g->words.w0 = (_SHIFTL((c), 24, 8) | \
2088 _SHIFTL((l), 0, 24)); \
2089 _g->words.w1 = (unsigned int)(s); \
2092#define gsDma0p(c, s, l) \
2094 (_SHIFTL((c), 24, 8) | \
2095 _SHIFTL((l), 0, 24)), \
2099#define gDma1p(pkt, c, s, l, p) \
2101 Gfx *_g = (Gfx *)(pkt); \
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); \
2109#define gsDma1p(c, s, l, p) \
2111 (_SHIFTL((c), 24, 8) | \
2112 _SHIFTL((p), 16, 8) | \
2113 _SHIFTL((l), 0, 16)), \
2117#define gDma2p(pkt, c, adrs, len, idx, ofs) \
2119 Gfx *_g = (Gfx *)(pkt); \
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); \
2128#define gsDma2p(c, adrs, len, idx, ofs) \
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) \
2137#define gSPNoOp(pkt) g1Word(pkt, G_SPNOOP, 0)
2138#define gsSPNoOp() gs1Word( G_SPNOOP, 0)
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)
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)
2334#define gSPVertex(pkt, v, n, v0) \
2336 Gfx *_g = (Gfx *)(pkt); \
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); \
2349#define gsSPVertex(v, n, v0) \
2351 (_SHIFTL(G_VTX, 24, 8) | \
2352 _SHIFTL((n), 12, 8) | \
2353 _SHIFTL((v0) + (n), 1, 7)), \
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)
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)
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)
2372#define _gSPEndDisplayListRaw(pkt,hint) g1Word(pkt, G_ENDDL, hint)
2373#define _gsSPEndDisplayListRaw(hint) gs1Word( G_ENDDL, hint)
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)
2394#define gSPDisplayListHint(pkt, dl, count) _gSPDisplayListRaw(pkt, dl, _DLHINTVALUE(count))
2398#define gsSPDisplayListHint( dl, count) _gsSPDisplayListRaw( dl, _DLHINTVALUE(count))
2403#define gSPBranchListHint(pkt, dl, count) _gSPBranchListRaw( pkt, dl, _DLHINTVALUE(count))
2408#define gsSPBranchListHint( dl, count) _gsSPBranchListRaw( dl, _DLHINTVALUE(count))
2413#define gSPEndDisplayListHint(pkt, count) _gSPEndDisplayListRaw( pkt, _DLHINTVALUE(count))
2418#define gsSPEndDisplayListHint( count) _gsSPEndDisplayListRaw( _DLHINTVALUE(count))
2423#define gSPDisplayList(pkt, dl) _gSPDisplayListRaw(pkt, dl, 0)
2427#define gsSPDisplayList( dl) _gsSPDisplayListRaw( dl, 0)
2432#define gSPBranchList(pkt, dl) _gSPBranchListRaw( pkt, dl, 0)
2436#define gsSPBranchList( dl) _gsSPBranchListRaw( dl, 0)
2441#define gSPEndDisplayList(pkt) _gSPEndDisplayListRaw( pkt, 0)
2445#define gsSPEndDisplayList( ) _gsSPEndDisplayListRaw( 0)
2454#define gSPLoadUcodeEx(pkt, uc_start, uc_dstart, uc_dsize) \
2456 Gfx *_g = (Gfx *)(pkt); \
2458 _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
2459 _g->words.w1 = (unsigned int)(uc_dstart); \
2461 _g = (Gfx *)(pkt); \
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); \
2471#define gsSPLoadUcodeEx(uc_start, uc_dstart, uc_dsize) \
2473 _SHIFTL(G_RDPHALF_1, 24, 8), \
2474 (unsigned int)(uc_dstart), \
2477 (_SHIFTL(G_LOAD_UCODE, 24, 8) | \
2478 _SHIFTL((int)(uc_dsize) - 1, 0, 16)), \
2479 (unsigned int)(uc_start), \
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)
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))
2497#define gSPDma_io(pkt, flag, dmem, dram, size) \
2499 Gfx *_g = (Gfx *)(pkt); \
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); \
2511#define gsSPDma_io(flag, dmem, dram, size) \
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) \
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))
2535#define gSPMemset(pkt, dram, value, size) \
2537 gImmp1(pkt, G_RDPHALF_1, ((value) & 0xFFFF)); \
2538 gDma0p(pkt, G_MEMSET, (dram), ((size) & 0xFFFFF0)); \
2544#define gsSPMemset(dram, value, size) \
2545 gsImmp1(G_RDPHALF_1, ((value) & 0xFFFF)), \
2546 gsDma0p(G_MEMSET, (dram), ((size) & 0xFFFFF0))
2564#define gSPFlush(pkt) g1Word(pkt, G_FLUSH, 0)
2569#define gsSPFlush() gs1Word( G_FLUSH, 0)
2575#define gImmp1(pkt, c, p0) \
2577 Gfx *_g = (Gfx *)(pkt); \
2579 _g->words.w0 = _SHIFTL((c), 24, 8); \
2580 _g->words.w1 = (unsigned int)(p0); \
2583#define gsImmp1(c, p0) \
2585 _SHIFTL((c), 24, 8), \
2586 (unsigned int)(p0) \
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)
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)
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))
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))
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))
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))
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))
2641#define gSP1Quadrangle(pkt, v0, v1, v2, v3, flag) \
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)); \
2652#define gsSP1Quadrangle(v0, v1, v2, v3, flag) \
2654 (_SHIFTL(G_QUAD, 24, 8) | \
2655 __gsSP1Quadrangle_w1f(v0, v1, v2, v3, flag)), \
2656 __gsSP1Quadrangle_w2f(v0, v1, v2, v3, flag) \
2662#define gSP2Triangles(pkt, v00, v01, v02, flag0, v10, v11, v12, flag1) \
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); \
2673#define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \
2675 (_SHIFTL(G_TRI2, 24, 8) | \
2676 __gsSP1Triangle_w1f(v00, v01, v02, flag0)), \
2677 __gsSP1Triangle_w1f(v10, v11, v12, flag1) \
2686#define G_SNAKE_RIGHT 0
2693#define G_SNAKE_LEFT 1
2704#define G_SNAKE_LAST 0x40
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))
2769#define gSPTriSnake(pkt, i1, i2, i3, i4, i4d, i5, i5d, i6, i6d, i7, i7d) \
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); \
2778#define gsSPTriSnake(i1, i2, i3, i4, i4d, i5, i5d, i6, i6d, i7, i7d) \
2780 _gSPTriSnakeW0(i1, i2, i3), \
2781 _gSPTriSnakeW1(i4, i4d, i5, i5d, i6, i6d, i7, i7d) \
2794#define gSPContinueSnake(pkt, i0, i0d, i1, i1d, i2, i2d, i3, i3d, \
2795 i4, i4d, i5, i5d, i6, i6d, i7, i7d) \
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); \
2804#define gsSPContinueSnake(i0, i0d, i1, i1d, i2, i2d, i3, i3d, \
2805 i4, i4d, i5, i5d, i6, i6d, i7, i7d) \
2807 _gSPTriSnakeW1(i0, i0d, i1, i1d, i2, i2d, i3, i3d), \
2808 _gSPTriSnakeW1(i4, i4d, i5, i5d, i6, i6d, i7, i7d) \
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)
2876#ifdef F3DEX2_SEGMENTS
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))
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)
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))
2901#define gSPClipRatio(pkt, r) gSPNoOp(pkt)
2907#define gsSPClipRatio(r) gsSPNoOp()
2915#define gSPForceMatrix(pkt, mptr) gSPNoOp(pkt)
2921#define gsSPForceMatrix(mptr) gsSPNoOp()
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)
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)))
2993#define gSPAmbOcclusion(pkt, amb, dir, point) \
2995 gSPAmbOcclusionAmbDir(pkt, amb, dir); \
2996 gSPAmbOcclusionPoint(pkt, point); \
2998#define gsSPAmbOcclusion(amb, dir, point) \
2999 gsSPAmbOcclusionAmbDir(amb, dir), \
3000 gsSPAmbOcclusionPoint(point)
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)))
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)))
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)))
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)
3222# define gSPModifyVertex(pkt, vtx, where, val) \
3224 Gfx *_g = (Gfx *)(pkt); \
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); \
3236# define gsSPModifyVertex(vtx, where, val) \
3238 (_SHIFTL(G_MODIFYVTX, 24, 8) | \
3239 _SHIFTL((where), 16, 8) | \
3240 _SHIFTL((vtx) * 2, 0, 16)), \
3241 (unsigned int)(val) \
3253#define gSPCullDisplayList(pkt,vstart,vend) \
3255 Gfx *_g = (Gfx *)(pkt); \
3257 _g->words.w0 = (_SHIFTL(G_CULLDL, 24, 8) | \
3258 _SHIFTL((vstart) * 2, 0, 16)); \
3259 _g->words.w1 = _SHIFTL((vend) * 2, 0, 16); \
3264#define gsSPCullDisplayList(vstart,vend) \
3266 (_SHIFTL(G_CULLDL, 24, 8) | \
3267 _SHIFTL((vstart) * 2, 0, 16)), \
3268 _SHIFTL((vend) * 2, 0, 16) \
3286# define FTOFIX32(x) (long)((x) * (float)0x00010000)
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))
3300#define G_DEPTOZS(zval, near, far, flag) \
3301 G_DEPTOZSrg(zval, near, far, flag, 0, G_MAXZ)
3303#define gSPBranchLessZrg(pkt, dl, vtx, zval, near, far, flag, zmin, zmax) \
3305 Gfx *_g = (Gfx *)(pkt); \
3307 _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
3308 _g->words.w1 = (unsigned int)(dl); \
3310 _g = (Gfx *)(pkt); \
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); \
3318#define gsSPBranchLessZrg(dl, vtx, zval, near, far, flag, zmin, zmax) \
3320 _SHIFTL(G_RDPHALF_1, 24, 8), \
3321 (unsigned int)(dl), \
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), \
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)
3342#define gSPBranchLessZraw(pkt, dl, vtx, zval) \
3344 Gfx *_g = (Gfx *)(pkt); \
3346 _g->words.w0 = _SHIFTL(G_RDPHALF_1, 24, 8); \
3347 _g->words.w1 = (unsigned int)(dl); \
3349 _g = (Gfx *)(pkt); \
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); \
3360#define gsSPBranchLessZraw(dl, vtx, zval) \
3362 _SHIFTL(G_RDPHALF_1, 24, 8), \
3363 (unsigned int)(dl), \
3366 (_SHIFTL(G_BRANCH_Z, 24, 8) | \
3367 _SHIFTL((vtx) * 5, 12, 12) | \
3368 _SHIFTL((vtx) * 2, 0, 12)), \
3369 (unsigned int)(zval), \
3382#define ENABLE_POINT_LIGHTS (0x8000 >> 4)
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
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))
3424#define _LIGHT_TO_OFFSET(n) (((n) - 1) * 0x10 + 0x10)
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))
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))
3465#define gSPLightColor(pkt, n, col) \
3467 gMoveWd(pkt, G_MW_LIGHTCOL, ((((n) - 1) * 0x10) + 0), ((col) & 0xFFFFFF00)); \
3468 gMoveWd(pkt, G_MW_LIGHTCOL, ((((n) - 1) * 0x10) + 4), ((col) & 0xFFFFFF00)); \
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))
3482#define _gSPLightColor2(pkt, n, col1, col2) \
3484 gMoveWd(pkt, G_MW_LIGHTCOL, ((((n) - 1) * 0x10) + 0), col1); \
3485 gMoveWd(pkt, G_MW_LIGHTCOL, ((((n) - 1) * 0x10) + 4), col2); \
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)
3518#define gSPSetLights(pkt, n, name) \
3520 gSPNumLights(pkt, n); \
3521 gDma2p((pkt), G_MOVEMEM, &(name), (n) * 0x10 + 8, G_MV_LIGHT, 0x10); \
3526#define gsSPSetLights(n, name) \
3528 gsDma2p(G_MOVEMEM, &(name), (n) * 0x10 + 8, G_MV_LIGHT, 0x10)
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()
3536#define gsSPSetLights1(name) gsSPSetLights( 1, name)
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)
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)
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)
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()
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)
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)
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)
3668#define gSPFogFactor(pkt, fm, fo) \
3669 gMoveWd(pkt, G_MW_FOG, G_MWO_FOG, \
3670 (_SHIFTL(fm, 16, 16) | _SHIFTL(fo, 0, 16)))
3675#define gsSPFogFactor(fm, fo) \
3676 gsMoveWd(G_MW_FOG, G_MWO_FOG, \
3677 (_SHIFTL(fm, 16, 16) | _SHIFTL(fo, 0, 16)))
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)))
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)))
3693#define gSPTexture(pkt, s, t, level, tile, on) \
3695 Gfx *_g = (Gfx *)(pkt); \
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)); \
3707#define gsSPTexture(s, t, level, tile, on) \
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)) \
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)
3737#define gSPGeometryMode(pkt, c, s) \
3739 Gfx *_g = (Gfx *)(pkt); \
3741 _g->words.w0 = (_SHIFTL(G_GEOMETRYMODE, 24, 8) | \
3742 _SHIFTL(~(u32)(c), 0, 24)); \
3743 _g->words.w1 = (u32)(s); \
3749#define gsSPGeometryMode(c, s) \
3751 (_SHIFTL(G_GEOMETRYMODE, 24, 8) | \
3752 _SHIFTL(~(u32)(c), 0, 24)), \
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))
3763#define gsSPGeometryModeSetFirst(c, s) gsSPGeometryMode(c, s)
3765#define gSPSetOtherMode(pkt, cmd, sft, len, data) \
3767 Gfx *_g = (Gfx *)(pkt); \
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); \
3775#define gsSPSetOtherMode(cmd, sft, len, data) \
3777 (_SHIFTL(cmd, 24, 8) | \
3778 _SHIFTL(32 - (sft) - (len), 8, 8) | \
3779 _SHIFTL((len) - 1, 0, 8)), \
3780 (unsigned int)(data) \
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
3850#define gDPSetBlendMask(pkt, mask) gSPNoOp(pkt)
3854#define gsDPSetBlendMask(mask) gsSPNoOp()
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)
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)
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))
3871#define gSetImage(pkt, cmd, fmt, siz, width, i) \
3873 Gfx *_g = (Gfx *)(pkt); \
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); \
3882#define gsSetImage(cmd, fmt, siz, width, i) \
3884 (_SHIFTL(cmd, 24, 8) | \
3885 _SHIFTL(fmt, 21, 3) | \
3886 _SHIFTL(siz, 19, 2) | \
3887 _SHIFTL((width) - 1, 0, 12)), \
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)
3896#define gDPSetDepthImage(pkt, i) gSetImage(pkt, G_SETZIMG, 0, 0, 1, i)
3897#define gsDPSetDepthImage(i) gsSetImage( G_SETZIMG, 0, 0, 1, i)
3899#define gDPSetMaskImage(pkt, i) gDPSetDepthImage(pkt, i)
3900#define gsDPSetMaskImage(i) gsDPSetDepthImage( i)
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)
3909#define gDPSetCombine(pkt, muxs0, muxs1) \
3911 Gfx *_g = (Gfx *)(pkt); \
3913 _g->words.w0 = (_SHIFTL(G_SETCOMBINE, 24, 8) | \
3914 _SHIFTL(muxs0, 0, 24)); \
3915 _g->words.w1 = (unsigned int)(muxs1); \
3918#define gsDPSetCombine(muxs0, muxs1) \
3920 (_SHIFTL(G_SETCOMBINE, 24, 8) | \
3921 _SHIFTL(muxs0, 0, 24)), \
3922 (unsigned int)(muxs1) \
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))
3931#define GCCc1w0(saRGB1, mRGB1) \
3932 (_SHIFTL((saRGB1), 5, 4) | \
3933 _SHIFTL((mRGB1), 0, 5))
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))
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))
3949#define gDPSetCombineLERP(pkt, a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
3950 a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
3952 Gfx *_g = (Gfx *)(pkt); \
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), \
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)); \
3966#define gsDPSetCombineLERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
3967 a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
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), \
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)) \
3990#define gDPSetCombineMode(pkt, a, b) gDPSetCombineLERP(pkt, a, b)
3994#define gsDPSetCombineMode(a, b) gsDPSetCombineLERP( a, b)
3996#define gDPSetColor(pkt, c, d) \
3998 Gfx *_g = (Gfx *)(pkt); \
4000 _g->words.w0 = _SHIFTL(c, 24, 8); \
4001 _g->words.w1 = (unsigned int)(d); \
4004#define gsDPSetColor(c, d) \
4006 _SHIFTL(c, 24, 8), \
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) | \
4017#define sDPRGBColor(cmd, r, g, b, a) \
4019 (_SHIFTL(r, 24, 8) | \
4020 _SHIFTL(g, 16, 8) | \
4021 _SHIFTL(b, 8, 8) | \
4024#define gDPSetEnvColor(pkt, r, g, b, a) \
4025 DPRGBColor(pkt, G_SETENVCOLOR, r, g, b, a)
4027#ifdef KAZE_GBI_HACKS
4028#define gsDPSetEnvColor(r, g, b, a) \
4031#define gsDPSetEnvColor(r, g, b, a) \
4032 sDPRGBColor( G_SETENVCOLOR, r, g, b, a)
4035#define gDPSetBlendColor(pkt, r, g, b, a) \
4036 DPRGBColor(pkt, G_SETBLENDCOLOR, r, g, b, a)
4038#define gsDPSetBlendColor(r, g, b, a) \
4039 sDPRGBColor( G_SETBLENDCOLOR, r, g, b, a)
4041#define gDPSetFogColor(pkt, r, g, b, a) \
4042 DPRGBColor(pkt, G_SETFOGCOLOR, r, g, b, a)
4044#define gsDPSetFogColor(r, g, b, a) \
4045 sDPRGBColor( G_SETFOGCOLOR, r, g, b, a)
4047#define gDPSetFillColor(pkt, d) \
4048 gDPSetColor(pkt, G_SETFILLCOLOR, (d))
4050#define gsDPSetFillColor(d) \
4051 gsDPSetColor( G_SETFILLCOLOR, (d))
4053#define gDPSetPrimDepth(pkt, z, dz) \
4054 gDPSetColor(pkt, G_SETPRIMDEPTH, \
4055 _SHIFTL(z, 16, 16) | _SHIFTL(dz, 0, 16))
4057#define gsDPSetPrimDepth(z, dz) \
4058 gsDPSetColor(G_SETPRIMDEPTH, \
4059 _SHIFTL(z, 16, 16) | _SHIFTL(dz, 0, 16))
4061#define gDPSetPrimColor(pkt, m, l, r, g, b, a) \
4063 Gfx *_g = (Gfx *)(pkt); \
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)); \
4074#define gsDPSetPrimColor(m, l, r, g, b, a) \
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) | \
4095#define gSPLightToRDP(pkt, light, alpha, word0) \
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); \
4106#define gsSPLightToRDP(light, alpha, word0) \
4108 (_SHIFTL(G_LIGHTTORDP, 24, 8) | \
4109 _SHIFTL(light * 0x10, 8, 8) | \
4110 _SHIFTL(alpha, 0, 8)), \
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))
4152#define gDPSetOtherMode(pkt, mode0, mode1) \
4154 Gfx *_g = (Gfx *)(pkt); \
4156 _g->words.w0 = (_SHIFTL(G_RDPSETOTHERMODE, 24, 8) | \
4157 _SHIFTL(mode0, 0, 24)); \
4158 _g->words.w1 = (unsigned int)(mode1); \
4164#define gsDPSetOtherMode(mode0, mode1) \
4166 (_SHIFTL(G_RDPSETOTHERMODE, 24, 8) | \
4167 _SHIFTL(mode0, 0, 24)), \
4168 (unsigned int)(mode1) \
4175#define G_TX_LOADTILE 7
4176#define G_TX_RENDERTILE 0
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))
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
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
4287#define MAX(a, b) ((a) > (b) ? (a) : (b))
4291#define MIN(a, b) ((a) < (b) ? (a) : (b))
4302#define G_TX_DXT_FRAC 11
4314#define G_TX_LDBLK_MAX_TXL 2047
4316#define TXL2WORDS(txls, b_txl) \
4317 MAX(1, ((txls) * (b_txl) / 8))
4319#define CALC_DXT(width, b_txl) \
4320 (((1 << G_TX_DXT_FRAC) + TXL2WORDS(width, b_txl) - 1) / TXL2WORDS(width, b_txl))
4322#define TXL2WORDS_4b(txls) \
4323 MAX(1, ((txls) / 16))
4325#define CALC_DXT_4b(width) \
4326 (((1 << G_TX_DXT_FRAC) + TXL2WORDS_4b(width) - 1) / TXL2WORDS_4b(width))
4328#define gDPLoadTileGeneric(pkt, c, tile, uls, ult, lrs, lrt) \
4330 Gfx *_g = (Gfx *)(pkt); \
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)); \
4340#define gsDPLoadTileGeneric(c, tile, uls, ult, lrs, lrt) \
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)) \
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)
4359#define gDPSetTile(pkt, fmt, siz, line, tmem, tile, palette, cmt, \
4360 maskt, shiftt, cms, masks, shifts) \
4362 Gfx *_g = (Gfx *)(pkt); \
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)); \
4379#define gsDPSetTile(fmt, siz, line, tmem, tile, palette, cmt, \
4380 maskt, shiftt, cms, masks, shifts) \
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)) \
4397#define gDPLoadBlock(pkt, tile, uls, ult, lrs, dxt) \
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)); \
4408#define gsDPLoadBlock(tile, uls, ult, lrs, dxt) \
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)) \
4418#define gDPLoadTLUTCmd(pkt, tile, count) \
4420 Gfx *_g = (Gfx *)pkt; \
4422 _g->words.w0 = _SHIFTL(G_LOADTLUT, 24, 8); \
4423 _g->words.w1 = (_SHIFTL((tile), 24, 3) | \
4424 _SHIFTL((count), 14, 10)); \
4427#define gsDPLoadTLUTCmd(tile, count) \
4429 _SHIFTL(G_LOADTLUT, 24, 8), \
4430 (_SHIFTL((tile), 24, 3) | \
4431 _SHIFTL((count), 14, 10)) \
4434#define gDPLoadTextureBlock(pkt, timg, fmt, siz, width, height, pal, \
4435 cms, cmt, masks, maskt, shifts, shiftt) \
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); \
4453#define gDPLoadTextureBlockYuv(pkt, timg, fmt, siz, width, height, pal, \
4454 cms, cmt, masks, maskt, shifts, shiftt) \
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); \
4475#define gDPLoadTextureBlockS(pkt, timg, fmt, siz, width, height, pal, \
4476 cms, cmt, masks, maskt, shifts, shiftt) \
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); \
4497#define gDPLoadMultiBlockS(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, \
4498 cms, cmt, masks, maskt, shifts, shiftt) \
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, \
4511 gDPSetTileSize(pkt, rtile, 0, 0, \
4512 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4513 ((height) - 1) << G_TEXTURE_IMAGE_FRAC); \
4517#define gDPLoadTextureBlockYuvS(pkt, timg, fmt, siz, width, height, pal, \
4518 cms, cmt, masks, maskt, shifts, shiftt) \
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); \
4538#define _gDPLoadTextureBlock(pkt, timg, tmem, fmt, siz, width, height, pal, \
4539 cms, cmt, masks, maskt, shifts, shiftt) \
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); \
4560#define _gDPLoadTextureBlockTile(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, \
4561 cms, cmt, masks, maskt, shifts, shiftt) \
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); \
4582#define gDPLoadMultiBlock(pkt, timg, tmem, rtile, fmt, siz, width, height, pal, \
4583 cms, cmt, masks, maskt, shifts, shiftt) \
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); \
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)
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, \
4635 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \
4636 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4637 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
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, \
4656 gsDPSetTileSize(G_TX_RENDERTILE, 0, 0, \
4657 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4658 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
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, \
4678 gsDPSetTileSize(rtile, 0, 0, \
4679 ((width) - 1) << G_TEXTURE_IMAGE_FRAC, \
4680 ((height) - 1) << G_TEXTURE_IMAGE_FRAC)
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)
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)
4729#define gDPLoadTextureBlock_4b(pkt, timg, fmt, width, height, pal, \
4730 cms, cmt, masks, maskt, shifts, shiftt) \
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); \
4751#define gDPLoadTextureBlock_4bS(pkt, timg, fmt, width, height, pal, \
4752 cms, cmt, masks, maskt, shifts, shiftt) \
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, \
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); \
4773#define gDPLoadMultiBlock_4b(pkt, timg, tmem, rtile, fmt, width, height, pal, \
4774 cms, cmt, masks, maskt, shifts, shiftt) \
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); \
4796#define gDPLoadMultiBlock_4bS(pkt, timg, tmem, rtile, fmt, width, height, pal, \
4797 cms, cmt, masks, maskt, shifts, shiftt) \
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, \
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); \
4816#define _gDPLoadTextureBlock_4b(pkt, timg, tmem, fmt, width, height, pal, \
4817 cms, cmt, masks, maskt, shifts, shiftt) \
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); \
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)
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, \
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)
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)
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, \
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)
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)
4933#define gDPLoadTextureTile(pkt, timg, fmt, siz, width, height, \
4934 uls, ult, lrs, lrt, pal, \
4935 cms, cmt, masks, maskt, shifts, shiftt) \
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, \
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); \
4963#define gDPLoadMultiTile(pkt, timg, tmem, rtile, fmt, siz, width, height, \
4964 uls, ult, lrs, lrt, pal, \
4965 cms, cmt, masks, maskt, shifts, shiftt) \
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); \
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)
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)
5039#define gDPLoadTextureTile_4b(pkt, timg, fmt, width, height, \
5040 uls, ult, lrs, lrt, pal, \
5041 cms, cmt, masks, maskt, shifts, shiftt) \
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); \
5068#define gDPLoadMultiTile_4b(pkt, timg, tmem, rtile, fmt, width, height, \
5069 uls, ult, lrs, lrt, pal, \
5070 cms, cmt, masks, maskt, shifts, shiftt) \
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); \
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)
5119#define gsDPLoadMultiTile_4b(timg, tmem, rtile, fmt, width, height, \
5120 uls, ult, lrs, lrt, pal, \
5121 cms, cmt, masks, maskt, shifts, shiftt) \
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)
5149#define gDPLoadTLUT_pal16(pkt, pal, dram) \
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); \
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
5175#define gDPLoadTLUT_pal256(pkt, dram) \
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); \
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
5203#define _G_PALTMEMTOTILE(tmemaddr) _G_PALLOADTILE(((tmemaddr) >> 4) & 1)
5205#define gDPLoadTLUT(pkt, count, tmemaddr, dram) \
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); \
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
5227#define gDPSetScissor(pkt, mode, ulx, uly, lrx, lry) \
5229 Gfx *_g = (Gfx *)pkt; \
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)); \
5240#define gDPSetScissorFrac(pkt, mode, ulx, uly, lrx, lry) \
5242 Gfx *_g = (Gfx *)pkt; \
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)); \
5252#define gsDPSetScissor(mode, ulx, uly, lrx, lry) \
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)) \
5262#define gsDPSetScissorFrac(mode, ulx, uly, lrx, lry) \
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)) \
5273#define gDPFillRectangle(pkt, ulx, uly, lrx, lry) \
5275 Gfx *_g = (Gfx *)(pkt); \
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)); \
5284#define gsDPFillRectangle(ulx, uly, lrx, lry) \
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)) \
5294#define gDPScisFillRectangle(pkt, ulx, uly, lrx, lry) \
5296 Gfx *_g = (Gfx *)(pkt); \
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)); \
5305#define gDPSetConvert(pkt, k0, k1, k2, k3, k4, k5) \
5307 Gfx *_g = (Gfx *)(pkt); \
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)); \
5319#define gsDPSetConvert(k0, k1, k2, k3, k4, k5) \
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)) \
5331#define gDPSetKeyR(pkt, cR, sR, wR) \
5333 Gfx *_g = (Gfx *)(pkt); \
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)); \
5341#define gsDPSetKeyR(cR, sR, wR) \
5343 _SHIFTL(G_SETKEYR, 24, 8), \
5344 (_SHIFTL(wR, 16, 12) | \
5345 _SHIFTL(cR, 8, 8) | \
5346 _SHIFTL(sR, 0, 8)) \
5349#define gDPSetKeyGB(pkt, cG, sG, wG, cB, sB, wB) \
5351 Gfx *_g = (Gfx *)(pkt); \
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)); \
5362#define gsDPSetKeyGB(cG, sG, wG, cB, sB, wB) \
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)) \
5373#define gDPNoParam(pkt, cmd) g1Word(pkt, cmd, 0)
5374#define gsDPNoParam(cmd) gs1Word( cmd, 0)
5376#define gDPParam(pkt, cmd, param) \
5378 Gfx *_g = (Gfx *)(pkt); \
5380 _g->words.w0 = _SHIFTL(cmd, 24, 8); \
5381 _g->words.w1 = (param); \
5384#define gsDPParam(cmd, param) \
5386 _SHIFTL(cmd, 24, 8), \
5396#define gsDPTextureRectangle(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
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)), \
5406 (_SHIFTL(s, 16, 16) | \
5407 _SHIFTL(t, 0, 16)), \
5408 (_SHIFTL(dsdx, 16, 16) | \
5409 _SHIFTL(dtdy, 0, 16)) \
5415#define gDPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
5417 Gfx *_g = (Gfx *)(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)); \
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)); \
5432#define gsDPTextureRectangleFlip(xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
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)), \
5442 (_SHIFTL(s, 16, 16) | \
5443 _SHIFTL(t, 0, 16)), \
5444 (_SHIFTL(dsdx, 16, 16) | \
5445 _SHIFTL(dtdy, 0, 16)) \
5448#define gDPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
5450 Gfx *_g = (Gfx *)(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)); \
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)); \
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)))
5479#define gSPTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
5481 Gfx *_g = (Gfx *)(pkt); \
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))); \
5498#define gSPScisTextureRectangle(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
5500 Gfx *_g = (Gfx *)(pkt); \
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, \
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) | \
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))); \
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)))
5538#define gSPTextureRectangleFlip(pkt, xl, yl, xh, yh, tile, s, t, dsdx, dtdy) \
5540 Gfx *_g = (Gfx *)(pkt); \
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))); \
5556#define gsDPWord(wordhi, wordlo) \
5557 gsImmp1(G_RDPHALF_1, (unsigned int)(wordhi)), \
5558 gsImmp1(G_RDPHALF_2, (unsigned int)(wordlo))
5560#define gDPWord(pkt, wordhi, wordlo) \
5562 Gfx *_g = (Gfx *)(pkt); \
5563 gImmp1(pkt, G_RDPHALF_1, (unsigned int)(wordhi)); \
5564 gImmp1(pkt, G_RDPHALF_2, (unsigned int)(wordlo)); \
5567#ifdef RISKY_RDP_SYNCS
5574#define G_USEASPIPESYNC G_RDPTILESYNC
5576#define G_USEASPIPESYNC G_RDPPIPESYNC
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)
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)
long int Mtx_t[4][4]
Definition gbi.h:1111
char pad1
Definition gbi.h:1265
char pad2
Definition gbi.h:1267
char pad3
Definition gbi.h:1239
unsigned char type
Definition gbi.h:1235
char pad2
Definition gbi.h:1237
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
unsigned short flag
Definition gbi.h:1063
unsigned char a
Definition gbi.h:1076
unsigned short flag
Definition gbi.h:1073
long long int force_structure_alignment
Definition gbi.h:1085
Vtx_tn n
Definition gbi.h:1084