1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-12-28 07:46:18 +00:00
oot/tools/ZAPD/lib/libgfxd/gbi.h
louist103 750c0cab35
Update ZAPD (#1001)
* remove fake match

* git subrepo pull --force tools/ZAPD

subrepo:
  subdir:   "tools/ZAPD"
  merged:   "3e9ed72e2"
upstream:
  origin:   "https://github.com/zeldaret/ZAPD.git"
  branch:   "master"
  commit:   "3e9ed72e2"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo.git"
  commit:   "2f68596"

* new extraction script and a hack to make clear tag work

* fix clear tag again

* remove static from clear tag DLists

* git subrepo pull --force tools/ZAPD

subrepo:
  subdir:   "tools/ZAPD"
  merged:   "e7a8a48cf"
upstream:
  origin:   "https://github.com/zeldaret/ZAPD.git"
  branch:   "master"
  commit:   "e7a8a48cf"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo.git"
  commit:   "2f68596"

* git subrepo pull --force tools/ZAPD

subrepo:
  subdir:   "tools/ZAPD"
  merged:   "e243634e5"
upstream:
  origin:   "https://github.com/zeldaret/ZAPD.git"
  branch:   "master"
  commit:   "e243634e5"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo.git"
  commit:   "2f68596"

* git subrepo pull --force tools/ZAPD

subrepo:
  subdir:   "tools/ZAPD"
  merged:   "d0cd6b397"
upstream:
  origin:   "https://github.com/zeldaret/ZAPD.git"
  branch:   "master"
  commit:   "d0cd6b397"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo.git"
  commit:   "2f68596"

* Update ovl_En_Clear_Tag.xml
2021-10-17 13:32:09 +02:00

3838 lines
98 KiB
C

/**
* gbi.h version 0.3.6
* n64 graphics microcode interface library
* compatible with fast3d, f3dex, f3dex2, s2dex, and s2dex2
*
* select a microcode with one of these preprocessor definitions;
* #define F3D_GBI
* for fast3d (selected automatically by default), or
* #define F3DEX_GBI
* for f3dex/s2dex, or
* #define F3DEX_GBI_2
* for f3dex2/s2dex2
*
* for early versions of fast3d and f3dex, also define the following;
* #define F3D_BETA
*
* ido incompatibilities;
* - use of c99 variadic macros
* - use of c99 fixed-width integer types
* - use of c99 designated initializers
* - use of c99 compound literals
* - use of c11 _Alignas
* - use of gnu c compound expressions
* - use of gnu c __typeof__
*
* libultra incompatibilities;
* - many private, undocumented, or obsolete macros not commonly used by
* programmers are missing
* - many different implementation details that will produce matching gbi,
* but not matching code
**/
#ifndef N64_GBI_H
#define N64_GBI_H
#include <stdint.h>
/* use fast3d by default */
#if !defined(F3D_GBI) && !defined(F3DEX_GBI) && !defined(F3DEX_GBI_2)
# define F3D_GBI
#endif
/* commands for fast3d and f3dex */
#if defined(F3D_GBI) || defined(F3DEX_GBI)
# define G_SPNOOP 0x00
# define G_MTX 0x01
# define G_MOVEMEM 0x03
# define G_VTX 0x04
# define G_DL 0x06
# if defined(F3D_BETA)
# define G_RDPHALF_2 0xB2
# define G_RDPHALF_1 0xB3
# define G_PERSPNORM 0xB4
# else
# define G_RDPHALF_2 0xB3
# define G_RDPHALF_1 0xB4
# endif
# define G_LINE3D 0xB5
# define G_CLEARGEOMETRYMODE 0xB6
# define G_SETGEOMETRYMODE 0xB7
# define G_ENDDL 0xB8
# define G_SETOTHERMODE_L 0xB9
# define G_SETOTHERMODE_H 0xBA
# define G_TEXTURE 0xBB
# define G_MOVEWORD 0xBC
# define G_POPMTX 0xBD
# define G_CULLDL 0xBE
# define G_TRI1 0xBF
# define G_NOOP 0xC0
#endif
/* commands for f3dex */
#if defined(F3DEX_GBI)
# define G_LOAD_UCODE 0xAF
# define G_BRANCH_Z 0xB0
# define G_TRI2 0xB1
# if !defined(F3D_BETA)
# define G_MODIFYVTX 0xB2
# endif
#endif
/* commands for f3dex2 */
#if defined(F3DEX_GBI_2)
# define G_NOOP 0x00
# define G_VTX 0x01
# define G_MODIFYVTX 0x02
# define G_CULLDL 0x03
# define G_BRANCH_Z 0x04
# define G_TRI1 0x05
# define G_TRI2 0x06
# define G_QUAD 0x07
# define G_LINE3D 0x08
# define G_SPECIAL_3 0xD3
# define G_SPECIAL_2 0xD4
# define G_SPECIAL_1 0xD5
# define G_DMA_IO 0xD6
# define G_TEXTURE 0xD7
# define G_POPMTX 0xD8
# define G_GEOMETRYMODE 0xD9
# define G_MTX 0xDA
# define G_MOVEWORD 0xDB
# define G_MOVEMEM 0xDC
# define G_LOAD_UCODE 0xDD
# define G_DL 0xDE
# define G_ENDDL 0xDF
# define G_SPNOOP 0xE0
# define G_RDPHALF_1 0xE1
# define G_SETOTHERMODE_L 0xE2
# define G_SETOTHERMODE_H 0xE3
# define G_RDPHALF_2 0xF1
#endif
/* rdp commands */
#define G_TEXRECT 0xE4
#define G_TEXRECTFLIP 0xE5
#define G_RDPLOADSYNC 0xE6
#define G_RDPPIPESYNC 0xE7
#define G_RDPTILESYNC 0xE8
#define G_RDPFULLSYNC 0xE9
#define G_SETKEYGB 0xEA
#define G_SETKEYR 0xEB
#define G_SETCONVERT 0xEC
#define G_SETSCISSOR 0xED
#define G_SETPRIMDEPTH 0xEE
#define G_RDPSETOTHERMODE 0xEF
#define G_LOADTLUT 0xF0
#define G_SETTILESIZE 0xF2
#define G_LOADBLOCK 0xF3
#define G_LOADTILE 0xF4
#define G_SETTILE 0xF5
#define G_FILLRECT 0xF6
#define G_SETFILLCOLOR 0xF7
#define G_SETFOGCOLOR 0xF8
#define G_SETBLENDCOLOR 0xF9
#define G_SETPRIMCOLOR 0xFA
#define G_SETENVCOLOR 0xFB
#define G_SETCOMBINE 0xFC
#define G_SETTIMG 0xFD
#define G_SETZIMG 0xFE
#define G_SETCIMG 0xFF
/* commands for s2dex */
#if defined(F3DEX_GBI)
# define G_BG_1CYC 0x01
# define G_BG_COPY 0x02
# define G_OBJ_RECTANGLE 0x03
# define G_OBJ_SPRITE 0x04
# define G_OBJ_MOVEMEM 0x05
# define G_SELECT_DL 0xB0
# define G_OBJ_RENDERMODE 0xB1
# define G_OBJ_RECTANGLE_R 0xB2
# define G_OBJ_LOADTXTR 0xC1
# define G_OBJ_LDTX_SPRITE 0xC2
# define G_OBJ_LDTX_RECT 0xC3
# define G_OBJ_LDTX_RECT_R 0xC4
#endif
/* commands for s2dex2 */
#if defined(F3DEX_GBI_2)
# define G_OBJ_RECTANGLE 0x01
# define G_OBJ_SPRITE 0x02
# define G_SELECT_DL 0x04
# define G_OBJ_LOADTXTR 0x05
# define G_OBJ_LDTX_SPRITE 0x06
# define G_OBJ_LDTX_RECT 0x07
# define G_OBJ_LDTX_RECT_R 0x08
# define G_BG_1CYC 0x09
# define G_BG_COPY 0x0A
# define G_OBJ_RENDERMODE 0x0B
# define G_OBJ_RECTANGLE_R 0xDA
# define G_OBJ_MOVEMEM 0xDC
#endif
/* commands for s2dex and s2dex2 */
#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2)
# define G_RDPHALF_0 0xE4
#endif
/* image formats */
#define G_IM_FMT_RGBA 0
#define G_IM_FMT_YUV 1
#define G_IM_FMT_CI 2
#define G_IM_FMT_IA 3
#define G_IM_FMT_I 4
#define G_IM_SIZ_4b 0
#define G_IM_SIZ_8b 1
#define G_IM_SIZ_16b 2
#define G_IM_SIZ_32b 3
/* texture settings */
#define G_TX_NOMIRROR (gI_(0b0) << 0)
#define G_TX_MIRROR (gI_(0b1) << 0)
#define G_TX_WRAP (gI_(0b0) << 1)
#define G_TX_CLAMP (gI_(0b1) << 1)
#define G_TX_NOMASK gI_(0)
#define G_TX_NOLOD gI_(0)
#define G_OFF gI_(0)
#define G_ON gI_(1)
/* tile indices */
#define G_TX_LOADTILE 7
#define G_TX_RENDERTILE 0
/* loadblock constants */
#define G_TX_DXT_FRAC 11
#define G_TX_LDBLK_MAX_TXL 2047
/* geometry mode */
#define G_ZBUFFER (gI_(0b1) << 0)
#define G_SHADE (gI_(0b1) << 2)
#define G_CULL_BOTH (G_CULL_FRONT | G_CULL_BACK)
#define G_FOG (gI_(0b1) << 16)
#define G_LIGHTING (gI_(0b1) << 17)
#define G_TEXTURE_GEN (gI_(0b1) << 18)
#define G_TEXTURE_GEN_LINEAR (gI_(0b1) << 19)
#define G_LOD (gI_(0b1) << 20)
/* geometry mode for fast3d */
#if defined(F3D_GBI)
# define G_CLIPPING (gI_(0b0) << 0)
#endif
/* geometry mode for fast3d and f3dex */
#if defined(F3D_GBI) || defined(F3DEX_GBI)
# define G_TEXTURE_ENABLE (gI_(0b1) << 1)
# define G_SHADING_SMOOTH (gI_(0b1) << 9)
# define G_CULL_FRONT (gI_(0b1) << 12)
# define G_CULL_BACK (gI_(0b1) << 13)
#endif
/* geometry mode for f3dex and f3dex2 */
#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2)
# define G_CLIPPING (gI_(0b1) << 23)
#endif
/* geometry mode for f3dex2 */
#if defined(F3DEX_GBI_2)
# define G_TEXTURE_ENABLE (gI_(0b0) << 0)
# define G_CULL_FRONT (gI_(0b1) << 9)
# define G_CULL_BACK (gI_(0b1) << 10)
# define G_SHADING_SMOOTH (gI_(0b1) << 21)
#endif
/* othermode lo */
#define G_MDSFT_ALPHACOMPARE 0
#define G_MDSFT_ZSRCSEL 2
#define G_MDSFT_RENDERMODE 3
#define G_MDSFT_BLENDER 16
#define G_MDSIZ_ALPHACOMPARE 2
#define G_MDSIZ_ZSRCSEL 1
#define G_MDSIZ_RENDERMODE 29
#define G_MDSIZ_BLENDER 13
#define G_AC_NONE (gI_(0b00) << G_MDSFT_ALPHACOMPARE)
#define G_AC_THRESHOLD (gI_(0b01) << G_MDSFT_ALPHACOMPARE)
#define G_AC_DITHER (gI_(0b11) << G_MDSFT_ALPHACOMPARE)
#define G_ZS_PIXEL (gI_(0b0) << G_MDSFT_ZSRCSEL)
#define G_ZS_PRIM (gI_(0b1) << G_MDSFT_ZSRCSEL)
#define AA_EN (gI_(0b1) << (G_MDSFT_RENDERMODE + 0))
#define Z_CMP (gI_(0b1) << (G_MDSFT_RENDERMODE + 1))
#define Z_UPD (gI_(0b1) << (G_MDSFT_RENDERMODE + 2))
#define IM_RD (gI_(0b1) << (G_MDSFT_RENDERMODE + 3))
#define CLR_ON_CVG (gI_(0b1) << (G_MDSFT_RENDERMODE + 4))
#define CVG_DST_CLAMP (gI_(0b00) << (G_MDSFT_RENDERMODE + 5))
#define CVG_DST_WRAP (gI_(0b01) << (G_MDSFT_RENDERMODE + 5))
#define CVG_DST_FULL (gI_(0b10) << (G_MDSFT_RENDERMODE + 5))
#define CVG_DST_SAVE (gI_(0b11) << (G_MDSFT_RENDERMODE + 5))
#define ZMODE_OPA (gI_(0b00) << (G_MDSFT_RENDERMODE + 7))
#define ZMODE_INTER (gI_(0b01) << (G_MDSFT_RENDERMODE + 7))
#define ZMODE_XLU (gI_(0b10) << (G_MDSFT_RENDERMODE + 7))
#define ZMODE_DEC (gI_(0b11) << (G_MDSFT_RENDERMODE + 7))
#define CVG_X_ALPHA (gI_(0b1) << (G_MDSFT_RENDERMODE + 9))
#define ALPHA_CVG_SEL (gI_(0b1) << (G_MDSFT_RENDERMODE + 10))
#define FORCE_BL (gI_(0b1) << (G_MDSFT_RENDERMODE + 11))
#define G_BL_1MA gI_(0b00)
#define G_BL_1 gI_(0b10)
#define G_BL_0 gI_(0b11)
#define G_BL_CLR_IN gI_(0b00)
#define G_BL_CLR_MEM gI_(0b01)
#define G_BL_CLR_BL gI_(0b10)
#define G_BL_CLR_FOG gI_(0b11)
#define G_BL_A_IN gI_(0b00)
#define G_BL_A_FOG gI_(0b01)
#define G_BL_A_MEM gI_(0b01)
#define G_BL_A_SHADE gI_(0b10)
#define GBL_c1(p, a, m, b) \
( \
gF_(p, 2, 30) | \
gF_(a, 2, 26) | \
gF_(m, 2, 22) | \
gF_(b, 2, 18) \
)
#define GBL_c2(p, a, m, b) \
( \
gF_(p, 2, 28) | \
gF_(a, 2, 24) | \
gF_(m, 2, 20) | \
gF_(b, 2, 16) \
)
/* render modes */
#define G_RM_OPA_SURF \
( \
CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
)
#define G_RM_OPA_SURF2 \
( \
CVG_DST_CLAMP | ZMODE_OPA | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
)
#define G_RM_AA_OPA_SURF \
( \
AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_OPA_SURF2 \
( \
AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_RA_OPA_SURF \
( \
AA_EN | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_RA_OPA_SURF2 \
( \
AA_EN | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_ZB_OPA_SURF \
( \
Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_ZB_OPA_SURF2 \
( \
Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_ZB_OPA_SURF \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_ZB_OPA_SURF2 \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_RA_ZB_OPA_SURF \
( \
AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_OPA | \
ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_RA_ZB_OPA_SURF2 \
( \
AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_OPA | \
ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_XLU_SURF \
( \
IM_RD | CVG_DST_FULL | ZMODE_OPA | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_XLU_SURF2 \
( \
IM_RD | CVG_DST_FULL | ZMODE_OPA | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_XLU_SURF \
( \
AA_EN | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_OPA | \
FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_XLU_SURF2 \
( \
AA_EN | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_OPA | \
FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_ZB_XLU_SURF \
( \
Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_XLU | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_ZB_XLU_SURF2 \
( \
Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_XLU | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_XLU_SURF \
( \
AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \
ZMODE_XLU | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_XLU_SURF2 \
( \
AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \
ZMODE_XLU | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_ZB_OPA_DECAL \
( \
Z_CMP | CVG_DST_FULL | ZMODE_DEC | ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_ZB_OPA_DECAL2 \
( \
Z_CMP | CVG_DST_FULL | ZMODE_DEC | ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_ZB_OPA_DECAL \
( \
AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | ZMODE_DEC | \
ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_ZB_OPA_DECAL2 \
( \
AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | ZMODE_DEC | \
ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_RA_ZB_OPA_DECAL \
( \
AA_EN | Z_CMP | CVG_DST_WRAP | ZMODE_DEC | ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_RA_ZB_OPA_DECAL2 \
( \
AA_EN | Z_CMP | CVG_DST_WRAP | ZMODE_DEC | ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_ZB_XLU_DECAL \
( \
Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_DEC | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_ZB_XLU_DECAL2 \
( \
Z_CMP | IM_RD | CVG_DST_FULL | ZMODE_DEC | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_XLU_DECAL \
( \
AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \
ZMODE_DEC | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_XLU_DECAL2 \
( \
AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \
ZMODE_DEC | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_OPA_INTER \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_INTER | \
ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_ZB_OPA_INTER2 \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_INTER | \
ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_RA_ZB_OPA_INTER \
( \
AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_INTER | \
ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_RA_ZB_OPA_INTER2 \
( \
AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | ZMODE_INTER | \
ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_ZB_XLU_INTER \
( \
AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \
ZMODE_INTER | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_XLU_INTER2 \
( \
AA_EN | Z_CMP | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | \
ZMODE_INTER | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_XLU_LINE \
( \
AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
ALPHA_CVG_SEL | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_XLU_LINE2 \
( \
AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
ALPHA_CVG_SEL | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_XLU_LINE \
( \
AA_EN | Z_CMP | IM_RD | CVG_DST_CLAMP | ZMODE_XLU | \
CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_XLU_LINE2 \
( \
AA_EN | Z_CMP | IM_RD | CVG_DST_CLAMP | ZMODE_XLU | \
CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_DEC_LINE \
( \
AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA | \
ALPHA_CVG_SEL | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_DEC_LINE2 \
( \
AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | CVG_X_ALPHA | \
ALPHA_CVG_SEL | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_DEC_LINE \
( \
AA_EN | Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_DEC | \
CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_DEC_LINE2 \
( \
AA_EN | Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_DEC | \
CVG_X_ALPHA | ALPHA_CVG_SEL | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_TEX_EDGE \
( \
AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
ALPHA_CVG_SEL | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
)
#define G_RM_TEX_EDGE2 \
( \
AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
ALPHA_CVG_SEL | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
)
#define G_RM_AA_TEX_EDGE \
( \
AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_TEX_EDGE2 \
( \
AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_ZB_TEX_EDGE \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
CVG_X_ALPHA | ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_ZB_TEX_EDGE2 \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
CVG_X_ALPHA | ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_ZB_TEX_INTER \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_INTER | \
CVG_X_ALPHA | ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_ZB_TEX_INTER2 \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_INTER | \
CVG_X_ALPHA | ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_SUB_SURF \
( \
AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_SUB_SURF2 \
( \
AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_ZB_SUB_SURF \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | \
ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_AA_ZB_SUB_SURF2 \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | \
ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) \
)
#define G_RM_PCL_SURF \
( \
G_AC_DITHER | CVG_DST_FULL | ZMODE_OPA | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
)
#define G_RM_PCL_SURF2 \
( \
G_AC_DITHER | CVG_DST_FULL | ZMODE_OPA | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
)
#define G_RM_AA_PCL_SURF \
( \
G_AC_DITHER | AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_PCL_SURF2 \
( \
G_AC_DITHER | AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_ZB_PCL_SURF \
( \
G_AC_DITHER | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | \
GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
)
#define G_RM_ZB_PCL_SURF2 \
( \
G_AC_DITHER | Z_CMP | Z_UPD | CVG_DST_FULL | ZMODE_OPA | \
GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
)
#define G_RM_AA_ZB_PCL_SURF \
( \
G_AC_DITHER | AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \
ZMODE_OPA | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_PCL_SURF2 \
( \
G_AC_DITHER | AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \
ZMODE_OPA | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_OPA_TERR \
( \
AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_OPA_TERR2 \
( \
AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_OPA_TERR \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_OPA_TERR2 \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_TEX_TERR \
( \
AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_TEX_TERR2 \
( \
AA_EN | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_TEX_TERR \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
CVG_X_ALPHA | ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_TEX_TERR2 \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | ZMODE_OPA | \
CVG_X_ALPHA | ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_SUB_TERR \
( \
AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_SUB_TERR2 \
( \
AA_EN | IM_RD | CVG_DST_FULL | ZMODE_OPA | ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_SUB_TERR \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | \
ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_ZB_SUB_TERR2 \
( \
AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | ZMODE_OPA | \
ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_CLD_SURF \
( \
IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_CLD_SURF2 \
( \
IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_ZB_CLD_SURF \
( \
Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_XLU | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_ZB_CLD_SURF2 \
( \
Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_XLU | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_ZB_OVL_SURF \
( \
Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_DEC | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_ZB_OVL_SURF2 \
( \
Z_CMP | IM_RD | CVG_DST_SAVE | ZMODE_DEC | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_ADD \
( \
IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1) \
)
#define G_RM_ADD2 \
( \
IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_FOG, G_BL_CLR_MEM, G_BL_1) \
)
#define G_RM_FOG_SHADE_A \
GBL_c1(G_BL_CLR_FOG, G_BL_A_SHADE, G_BL_CLR_IN, G_BL_1MA)
#define G_RM_FOG_PRIM_A \
GBL_c1(G_BL_CLR_FOG, G_BL_A_FOG, G_BL_CLR_IN, G_BL_1MA)
#define G_RM_PASS \
GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1)
#define G_RM_VISCVG \
( \
IM_RD | FORCE_BL | \
GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM) \
)
#define G_RM_VISCVG2 \
( \
IM_RD | FORCE_BL | \
GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_BL, G_BL_A_MEM) \
)
#define G_RM_OPA_CI \
( \
CVG_DST_CLAMP | ZMODE_OPA | \
GBL_c1(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
)
#define G_RM_OPA_CI2 \
( \
CVG_DST_CLAMP | ZMODE_OPA | \
GBL_c2(G_BL_CLR_IN, G_BL_0, G_BL_CLR_IN, G_BL_1) \
)
#define G_RM_NOOP GBL_c1(0, 0, 0, 0)
#define G_RM_NOOP2 GBL_c2(0, 0, 0, 0)
#define G_RM_SPRITE G_RM_OPA_SURF
#define G_RM_SPRITE2 G_RM_OPA_SURF2
#define G_RM_RA_SPRITE \
( \
AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
ALPHA_CVG_SEL | \
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_RA_SPRITE2 \
( \
AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | \
ALPHA_CVG_SEL | \
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) \
)
#define G_RM_AA_SPRITE G_RM_AA_TEX_TERR
#define G_RM_AA_SPRITE2 G_RM_AA_TEX_TERR2
#define G_RM_XLU_SPRITE G_RM_XLU_SURF
#define G_RM_XLU_SPRITE2 G_RM_XLU_SURF2
#define G_RM_AA_XLU_SPRITE G_RM_AA_XLU_SURF
#define G_RM_AA_XLU_SPRITE2 G_RM_AA_XLU_SURF2
#define G_OBJRM_NOTXCLAMP (gI_(0b1) << 0)
#define G_OBJRM_XLU (gI_(0b1) << 1)
#define G_OBJRM_ANTIALIAS (gI_(0b1) << 2)
#define G_OBJRM_BILERP (gI_(0b1) << 3)
#define G_OBJRM_SHRINKSIZE_1 (gI_(0b1) << 4)
#define G_OBJRM_SHRINKSIZE_2 (gI_(0b1) << 5)
#define G_OBJRM_WIDEN (gI_(0b1) << 6)
/* othermode hi */
#define G_MDSFT_ALPHADITHER 4
#define G_MDSFT_RGBDITHER 6
#define G_MDSFT_COMBKEY 8
#define G_MDSFT_TEXTCONV 9
#define G_MDSFT_TEXTFILT 12
#define G_MDSFT_TEXTLUT 14
#define G_MDSFT_TEXTLOD 16
#define G_MDSFT_TEXTDETAIL 17
#define G_MDSFT_TEXTPERSP 19
#define G_MDSFT_CYCLETYPE 20
#define G_MDSFT_PIPELINE 23
#define G_MDSIZ_ALPHADITHER 2
#define G_MDSIZ_RGBDITHER 2
#define G_MDSIZ_COMBKEY 1
#define G_MDSIZ_TEXTCONV 3
#define G_MDSIZ_TEXTFILT 2
#define G_MDSIZ_TEXTLUT 2
#define G_MDSIZ_TEXTLOD 1
#define G_MDSIZ_TEXTDETAIL 2
#define G_MDSIZ_TEXTPERSP 1
#define G_MDSIZ_CYCLETYPE 2
#define G_MDSIZ_PIPELINE 1
#define G_AD_PATTERN (gI_(0b00) << G_MDSFT_ALPHADITHER)
#define G_AD_NOTPATTERN (gI_(0b01) << G_MDSFT_ALPHADITHER)
#define G_AD_NOISE (gI_(0b10) << G_MDSFT_ALPHADITHER)
#define G_AD_DISABLE (gI_(0b11) << G_MDSFT_ALPHADITHER)
#define G_CD_MAGICSQ (gI_(0b00) << G_MDSFT_RGBDITHER)
#define G_CD_BAYER (gI_(0b01) << G_MDSFT_RGBDITHER)
#define G_CD_NOISE (gI_(0b10) << G_MDSFT_RGBDITHER)
#define G_CD_DISABLE (gI_(0b11) << G_MDSFT_RGBDITHER)
#define G_CD_ENABLE (gI_(0b10) << G_MDSFT_RGBDITHER)
#define G_CK_NONE (gI_(0b0) << G_MDSFT_COMBKEY)
#define G_CK_KEY (gI_(0b1) << G_MDSFT_COMBKEY)
#define G_TC_CONV (gI_(0b000) << G_MDSFT_TEXTCONV)
#define G_TC_FILTCONV (gI_(0b101) << G_MDSFT_TEXTCONV)
#define G_TC_FILT (gI_(0b110) << G_MDSFT_TEXTCONV)
#define G_TF_POINT (gI_(0b00) << G_MDSFT_TEXTFILT)
#define G_TF_BILERP (gI_(0b10) << G_MDSFT_TEXTFILT)
#define G_TF_AVERAGE (gI_(0b11) << G_MDSFT_TEXTFILT)
#define G_TT_NONE (gI_(0b00) << G_MDSFT_TEXTLUT)
#define G_TT_RGBA16 (gI_(0b10) << G_MDSFT_TEXTLUT)
#define G_TT_IA16 (gI_(0b11) << G_MDSFT_TEXTLUT)
#define G_TL_TILE (gI_(0b0) << G_MDSFT_TEXTLOD)
#define G_TL_LOD (gI_(0b1) << G_MDSFT_TEXTLOD)
#define G_TD_CLAMP (gI_(0b00) << G_MDSFT_TEXTDETAIL)
#define G_TD_SHARPEN (gI_(0b01) << G_MDSFT_TEXTDETAIL)
#define G_TD_DETAIL (gI_(0b10) << G_MDSFT_TEXTDETAIL)
#define G_TP_NONE (gI_(0b0) << G_MDSFT_TEXTPERSP)
#define G_TP_PERSP (gI_(0b1) << G_MDSFT_TEXTPERSP)
#define G_CYC_1CYCLE (gI_(0b00) << G_MDSFT_CYCLETYPE)
#define G_CYC_2CYCLE (gI_(0b01) << G_MDSFT_CYCLETYPE)
#define G_CYC_COPY (gI_(0b10) << G_MDSFT_CYCLETYPE)
#define G_CYC_FILL (gI_(0b11) << G_MDSFT_CYCLETYPE)
#define G_PM_NPRIMITIVE (gI_(0b0) << G_MDSFT_PIPELINE)
#define G_PM_1PRIMITIVE (gI_(0b1) << G_MDSFT_PIPELINE)
/* color conversion constants */
#define G_CV_K0 (175)
#define G_CV_K1 (-43)
#define G_CV_K2 (-89)
#define G_CV_K3 (222)
#define G_CV_K4 (114)
#define G_CV_K5 (42)
/* color combiner */
#define G_CCMUX_COMBINED 0
#define G_CCMUX_TEXEL0 1
#define G_CCMUX_TEXEL1 2
#define G_CCMUX_PRIMITIVE 3
#define G_CCMUX_SHADE 4
#define G_CCMUX_ENVIRONMENT 5
#define G_CCMUX_1 6
#define G_CCMUX_NOISE 7
#define G_CCMUX_0 31
#define G_CCMUX_CENTER 6
#define G_CCMUX_K4 7
#define G_CCMUX_SCALE 6
#define G_CCMUX_COMBINED_ALPHA 7
#define G_CCMUX_TEXEL0_ALPHA 8
#define G_CCMUX_TEXEL1_ALPHA 9
#define G_CCMUX_PRIMITIVE_ALPHA 10
#define G_CCMUX_SHADE_ALPHA 11
#define G_CCMUX_ENV_ALPHA 12
#define G_CCMUX_LOD_FRACTION 13
#define G_CCMUX_PRIM_LOD_FRAC 14
#define G_CCMUX_K5 15
#define G_ACMUX_COMBINED 0
#define G_ACMUX_TEXEL0 1
#define G_ACMUX_TEXEL1 2
#define G_ACMUX_PRIMITIVE 3
#define G_ACMUX_SHADE 4
#define G_ACMUX_ENVIRONMENT 5
#define G_ACMUX_1 6
#define G_ACMUX_0 7
#define G_ACMUX_LOD_FRACTION 0
#define G_ACMUX_PRIM_LOD_FRAC 6
/*
* combine modes
* ( A - B ) * C + D
*/
#define G_CC_MODULATEI \
TEXEL0, 0, SHADE, 0, \
0, 0, 0, SHADE
#define G_CC_MODULATEIA \
TEXEL0, 0, SHADE, 0, \
TEXEL0, 0, SHADE, 0
#define G_CC_MODULATEIDECALA \
TEXEL0, 0, SHADE, 0, \
0, 0, 0, TEXEL0
#define G_CC_MODULATERGB \
G_CC_MODULATEI
#define G_CC_MODULATERGBA \
G_CC_MODULATEIA
#define G_CC_MODULATERGBDECALA \
G_CC_MODULATEIDECALA
#define G_CC_MODULATEI_PRIM \
TEXEL0, 0, PRIMITIVE, 0, \
0, 0, 0, PRIMITIVE
#define G_CC_MODULATEIA_PRIM \
TEXEL0, 0, PRIMITIVE, 0, \
TEXEL0, 0, PRIMITIVE, 0
#define G_CC_MODULATEIDECALA_PRIM \
TEXEL0, 0, PRIMITIVE, 0, \
0, 0, 0, TEXEL0
#define G_CC_MODULATERGB_PRIM \
G_CC_MODULATEI_PRIM
#define G_CC_MODULATERGBA_PRIM \
G_CC_MODULATEIA_PRIM
#define G_CC_MODULATERGBDECALA_PRIM \
G_CC_MODULATEIDECALA_PRIM
#define G_CC_DECALRGB \
0, 0, 0, TEXEL0, \
0, 0, 0, SHADE
#define G_CC_DECALRGBA \
0, 0, 0, TEXEL0, \
0, 0, 0, TEXEL0
#define G_CC_BLENDI \
ENVIRONMENT, SHADE, TEXEL0, SHADE, \
0, 0, 0, SHADE
#define G_CC_BLENDIA \
ENVIRONMENT, SHADE, TEXEL0, SHADE, \
TEXEL0, 0, SHADE, 0
#define G_CC_BLENDIDECALA \
ENVIRONMENT, SHADE, TEXEL0, SHADE, \
0, 0, 0, TEXEL0
#define G_CC_BLENDRGBA \
TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, \
0, 0, 0, SHADE
#define G_CC_BLENDRGBDECALA \
TEXEL0, SHADE, TEXEL0_ALPHA, SHADE, \
0, 0, 0, TEXEL0
#define G_CC_REFLECTRGB \
ENVIRONMENT, 0, TEXEL0, SHADE, \
0, 0, 0, SHADE
#define G_CC_REFLECTRGBDECALA \
ENVIRONMENT, 0, TEXEL0, SHADE, \
0, 0, 0, TEXEL0
#define G_CC_HILITERGB \
PRIMITIVE, SHADE, TEXEL0, SHADE, \
0, 0, 0, SHADE
#define G_CC_HILITERGBA \
PRIMITIVE, SHADE, TEXEL0, SHADE, \
PRIMITIVE, SHADE, TEXEL0, SHADE
#define G_CC_HILITERGBDECALA \
PRIMITIVE, SHADE, TEXEL0, SHADE, \
0, 0, 0, TEXEL0
#define G_CC_1CYUV2RGB \
TEXEL0, K4, K5, TEXEL0, \
0, 0, 0, SHADE
#define G_CC_PRIMITIVE \
0, 0, 0, PRIMITIVE, \
0, 0, 0, PRIMITIVE
#define G_CC_SHADE \
0, 0, 0, SHADE, \
0, 0, 0, SHADE
#define G_CC_ADDRGB \
1, 0, TEXEL0, SHADE, \
0, 0, 0, SHADE
#define G_CC_ADDRGBDECALA \
1, 0, TEXEL0, SHADE, \
0, 0, 0, TEXEL0
#define G_CC_SHADEDECALA \
0, 0, 0, SHADE, \
0, 0, 0, TEXEL0
#define G_CC_BLENDPE \
PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, \
TEXEL0, 0, SHADE, 0
#define G_CC_BLENDPEDECALA \
PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, \
0, 0, 0, TEXEL0
#define G_CC_TRILERP \
TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0, \
TEXEL1, TEXEL0, LOD_FRACTION, TEXEL0
#define G_CC_TEMPLERP \
TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0, \
TEXEL1, TEXEL0, PRIM_LOD_FRAC, TEXEL0
#define G_CC_INTERFERENCE \
TEXEL0, 0, TEXEL1, 0, \
TEXEL0, 0, TEXEL1, 0
#define _G_CC_BLENDPE \
ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, \
TEXEL0, 0, SHADE, 0
#define _G_CC_BLENDPEDECALA \
ENVIRONMENT, PRIMITIVE, TEXEL0, PRIMITIVE, \
0, 0, 0, TEXEL0
#define _G_CC_SPARSEST \
PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0, \
PRIMITIVE, TEXEL0, LOD_FRACTION, TEXEL0
#define _G_CC_TWOCOLORTEX \
PRIMITIVE, SHADE, TEXEL0, SHADE, \
0, 0, 0, SHADE
#define G_CC_MODULATEI2 \
COMBINED, 0, SHADE, 0, \
0, 0, 0, SHADE
#define G_CC_MODULATEIA2 \
COMBINED, 0, SHADE, 0, \
COMBINED, 0, SHADE, 0
#define G_CC_MODULATERGB2 \
G_CC_MODULATEI2
#define G_CC_MODULATERGBA2 \
G_CC_MODULATEIA2
#define G_CC_MODULATEI_PRIM2 \
COMBINED, 0, PRIMITIVE, 0, \
0, 0, 0, PRIMITIVE
#define G_CC_MODULATEIA_PRIM2 \
COMBINED, 0, PRIMITIVE, 0, \
COMBINED, 0, PRIMITIVE, 0
#define G_CC_MODULATERGB_PRIM2 \
G_CC_MODULATEI_PRIM2
#define G_CC_MODULATERGBA_PRIM2 \
G_CC_MODULATEIA_PRIM2
#define G_CC_DECALRGB2 \
0, 0, 0, COMBINED, \
0, 0, 0, SHADE
#define G_CC_BLENDI2 \
ENVIRONMENT, SHADE, COMBINED, SHADE, \
0, 0, 0, SHADE
#define G_CC_BLENDIA2 \
ENVIRONMENT, SHADE, COMBINED, SHADE, \
COMBINED, 0, SHADE, 0
#define G_CC_HILITERGB2 \
ENVIRONMENT, COMBINED, TEXEL0, COMBINED, \
0, 0, 0, SHADE
#define G_CC_HILITERGBA2 \
ENVIRONMENT, COMBINED, TEXEL0, COMBINED, \
ENVIRONMENT, COMBINED, TEXEL0, COMBINED
#define G_CC_HILITERGBDECALA2 \
ENVIRONMENT, COMBINED, TEXEL0, COMBINED, \
0, 0, 0, TEXEL0
#define G_CC_HILITERGBPASSA2 \
ENVIRONMENT, COMBINED, TEXEL0, COMBINED, \
0, 0, 0, COMBINED
#define G_CC_CHROMA_KEY2 \
TEXEL0, CENTER, SCALE, 0, \
0, 0, 0, 0
#define G_CC_YUV2RGB \
TEXEL1, K4, K5, TEXEL1, \
0, 0, 0, 0
#define G_CC_PASS2 \
0, 0, 0, COMBINED, \
0, 0, 0, COMBINED
#define G_CC_LERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
( \
gFL_(G_CCMUX_##a0, 4, 52) | \
gFL_(G_CCMUX_##c0, 5, 47) | \
gFL_(G_ACMUX_##Aa0, 3, 44) | \
gFL_(G_ACMUX_##Ac0, 3, 41) | \
gFL_(G_CCMUX_##a1, 4, 37) | \
gFL_(G_CCMUX_##c1, 5, 32) | \
gFL_(G_CCMUX_##b0, 4, 28) | \
gFL_(G_CCMUX_##b1, 4, 24) | \
gFL_(G_ACMUX_##Aa1, 3, 21) | \
gFL_(G_ACMUX_##Ac1, 3, 18) | \
gFL_(G_CCMUX_##d0, 3, 15) | \
gFL_(G_ACMUX_##Ab0, 3, 12) | \
gFL_(G_ACMUX_##Ad0, 3, 9) | \
gFL_(G_CCMUX_##d1, 3, 6) | \
gFL_(G_ACMUX_##Ab1, 3, 3) | \
gFL_(G_ACMUX_##Ad1, 3, 0) \
)
#define G_CC_MODE(mode1, mode2) G_CC_LERP(mode1, mode2)
/* scissor modes */
#define G_SC_NON_INTERLACE gI_(0b00)
#define G_SC_EVEN_INTERLACE gI_(0b10)
#define G_SC_ODD_INTERLACE gI_(0b11)
/* display list branch flags */
#define G_DL_PUSH gI_(0b0)
#define G_DL_NOPUSH gI_(0b1)
/* conditional branching flags (f3dex and f3dex2) */
#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2)
# define G_BZ_PERSP 0
# define G_BZ_ORTHO 1
#endif
/* matrix params */
#define G_MTX_MUL (gI_(0b0) << 1)
#define G_MTX_LOAD (gI_(0b1) << 1)
/* matrix params for fast3d and f3dex */
#if defined(F3D_GBI) || defined(F3DEX_GBI)
# define G_MTX_MODELVIEW (gI_(0b0) << 0)
# define G_MTX_PROJECTION (gI_(0b1) << 0)
# define G_MTX_NOPUSH (gI_(0b0) << 2)
# define G_MTX_PUSH (gI_(0b1) << 2)
#endif
/* matrix params for f3dex2 */
#if defined(F3DEX_GBI_2)
# define G_MTX_NOPUSH (gI_(0b0) << 0)
# define G_MTX_PUSH (gI_(0b1) << 0)
# define G_MTX_MODELVIEW (gI_(0b0) << 2)
# define G_MTX_PROJECTION (gI_(0b1) << 2)
#endif
/* moveword indices */
#define G_MW_MATRIX 0
#define G_MW_NUMLIGHT 2
#define G_MW_CLIP 4
#define G_MW_SEGMENT 6
#define G_MW_FOG 8
#define G_MW_GENSTAT 8
#define G_MW_LIGHTCOL 10
#define G_MW_PERSPNORM 14
/* moveword indices for fast3d and f3dex */
#if defined(F3D_GBI) || defined(F3DEX_GBI)
# define G_MW_POINTS 12
#endif
/* moveword indices for f3dex2 */
#if defined(F3DEX_GBI_2)
# define G_MW_FORCEMTX 12
#endif
/* moveword offsets */
#define G_MWO_NUMLIGHT gI_(0x00)
#define G_MWO_CLIP_RNX gI_(0x04)
#define G_MWO_CLIP_RNY gI_(0x0C)
#define G_MWO_CLIP_RPX gI_(0x14)
#define G_MWO_CLIP_RPY gI_(0x1C)
#define G_MWO_SEGMENT_0 gI_(0x00)
#define G_MWO_SEGMENT_1 gI_(0x04)
#define G_MWO_SEGMENT_2 gI_(0x08)
#define G_MWO_SEGMENT_3 gI_(0x0C)
#define G_MWO_SEGMENT_4 gI_(0x10)
#define G_MWO_SEGMENT_5 gI_(0x14)
#define G_MWO_SEGMENT_6 gI_(0x18)
#define G_MWO_SEGMENT_7 gI_(0x1C)
#define G_MWO_SEGMENT_8 gI_(0x20)
#define G_MWO_SEGMENT_9 gI_(0x24)
#define G_MWO_SEGMENT_A gI_(0x28)
#define G_MWO_SEGMENT_B gI_(0x2C)
#define G_MWO_SEGMENT_C gI_(0x30)
#define G_MWO_SEGMENT_D gI_(0x34)
#define G_MWO_SEGMENT_E gI_(0x38)
#define G_MWO_SEGMENT_F gI_(0x3C)
#define G_MWO_FOG gI_(0x00)
#define G_MWO_aLIGHT_1 gI_(0x00)
#define G_MWO_bLIGHT_1 gI_(0x04)
#define G_MWO_MATRIX_XX_XY_I gI_(0x00)
#define G_MWO_MATRIX_XZ_XW_I gI_(0x04)
#define G_MWO_MATRIX_YX_YY_I gI_(0x08)
#define G_MWO_MATRIX_YZ_YW_I gI_(0x0C)
#define G_MWO_MATRIX_ZX_ZY_I gI_(0x10)
#define G_MWO_MATRIX_ZZ_ZW_I gI_(0x14)
#define G_MWO_MATRIX_WX_WY_I gI_(0x18)
#define G_MWO_MATRIX_WZ_WW_I gI_(0x1C)
#define G_MWO_MATRIX_XX_XY_F gI_(0x20)
#define G_MWO_MATRIX_XZ_XW_F gI_(0x24)
#define G_MWO_MATRIX_YX_YY_F gI_(0x28)
#define G_MWO_MATRIX_YZ_YW_F gI_(0x2C)
#define G_MWO_MATRIX_ZX_ZY_F gI_(0x30)
#define G_MWO_MATRIX_ZZ_ZW_F gI_(0x34)
#define G_MWO_MATRIX_WX_WY_F gI_(0x38)
#define G_MWO_MATRIX_WZ_WW_F gI_(0x3C)
#define G_MWO_POINT_RGBA gI_(0x10)
#define G_MWO_POINT_ST gI_(0x14)
#define G_MWO_POINT_XYSCREEN gI_(0x18)
#define G_MWO_POINT_ZSCREEN gI_(0x1C)
/* moveword offsets for fast3d and f3dex */
#if defined(F3D_GBI) || defined(F3DEX_GBI)
# define G_MWO_aLIGHT_2 gI_(0x20)
# define G_MWO_bLIGHT_2 gI_(0x24)
# define G_MWO_aLIGHT_3 gI_(0x40)
# define G_MWO_bLIGHT_3 gI_(0x44)
# define G_MWO_aLIGHT_4 gI_(0x60)
# define G_MWO_bLIGHT_4 gI_(0x64)
# define G_MWO_aLIGHT_5 gI_(0x80)
# define G_MWO_bLIGHT_5 gI_(0x84)
# define G_MWO_aLIGHT_6 gI_(0xA0)
# define G_MWO_bLIGHT_6 gI_(0xA4)
# define G_MWO_aLIGHT_7 gI_(0xC0)
# define G_MWO_bLIGHT_7 gI_(0xC4)
# define G_MWO_aLIGHT_8 gI_(0xE0)
# define G_MWO_bLIGHT_8 gI_(0xE4)
#endif
/* moveword offsets for f3dex2 */
#if defined(F3DEX_GBI_2)
# define G_MWO_aLIGHT_2 gI_(0x18)
# define G_MWO_bLIGHT_2 gI_(0x1C)
# define G_MWO_aLIGHT_3 gI_(0x30)
# define G_MWO_bLIGHT_3 gI_(0x34)
# define G_MWO_aLIGHT_4 gI_(0x48)
# define G_MWO_bLIGHT_4 gI_(0x4C)
# define G_MWO_aLIGHT_5 gI_(0x60)
# define G_MWO_bLIGHT_5 gI_(0x64)
# define G_MWO_aLIGHT_6 gI_(0x78)
# define G_MWO_bLIGHT_6 gI_(0x7C)
# define G_MWO_aLIGHT_7 gI_(0x90)
# define G_MWO_bLIGHT_7 gI_(0x94)
# define G_MWO_aLIGHT_8 gI_(0xA8)
# define G_MWO_bLIGHT_8 gI_(0xAC)
#endif
/* movemem params for fast3d and f3dex */
#if defined(F3D_GBI) || defined(F3DEX_GBI)
# define G_MV_VIEWPORT 128
# define G_MV_LOOKATY 130
# define G_MV_LOOKATX 132
# define G_MV_L0 134
# define G_MV_L1 136
# define G_MV_L2 138
# define G_MV_L3 140
# define G_MV_L4 142
# define G_MV_L5 144
# define G_MV_L6 146
# define G_MV_L7 148
# define G_MV_TXTATT 150
# define G_MV_MATRIX_2 152
# define G_MV_MATRIX_3 154
# define G_MV_MATRIX_4 156
# define G_MV_MATRIX_1 158
#endif
/* movemem params for f3dex2 */
#if defined(F3DEX_GBI_2)
# define G_MV_MMTX 2
# define G_MV_PMTX 6
# define G_MV_VIEWPORT 8
# define G_MV_LIGHT 10
# define G_MV_POINT 12
# define G_MV_MATRIX 14
# define G_MVO_LOOKATX gI_(0 * 0x18)
# define G_MVO_LOOKATY gI_(1 * 0x18)
# define G_MVO_L0 gI_(2 * 0x18)
# define G_MVO_L1 gI_(3 * 0x18)
# define G_MVO_L2 gI_(4 * 0x18)
# define G_MVO_L3 gI_(5 * 0x18)
# define G_MVO_L4 gI_(6 * 0x18)
# define G_MVO_L5 gI_(7 * 0x18)
# define G_MVO_L6 gI_(8 * 0x18)
# define G_MVO_L7 gI_(9 * 0x18)
#endif
/* frustum ratios */
#define FRUSTRATIO_1 gI_(1)
#define FRUSTRATIO_2 gI_(2)
#define FRUSTRATIO_3 gI_(3)
#define FRUSTRATIO_4 gI_(4)
#define FRUSTRATIO_5 gI_(5)
#define FRUSTRATIO_6 gI_(6)
/* light params */
#define NUMLIGHTS_0 1
#define NUMLIGHTS_1 1
#define NUMLIGHTS_2 2
#define NUMLIGHTS_3 3
#define NUMLIGHTS_4 4
#define NUMLIGHTS_5 5
#define NUMLIGHTS_6 6
#define NUMLIGHTS_7 7
#define LIGHT_1 1
#define LIGHT_2 2
#define LIGHT_3 3
#define LIGHT_4 4
#define LIGHT_5 5
#define LIGHT_6 6
#define LIGHT_7 7
#define LIGHT_8 8
/* light params for fast3d and f3dex */
#if defined(F3D_GBI) || defined(F3DEX_GBI)
# define NUML(n) (((n) + 1) * 32 + 0x80000000)
#endif
/* light params for f3dex2 */
#if defined(F3DEX_GBI_2)
# define NUML(n) ((n) * 0x18)
#endif
/* background load types */
#define G_BGLT_LOADBLOCK gI_(0x0033)
#define G_BGLT_LOADTILE gI_(0xFFF4)
/* background flags */
#define G_BG_FLAG_FLIPS (gI_(0b1) << 0)
#define G_BG_FLAG_FLIPT (gI_(0b1) << 1)
/* object load types */
#define G_OBJLT_TXTRBLOCK gI_(0x00001033)
#define G_OBJLT_TXTRTILE gI_(0x00FC1034)
#define G_OBJLT_TLUT gI_(0x00000030)
/* object flags */
#define G_OBJ_FLAG_FLIPS (gI_(0b1) << 0)
#define G_OBJ_FLAG_FLIPT (gI_(0b1) << 4)
/* color macros */
#define G_MAXZ 0x03FF
#define G_MAXFBZ 0x3FFF
#define GPACK_RGBA5551(r, g, b, a) \
( \
gF_(r, 5, 11) | \
gF_(g, 5, 6) | \
gF_(b, 5, 1) | \
gF_(a, 1, 0) \
)
#define GPACK_RGBA8888(r, g, b, a) \
( \
gF_(r, 8, 24) | \
gF_(g, 8, 16) | \
gF_(b, 8, 8) | \
gF_(a, 8, 0) \
)
#define GPACK_RGB24A8(rgb, a) (gF_(rgb, 24, 8) | gF_(a, 8, 0))
#define GPACK_ZDZ(z, dz) (gF_(z, 14, 2) | gF_(dz, 2, 0))
/* structure definition macros */
#define gdSPDefMtx(xx, xy, xz, xw, \
yx, yy, yz, yw, \
zx, zy, zz, zw, \
wx, wy, wz, ww) \
( \
(Mtx) \
{ \
.i = \
{ \
(qs1616(xx) >> 16) & 0xFFFF, \
(qs1616(xy) >> 16) & 0xFFFF, \
(qs1616(xz) >> 16) & 0xFFFF, \
(qs1616(xw) >> 16) & 0xFFFF, \
(qs1616(yx) >> 16) & 0xFFFF, \
(qs1616(yy) >> 16) & 0xFFFF, \
(qs1616(yz) >> 16) & 0xFFFF, \
(qs1616(yw) >> 16) & 0xFFFF, \
(qs1616(zx) >> 16) & 0xFFFF, \
(qs1616(zy) >> 16) & 0xFFFF, \
(qs1616(zz) >> 16) & 0xFFFF, \
(qs1616(zw) >> 16) & 0xFFFF, \
(qs1616(wx) >> 16) & 0xFFFF, \
(qs1616(wy) >> 16) & 0xFFFF, \
(qs1616(wz) >> 16) & 0xFFFF, \
(qs1616(ww) >> 16) & 0xFFFF, \
}, \
.f = \
{ \
qs1616(xx) & 0xFFFF, \
qs1616(xy) & 0xFFFF, \
qs1616(xz) & 0xFFFF, \
qs1616(xw) & 0xFFFF, \
qs1616(yx) & 0xFFFF, \
qs1616(yy) & 0xFFFF, \
qs1616(yz) & 0xFFFF, \
qs1616(yw) & 0xFFFF, \
qs1616(zx) & 0xFFFF, \
qs1616(zy) & 0xFFFF, \
qs1616(zz) & 0xFFFF, \
qs1616(zw) & 0xFFFF, \
qs1616(wx) & 0xFFFF, \
qs1616(wy) & 0xFFFF, \
qs1616(wz) & 0xFFFF, \
qs1616(ww) & 0xFFFF, \
} \
} \
)
#define gdSPDefLookAt(rx, ry, rz, ux, uy, uz) \
( \
(LookAt) \
{ \
.l[0].l = \
{ \
.col = {0, 0, 0}, \
.colc = {0, 0, 0}, \
.dir = {rx, ry, rz}, \
}, \
.l[1].l = \
{ \
.col = {0, 0x80, 0}, \
.colc = {0, 0x80, 0}, \
.dir = {ux, uy, uz}, \
}, \
} \
)
#define gdSPDefLights0(ar, ag, ab) \
( \
(Lights0) \
{ \
.a.l = \
{ \
.col = {ar, ag, ab}, \
.colc = {ar, ag, ab}, \
}, \
.l[0].l = \
{ \
} \
} \
)
#define gdSPDefLights1(ar, ag, ab, \
r1, g1, b1, x1, y1, z1) \
( \
(Lights1) \
{ \
.a.l = \
{ \
.col = {ar, ag, ab}, \
.colc = {ar, ag, ab}, \
}, \
.l[0].l = \
{ \
.col = {r1, g1, b1}, \
.colc = {r1, g1, b1}, \
.dir = {x1, y1, z1}, \
} \
} \
)
#define gdSPDefLights2(ar, ag, ab, \
r1, g1, b1, x1, y1, z1, \
r2, g2, b2, x2, y2, z2) \
( \
(Lights2) \
{ \
.a.l = \
{ \
.col = {ar, ag, ab}, \
.colc = {ar, ag, ab}, \
}, \
.l[0].l = \
{ \
.col = {r1, g1, b1}, \
.colc = {r1, g1, b1}, \
.dir = {x1, y1, z1}, \
} \
.l[1].l = \
{ \
.col = {r2, g2, b2}, \
.colc = {r2, g2, b2}, \
.dir = {x2, y2, z2}, \
} \
} \
)
#define gdSPDefLights3(ar, ag, ab, \
r1, g1, b1, x1, y1, z1, \
r2, g2, b2, x2, y2, z2, \
r3, g3, b3, x3, y3, z3) \
( \
(Lights3) \
{ \
.a.l = \
{ \
.col = {ar, ag, ab}, \
.colc = {ar, ag, ab}, \
}, \
.l[0].l = \
{ \
.col = {r1, g1, b1}, \
.colc = {r1, g1, b1}, \
.dir = {x1, y1, z1}, \
} \
.l[1].l = \
{ \
.col = {r2, g2, b2}, \
.colc = {r2, g2, b2}, \
.dir = {x2, y2, z2}, \
} \
.l[2].l = \
{ \
.col = {r3, g3, b3}, \
.colc = {r3, g3, b3}, \
.dir = {x3, y3, z3}, \
} \
} \
)
#define gdSPDefLights4(ar, ag, ab, \
r1, g1, b1, x1, y1, z1, \
r2, g2, b2, x2, y2, z2, \
r3, g3, b3, x3, y3, z3, \
r4, g4, b4, x4, y4, z4) \
( \
(Lights4) \
{ \
.a.l = \
{ \
.col = {ar, ag, ab}, \
.colc = {ar, ag, ab}, \
}, \
.l[0].l = \
{ \
.col = {r1, g1, b1}, \
.colc = {r1, g1, b1}, \
.dir = {x1, y1, z1}, \
} \
.l[1].l = \
{ \
.col = {r2, g2, b2}, \
.colc = {r2, g2, b2}, \
.dir = {x2, y2, z2}, \
} \
.l[2].l = \
{ \
.col = {r3, g3, b3}, \
.colc = {r3, g3, b3}, \
.dir = {x3, y3, z3}, \
} \
.l[3].l = \
{ \
.col = {r4, g4, b4}, \
.colc = {r4, g4, b4}, \
.dir = {x4, y4, z4}, \
} \
} \
)
#define gdSPDefLights5(ar, ag, ab, \
r1, g1, b1, x1, y1, z1, \
r2, g2, b2, x2, y2, z2, \
r3, g3, b3, x3, y3, z3, \
r4, g4, b4, x4, y4, z4, \
r5, g5, b5, x5, y5, z5) \
( \
(Lights5) \
{ \
.a.l = \
{ \
.col = {ar, ag, ab}, \
.colc = {ar, ag, ab}, \
}, \
.l[0].l = \
{ \
.col = {r1, g1, b1}, \
.colc = {r1, g1, b1}, \
.dir = {x1, y1, z1}, \
} \
.l[1].l = \
{ \
.col = {r2, g2, b2}, \
.colc = {r2, g2, b2}, \
.dir = {x2, y2, z2}, \
} \
.l[2].l = \
{ \
.col = {r3, g3, b3}, \
.colc = {r3, g3, b3}, \
.dir = {x3, y3, z3}, \
} \
.l[3].l = \
{ \
.col = {r4, g4, b4}, \
.colc = {r4, g4, b4}, \
.dir = {x4, y4, z4}, \
} \
.l[4].l = \
{ \
.col = {r5, g5, b5}, \
.colc = {r5, g5, b5}, \
.dir = {x5, y5, z5}, \
} \
} \
)
#define gdSPDefLights6(ar, ag, ab, \
r1, g1, b1, x1, y1, z1, \
r2, g2, b2, x2, y2, z2, \
r3, g3, b3, x3, y3, z3, \
r4, g4, b4, x4, y4, z4, \
r5, g5, b5, x5, y5, z5, \
r6, g6, b6, x6, y6, z6)\
( \
(Lights6) \
{ \
.a.l = \
{ \
.col = {ar, ag, ab}, \
.colc = {ar, ag, ab}, \
}, \
.l[0].l = \
{ \
.col = {r1, g1, b1}, \
.colc = {r1, g1, b1}, \
.dir = {x1, y1, z1}, \
} \
.l[1].l = \
{ \
.col = {r2, g2, b2}, \
.colc = {r2, g2, b2}, \
.dir = {x2, y2, z2}, \
} \
.l[2].l = \
{ \
.col = {r3, g3, b3}, \
.colc = {r3, g3, b3}, \
.dir = {x3, y3, z3}, \
} \
.l[3].l = \
{ \
.col = {r4, g4, b4}, \
.colc = {r4, g4, b4}, \
.dir = {x4, y4, z4}, \
} \
.l[4].l = \
{ \
.col = {r5, g5, b5}, \
.colc = {r5, g5, b5}, \
.dir = {x5, y5, z5}, \
} \
.l[5].l = \
{ \
.col = {r6, g6, b6}, \
.colc = {r6, g6, b6}, \
.dir = {x6, y6, z6}, \
} \
} \
)
#define gdSPDefLights7(ar, ag, ab, \
r1, g1, b1, x1, y1, z1, \
r2, g2, b2, x2, y2, z2, \
r3, g3, b3, x3, y3, z3, \
r4, g4, b4, x4, y4, z4, \
r5, g5, b5, x5, y5, z5, \
r6, g6, b6, x6, y6, z6, \
r7, g7, b7, x7, y7, z7) \
( \
(Lights7) \
{ \
.a.l = \
{ \
.col = {ar, ag, ab}, \
.colc = {ar, ag, ab}, \
}, \
.l[0].l = \
{ \
.col = {r1, g1, b1}, \
.colc = {r1, g1, b1}, \
.dir = {x1, y1, z1}, \
} \
.l[1].l = \
{ \
.col = {r2, g2, b2}, \
.colc = {r2, g2, b2}, \
.dir = {x2, y2, z2}, \
} \
.l[2].l = \
{ \
.col = {r3, g3, b3}, \
.colc = {r3, g3, b3}, \
.dir = {x3, y3, z3}, \
} \
.l[3].l = \
{ \
.col = {r4, g4, b4}, \
.colc = {r4, g4, b4}, \
.dir = {x4, y4, z4}, \
} \
.l[4].l = \
{ \
.col = {r5, g5, b5}, \
.colc = {r5, g5, b5}, \
.dir = {x5, y5, z5}, \
} \
.l[5].l = \
{ \
.col = {r6, g6, b6}, \
.colc = {r6, g6, b6}, \
.dir = {x6, y6, z6}, \
} \
.l[6].l = \
{ \
.col = {r7, g7, b7}, \
.colc = {r7, g7, b7}, \
.dir = {x7, y7, z7}, \
} \
} \
)
#define gdSPDefVtx(x, y, z, s, t) \
( \
(Vtx) \
{ \
.v = \
{ \
.ob = {x, y, z}, \
.tc = {qs105(s), qs105(t)}, \
} \
} \
)
#define gdSPDefVtxC(x, y, z, s, t, cr, cg, cb, ca) \
( \
(Vtx) \
{ \
.v = \
{ \
.ob = {x, y, z}, \
.tc = {qs105(s), qs105(t)}, \
.cn = {cr, cg, cb, ca}, \
} \
} \
)
#define gdSPDefVtxN(x, y, z, s, t, nx, ny, nz, ca) \
( \
(Vtx) \
{ \
.n = \
{ \
.ob = {x, y, z}, \
.tc = {qs105(s), qs105(t)}, \
.n = {nx, ny, nz}, \
.a = ca \
} \
} \
)
/* instruction macros */
#define gsDPFillRectangle(ulx, uly, lrx, lry) \
gO_( \
G_FILLRECT, \
gF_(lrx, 10, 14) | \
gF_(lry, 10, 2), \
gF_(ulx, 10, 14) | \
gF_(uly, 10, 2))
#define gsDPScisFillRectangle(ulx, uly, lrx, lry) \
gsDPFillRectangle(gScC_(ulx), gScC_(uly), gScC_(lrx), gScC_(lry))
#define gsDPFullSync() \
gO_(G_RDPFULLSYNC, 0, 0)
#define gsDPLoadSync() \
gO_(G_RDPLOADSYNC, 0, 0)
#define gsDPTileSync() \
gO_(G_RDPTILESYNC, 0, 0)
#define gsDPPipeSync() \
gO_(G_RDPPIPESYNC, 0, 0)
#define gsDPLoadTLUT_pal16(pal, dram) \
gsDPLoadTLUT(16, 256 + (gI_(pal) & 0xF) * 16, dram)
#define gsDPLoadTLUT_pal256(dram) \
gsDPLoadTLUT(256, 256, dram)
#define gLTB_(timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
dxt, tmem, rt, line) \
gsDPSetTextureImage(fmt, G_SIZ_LDSIZ(siz), 1, timg), \
gsDPSetTile( \
fmt, G_SIZ_LDSIZ(siz), 0, tmem, G_TX_LOADTILE, 0, \
cmt, maskt, shiftt, \
cms, masks, shifts), \
gsDPLoadSync(), \
gsDPLoadBlock( \
G_TX_LOADTILE, 0, 0, \
G_LTB_LRS(width, height, siz), \
dxt), \
gsDPPipeSync(), \
gsDPSetTile( \
fmt, siz, line, tmem, rt, pal, \
cmt, maskt, shiftt, \
cms, masks, shifts), \
gsDPSetTileSize(rt, 0, 0, qu102((width) - 1), qu102((height) - 1))
#define gsDPLoadTextureBlock(timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
G_DXT(siz, width), 0x0, G_TX_RENDERTILE, \
((width) * G_SIZ_LDBITS(siz) + 63) / 64)
#define gsDPLoadTextureBlockS(timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
0, 0x0, G_TX_RENDERTILE, \
((width) * G_SIZ_LDBITS(siz) + 63) / 64)
#define gsDPLoadTextureBlock_4b(timg, fmt, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, G_IM_SIZ_4b, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
G_DXT(G_IM_SIZ_4b, width), 0x0, G_TX_RENDERTILE, \
((width) * 4 + 63) / 64)
#define gsDPLoadTextureBlock_4bS(timg, fmt, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, G_IM_SIZ_4b, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
0, 0x0, G_TX_RENDERTILE, \
((width) * 4 + 63) / 64)
#define gsDPLoadTextureBlockYuv(timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
G_DXT(siz, width), 0x0, G_TX_RENDERTILE, \
((width) + 7) / 8)
#define gsDPLoadTextureBlockYuvS(timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
0, 0x0, G_TX_RENDERTILE, \
((width) + 7) / 8)
#define _gsDPLoadTextureBlock(timg, tmem, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
G_DXT(siz, width), tmem, G_TX_RENDERTILE, \
((width) * G_SIZ_LDBITS(siz) + 63) / 64)
#define _gsDPLoadTextureBlockS(timg, tmem, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
0, tmem, G_TX_RENDERTILE, \
((width) * G_SIZ_LDBITS(siz) + 63) / 64)
#define _gsDPLoadTextureBlock_4b(timg, tmem, fmt, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, G_IM_SIZ_4b, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
G_DXT(G_IM_SIZ_4b, width), tmem, G_TX_RENDERTILE, \
((width) * 4 + 63) / 64)
#define _gsDPLoadTextureBlock_4bS(timg, tmem, fmt, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, G_IM_SIZ_4b, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
0, tmem, G_TX_RENDERTILE, \
((width) * 4 + 63) / 64)
#define _gsDPLoadTextureBlockYuv(timg, tmem, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
G_DXT(siz, width), tmem, G_TX_RENDERTILE, \
((width) + 7) / 8)
#define _gsDPLoadTextureBlockYuvS(timg, tmem, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
0, tmem, G_TX_RENDERTILE, \
((width) + 7) / 8)
#define gsDPLoadMultiBlock(timg, tmem, rt, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
G_DXT(siz, width), tmem, rt, \
((width) * G_SIZ_LDBITS(siz) + 63) / 64)
#define gsDPLoadMultiBlockS(timg, tmem, rt, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
0, tmem, rt, \
((width) * G_SIZ_LDBITS(siz) + 63) / 64)
#define gsDPLoadMultiBlock_4b(timg, tmem, rt, fmt, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, G_IM_SIZ_4b, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
G_DXT(G_IM_SIZ_4b, width), tmem, rt, \
((width) * 4 + 63) / 64)
#define gsDPLoadMultiBlock_4bS(timg, tmem, rt, fmt, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, G_IM_SIZ_4b, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
0, tmem, rt, \
((width) * 4 + 63) / 64)
#define gsDPLoadMultiBlockYuv(timg, tmem, rt, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
G_DXT(siz, width), tmem, rt, \
((width) + 7) / 8)
#define gsDPLoadMultiBlockYuvS(timg, tmem, rt, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTB_( \
timg, fmt, siz, width, height, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
0, tmem, rt, \
((width) + 7) / 8)
#define gLTT_(timg, fmt, siz, width, height, uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
tmem, rt, line) \
gsDPSetTextureImage(fmt, siz, width, timg), \
gsDPSetTile( \
fmt, siz, line, tmem, \
G_TX_LOADTILE, 0, \
cmt, maskt, shiftt, \
cms, masks, shifts), \
gsDPLoadSync(), \
gsDPLoadTile( \
G_TX_LOADTILE, \
qu102(uls), qu102(ult), \
qu102(lrs), qu102(lrt)), \
gsDPPipeSync(), \
gsDPSetTile( \
fmt, siz, line, \
tmem, rt, pal, \
cmt, maskt, shiftt, \
cms, masks, shifts), \
gsDPSetTileSize( \
rt, \
qu102(uls), qu102(ult), \
qu102(lrs), qu102(lrt))
#define gLTT4_(timg, fmt, width, height, uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
tmem, rt) \
gsDPSetTextureImage(fmt, G_IM_SIZ_8b, (width) / 2, timg), \
gsDPSetTile( \
fmt, G_IM_SIZ_8b, \
(((lrs) - (uls) + 1) / 2 + 7) / 8, \
tmem, G_TX_LOADTILE, 0, \
cmt, maskt, shiftt, \
cms, masks, shifts), \
gsDPLoadSync(), \
gsDPLoadTile( \
G_TX_LOADTILE, \
qu102(uls) / 2, qu102(ult), \
qu102(lrs) / 2, qu102(lrt)), \
gsDPPipeSync(), \
gsDPSetTile( \
fmt, G_IM_SIZ_4b, \
(((lrs) - (uls) + 1) / 2 + 7) / 8, \
tmem, rt, pal, \
cmt, maskt, shiftt, \
cms, masks, shifts), \
gsDPSetTileSize( \
rt, \
qu102(uls), qu102(ult), \
qu102(lrs), qu102(lrt))
#define gsDPLoadTextureTile(timg, fmt, siz, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTT_( \
timg, fmt, siz, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
0x0, G_TX_RENDERTILE, \
(((lrs) - (uls) + 1) * G_SIZ_LDBITS(siz) + 63) / 64)
#define gsDPLoadTextureTile_4b(timg, fmt, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTT4_( \
timg, fmt, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
0x0, G_TX_RENDERTILE)
#define gsDPLoadTextureTileYuv(timg, fmt, siz, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTT_( \
timg, fmt, siz, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
0x0, G_TX_RENDERTILE, \
(((lrs) - (uls) + 1) + 7) / 8)
#define _gsDPLoadTextureTile(timg, tmem, fmt, siz, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTT_( \
timg, fmt, siz, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
tmem, G_TX_RENDERTILE, \
(((lrs) - (uls) + 1) * G_SIZ_LDBITS(siz) + 63) / 64)
#define _gsDPLoadTextureTile_4b(timg, tmem, fmt, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTT4_( \
timg, fmt, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
tmem, G_TX_RENDERTILE)
#define _gsDPLoadTextureTileYuv(timg, tmem, fmt, siz, width, height, \
uls, ult, lrs, lrt, pal, cms, cmt, \
masks, maskt, shifts, shiftt) \
gLTT_( \
timg, fmt, siz, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
tmem, G_TX_RENDERTILE, \
(((lrs) - (uls) + 1) + 7) / 8)
#define gsDPLoadMultiTile(timg, tmem, rt, fmt, siz, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTT_( \
timg, fmt, siz, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
tmem, rt, \
(((lrs) - (uls) + 1) * G_SIZ_LDBITS(siz) + 63) / 64)
#define gsDPLoadMultiTile_4b(timg, tmem, rt, fmt, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTT4_( \
timg, fmt, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
tmem, rt)
#define gsDPLoadMultiTileYuv(timg, tmem, rt, fmt, siz, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt) \
gLTT_( \
timg, fmt, siz, width, height, \
uls, ult, lrs, lrt, pal, \
cms, cmt, masks, maskt, shifts, shiftt, \
tmem, rt, \
(((lrs) - (uls) + 1) + 7) / 8)
#define gsDPLoadBlock(tile, uls, ult, lrs, dxt) \
gO_( \
G_LOADBLOCK, \
gF_(uls, 12, 12) | \
gF_(ult, 12, 0), \
gF_(tile, 3, 24) | \
gF_(G_LDBLK_TXL(lrs), 12, 12) | \
gF_(dxt, 12, 0))
#define gsDPNoOp() \
gsDPNoOpTag(0)
#define gsDPNoOpTag(tag) \
gO_(G_NOOP, 0, tag)
#define gsDPPipelineMode(mode) \
gsSPSetOtherModeHi(G_MDSFT_PIPELINE, G_MDSIZ_PIPELINE, mode)
#define gsDPSetBlendColor(r, g, b, a) \
gO_( \
G_SETBLENDCOLOR, \
0, \
gF_(r, 8, 24) | \
gF_(g, 8, 16) | \
gF_(b, 8, 8) | \
gF_(a, 8, 0))
#define gsDPSetEnvColor(r, g, b, a) \
gO_( \
G_SETENVCOLOR, \
0, \
gF_(r, 8, 24) | \
gF_(g, 8, 16) | \
gF_(b, 8, 8) | \
gF_(a, 8, 0))
#define gsDPSetFillColor(c) \
gO_(G_SETFILLCOLOR, 0, c)
#define gsDPSetFogColor(r, g, b, a) \
gO_( \
G_SETFOGCOLOR, 0, \
gF_(r, 8, 24) | \
gF_(g, 8, 16) | \
gF_(b, 8, 8) | \
gF_(a, 8, 0))
#define gsDPSetPrimColor(m, l, r, g, b, a) \
gO_( \
G_SETPRIMCOLOR, \
gF_(m, 8, 8) | \
gF_(l, 8, 0), \
gF_(r, 8, 24) | \
gF_(g, 8, 16) | \
gF_(b, 8, 8) | \
gF_(a, 8, 0))
#define gsDPSetColorImage(fmt, siz, width, img) \
gO_( \
G_SETCIMG, \
gF_(fmt, 3, 21) | \
gF_(siz, 2, 19) | \
gF_((width) - 1, 12, 0), \
img)
#define gsDPSetDepthImage(img) \
gO_(G_SETZIMG, 0, img)
#define gsDPSetTextureImage(fmt, siz, width, img) \
gO_( \
G_SETTIMG, \
gF_(fmt, 3, 21) | \
gF_(siz, 2, 19) | \
gF_((width) - 1, 12, 0), \
img)
#define gsDPSetHilite1Tile(tile, hilite, width, height) \
gsDPSetTileSize( \
tile, \
((Hilite *)(hilite))->h.x1 & 0xFFF, \
((Hilite *)(hilite))->h.y1 & 0xFFF, \
(((width) - 1) * 4 + ((Hilite *)(hilite))->h.x1) & 0xFFF, \
(((height) - 1) * 4 + ((Hilite *)(hilite))->h.y1) & 0xFFF)
#define gsDPSetHilite2Tile(tile, hilite, width, height) \
gsDPSetTileSize( \
tile, \
((Hilite *)(hilite))->h.x2 & 0xFFF, \
((Hilite *)(hilite))->h.y2 & 0xFFF, \
(((width) - 1) * 4 + ((Hilite *)(hilite))->h.x2) & 0xFFF, \
(((height) - 1) * 4 + ((Hilite *)(hilite))->h.y2) & 0xFFF)
#define gsDPSetAlphaCompare(mode) \
gsSPSetOtherModeLo(G_MDSFT_ALPHACOMPARE, G_MDSIZ_ALPHACOMPARE, mode)
#define gsDPSetAlphaDither(type) \
gsSPSetOtherModeHi(G_MDSFT_ALPHADITHER, G_MDSIZ_ALPHADITHER, type)
#define gsDPSetColorDither(type) \
gsSPSetOtherModeHi(G_MDSFT_RGBDITHER, G_MDSIZ_RGBDITHER, type)
#define gsDPSetCombineMode(mode1, mode2) \
gsDPSetCombineLERP(mode1, mode2)
#define gsDPSetCombineLERP(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
gO_( \
G_SETCOMBINE, \
gF_(G_CCMUX_##a0, 4, 20) | \
gF_(G_CCMUX_##c0, 5, 15) | \
gF_(G_ACMUX_##Aa0, 3, 12) | \
gF_(G_ACMUX_##Ac0, 3, 9) | \
gF_(G_CCMUX_##a1, 4, 5) | \
gF_(G_CCMUX_##c1, 5, 0), \
gF_(G_CCMUX_##b0, 4, 28) | \
gF_(G_CCMUX_##b1, 4, 24) | \
gF_(G_ACMUX_##Aa1, 3, 21) | \
gF_(G_ACMUX_##Ac1, 3, 18) | \
gF_(G_CCMUX_##d0, 3, 15) | \
gF_(G_ACMUX_##Ab0, 3, 12) | \
gF_(G_ACMUX_##Ad0, 3, 9) | \
gF_(G_CCMUX_##d1, 3, 6) | \
gF_(G_ACMUX_##Ab1, 3, 3) | \
gF_(G_ACMUX_##Ad1, 3, 0))
#define gsDPSetConvert(k0, k1, k2, k3, k4, k5) \
gO_( \
G_SETCONVERT, \
gF_(k0, 9, 13) | \
gF_(k1, 9, 4) | \
gF_(gI_(k2) >> 5, 4, 0), \
gF_(k2, 5, 27) | \
gF_(k3, 9, 18) | \
gF_(k4, 9, 9) | \
gF_(k5, 9, 0))
#define gsDPSetTextureConvert(type) \
gsSPSetOtherModeHi(G_MDSFT_TEXTCONV, G_MDSIZ_TEXTCONV, type)
#define gsDPSetCycleType(type) \
gsSPSetOtherModeHi(G_MDSFT_CYCLETYPE, G_MDSIZ_CYCLETYPE, type)
#define gsDPSetDepthSource(source) \
gsSPSetOtherModeLo(G_MDSFT_ZSRCSEL, G_MDSIZ_ZSRCSEL, source)
#define gsDPSetCombineKey(type) \
gsSPSetOtherModeHi(G_MDSFT_COMBKEY, G_MDSIZ_COMBKEY, type)
#define gsDPSetKeyGB(cG, sG, wG, cB, sB, wB) \
gO_( \
G_SETKEYGB, \
gF_(wG, 12, 12) | \
gF_(wB, 12, 0), \
gF_(cG, 8, 24) | \
gF_(sG, 8, 16) | \
gF_(cB, 8, 8) | \
gF_(sB, 8, 0))
#define gsDPSetKeyR(cR, sR, wR) \
gO_( \
G_SETKEYR, 0, \
gF_(wR, 12, 16) | \
gF_(cR, 8, 8) | \
gF_(sR, 8, 0))
#define gsDPSetPrimDepth(z, dz) \
gO_( \
G_SETPRIMDEPTH, \
0, \
gF_(z, 16, 16) | \
gF_(dz, 16, 0))
#define gsDPSetRenderMode(mode1, mode2) \
gsSPSetOtherModeLo( \
G_MDSFT_RENDERMODE, \
G_MDSIZ_RENDERMODE, \
gI_(mode1) | \
gI_(mode2))
#define gsDPSetScissor(mode, ulx, uly, lrx, lry) \
gsDPSetScissorFrac( \
mode, \
qu102(gI_(ulx)), \
qu102(gI_(uly)), \
qu102(gI_(lrx)), \
qu102(gI_(lry)))
#define gsDPSetScissorFrac(mode, ulx, uly, lrx, lry) \
gO_( \
G_SETSCISSOR, \
gF_(ulx, 12, 12) | \
gF_(uly, 12, 0), \
gF_(mode, 2, 24) | \
gF_(lrx, 12, 12) | \
gF_(lry, 12, 0))
#define gsDPSetTextureDetail(type) \
gsSPSetOtherModeHi(G_MDSFT_TEXTDETAIL, G_MDSIZ_TEXTDETAIL, type)
#define gsDPSetTextureFilter(mode) \
gsSPSetOtherModeHi(G_MDSFT_TEXTFILT, G_MDSIZ_TEXTFILT, mode)
#define gsDPSetTextureLOD(mode) \
gsSPSetOtherModeHi(G_MDSFT_TEXTLOD, G_MDSIZ_TEXTLOD, mode)
#define gsDPSetTextureLUT(mode) \
gsSPSetOtherModeHi(G_MDSFT_TEXTLUT, G_MDSIZ_TEXTLUT, mode)
#define gsDPSetTexturePersp(enable) \
gsSPSetOtherModeHi(G_MDSFT_TEXTPERSP, G_MDSIZ_TEXTPERSP, enable)
#define gsDPSetTile(fmt, siz, line, tmem, tile, palette, \
cmt, maskt, shiftt, cms, masks, shifts) \
gO_( \
G_SETTILE, \
gF_(fmt, 3, 21) | \
gF_(siz, 2, 19) | \
gF_(line, 9, 9) | \
gF_(tmem, 9, 0), \
gF_(tile, 3, 24) | \
gF_(palette, 4, 20) | \
gF_(cmt, 2, 18) | \
gF_(maskt, 4, 14) | \
gF_(shiftt, 4, 10) | \
gF_(cms, 2, 8) | \
gF_(masks, 4, 4) | \
gF_(shifts, 4, 0))
#define gsDPSetTileSize(tile, uls, ult, lrs, lrt) \
gO_( \
G_SETTILESIZE, \
gF_(uls, 12, 12) | \
gF_(ult, 12, 0), \
gF_(tile, 3, 24) | \
gF_(lrs, 12, 12) | \
gF_(lrt, 12, 0))
#define gsSPBranchList(dl) \
gsDisplayList(dl, 1)
#define gsSPClipRatio(r) \
gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNX, (uint16_t)(r)), \
gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RNY, (uint16_t)(r)), \
gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPX, (uint16_t)-(r)), \
gsMoveWd(G_MW_CLIP, G_MWO_CLIP_RPY, (uint16_t)-(r))
#define gsSPDisplayList(dl) \
gsDisplayList(dl, 0)
#define gsSPEndDisplayList() \
gO_(G_ENDDL, 0, 0)
#define gsSPFogFactor(fm, fo) \
gsMoveWd( \
G_MW_FOG, \
G_MWO_FOG, \
gF_(fm, 16, 16) | \
gF_(fo, 16, 0))
#define gsSPFogPosition(min, max) \
gsSPFogFactor( \
(500 * 0x100) / ((max) - (min)), \
(500 - (min)) * 0x100 / ((max) - (min)))
#define gsSPLine3D(v0, v1, flag) \
gsSPLineW3D(v0, v1, 0, flag)
#define gsSPLookAt(l) \
gsSPLookAtX(l), \
gsSPLookAtY(gI_(l) + 0x10)
#define gsSPSegment(seg, base) \
gsMoveWd(G_MW_SEGMENT, (seg) * 4, base)
#define gsSPSetLights0(lites) \
gsSPNumLights(NUMLIGHTS_0), \
gsSPLight(&(lites).l[0], 1), \
gsSPLight(&(lites).a, 2)
#define gsSPSetLights1(lites) \
gsSPNumLights(NUMLIGHTS_1), \
gsSPLight(&(lites).l[0], 1), \
gsSPLight(&(lites).a, 2)
#define gsSPSetLights2(lites) \
gsSPNumLights(NUMLIGHTS_2), \
gsSPLight(&(lites).l[0], 1), \
gsSPLight(&(lites).l[1], 2), \
gsSPLight(&(lites).a, 3)
#define gsSPSetLights3(lites) \
gsSPNumLights(NUMLIGHTS_3), \
gsSPLight(&(lites).l[0], 1), \
gsSPLight(&(lites).l[1], 2), \
gsSPLight(&(lites).l[2], 3), \
gsSPLight(&(lites).a, 4)
#define gsSPSetLights4(lites) \
gsSPNumLights(NUMLIGHTS_4), \
gsSPLight(&(lites).l[0], 1), \
gsSPLight(&(lites).l[1], 2), \
gsSPLight(&(lites).l[2], 3), \
gsSPLight(&(lites).l[3], 4), \
gsSPLight(&(lites).a, 5)
#define gsSPSetLights5(lites) \
gsSPNumLights(NUMLIGHTS_5), \
gsSPLight(&(lites).l[0], 1), \
gsSPLight(&(lites).l[1], 2), \
gsSPLight(&(lites).l[2], 3), \
gsSPLight(&(lites).l[3], 4), \
gsSPLight(&(lites).l[4], 5), \
gsSPLight(&(lites).a, 6)
#define gsSPSetLights6(lites) \
gsSPNumLights(NUMLIGHTS_6), \
gsSPLight(&(lites).l[0], 1), \
gsSPLight(&(lites).l[1], 2), \
gsSPLight(&(lites).l[2], 3), \
gsSPLight(&(lites).l[3], 4), \
gsSPLight(&(lites).l[4], 5), \
gsSPLight(&(lites).l[5], 6), \
gsSPLight(&(lites).a, 7)
#define gsSPSetLights7(lites) \
gsSPNumLights(NUMLIGHTS_7), \
gsSPLight(&(lites).l[0], 1), \
gsSPLight(&(lites).l[1], 2), \
gsSPLight(&(lites).l[2], 3), \
gsSPLight(&(lites).l[3], 4), \
gsSPLight(&(lites).l[4], 5), \
gsSPLight(&(lites).l[5], 6), \
gsSPLight(&(lites).l[6], 7), \
gsSPLight(&(lites).a, 8)
#define gsSPSetStatus(sid, val) \
gsMoveWd(G_MW_GENSTAT, sid, val)
#define gsSPNumLights(n) \
gsMoveWd(G_MW_NUMLIGHT, G_MWO_NUMLIGHT, NUML(n))
#define gsSPLightColor(Lightnum, packedcolor) \
gsMoveWd(G_MW_LIGHTCOL, G_MWO_a##Lightnum, packedcolor), \
gsMoveWd(G_MW_LIGHTCOL, G_MWO_b##Lightnum, packedcolor)
#define gsSPTextureRectangle(ulx, uly, lrx, lry, tile, s, t, dsdx, dtdy) \
gsTexRect(ulx, uly, lrx, lry, tile), \
gsDPHalf1(gF_(s, 16, 16) | gF_(t, 16, 0)), \
gsDPHalf2(gF_(dsdx, 16, 16) | gF_(dtdy, 16, 0))
#define gsSPScisTextureRectangle(ulx, uly, lrx, lry, tile, s, t, dsdx, dtdy) \
gsTexRect(gScC_(ulx), gScC_(uly), gScC_(lrx), gScC_(lry), tile), \
gsDPHalf1( \
gF_(gScD_(s, ulx, dsdx), 16, 16) | \
gF_(gScD_(t, uly, dtdy), 16, 0)), \
gsDPHalf2(gF_(dsdx, 16, 16) | gF_(dtdy, 16, 0))
#define gsSPTextureRectangleFlip(ulx, uly, lrx, lry, tile, s, t, dsdx, dtdy) \
gsTexRectFlip(ulx, uly, lrx, lry, tile), \
gsDPHalf1(gF_(s, 16, 16) | gF_(t, 16, 0)), \
gsDPHalf2(gF_(dsdx, 16, 16) | gF_(dtdy, 16, 0))
#define gsSPScisTextureRectangleFlip( \
ulx, uly, lrx, lry, tile, s, t, dsdx, dtdy) \
gsTexRectFlip(gScC_(ulx), gScC_(uly), gScC_(lrx), gScC_(lry), tile), \
gsDPHalf1( \
gF_(gScD_(s, ulx, dsdx), 16, 16) | \
gF_(gScD_(t, uly, dtdy), 16, 0)), \
gsDPHalf2(gF_(dsdx, 16, 16) | gF_(dtdy, 16, 0))
#define gsSPBgRectCopy(bg) \
gO_(G_BG_COPY, 0, bg)
#define gsSPBgRect1Cyc(bg) \
gO_(G_BG_1CYC, 0, bg)
#define gsSPObjRectangle(sp) \
gO_(G_OBJ_RECTANGLE, 0, sp)
#define gsSPObjRectangleR(sp) \
gO_(G_OBJ_RECTANGLE_R, 0, sp)
#define gsSPObjSprite(sp) \
gO_(G_OBJ_SPRITE, 0, sp)
#define gsSPObjMatrix(mtx) \
gO_( \
G_OBJ_MOVEMEM, \
gF_(sizeof(uObjMtx) - 1, 8, 16), \
mtx)
#define gsSPObjSubMatrix(mtx) \
gO_( \
G_OBJ_MOVEMEM, \
gF_(sizeof(uObjSubMtx) - 1, 8, 16) | \
gF_(2, 16, 0), \
mtx)
#define gsSPObjRenderMode(mode) \
gO_(G_OBJ_RENDERMODE, 0, mode)
#define gsSPObjLoadTxtr(tx) \
gO_(G_OBJ_LOADTXTR, 23, tx)
#define gsSPObjLoadTxRect(txsp) \
gO_(G_OBJ_LDTX_RECT, 47, txsp)
#define gsSPObjLoadTxRectR(txsp) \
gO_(G_OBJ_LDTX_RECT_R, 47, txsp)
#define gsSPObjLoadTxSprite(txsp) \
gO_(G_OBJ_LDTX_SPRITE, 47, txsp)
#define gsSPSelectDL(ldl, sid, flag, mask) \
gO_( \
G_RDPHALF_0, \
gF_(sid, 8, 16) | \
gF_(ldl, 16, 0), \
flag), \
gO_( \
G_SELECT_DL, \
gF_(0x00, 8, 16) | \
gF_(gI_(ldl) >> 16, 16, 0), \
mask)
#define gsSPSelectBranchDL(bdl, sid, flag, mask) \
gO_( \
G_RDPHALF_0, \
gF_(sid, 8, 16) | \
gF_(bdl, 16, 0), \
flag), \
gO_( \
G_SELECT_DL, \
gF_(0x01, 8, 16) | \
gF_(gI_(bdl) >> 16, 16, 0), \
mask)
/* unlisted instructions */
#define gsDPLoadTLUTCmd(tile, count) \
gO_( \
G_LOADTLUT, \
0, \
gF_(tile, 3, 24) | \
gF_(count, 10, 14))
#define gsDPLoadTLUT(count, tmem, dram) \
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram), \
gsDPTileSync(), \
gsDPSetTile(0, 0, 0, tmem, G_TX_LOADTILE, 0, 0, 0, 0, 0, 0, 0), \
gsDPLoadSync(), \
gsDPLoadTLUTCmd(G_TX_LOADTILE, (count) - 1), \
gsDPPipeSync()
#define gsDisplayList(dl, branch) \
gO_(G_DL, gF_(branch, 8, 16), dl)
#define gsDPLoadTile(tile, uls, ult, lrs, lrt) \
gO_( \
G_LOADTILE, \
gF_(uls, 12, 12) | \
gF_(ult, 12, 0), \
gF_(tile, 3, 24) | \
gF_(lrs, 12, 12) | \
gF_(lrt, 12, 0))
#define gsDPSetCombine(c) \
gO_( \
G_SETCOMBINE, \
(gL_(c) >> 32) & 0xFFFFFFFF, \
(gL_(c) >> 0) & 0xFFFFFFFF)
#define gsSPSetOtherModeLo(shift, length, data) \
gsSPSetOtherMode(G_SETOTHERMODE_L, shift, length, data)
#define gsSPSetOtherModeHi(shift, length, data) \
gsSPSetOtherMode(G_SETOTHERMODE_H, shift, length, data)
#define gsDPSetOtherMode(mode0, mode1) \
gO_(G_RDPSETOTHERMODE, gF_(mode0, 24, 0), mode1)
#define gsTexRect(ulx, uly, lrx, lry, tile) \
gO_( \
G_TEXRECT, \
gF_(lrx, 12, 12) | \
gF_(lry, 12, 0), \
gF_(tile, 3, 24) | \
gF_(ulx, 12, 12) | \
gF_(uly, 12, 0))
#define gsTexRectFlip(ulx, uly, lrx, lry, tile) \
gO_( \
G_TEXRECTFLIP, \
gF_(lrx, 12, 12) | \
gF_(lry, 12, 0), \
gF_(tile, 3, 24) | \
gF_(ulx, 12, 12) | \
gF_(uly, 12, 0))
#define gsSPNoOp() \
gO_(G_SPNOOP, 0, 0)
#define gsDPHalf1(wordhi) \
gO_(G_RDPHALF_1, 0, wordhi)
#define gsDPHalf2(wordlo) \
gO_(G_RDPHALF_2, 0, wordlo)
#define gsDPWord(wordhi, wordlo) \
gsDPHalf1(wordhi), \
gsDPHalf2(wordlo)
/* instruction macros for fast3d */
#if defined(F3D_GBI)
# define gsSP1Triangle(v0, v1, v2, flag) \
gO_( \
G_TRI1, \
0, \
gF_(flag, 8, 24) | \
gF_(gI_(v0) * 10, 8, 16) | \
gF_(gI_(v1) * 10, 8, 8) | \
gF_(gI_(v2) * 10, 8, 0))
# define gsSPCullDisplayList(v0, vn) \
gO_( \
G_CULLDL, \
(gI_(v0) & 0xF) * 40, \
gI_((vn) + 1) & 0xF) * 40)
# define gsSPLineW3D(v0, v1, wd, flag) \
gO_( \
G_LINE3D, \
0, \
gF_(flag, 8, 24) | \
gF_(gI_(v0) * 10, 8, 16) | \
gF_(gI_(v1) * 10, 8, 8) | \
gF_(wd, 8, 0))
# define gsSPVertex(v, n, v0) \
gO_( \
G_VTX, \
gF_((n) - 1, 4, 20) | \
gF_(v0, 4, 16) | \
gF_(sizeof(Vtx) * (n), 16, 0), \
v)
#endif
/* instruction macros for fast3d and beta f3dex */
#if defined(F3D_GBI) || (defined(F3D_BETA) && defined(F3DEX_GBI))
# define gsSPModifyVertex(vtx, where, val) \
gsMoveWd(G_MW_POINTS, (vtx) * 40 + (where), val)
#endif
/* instruction macros for fast3d and f3dex */
#if defined(F3D_GBI) || defined(F3DEX_GBI)
# define gsSPForceMatrix(mptr) \
gsMoveMem(16, G_MV_MATRIX_1, (char *)(mptr)), \
gsMoveMem(16, G_MV_MATRIX_2, (char *)(mptr) + 16), \
gsMoveMem(16, G_MV_MATRIX_3, (char *)(mptr) + 32), \
gsMoveMem(16, G_MV_MATRIX_4, (char *)(mptr) + 48)
# define gsSPSetGeometryMode(mode) \
gO_(G_SETGEOMETRYMODE, 0, gI_(mode))
# define gsSPClearGeometryMode(mode) \
gO_(G_CLEARGEOMETRYMODE, 0, gI_(mode))
# define gsSPLoadGeometryMode(mode) \
gsSPClearGeometryMode(~gI_(0)), \
gsSPSetGeometryMode(mode)
# define gsSPInsertMatrix(where, num) \
gsMoveWd(G_MW_MATRIX, where, num)
# define gsSPLookAtX(l) \
gsMoveMem(sizeof(Light), G_MV_LOOKATX, l)
# define gsSPLookAtY(l) \
gsMoveMem(sizeof(Light), G_MV_LOOKATY, l)
# define gsSPMatrix(matrix, param) \
gO_( \
G_MTX, \
gF_(param, 8, 16) | \
gF_(sizeof(Mtx), 16, 0), \
matrix)
# define gsSPPopMatrix(param) \
gO_(G_POPMTX, 0, param)
# define gsSPLight(l, n) \
gsMoveMem(sizeof(Light), G_MV_L0 + ((n) - 1) * 2, l)
# define gsSPTexture(sc, tc, level, tile, on) \
gO_( \
G_TEXTURE, \
gF_(level, 3, 11) | \
gF_(tile, 3, 8) | \
gF_(on, 8, 0), \
gF_(sc, 16, 16) | \
gF_(tc, 16, 0))
# define gsSPViewport(v) \
gsMoveMem(sizeof(Vp), G_MV_VIEWPORT, v)
# define gsSPSetOtherMode(opc, shift, length, data) \
gO_( \
opc, \
gF_(shift, 8, 8) | \
gF_(length, 8, 0), \
data)
# define gsMoveWd(index, offset, data) \
gO_( \
G_MOVEWORD, \
gF_(offset, 16, 8) | \
gF_(index, 8, 0), \
data)
# define gsMoveMem(size, index, address) \
gO_( \
G_MOVEMEM, \
gF_(index, 8, 16) | \
gF_(size, 16, 0), \
address)
#endif
/* instruction macros for f3dex */
#if defined(F3DEX_GBI)
# define gsSP1Triangle(v0, v1, v2, flag) \
gO_( \
G_TRI1, \
0, \
gF_(gV3_(v0, v1, v2, flag) * 2, 8, 16) | \
gF_(gV3_(v1, v2, v0, flag) * 2, 8, 8) | \
gF_(gV3_(v2, v0, v1, flag) * 2, 8, 0))
# define gsSP1Quadrangle(v0, v1, v2, v3, flag) \
gO_( \
G_TRI2, \
gF_(gV4_(v0, v1, v2, v3, flag) * 2, 8, 16) | \
gF_(gV4_(v1, v2, v3, v0, flag) * 2, 8, 8) | \
gF_(gV4_(v2, v3, v0, v1, flag) * 2, 8, 0), \
gF_(gV4_(v0, v1, v2, v3, flag) * 2, 8, 16) | \
gF_(gV4_(v2, v3, v0, v1, flag) * 2, 8, 8) | \
gF_(gV4_(v3, v0, v1, v2, flag) * 2, 8, 0))
# define gsSPLineW3D(v0, v1, wd, flag) \
gO_( \
G_LINE3D, \
0, \
gF_(gV2_(v0, v1, flag) * 2, 8, 16) | \
gF_(gV2_(v1, v0, flag) * 2, 8, 8) | \
gF_(wd, 8, 0))
# define gsSPVertex(v, n, v0) \
gO_( \
G_VTX, \
gF_((v0) * 2, 8, 16) | \
gF_(n, 6, 10) | \
gF_(sizeof(Vtx) * (n) - 1, 10, 0), \
v)
#endif
/* instruction macros for f3dex and f3dex2 */
#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2)
# define gsSP2Triangles(v00, v01, v02, flag0, v10, v11, v12, flag1) \
gO_( \
G_TRI2, \
gF_(gV3_(v00, v01, v02, flag0) * 2, 8, 16) | \
gF_(gV3_(v01, v02, v00, flag0) * 2, 8, 8) | \
gF_(gV3_(v02, v00, v01, flag0) * 2, 8, 0), \
gF_(gV3_(v10, v11, v12, flag1) * 2, 8, 16) | \
gF_(gV3_(v11, v12, v10, flag1) * 2, 8, 8) | \
gF_(gV3_(v12, v10, v11, flag1) * 2, 8, 0))
# define gsSPBranchLessZ(branchdl, vtx, zval, near, far, flag) \
gsSPBranchLessZrg(branchdl, vtx, zval, near, far, flag, 0, G_MAXZ)
# define gsSPBranchLessZrg(branchdl, vtx, zval, near, far, flag, zmin, zmax) \
gsSPBranchLessZraw(branchdl, vtx, \
G_DEPTOZSrg(zval, near, far, flag, zmin, zmax))
# define gsSPBranchLessZraw(branchdl, vtx, zval) \
gsDPHalf1(branchdl), \
gsBranchZ(vtx, zval)
# define gsSPCullDisplayList(v0, vn) \
gO_( \
G_CULLDL, \
gF_((v0) * 2, 16, 0), \
gF_((vn) * 2, 16, 0))
# define gsSPLoadUcode(uc_start, uc_dstart) \
gsSPLoadUcodeEx(uc_start, uc_dstart, 0x800)
# define gsSPLoadUcodeL(ucode) \
gsSPLoadUcode( \
gI_(&ucode##TextStart) & 0x1FFFFFFF, \
gI_(&ucode##DataStart) & 0x1FFFFFFF)
# if !(defined(F3D_BETA) && defined(F3DEX_GBI))
# define gsSPModifyVertex(vtx, where, val) \
gO_( \
G_MODIFYVTX, \
gF_(where, 8, 16) | \
gF_((vtx) * 2, 16, 0), \
val)
# endif
# define gsBranchZ(vtx, zval) \
gO_( \
G_BRANCH_Z, \
gF_((vtx) * 5, 12, 12) | \
gF_((vtx) * 2, 12, 0), \
zval)
# define gsLoadUcode(uc_start, uc_dsize) \
gO_( \
G_LOAD_UCODE, \
gF_((uc_dsize) - 1, 16, 0), \
uc_start)
# define gsSPLoadUcodeEx(uc_start, uc_dstart, uc_dsize) \
gsDPHalf1(uc_dstart), \
gsLoadUcode(uc_start, uc_dsize)
#endif
/* instruction macros for f3dex2 */
#if defined(F3DEX_GBI_2)
# define gsSP1Triangle(v0, v1, v2, flag) \
gO_( \
G_TRI1, \
gF_(gV3_(v0, v1, v2, flag) * 2, 8, 16) | \
gF_(gV3_(v1, v2, v0, flag) * 2, 8, 8) | \
gF_(gV3_(v2, v0, v1, flag) * 2, 8, 0), \
0)
# define gsSP1Quadrangle(v0, v1, v2, v3, flag) \
gO_( \
G_QUAD, \
gF_(gV4_(v0, v1, v2, v3, flag) * 2, 8, 16) | \
gF_(gV4_(v1, v2, v3, v0, flag) * 2, 8, 8) | \
gF_(gV4_(v2, v3, v0, v1, flag) * 2, 8, 0), \
gF_(gV4_(v0, v1, v2, v3, flag) * 2, 8, 16) | \
gF_(gV4_(v2, v3, v0, v1, flag) * 2, 8, 8) | \
gF_(gV4_(v3, v0, v1, v2, flag) * 2, 8, 0))
# define gsSPForceMatrix(mptr) \
gsMoveMem(sizeof(Mtx), G_MV_MATRIX, 0, mptr), \
gsMoveWd(G_MW_FORCEMTX, 0, 0x10000)
# define gsSPSetGeometryMode(mode) \
gsSPGeometryMode(0, mode)
# define gsSPClearGeometryMode(mode) \
gsSPGeometryMode(mode, 0)
# define gsSPLoadGeometryMode(mode) \
gsSPGeometryMode(~gI_(0), mode)
# define gsSPLineW3D(v0, v1, wd, flag) \
gO_( \
G_LINE3D, \
gF_(gV2_(v0, v1, flag) * 2, 8, 16) | \
gF_(gV2_(v1, v0, flag) * 2, 8, 8) | \
gF_(wd, 8, 0), \
0)
# define gsSPLookAtX(l) \
gsMoveMem(sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATX, l)
# define gsSPLookAtY(l) \
gsMoveMem(sizeof(Light), G_MV_LIGHT, G_MVO_LOOKATY, l)
# define gsSPMatrix(matrix, param) \
gO_( \
G_MTX, \
gF_((sizeof(Mtx) - 1) / 8, 5, 19) | \
gF_(gI_(param) ^ G_MTX_PUSH, 8, 0), \
matrix)
# define gsSPPopMatrix(param) \
gsSPPopMatrixN(param, 1)
# define gsSPPopMatrixN(param, n) \
gO_( \
G_POPMTX, \
gF_((sizeof(Mtx) - 1) / 8, 5, 19) | \
gF_(2, 8, 0), \
sizeof(Mtx) * (n))
# define gsSPLight(l, n) \
gsMoveMem(sizeof(Light), G_MV_LIGHT, ((n) + 1) * 0x18, l)
# define gsSPTexture(sc, tc, level, tile, on) \
gO_( \
G_TEXTURE, \
gF_(level, 3, 11) | \
gF_(tile, 3, 8) | \
gF_(on, 7, 1), \
gF_(sc, 16, 16) | \
gF_(tc, 16, 0))
# define gsSPVertex(v, n, v0) \
gO_( \
G_VTX, \
gF_(n, 8, 12) | \
gF_((v0) + (n), 7, 1), \
v)
# define gsSPViewport(v) \
gsMoveMem(sizeof(Vp), G_MV_VIEWPORT, 0, v)
# define gsSPGeometryMode(clearbits, setbits) \
gO_( \
G_GEOMETRYMODE, \
gF_(~gI_(clearbits), 24, 0), \
setbits)
# define gsSPSetOtherMode(opc, shift, length, data) \
gO_( \
opc, \
gF_(32 - (shift) - (length), 8, 8) | \
gF_((length) - 1, 8, 0), \
data)
# define gsMoveWd(index, offset, data) \
gO_( \
G_MOVEWORD, \
gF_(index, 8, 16) | \
gF_(offset, 16, 0), \
data)
# define gsMoveMem(size, index, offset, address) \
gO_( \
G_MOVEMEM, \
gF_((size - 1) / 8, 5, 19) | \
gF_((offset) / 8, 8, 8) | \
gF_(index, 8, 0), \
address)
# define gsSPDma_io(flag, dmem, dram, size) \
gO_( \
G_DMA_IO, \
gF_(flag, 1, 23) | \
gF_((dmem) / 8, 10, 13) | \
gF_((size) - 1, 12, 0), \
dram)
# define gsSPDmaRead(dmem, dram, size) \
gsSPDma_io(0, dmem, dram, size)
# define gsSPDmaWrite(dmem, dram, size) \
gsSPDma_io(1, dmem, dram, size)
# define gsSpecial3(hi, lo) \
gO_(G_SPECIAL_3, hi, lo)
# define gsSpecial2(hi, lo) \
gO_(G_SPECIAL_2, hi, lo)
# define gsSpecial1(hi, lo) \
gO_(G_SPECIAL_1, hi, lo)
#endif
/* instruction macros for beta fast3d and f3dex */
#if defined(F3D_BETA) && (defined(F3D_GBI) || defined(F3DEX_GBI))
# define gsSPPerspNormalize(scale) \
gO_(G_PERSPNORM, 0, scale)
#else
# define gsSPPerspNormalize(scale) \
gsMoveWd(G_MW_PERSPNORM, 0, scale)
#endif
/* dynamic instruction macros */
#define gDisplayListPut(gdl, ...) \
({ \
Gfx Gd_[] = {__VA_ARGS__}; \
for(size_t Gi_ = 0; Gi_ < sizeof(Gd_) / sizeof(Gfx); Gi_++) \
{ \
*(Gfx *)(gdl) = Gd_[Gi_]; \
} \
(void)0; \
})
#define gDisplayListAppend(pgdl, ...) \
({ \
Gfx Gd_[] = {__VA_ARGS__}; \
for(size_t Gi_ = 0; Gi_ < sizeof(Gd_) / sizeof(Gfx); Gi_++) \
{ \
*(*(Gfx **)(pgdl))++ = Gd_[Gi_]; \
} \
(void)0; \
})
#define gDisplayListData(pgdl, d) \
({ \
Gfx **Gp_ = (void *)(pgdl); \
struct \
{ \
__typeof__(d) v; \
} *Gd_, *Gs_; \
*Gp_ -= (sizeof(*Gd_) + sizeof(Gfx) - 1) / sizeof(Gfx); \
Gd_ = (void *)*Gp_; \
Gs_ = (void *)&(d); \
*Gd_ = *Gs_; \
&Gd_->v; \
})
#define gDisplayListAlloc(pgdl, s) \
({ \
Gfx **Gp_ = (void *)(pgdl); \
*Gp_ -= ((s) + sizeof(Gfx) - 1) / sizeof(Gfx); \
(void *)*Gp_; \
})
#define gDPFillRectangle(gdl, ...) \
gD_(gdl, gsDPFillRectangle, __VA_ARGS__)
#define gDPScisFillRectangle(gdl, ...) \
gD_(gdl, gsDPScisFillRectangle, __VA_ARGS__)
#define gDPFullSync(gdl) \
gDisplayListPut(gdl, gsDPFullSync())
#define gDPLoadSync(gdl) \
gDisplayListPut(gdl, gsDPLoadSync())
#define gDPTileSync(gdl) \
gDisplayListPut(gdl, gsDPTileSync())
#define gDPPipeSync(gdl) \
gDisplayListPut(gdl, gsDPPipeSync())
#define gDPLoadTLUT_pal16(gdl, ...) \
gD_(gdl, gsDPLoadTLUT_pal16, __VA_ARGS__)
#define gDPLoadTLUT_pal256(gdl, ...) \
gD_(gdl, gsDPLoadTLUT_pal256, __VA_ARGS__)
#define gDPLoadTextureBlock(gdl, ...) \
gD_(gdl, gsDPLoadTextureBlock, __VA_ARGS__)
#define gDPLoadTextureBlockS(gdl, ...) \
gD_(gdl, gsDPLoadTextureBlockS, __VA_ARGS__)
#define gDPLoadTextureBlock_4b(gdl, ...) \
gD_(gdl, gsDPLoadTextureBlock_4b, __VA_ARGS__)
#define gDPLoadTextureBlock_4bS(gdl, ...) \
gD_(gdl, gsDPLoadTextureBlock_4bS, __VA_ARGS__)
#define gDPLoadTextureBlockYuv(gdl, ...) \
gD_(gdl, gsDPLoadTextureBlockYuv, __VA_ARGS__)
#define gDPLoadTextureBlockYuvS(gdl, ...) \
gD_(gdl, gsDPLoadTextureBlockYuvS, __VA_ARGS__)
#define _gDPLoadTextureBlock(gdl, ...) \
gD_(gdl, _gsDPLoadTextureBlock, __VA_ARGS__)
#define _gDPLoadTextureBlockS(gdl, ...) \
gD_(gdl, _gsDPLoadTextureBlockS, __VA_ARGS__)
#define _gDPLoadTextureBlock_4b(gdl, ...) \
gD_(gdl, _gsDPLoadTextureBlock_4b, __VA_ARGS__)
#define _gDPLoadTextureBlock_4bS(gdl, ...) \
gD_(gdl, _gsDPLoadTextureBlock_4bS, __VA_ARGS__)
#define _gDPLoadTextureBlockYuv(gdl, ...) \
gD_(gdl, _gsDPLoadTextureBlockYuv, __VA_ARGS__)
#define _gDPLoadTextureBlockYuvS(gdl, ...) \
gD_(gdl, _gsDPLoadTextureBlockYuvS, __VA_ARGS__)
#define gDPLoadMultiBlock(gdl, ...) \
gD_(gdl, gsDPLoadMultiBlock, __VA_ARGS__)
#define gDPLoadMultiBlockS(gdl, ...) \
gD_(gdl, gsDPLoadMultiBlockS, __VA_ARGS__)
#define gDPLoadMultiBlock_4b(gdl, ...) \
gD_(gdl, gsDPLoadMultiBlock_4b, __VA_ARGS__)
#define gDPLoadMultiBlock_4bS(gdl, ...) \
gD_(gdl, gsDPLoadMultiBlock_4bS, __VA_ARGS__)
#define gDPLoadMultiBlockYuv(gdl, ...) \
gD_(gdl, gsDPLoadMultiBlockYuv, __VA_ARGS__)
#define gDPLoadMultiBlockYuvS(gdl, ...) \
gD_(gdl, gsDPLoadMultiBlockYuvS, __VA_ARGS__)
#define gDPLoadTextureTile(gdl, ...) \
gD_(gdl, gsDPLoadTextureTile, __VA_ARGS__)
#define gDPLoadTextureTile_4b(gdl, ...) \
gD_(gdl, gsDPLoadTextureTile_4b, __VA_ARGS__)
#define gDPLoadTextureTileYuv(gdl, ...) \
gD_(gdl, gsDPLoadTextureTileYuv, __VA_ARGS__)
#define _gDPLoadTextureTile(gdl, ...) \
gD_(gdl, _gsDPLoadTextureTile, __VA_ARGS__)
#define _gDPLoadTextureTile_4b(gdl, ...) \
gD_(gdl, _gsDPLoadTextureTile_4b, __VA_ARGS__)
#define _gDPLoadTextureTileYuv(gdl, ...) \
gD_(gdl, _gsDPLoadTextureTileYuv, __VA_ARGS__)
#define gDPLoadMultiTile(gdl, ...) \
gD_(gdl, gsDPLoadMultiTile, __VA_ARGS__)
#define gDPLoadMultiTile_4b(gdl, ...) \
gD_(gdl, gsDPLoadMultiTile_4b, __VA_ARGS__)
#define gDPLoadMultiTileYuv(gdl, ...) \
gD_(gdl, gsDPLoadMultiTileYuv, __VA_ARGS__)
#define gDPLoadBlock(gdl, ...) \
gD_(gdl, gsDPLoadBlock, __VA_ARGS__)
#define gDPNoOp(gdl) \
gDisplayListPut(gdl, gsDPNoOp())
#define gDPNoOpTag(gdl, ...) \
gD_(gdl, gsDPNoOpTag, __VA_ARGS__)
#define gDPPipelineMode(gdl, ...) \
gD_(gdl, gsDPPipelineMode, __VA_ARGS__)
#define gDPSetBlendColor(gdl, ...) \
gD_(gdl, gsDPSetBlendColor, __VA_ARGS__)
#define gDPSetEnvColor(gdl, ...) \
gD_(gdl, gsDPSetEnvColor, __VA_ARGS__)
#define gDPSetFillColor(gdl, ...) \
gD_(gdl, gsDPSetFillColor, __VA_ARGS__)
#define gDPSetFogColor(gdl, ...) \
gD_(gdl, gsDPSetFogColor, __VA_ARGS__)
#define gDPSetPrimColor(gdl, ...) \
gD_(gdl, gsDPSetPrimColor, __VA_ARGS__)
#define gDPSetColorImage(gdl, ...) \
gD_(gdl, gsDPSetColorImage, __VA_ARGS__)
#define gDPSetDepthImage(gdl, ...) \
gD_(gdl, gsDPSetDepthImage, __VA_ARGS__)
#define gDPSetTextureImage(gdl, ...) \
gD_(gdl, gsDPSetTextureImage, __VA_ARGS__)
#define gDPSetHilite1Tile(gdl, ...) \
gD_(gdl, gsDPSetHilite1Tile, __VA_ARGS__)
#define gDPSetHilite2Tile(gdl, ...) \
gD_(gdl, gsDPSetHilite2Tile, __VA_ARGS__)
#define gDPSetAlphaCompare(gdl, ...) \
gD_(gdl, gsDPSetAlphaCompare, __VA_ARGS__)
#define gDPSetAlphaDither(gdl, ...) \
gD_(gdl, gsDPSetAlphaDither, __VA_ARGS__)
#define gDPSetColorDither(gdl, ...) \
gD_(gdl, gsDPSetColorDither, __VA_ARGS__)
#define gDPSetCombineMode(gdl, ...) \
gD_(gdl, gsDPSetCombineLERP, __VA_ARGS__)
#define gDPSetCombineLERP(gdl, ...) \
gD_(gdl, gsDPSetCombineLERP, __VA_ARGS__)
#define gDPSetConvert(gdl, ...) \
gD_(gdl, gsDPSetConvert, __VA_ARGS__)
#define gDPSetTextureConvert(gdl, ...) \
gD_(gdl, gsDPSetTextureConvert, __VA_ARGS__)
#define gDPSetCycleType(gdl, ...) \
gD_(gdl, gsDPSetCycleType, __VA_ARGS__)
#define gDPSetDepthSource(gdl, ...) \
gD_(gdl, gsDPSetDepthSource, __VA_ARGS__)
#define gDPSetCombineKey(gdl, ...) \
gD_(gdl, gsDPSetCombineKey, __VA_ARGS__)
#define gDPSetKeyGB(gdl, ...) \
gD_(gdl, gsDPSetKeyGB, __VA_ARGS__)
#define gDPSetKeyR(gdl, ...) \
gD_(gdl, gsDPSetKeyR, __VA_ARGS__)
#define gDPSetPrimDepth(gdl, ...) \
gD_(gdl, gsDPSetPrimDepth, __VA_ARGS__)
#define gDPSetRenderMode(gdl, ...) \
gD_(gdl, gsDPSetRenderMode, __VA_ARGS__)
#define gDPSetScissor(gdl, ...) \
gD_(gdl, gsDPSetScissor, __VA_ARGS__)
#define gDPSetScissorFrac(gdl, ...) \
gD_(gdl, gsDPSetScissorFrac, __VA_ARGS__)
#define gDPSetTextureDetail(gdl, ...) \
gD_(gdl, gsDPSetTextureDetail, __VA_ARGS__)
#define gDPSetTextureFilter(gdl, ...) \
gD_(gdl, gsDPSetTextureFilter, __VA_ARGS__)
#define gDPSetTextureLOD(gdl, ...) \
gD_(gdl, gsDPSetTextureLOD, __VA_ARGS__)
#define gDPSetTextureLUT(gdl, ...) \
gD_(gdl, gsDPSetTextureLUT, __VA_ARGS__)
#define gDPSetTexturePersp(gdl, ...) \
gD_(gdl, gsDPSetTexturePersp, __VA_ARGS__)
#define gDPSetTile(gdl, ...) \
gD_(gdl, gsDPSetTile, __VA_ARGS__)
#define gDPSetTileSize(gdl, ...) \
gD_(gdl, gsDPSetTileSize, __VA_ARGS__)
#define gSP1Triangle(gdl, ...) \
gD_(gdl, gsSP1Triangle, __VA_ARGS__)
#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2)
# define gSP2Triangles(gdl, ...) \
gD_(gdl, gsSP2Triangles, __VA_ARGS__)
# define gSP1Quadrangle(gdl, ...) \
gD_(gdl, gsSP1Quadrangle, __VA_ARGS__)
# define gSPBranchLessZ(gdl, ...) \
gD_(gdl, gsSPBranchLessZ, __VA_ARGS__)
# define gSPBranchLessZrg(gdl, ...) \
gD_(gdl, gsSPBranchLessZrg, __VA_ARGS__)
# define gSPBranchLessZraw(gdl, ...) \
gD_(gdl, gsSPBranchLessZraw, __VA_ARGS__)
#endif
#define gSPBranchList(gdl, ...) \
gD_(gdl, gsSPBranchList, __VA_ARGS__)
#define gSPClipRatio(gdl, ...) \
gD_(gdl, gsSPClipRatio, __VA_ARGS__)
#define gSPCullDisplayList(gdl, ...) \
gD_(gdl, gsSPCullDisplayList, __VA_ARGS__)
#define gSPDisplayList(gdl, ...) \
gD_(gdl, gsSPDisplayList, __VA_ARGS__)
#define gSPEndDisplayList(gdl) \
gDisplayListPut(gdl, gsSPEndDisplayList())
#define gSPFogFactor(gdl, ...) \
gD_(gdl, gsSPFogFactor, __VA_ARGS__)
#define gSPFogPosition(gdl, ...) \
gD_(gdl, gsSPFogPosition, __VA_ARGS__)
#define gSPForceMatrix(gdl, ...) \
gD_(gdl, gsSPForceMatrix, __VA_ARGS__)
#define gSPSetGeometryMode(gdl, ...) \
gD_(gdl, gsSPSetGeometryMode, __VA_ARGS__)
#define gSPClearGeometryMode(gdl, ...) \
gD_(gdl, gsSPClearGeometryMode, __VA_ARGS__)
#define gSPLoadGeometryMode(gdl, ...) \
gD_(gdl, gsSPLoadGeometryMode, __VA_ARGS__)
#if defined(F3D_GBI) || defined(F3DEX_GBI)
# define gSPInsertMatrix(gdl, ...) \
gD_(gdl, gsSPInsertMatrix, __VA_ARGS__)
#endif
#define gSPLine3D(gdl, ...) \
gD_(gdl, gsSPLine3D, __VA_ARGS__)
#define gSPLineW3D(gdl, ...) \
gD_(gdl, gsSPLineW3D, __VA_ARGS__)
#define gSPLoadUcode(gdl, ...) \
gD_(gdl, gsSPLoadUcode, __VA_ARGS__)
#define gSPLoadUcodeL(gdl, ...) \
gD_(gdl, gsSPLoadUcodeL, __VA_ARGS__)
#define gSPLookAtX(gdl, ...) \
gD_(gdl, gsSPLookAtX, __VA_ARGS__)
#define gSPLookAtY(gdl, ...) \
gD_(gdl, gsSPLookAtY, __VA_ARGS__)
#define gSPLookAt(gdl, ...) \
gD_(gdl, gsSPLookAt, __VA_ARGS__)
#define gSPMatrix(gdl, ...) \
gD_(gdl, gsSPMatrix, __VA_ARGS__)
#define gSPModifyVertex(gdl, ...) \
gD_(gdl, gsSPModifyVertex, __VA_ARGS__)
#define gSPPerspNormalize(gdl, ...) \
gD_(gdl, gsSPPerspNormalize, __VA_ARGS__)
#define gSPPopMatrix(gdl, ...) \
gD_(gdl, gsSPPopMatrix, __VA_ARGS__)
#if defined(F3DEX_GBI_2)
# define gSPPopMatrixN(gdl, ...) \
gD_(gdl, gsSPPopMatrixN, __VA_ARGS__)
#endif
#define gSPSegment(gdl, ...) \
gD_(gdl, gsSPSegment, __VA_ARGS__)
#define gSPSetLights0(gdl, ...) \
gD_(gdl, gsSPSetLights0, __VA_ARGS__)
#define gSPSetLights1(gdl, ...) \
gD_(gdl, gsSPSetLights1, __VA_ARGS__)
#define gSPSetLights2(gdl, ...) \
gD_(gdl, gsSPSetLights2, __VA_ARGS__)
#define gSPSetLights3(gdl, ...) \
gD_(gdl, gsSPSetLights3, __VA_ARGS__)
#define gSPSetLights4(gdl, ...) \
gD_(gdl, gsSPSetLights4, __VA_ARGS__)
#define gSPSetLights5(gdl, ...) \
gD_(gdl, gsSPSetLights5, __VA_ARGS__)
#define gSPSetLights6(gdl, ...) \
gD_(gdl, gsSPSetLights6, __VA_ARGS__)
#define gSPSetLights7(gdl, ...) \
gD_(gdl, gsSPSetLights7, __VA_ARGS__)
#define gSPSetStatus(gdl, ...) \
gD_(gdl, gsSPSetStatus, __VA_ARGS__)
#define gSPNumLights(gdl, ...) \
gD_(gdl, gsSPNumLights, __VA_ARGS__)
#define gSPLight(gdl, ...) \
gD_(gdl, gsSPLight, __VA_ARGS__)
#define gSPLightColor(gdl, ...) \
gD_(gdl, gsSPLightColor, __VA_ARGS__)
#define gSPTexture(gdl, ...) \
gD_(gdl, gsSPTexture, __VA_ARGS__)
#define gSPTextureRectangle(gdl, ...) \
gD_(gdl, gsSPTextureRectangle, __VA_ARGS__)
#define gSPScisTextureRectangle(gdl, ...) \
gD_(gdl, gsSPScisTextureRectangle, __VA_ARGS__)
#define gSPTextureRectangleFlip(gdl, ...) \
gD_(gdl, gsSPTextureRectangleFlip, __VA_ARGS__)
#define gSPScisTextureRectangleFlip(gdl, ...) \
gD_(gdl, gsSPScisTextureRectangleFlip, __VA_ARGS__)
#define gSPVertex(gdl, ...) \
gD_(gdl, gsSPVertex, __VA_ARGS__)
#define gSPViewport(gdl, ...) \
gD_(gdl, gsSPViewport, __VA_ARGS__)
#define gSPBgRectCopy(gdl, ...) \
gD_(gdl, gsSPBgRectCopy, __VA_ARGS__)
#define gSPBgRect1Cyc(gdl, ...) \
gD_(gdl, gsSPBgRect1Cyc, __VA_ARGS__)
#define gSPObjRectangle(gdl, ...) \
gD_(gdl, gsSPObjRectangle, __VA_ARGS__)
#define gSPObjRectangleR(gdl, ...) \
gD_(gdl, gsSPObjRectangleR, __VA_ARGS__)
#define gSPObjSprite(gdl, ...) \
gD_(gdl, gsSPObjSprite, __VA_ARGS__)
#define gSPObjMatrix(gdl, ...) \
gD_(gdl, gsSPObjMatrix, __VA_ARGS__)
#define gSPObjSubMatrix(gdl, ...) \
gD_(gdl, gsSPObjSubMatrix, __VA_ARGS__)
#define gSPObjRenderMode(gdl, ...) \
gD_(gdl, gsSPObjRenderMode, __VA_ARGS__)
#define gSPObjLoadTxtr(gdl, ...) \
gD_(gdl, gsSPObjLoadTxtr, __VA_ARGS__)
#define gSPObjLoadTxRect(gdl, ...) \
gD_(gdl, gsSPObjLoadTxRect, __VA_ARGS__)
#define gSPObjLoadTxRectR(gdl, ...) \
gD_(gdl, gsSPObjLoadTxRectR, __VA_ARGS__)
#define gSPObjLoadTxSprite(gdl, ...) \
gD_(gdl, gsSPObjLoadTxSprite, __VA_ARGS__)
#define gSPSelectDL(gdl, ...) \
gD_(gdl, gsSPSelectDL, __VA_ARGS__)
#define gSPSelectBranchDL(gdl, ...) \
gD_(gdl, gsSPSelectBranchDL, __VA_ARGS__)
#define gDPLoadTLUTCmd(gdl, ...) \
gD_(gdl, gsDPLoadTLUTCmd, __VA_ARGS__)
#define gDPLoadTLUT(gdl, ...) \
gD_(gdl, gsDPLoadTLUT, __VA_ARGS__)
#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2)
# define gBranchZ(gdl, ...) \
gD_(gdl, gsBranchZ, __VA_ARGS__)
#endif
#define gDisplayList(gdl, ...) \
gD_(gdl, gsDisplayList, __VA_ARGS__)
#define gDPHalf1(gdl, ...) \
gD_(gdl, gsDPHalf1, __VA_ARGS__)
#define gDPHalf2(gdl, ...) \
gD_(gdl, gsDPHalf2, __VA_ARGS__)
#define gDPLoadTile(gdl, ...) \
gD_(gdl, gsDPLoadTile, __VA_ARGS__)
#define gDPSetCombine(gdl, ...) \
gD_(gdl, gsDPSetCombine, __VA_ARGS__)
#if defined(F3DEX_GBI_2)
# define gSPGeometryMode(gdl, ...) \
gD_(gdl, gsSPGeometryMode, __VA_ARGS__)
#endif
#define gSPSetOtherMode(gdl, ...) \
gD_(gdl, gsSPSetOtherMode, __VA_ARGS__)
#define gSPSetOtherModeLo(gdl, ...) \
gD_(gdl, gsSPSetOtherModeLo, __VA_ARGS__)
#define gSPSetOtherModeHi(gdl, ...) \
gD_(gdl, gsSPSetOtherModeHi, __VA_ARGS__)
#define gDPSetOtherMode(gdl, ...) \
gD_(gdl, gsDPSetOtherMode, __VA_ARGS__)
#define gMoveWd(gdl, ...) \
gD_(gdl, gsMoveWd, __VA_ARGS__)
#define gMoveMem(gdl, ...) \
gD_(gdl, gsMoveMem, __VA_ARGS__)
#if defined(F3DEX_GBI_2)
# define gSPDma_io(gdl, ...) \
gD_(gdl, gsSPDma_io, __VA_ARGS__)
# define gSPDmaRead(gdl, ...) \
gD_(gdl, gsSPDmaRead, __VA_ARGS__)
# define gSPDmaWrite(gdl, ...) \
gD_(gdl, gsSPDmaWrite, __VA_ARGS__)
#endif
#if defined(F3DEX_GBI) || defined(F3DEX_GBI_2)
# define gLoadUcode(gdl, ...) \
gD_(gdl, gsLoadUcode, __VA_ARGS__)
# define gSPLoadUcodeEx(gdl, ...) \
gD_(gdl, gsSPLoadUcodeEx, __VA_ARGS__)
#endif
#define gTexRect(gdl, ...) \
gD_(gdl, gsTexRect, __VA_ARGS__)
#define gTexRectFlip(gdl, ...) \
gD_(gdl, gsTexRectFlip, __VA_ARGS__)
#define gSPNoOp(gdl) \
gDisplayListPut(gdl, gsSPNoOp())
#define gDPWord(gdl, ...) \
gD_(gdl, gsDPWord, __VA_ARGS__)
#if defined(F3DEX_GBI_2)
# define gSpecial3(gdl, ...) \
gD_(gdl, gsSpecial3, __VA_ARGS__)
# define gSpecial2(gdl, ...) \
gD_(gdl, gsSpecial2, __VA_ARGS__)
# define gSpecial1(gdl, ...) \
gD_(gdl, gsSpecial1, __VA_ARGS__)
#endif
/* data types and structures */
typedef uint8_t qu08_t;
typedef uint16_t qu016_t;
typedef int16_t qs48_t;
typedef int16_t qs510_t;
typedef uint16_t qu510_t;
typedef int16_t qs102_t;
typedef uint16_t qu102_t;
typedef int16_t qs105_t;
typedef uint16_t qu105_t;
typedef int16_t qs132_t;
typedef int16_t qs142_t;
typedef int32_t qs1516_t;
typedef int32_t qs1616_t;
typedef int32_t qs205_t;
typedef uint16_t g_bglt_t;
typedef uint8_t g_ifmt_t;
typedef uint8_t g_isiz_t;
typedef uint16_t g_bgf_t;
typedef uint8_t g_objf_t;
typedef uint32_t g_objlt_t;
typedef struct
{
_Alignas(8)
uint32_t hi;
uint32_t lo;
} Gfx;
typedef struct
{
int32_t x1;
int32_t y1;
int32_t x2;
int32_t y2;
} Hilite_t;
typedef union
{
_Alignas(8)
Hilite_t h;
} Hilite;
typedef int32_t Mtx_t[4][4];
typedef union
{
_Alignas(8)
Mtx_t m;
int32_t l[16];
struct
{
int16_t i[16];
uint16_t f[16];
};
} Mtx;
typedef struct
{
uint8_t col[3];
char pad1;
uint8_t colc[3];
char pad2;
int8_t dir[3];
char pad3;
} Light_t;
typedef union
{
_Alignas(8)
Light_t l;
} Light;
typedef struct
{
Light l[2];
} LookAt;
typedef struct
{
uint8_t col[3];
char pad1;
uint8_t colc[3];
char pad2;
} Ambient_t;
typedef union
{
_Alignas(8)
Ambient_t l;
} Ambient;
typedef struct
{
Ambient a;
Light l[1];
} Lights0, Lights1;
typedef struct
{
Ambient a;
Light l[2];
} Lights2;
typedef struct
{
Ambient a;
Light l[3];
} Lights3;
typedef struct
{
Ambient a;
Light l[4];
} Lights4;
typedef struct
{
Ambient a;
Light l[5];
} Lights5;
typedef struct
{
Ambient a;
Light l[6];
} Lights6;
typedef struct
{
Ambient a;
Light l[7];
} Lightsn, Lights7;
typedef struct
{
int16_t ob[3];
uint16_t flag;
qs105_t tc[2];
uint8_t cn[4];
} Vtx_t;
typedef struct
{
int16_t ob[3];
uint16_t flag;
qs105_t tc[2];
int8_t n[3];
uint8_t a;
} Vtx_tn;
typedef union
{
_Alignas(8)
Vtx_t v;
Vtx_tn n;
} Vtx;
typedef struct
{
qs142_t vscale[4];
qs142_t vtrans[4];
} Vp_t;
typedef union
{
_Alignas(8)
Vp_t vp;
} Vp;
typedef struct
{
qs1516_t A;
qs1516_t B;
qs1516_t C;
qs1516_t D;
qs102_t X;
qs102_t Y;
qu510_t BaseScaleX;
qu510_t BaseScaleY;
} uObjMtx_t;
typedef union
{
_Alignas(8)
uObjMtx_t m;
} uObjMtx;
typedef struct
{
qs102_t X;
qs102_t Y;
qu510_t BaseScaleX;
qu510_t BaseScaleY;
} uObjSubMtx_t;
typedef union
{
_Alignas(8)
uObjSubMtx_t m;
} uObjSubMtx;
typedef struct
{
qu105_t imageX;
qu102_t imageW;
qs102_t frameX;
qu102_t frameW;
qu105_t imageY;
qu102_t imageH;
qs102_t frameY;
qu102_t frameH;
uint64_t * imagePtr;
g_bglt_t imageLoad;
g_ifmt_t imageFmt;
g_isiz_t imageSiz;
uint16_t imagePal;
g_bgf_t imageFlip;
uint16_t tmemW;
qs132_t tmemH;
uint16_t tmemLoadSH;
uint16_t tmemLoadTH;
uint16_t tmemSizeW;
uint16_t tmemSize;
} uObjBg_t;
typedef struct
{
qu105_t imageX;
qu102_t imageW;
qs102_t frameX;
qu102_t frameW;
qu105_t imageY;
qu102_t imageH;
qs102_t frameY;
qu102_t frameH;
uint64_t * imagePtr;
g_bglt_t imageLoad;
g_ifmt_t imageFmt;
g_isiz_t imageSiz;
uint16_t imagePal;
g_bgf_t imageFlip;
qu510_t scaleW;
qu510_t scaleH;
qs205_t imageYorig;
char padding[4];
} uObjScaleBg_t;
typedef union
{
_Alignas(8)
uObjBg_t b;
uObjScaleBg_t s;
} uObjBg;
typedef struct
{
qs102_t objX;
qu510_t scaleW;
qu105_t imageW;
uint16_t paddingX;
qs102_t objY;
qu510_t scaleH;
qu105_t imageH;
uint16_t paddingY;
uint16_t imageStride;
uint16_t imageAdrs;
g_ifmt_t imageFmt;
g_isiz_t imageSiz;
uint16_t imagePal;
g_objf_t imageFlags;
} uObjSprite_t;
typedef union
{
_Alignas(8)
uObjSprite_t s;
} uObjSprite;
typedef struct
{
g_objlt_t type;
uint64_t * image;
uint16_t tmem;
uint16_t tsize;
uint16_t tline;
uint16_t sid;
uint32_t flag;
uint32_t mask;
} uObjTxtrBlock_t;
typedef struct
{
g_objlt_t type;
uint64_t * image;
uint16_t tmem;
uint16_t twidth;
uint16_t theight;
uint16_t sid;
uint32_t flag;
uint32_t mask;
} uObjTxtrTile_t;
typedef struct
{
g_objlt_t type;
uint64_t * image;
uint16_t phead;
uint16_t pnum;
uint16_t zero;
uint16_t sid;
uint32_t flag;
uint32_t mask;
} uObjTxtrTLUT_t;
typedef union
{
_Alignas(8)
uObjTxtrBlock_t block;
uObjTxtrTile_t tile;
uObjTxtrTLUT_t tlut;
} uObjTxtr;
typedef struct
{
uObjTxtr txtr;
uObjSprite sprite;
} uObjTxSprite;
/* rectangle scissoring macros */
#define gScC_(c) ((c) < 0 ? 0 : (c))
#define gScD_(t, c, d) \
( \
(c) < 0 ? \
( \
(d) < 0 ? \
(t) + (c) * (d) / 0x80 : \
(t) - (c) * (d) / 0x80 \
) : \
(t) \
)
/* texture loading helper macros */
#define G_SIZ_LDSIZ(siz) ((siz) < G_IM_SIZ_16b ? G_IM_SIZ_16b : (siz))
#define G_SIZ_BITS(siz) (4 << gI_(siz))
#define G_SIZ_LDBITS(siz) ((siz) < G_IM_SIZ_16b ? G_SIZ_BITS(siz) : 16)
#define G_DXT(siz, width) \
( \
(width) * G_SIZ_BITS(siz) > 64 ? \
((1 << 11) + (width) * G_SIZ_BITS(siz) / 64 - 1) / \
((width) * G_SIZ_BITS(siz) / 64) : \
(1 << 11) \
)
#define G_LTB_LRS(width, height, siz) \
( \
(((width) * (height) + 1) * G_SIZ_BITS(siz) - 1) / \
G_SIZ_BITS(G_SIZ_LDSIZ(siz)) - 1 \
)
#define G_LDBLK_TXL(txl) \
( \
(txl) > G_TX_LDBLK_MAX_TXL ? \
G_TX_LDBLK_MAX_TXL : \
(txl) \
)
/* depth value macros */
#define gZp_(zval, near, far) \
( \
(1.f - (float)(near) / (float)(zval)) / \
(1.f - (float)(near) / (float)(far)) \
)
#define gZo_(zval, near, far) \
( \
((float)(zval) - (float)(near)) / \
((float)(far) - (float)(near)) \
)
#define gZf_(zval, near, far, flag) \
qs1616 \
( \
(flag) == G_BZ_PERSP ? \
gZp_(zval, near, far) : \
gZo_(zval, near, far) \
)
#define G_DEPTOZSrg(zval, near, far, flag, zmin, zmax) \
( \
gZf_(zval, near, far, flag) * \
((int32_t)((zmax) - (zmin)) & ~(int32_t)1) + \
qs1616(zmin) \
)
#define G_DEPTOZS(zval, near, far, flag) \
G_DEPTOZSrg(zval, near, far, flag, 0, G_MAXZ)
/* vertex ordering macros */
#define gV2_(v0, v1, flag) \
( \
(flag) == 0 ? gI_(v0) : \
gI_(v1) \
)
#define gV3_(v0, v1, v2, flag) \
( \
(flag) == 0 ? gI_(v0) : \
(flag) == 1 ? gI_(v1) : \
gI_(v2) \
)
#define gV4_(v0, v1, v2, v3, flag) \
( \
(flag) == 0 ? gI_(v0) : \
(flag) == 1 ? gI_(v1) : \
(flag) == 2 ? gI_(v2) : \
gI_(v3) \
)
/* sprite texture parameter macros */
#define GS_PIX2TMEM(pix, siz) ((pix) * G_SIZ_BITS(siz) / 64)
#define GS_TB_TSIZE(pix, siz) (GS_PIX2TMEM(pix, siz) - 1)
#define GS_TB_TLINE(pix, siz) (((1 << 11) - 1) / GS_PIX2TMEM(pix, siz) + 1)
#define GS_TT_TWIDTH(pix, siz) (GS_PIX2TMEM(pix, siz) * 4 - 1)
#define GS_TT_THEIGHT(pix, siz) ((pix) * 4 - 1)
#define GS_PAL_HEAD(head) ((head) + 256)
#define GS_PAL_NUM(num) ((num) - 1)
/* fixed-point conversion macros */
#define qu08(n) ((qu08_t)((n) * 0x100))
#define qu016(n) ((qu016_t)((n) * 0x10000))
#define qs48(n) ((qs48_t)((n) * 0x0100))
#define qs510(n) ((qs510_t)((n) * 0x0400))
#define qu510(n) ((qu510_t)((n) * 0x0400))
#define qs102(n) ((qs102_t)((n) * 0x0004))
#define qu102(n) ((qu102_t)((n) * 0x0004))
#define qs105(n) ((qs105_t)((n) * 0x0020))
#define qu105(n) ((qu105_t)((n) * 0x0020))
#define qs132(n) ((qs132_t)((n) * 0x0004))
#define qs142(n) ((qs142_t)((n) * 0x0004))
#define qs1516(n) ((qs1516_t)((n) * 0x00010000))
#define qs1616(n) ((qs1616_t)((n) * 0x00010000))
#define qs205(n) ((qs205_t)((n) * 0x00000020))
/* private helper macros */
#define gI_(i) ((uint32_t)(i))
#define gL_(l) ((uint64_t)(l))
#define gF_(i, n, s) ((gI_(i) & ((gI_(1) << (n)) - 1)) << (s))
#define gFL_(l, n, s) ((gL_(l) & ((gL_(1) << (n)) - 1)) << (s))
#define gO_(opc, hi, lo) ((Gfx){gF_(opc, 8, 24) | gI_(hi), gI_(lo)})
#define gD_(gdl, m, ...) gDisplayListPut(gdl, m(__VA_ARGS__))
#endif