From 330eccd4941dbd1097cccf8acc65ed03b14d2e28 Mon Sep 17 00:00:00 2001 From: Sauraen Date: Sun, 1 Sep 2024 15:21:23 -0700 Subject: [PATCH] Updated gbi --- gbi.h | 130 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 92 insertions(+), 38 deletions(-) diff --git a/gbi.h b/gbi.h index 2471998..c5cde9e 100644 --- a/gbi.h +++ b/gbi.h @@ -1,9 +1,16 @@ /** * @file gbi.h * @brief Modded GBI for use with F3DEX3 custom microcode - * */ +/* List of options; the documentation for each is where it is used below. */ +/* #define REQUIRE_SEMICOLONS_AFTER_GBI_COMMANDS */ /* recommended */ +/* #define NO_SYNCS_IN_TEXTURE_LOADS */ /* see documentation */ +/* #define F3DEX2_SEGMENTS */ /* see documentation */ +/* #define DISABLE_AA */ /* developer taste */ +/* #define RISKY_RDP_SYNCS */ /* see documentation */ +/* #define KAZE_GBI_HACKS */ /* not recommended unless you are Kaze */ + #include "ultra64/mbi.h" #ifndef F3DEX3_H @@ -661,6 +668,20 @@ longer a multiple of 8 (DMA word). This was not used in any command anyway. */ #define G_ZS_PIXEL (0 << G_MDSFT_ZSRCSEL) #define G_ZS_PRIM (1 << G_MDSFT_ZSRCSEL) +#ifdef DISABLE_AA +/* Disables antialiasing in all preset rendermodes, saving RDP time. Note that +this does NOT disable antialiasing in manually written rendermodes, e.g. +exported from fast64 with advanced options enabled. We can't redefine the real +IM_RD because IM_RD is needed for transparency also, and we can't distinguish +between a manually written rendermode using IM_RD for transparency and one using +it for antialiasing. */ +#define AA_DEF 0 +#define RD_DEF 0 +#else +#define AA_DEF AA_EN +#define RD_DEF IM_RD +#endif + /* G_SETOTHERMODE_L gSetRenderMode */ #define AA_EN 0x0008 #define Z_CMP 0x0010 @@ -678,7 +699,7 @@ longer a multiple of 8 (DMA word). This was not used in any command anyway. */ #define CVG_X_ALPHA 0x1000 #define ALPHA_CVG_SEL 0x2000 #define FORCE_BL 0x4000 -#define TEX_EDGE 0x0000 /* used to be 0x8000 */ +#define TEX_EDGE 0x0000 /* not in HW V2; is 0x8000 in older HW */ #define G_BL_CLR_IN 0 #define G_BL_CLR_MEM 1 @@ -698,148 +719,150 @@ longer a multiple of 8 (DMA word). This was not used in any command anyway. */ (m1a) << 28 | (m1b) << 24 | (m2a) << 20 | (m2b) << 16 #define RM_AA_ZB_OPA_SURF(clk) \ - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + AA_DEF | Z_CMP | Z_UPD | RD_DEF | CVG_DST_CLAMP | \ ZMODE_OPA | ALPHA_CVG_SEL | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) #define RM_RA_ZB_OPA_SURF(clk) \ - AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | \ + AA_DEF | Z_CMP | Z_UPD | CVG_DST_CLAMP | \ ZMODE_OPA | ALPHA_CVG_SEL | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) #define RM_AA_ZB_XLU_SURF(clk) \ - AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ + AA_DEF | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ FORCE_BL | ZMODE_XLU | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) #define RM_AA_ZB_OPA_DECAL(clk) \ - AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | ALPHA_CVG_SEL | \ + AA_DEF | Z_CMP | RD_DEF | CVG_DST_WRAP | ALPHA_CVG_SEL | \ ZMODE_DEC | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) #define RM_RA_ZB_OPA_DECAL(clk) \ - AA_EN | Z_CMP | CVG_DST_WRAP | ALPHA_CVG_SEL | \ + AA_DEF | Z_CMP | CVG_DST_WRAP | ALPHA_CVG_SEL | \ ZMODE_DEC | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) #define RM_AA_ZB_XLU_DECAL(clk) \ - AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ + AA_DEF | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ FORCE_BL | ZMODE_DEC | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) #define RM_AA_ZB_OPA_INTER(clk) \ - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + AA_DEF | Z_CMP | Z_UPD | RD_DEF | CVG_DST_CLAMP | \ ALPHA_CVG_SEL | ZMODE_INTER | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) #define RM_RA_ZB_OPA_INTER(clk) \ - AA_EN | Z_CMP | Z_UPD | CVG_DST_CLAMP | \ + AA_DEF | Z_CMP | Z_UPD | CVG_DST_CLAMP | \ ALPHA_CVG_SEL | ZMODE_INTER | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) #define RM_AA_ZB_XLU_INTER(clk) \ - AA_EN | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ + AA_DEF | Z_CMP | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | \ FORCE_BL | ZMODE_INTER | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) #define RM_AA_ZB_XLU_LINE(clk) \ - AA_EN | Z_CMP | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | \ + AA_DEF | Z_CMP | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | \ ALPHA_CVG_SEL | FORCE_BL | ZMODE_XLU | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) #define RM_AA_ZB_DEC_LINE(clk) \ - AA_EN | Z_CMP | IM_RD | CVG_DST_SAVE | CVG_X_ALPHA | \ + AA_DEF | Z_CMP | IM_RD | CVG_DST_SAVE | CVG_X_ALPHA | \ ALPHA_CVG_SEL | FORCE_BL | ZMODE_DEC | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) +/* Note that this uses AA_EN not AA_DEF */ #define RM_AA_ZB_TEX_EDGE(clk) \ - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + AA_EN | Z_CMP | Z_UPD | RD_DEF | CVG_DST_CLAMP | \ CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) #define RM_AA_ZB_TEX_INTER(clk) \ - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + AA_DEF | Z_CMP | Z_UPD | RD_DEF | CVG_DST_CLAMP | \ CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_INTER | TEX_EDGE | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) #define RM_AA_ZB_SUB_SURF(clk) \ - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | \ + AA_DEF | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | \ ZMODE_OPA | ALPHA_CVG_SEL | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) #define RM_AA_ZB_PCL_SURF(clk) \ - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + AA_DEF | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ ZMODE_OPA | G_AC_DITHER | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) #define RM_AA_ZB_OPA_TERR(clk) \ - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + AA_DEF | Z_CMP | Z_UPD | RD_DEF | CVG_DST_CLAMP | \ ZMODE_OPA | ALPHA_CVG_SEL | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) #define RM_AA_ZB_TEX_TERR(clk) \ - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_CLAMP | \ + AA_DEF | Z_CMP | Z_UPD | RD_DEF | CVG_DST_CLAMP | \ CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) #define RM_AA_ZB_SUB_TERR(clk) \ - AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | \ + AA_DEF | Z_CMP | Z_UPD | IM_RD | CVG_DST_FULL | \ ZMODE_OPA | ALPHA_CVG_SEL | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) #define RM_AA_OPA_SURF(clk) \ - AA_EN | IM_RD | CVG_DST_CLAMP | \ + AA_DEF | RD_DEF | CVG_DST_CLAMP | \ ZMODE_OPA | ALPHA_CVG_SEL | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) #define RM_RA_OPA_SURF(clk) \ - AA_EN | CVG_DST_CLAMP | \ + AA_DEF | CVG_DST_CLAMP | \ ZMODE_OPA | ALPHA_CVG_SEL | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) #define RM_AA_XLU_SURF(clk) \ - AA_EN | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | \ + AA_DEF | IM_RD | CVG_DST_WRAP | CLR_ON_CVG | FORCE_BL | \ ZMODE_OPA | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) #define RM_AA_XLU_LINE(clk) \ - AA_EN | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | \ + AA_DEF | IM_RD | CVG_DST_CLAMP | CVG_X_ALPHA | \ ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) #define RM_AA_DEC_LINE(clk) \ - AA_EN | IM_RD | CVG_DST_FULL | CVG_X_ALPHA | \ + AA_DEF | IM_RD | CVG_DST_FULL | CVG_X_ALPHA | \ ALPHA_CVG_SEL | FORCE_BL | ZMODE_OPA | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) +/* Note that this uses AA_EN not AA_DEF */ #define RM_AA_TEX_EDGE(clk) \ - AA_EN | IM_RD | CVG_DST_CLAMP | \ + AA_EN | RD_DEF | CVG_DST_CLAMP | \ CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) #define RM_AA_SUB_SURF(clk) \ - AA_EN | IM_RD | CVG_DST_FULL | \ + AA_DEF | IM_RD | CVG_DST_FULL | \ ZMODE_OPA | ALPHA_CVG_SEL | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_A_MEM) #define RM_AA_PCL_SURF(clk) \ - AA_EN | IM_RD | CVG_DST_CLAMP | \ + AA_DEF | IM_RD | CVG_DST_CLAMP | \ ZMODE_OPA | G_AC_DITHER | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) #define RM_AA_OPA_TERR(clk) \ - AA_EN | IM_RD | CVG_DST_CLAMP | \ + AA_DEF | RD_DEF | CVG_DST_CLAMP | \ ZMODE_OPA | ALPHA_CVG_SEL | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) #define RM_AA_TEX_TERR(clk) \ - AA_EN | IM_RD | CVG_DST_CLAMP | \ + AA_DEF | RD_DEF | CVG_DST_CLAMP | \ CVG_X_ALPHA | ALPHA_CVG_SEL | ZMODE_OPA | TEX_EDGE | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) #define RM_AA_SUB_TERR(clk) \ - AA_EN | IM_RD | CVG_DST_FULL | \ + AA_DEF | IM_RD | CVG_DST_FULL | \ ZMODE_OPA | ALPHA_CVG_SEL | \ GBL_c##clk(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA) @@ -2660,11 +2683,22 @@ _DW({ \ /* * Moveword commands */ -/* not strictly a moveword command anymore */ +#ifdef F3DEX2_SEGMENTS +/* Use F3DEX2 style segment setup binary encoding. F3DEX3 supports both the +F3DEX2 encoding and the F3DEX3 encoding, but the former does not have the +relative segment resolution behavior. */ +#define gSPSegment(pkt, segment, base) \ + gMoveWd(pkt, G_MW_SEGMENT, (segment) * 4, (base)) +#define gsSPSegment(segment, base) \ + gsMoveWd( G_MW_SEGMENT, (segment) * 4, (base)) +#else +/* F3DEX3 style segment setup, which resolves segment addresses relative to +other segments. */ #define gSPSegment(pkt, segment, base) \ gDma1p((pkt), G_RELSEGMENT, (base), ((segment) * 4) & 0xFFF, G_MW_SEGMENT) #define gsSPSegment(segment, base) \ gsDma1p( G_RELSEGMENT, (base), ((segment) * 4) & 0xFFF, G_MW_SEGMENT) +#endif #define gSPPerspNormalize(pkt, s) gMoveHalfwd(pkt, G_MW_FX, G_MWO_PERSPNORM, (s)) #define gsSPPerspNormalize(s) gsMoveHalfwd( G_MW_FX, G_MWO_PERSPNORM, (s)) @@ -3377,7 +3411,11 @@ _DW({ \ #define gSPSetLights0(pkt, name) gSPSetLights(pkt, 0, name) #define gsSPSetLights0(name) gsSPSetLights( 0, name) #define gSPSetLights1(pkt, name) gSPSetLights(pkt, 1, name) +#ifdef KAZE_GBI_HACKS +#define gsSPSetLights1(name) gsSPNoOp() +#else #define gsSPSetLights1(name) gsSPSetLights( 1, name) +#endif #define gSPSetLights2(pkt, name) gSPSetLights(pkt, 2, name) #define gsSPSetLights2(name) gsSPSetLights( 2, name) #define gSPSetLights3(pkt, name) gSPSetLights(pkt, 3, name) @@ -3690,11 +3728,11 @@ _DW({ \ * Fri May 26 13:45:55 PDT 1995 * @deprecated */ -#define gDPSetBlendMask(pkt, mask) gDPNoOp(pkt) +#define gDPSetBlendMask(pkt, mask) gSPNoOp(pkt) /** * @copydetails gDPSetBlendMask */ -#define gsDPSetBlendMask(mask) gsDPNoOp() +#define gsDPSetBlendMask(mask) gsSPNoOp() #define gDPSetAlphaCompare(pkt, type) \ gSPSetOtherMode(pkt, G_SETOTHERMODE_L, G_MDSFT_ALPHACOMPARE, 2, type) @@ -3866,9 +3904,14 @@ _DW({ \ #define gDPSetEnvColor(pkt, r, g, b, a) \ DPRGBColor(pkt, G_SETENVCOLOR, r, g, b, a) - + +#ifdef KAZE_GBI_HACKS +#define gsDPSetEnvColor(r, g, b, a) \ + gsSPNoOp() +#else #define gsDPSetEnvColor(r, g, b, a) \ sDPRGBColor( G_SETENVCOLOR, r, g, b, a) +#endif #define gDPSetBlendColor(pkt, r, g, b, a) \ DPRGBColor(pkt, G_SETBLENDCOLOR, r, g, b, a) @@ -5409,17 +5452,28 @@ _DW({ #define gDPWord(pkt, wordhi, wordlo) \ _DW({ \ Gfx *_g = (Gfx *)(pkt); \ - \ gImmp1(pkt, G_RDPHALF_1, (unsigned int)(wordhi)); \ gImmp1(pkt, G_RDPHALF_2, (unsigned int)(wordlo)); \ }) +#ifdef RISKY_RDP_SYNCS +/* + * The community has found that in nearly all instances, a tile sync is + * sufficient where a pipe sync is normally used--between rendering something + * and changing critical RDP settings. However, we are not 100% sure this is + * true for all obscure settings, so it is risky. +*/ +#define G_USEASPIPESYNC G_RDPTILESYNC +#else +#define G_USEASPIPESYNC G_RDPPIPESYNC +#endif + #define gDPFullSync(pkt) gDPNoParam(pkt, G_RDPFULLSYNC) #define gsDPFullSync() gsDPNoParam( G_RDPFULLSYNC) #define gDPTileSync(pkt) gDPNoParam(pkt, G_RDPTILESYNC) #define gsDPTileSync() gsDPNoParam( G_RDPTILESYNC) -#define gDPPipeSync(pkt) gDPNoParam(pkt, G_RDPPIPESYNC) -#define gsDPPipeSync() gsDPNoParam( G_RDPPIPESYNC) +#define gDPPipeSync(pkt) gDPNoParam(pkt, G_USEASPIPESYNC) +#define gsDPPipeSync() gsDPNoParam( G_USEASPIPESYNC) #define gDPLoadSync(pkt) gDPNoParam(pkt, G_RDPLOADSYNC) #define gsDPLoadSync() gsDPNoParam( G_RDPLOADSYNC) #define gDPNoOp(pkt) gDPNoParam(pkt, G_NOOP)