From d7c840b8f1b9efb7028ca99c1e81c8ad1e12ec89 Mon Sep 17 00:00:00 2001 From: someone2639 Date: Fri, 15 Dec 2023 23:56:40 -0500 Subject: [PATCH] Cache master displaylist on "hot" code paths (#724) * add displaylist macros * implement displaylist macro in memory.c * API update * implement displaylist macro on all 'hot' code paths * Remove the macro entirely * rename tmpDL * remove the other two macros * catch the last 2 missing statements --------- Co-authored-by: someone2639 --- src/boot/memory.c | 8 ++-- src/game/debug_box.c | 4 ++ src/game/game_init.c | 82 ++++++++++++++++++++++-------------- src/game/hud.c | 65 +++++++++++++++++----------- src/game/puppycam2.c | 24 ++++++----- src/game/puppyprint.c | 16 ++++--- src/game/screen_transition.c | 56 +++++++++++++----------- 7 files changed, 156 insertions(+), 99 deletions(-) diff --git a/src/boot/memory.c b/src/boot/memory.c index c086f8b0..0066f8ba 100644 --- a/src/boot/memory.c +++ b/src/boot/memory.c @@ -94,11 +94,13 @@ void *virtual_to_segmented(u32 segment, const void *addr) { } void move_segment_table_to_dmem(void) { - s32 i; + Gfx *tempGfxHead = gDisplayListHead; - for (i = 0; i < 16; i++) { - gSPSegment(gDisplayListHead++, i, sSegmentTable[i]); + for (s32 i = 0; i < 16; i++) { + gSPSegment(tempGfxHead++, i, sSegmentTable[i]); } + + gDisplayListHead = tempGfxHead; } #else void *segmented_to_virtual(const void *addr) { diff --git a/src/game/debug_box.c b/src/game/debug_box.c index f186c8e9..9281625f 100644 --- a/src/game/debug_box.c +++ b/src/game/debug_box.c @@ -271,6 +271,8 @@ void visual_surface_display(Gfx **gfx, Vtx *verts, s32 iteration) { s32 count = VERTCOUNT; s32 ntx = 0; + Gfx *tempGfxHead = gDisplayListHead; + while (vts > 0) { if (count == VERTCOUNT) { ntx = MIN(VERTCOUNT, vts); @@ -298,6 +300,8 @@ void visual_surface_display(Gfx **gfx, Vtx *verts, s32 iteration) { count += 3; } } + + gDisplayListHead = tempGfxHead; } s32 iterate_surface_count(s32 x, s32 z) { diff --git a/src/game/game_init.c b/src/game/game_init.c index 4b415138..bec0cfd3 100644 --- a/src/game/game_init.c +++ b/src/game/game_init.c @@ -156,32 +156,40 @@ void my_rsp_init(void) { * Initialize the z buffer for the current frame. */ void init_z_buffer(s32 resetZB) { - gDPPipeSync(gDisplayListHead++); + Gfx *tempGfxHead = gDisplayListHead; - gDPSetDepthSource(gDisplayListHead++, G_ZS_PIXEL); - gDPSetDepthImage(gDisplayListHead++, gPhysicalZBuffer); + gDPPipeSync(tempGfxHead++); - gDPSetColorImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, gPhysicalZBuffer); + gDPSetDepthSource(tempGfxHead++, G_ZS_PIXEL); + gDPSetDepthImage(tempGfxHead++, gPhysicalZBuffer); + + gDPSetColorImage(tempGfxHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, gPhysicalZBuffer); if (!resetZB) return; - gDPSetFillColor(gDisplayListHead++, + gDPSetFillColor(tempGfxHead++, GPACK_ZDZ(G_MAXFBZ, 0) << 16 | GPACK_ZDZ(G_MAXFBZ, 0)); - gDPFillRectangle(gDisplayListHead++, 0, gBorderHeight, SCREEN_WIDTH - 1, + gDPFillRectangle(tempGfxHead++, 0, gBorderHeight, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1 - gBorderHeight); + + gDisplayListHead = tempGfxHead; } /** * Tells the RDP which of the three framebuffers it shall draw to. */ void select_framebuffer(void) { - gDPPipeSync(gDisplayListHead++); + Gfx *tempGfxHead = gDisplayListHead; - gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE); - gDPSetColorImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, + gDPPipeSync(tempGfxHead++); + + gDPSetCycleType(tempGfxHead++, G_CYC_1CYCLE); + gDPSetColorImage(tempGfxHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, gPhysicalFramebuffers[sRenderingFramebuffer]); - gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, gBorderHeight, SCREEN_WIDTH, + gDPSetScissor(tempGfxHead++, G_SC_NON_INTERLACE, 0, gBorderHeight, SCREEN_WIDTH, SCREEN_HEIGHT - gBorderHeight); + + gDisplayListHead = tempGfxHead; } /** @@ -189,19 +197,23 @@ void select_framebuffer(void) { * Information about the color argument: https://jrra.zone/n64/doc/n64man/gdp/gDPSetFillColor.htm */ void clear_framebuffer(s32 color) { - gDPPipeSync(gDisplayListHead++); + Gfx *tempGfxHead = gDisplayListHead; - gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2); - gDPSetCycleType(gDisplayListHead++, G_CYC_FILL); + gDPPipeSync(tempGfxHead++); - gDPSetFillColor(gDisplayListHead++, color); - gDPFillRectangle(gDisplayListHead++, + gDPSetRenderMode(tempGfxHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2); + gDPSetCycleType(tempGfxHead++, G_CYC_FILL); + + gDPSetFillColor(tempGfxHead++, color); + gDPFillRectangle(tempGfxHead++, GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), gBorderHeight, GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(0) - 1, SCREEN_HEIGHT - gBorderHeight - 1); - gDPPipeSync(gDisplayListHead++); + gDPPipeSync(tempGfxHead++); - gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE); + gDPSetCycleType(tempGfxHead++, G_CYC_1CYCLE); + + gDisplayListHead = tempGfxHead; } /** @@ -218,38 +230,46 @@ void clear_viewport(Vp *viewport, s32 color) { vpLrx = GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(SCREEN_WIDTH - vpLrx); #endif - gDPPipeSync(gDisplayListHead++); + Gfx *tempGfxHead = gDisplayListHead; - gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2); - gDPSetCycleType(gDisplayListHead++, G_CYC_FILL); + gDPPipeSync(tempGfxHead++); - gDPSetFillColor(gDisplayListHead++, color); - gDPFillRectangle(gDisplayListHead++, vpUlx, vpUly, vpLrx, vpLry); + gDPSetRenderMode(tempGfxHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2); + gDPSetCycleType(tempGfxHead++, G_CYC_FILL); - gDPPipeSync(gDisplayListHead++); + gDPSetFillColor(tempGfxHead++, color); + gDPFillRectangle(tempGfxHead++, vpUlx, vpUly, vpLrx, vpLry); - gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE); + gDPPipeSync(tempGfxHead++); + + gDPSetCycleType(tempGfxHead++, G_CYC_1CYCLE); + + gDisplayListHead = tempGfxHead; } /** * Draw the horizontal screen borders. */ void draw_screen_borders(void) { - gDPPipeSync(gDisplayListHead++); + Gfx *tempGfxHead = gDisplayListHead; - gDPSetScissor(gDisplayListHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); - gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2); - gDPSetCycleType(gDisplayListHead++, G_CYC_FILL); + gDPPipeSync(tempGfxHead++); - gDPSetFillColor(gDisplayListHead++, GPACK_RGBA5551(0, 0, 0, 0) << 16 | GPACK_RGBA5551(0, 0, 0, 0)); + gDPSetScissor(tempGfxHead++, G_SC_NON_INTERLACE, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + gDPSetRenderMode(tempGfxHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2); + gDPSetCycleType(tempGfxHead++, G_CYC_FILL); + + gDPSetFillColor(tempGfxHead++, GPACK_RGBA5551(0, 0, 0, 0) << 16 | GPACK_RGBA5551(0, 0, 0, 0)); if (gBorderHeight) { - gDPFillRectangle(gDisplayListHead++, GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), 0, + gDPFillRectangle(tempGfxHead++, GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), 0, GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(0) - 1, gBorderHeight - 1); - gDPFillRectangle(gDisplayListHead++, + gDPFillRectangle(tempGfxHead++, GFX_DIMENSIONS_RECT_FROM_LEFT_EDGE(0), SCREEN_HEIGHT - gBorderHeight, GFX_DIMENSIONS_RECT_FROM_RIGHT_EDGE(0) - 1, SCREEN_HEIGHT - 1); } + + gDisplayListHead = tempGfxHead; } /** diff --git a/src/game/hud.c b/src/game/hud.c index 75118b56..88b8e7ca 100644 --- a/src/game/hud.c +++ b/src/game/hud.c @@ -117,29 +117,37 @@ static struct CameraHUD sCameraHUD = { CAM_STATUS_NONE }; * Renders a rgba16 16x16 glyph texture from a table list. */ void render_hud_tex_lut(s32 x, s32 y, Texture *texture) { - gDPPipeSync(gDisplayListHead++); - gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, texture); - gSPDisplayList(gDisplayListHead++, &dl_hud_img_load_tex_block); - gSPTextureRectangle(gDisplayListHead++, x << 2, y << 2, (x + 15) << 2, (y + 15) << 2, + Gfx *tempGfxHead = gDisplayListHead; + + gDPPipeSync(tempGfxHead++); + gDPSetTextureImage(tempGfxHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, texture); + gSPDisplayList(tempGfxHead++, &dl_hud_img_load_tex_block); + gSPTextureRectangle(tempGfxHead++, x << 2, y << 2, (x + 15) << 2, (y + 15) << 2, G_TX_RENDERTILE, 0, 0, 4 << 10, 1 << 10); + + gDisplayListHead = tempGfxHead; } /** * Renders a rgba16 8x8 glyph texture from a table list. */ void render_hud_small_tex_lut(s32 x, s32 y, Texture *texture) { - gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, + Gfx *tempGfxHead = gDisplayListHead; + + gDPSetTile(tempGfxHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 0, 0, G_TX_LOADTILE, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD, G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOLOD); - gDPTileSync(gDisplayListHead++); - gDPSetTile(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 2, 0, G_TX_RENDERTILE, 0, + gDPTileSync(tempGfxHead++); + gDPSetTile(tempGfxHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 2, 0, G_TX_RENDERTILE, 0, G_TX_CLAMP, 3, G_TX_NOLOD, G_TX_CLAMP, 3, G_TX_NOLOD); - gDPSetTileSize(gDisplayListHead++, G_TX_RENDERTILE, 0, 0, (8 - 1) << G_TEXTURE_IMAGE_FRAC, (8 - 1) << G_TEXTURE_IMAGE_FRAC); - gDPPipeSync(gDisplayListHead++); - gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, texture); - gDPLoadSync(gDisplayListHead++); - gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 8 * 8 - 1, CALC_DXT(8, G_IM_SIZ_16b_BYTES)); - gSPTextureRectangle(gDisplayListHead++, x << 2, y << 2, (x + 7) << 2, (y + 7) << 2, G_TX_RENDERTILE, + gDPSetTileSize(tempGfxHead++, G_TX_RENDERTILE, 0, 0, (8 - 1) << G_TEXTURE_IMAGE_FRAC, (8 - 1) << G_TEXTURE_IMAGE_FRAC); + gDPPipeSync(tempGfxHead++); + gDPSetTextureImage(tempGfxHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, texture); + gDPLoadSync(tempGfxHead++); + gDPLoadBlock(tempGfxHead++, G_TX_LOADTILE, 0, 0, 8 * 8 - 1, CALC_DXT(8, G_IM_SIZ_16b_BYTES)); + gSPTextureRectangle(tempGfxHead++, x << 2, y << 2, (x + 7) << 2, (y + 7) << 2, G_TX_RENDERTILE, 0, 0, 4 << 10, 1 << 10); + + gDisplayListHead = tempGfxHead; } /** @@ -147,14 +155,17 @@ void render_hud_small_tex_lut(s32 x, s32 y, Texture *texture) { */ void render_power_meter_health_segment(s16 numHealthWedges) { Texture *(*healthLUT)[] = segmented_to_virtual(&power_meter_health_segments_lut); + Gfx *tempGfxHead = gDisplayListHead; - gDPPipeSync(gDisplayListHead++); - gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, + gDPPipeSync(tempGfxHead++); + gDPSetTextureImage(tempGfxHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, (*healthLUT)[numHealthWedges - 1]); - gDPLoadSync(gDisplayListHead++); - gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)); - gSP1Triangle(gDisplayListHead++, 0, 1, 2, 0); - gSP1Triangle(gDisplayListHead++, 0, 2, 3, 0); + gDPLoadSync(tempGfxHead++); + gDPLoadBlock(tempGfxHead++, G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)); + gSP1Triangle(tempGfxHead++, 0, 1, 2, 0); + gSP1Triangle(tempGfxHead++, 0, 2, 3, 0); + + gDisplayListHead = tempGfxHead; } /** @@ -293,12 +304,16 @@ void render_hud_power_meter(void) { void render_breath_meter_segment(s16 numBreathWedges) { Texture *(*breathLUT)[]; breathLUT = segmented_to_virtual(&breath_meter_segments_lut); - gDPPipeSync(gDisplayListHead++); - gDPSetTextureImage(gDisplayListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, (*breathLUT)[numBreathWedges - 1]); - gDPLoadSync(gDisplayListHead++); - gDPLoadBlock(gDisplayListHead++, G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)); - gSP1Triangle(gDisplayListHead++, 0, 1, 2, 0); - gSP1Triangle(gDisplayListHead++, 0, 2, 3, 0); + Gfx *tempGfxHead = gDisplayListHead; + + gDPPipeSync(tempGfxHead++); + gDPSetTextureImage(tempGfxHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, (*breathLUT)[numBreathWedges - 1]); + gDPLoadSync(tempGfxHead++); + gDPLoadBlock(tempGfxHead++, G_TX_LOADTILE, 0, 0, 32 * 32 - 1, CALC_DXT(32, G_IM_SIZ_16b_BYTES)); + gSP1Triangle(tempGfxHead++, 0, 1, 2, 0); + gSP1Triangle(tempGfxHead++, 0, 2, 3, 0); + + gDisplayListHead = tempGfxHead; } /** diff --git a/src/game/puppycam2.c b/src/game/puppycam2.c index bc9fc26c..384d8af0 100644 --- a/src/game/puppycam2.c +++ b/src/game/puppycam2.c @@ -286,19 +286,23 @@ static void puppycam_process_cutscene(void) { #define BLANK 0, 0, 0, ENVIRONMENT, 0, 0, 0, ENVIRONMENT static void puppycam_display_box(s32 x1, s32 y1, s32 x2, s32 y2, u8 r, u8 g, u8 b, u8 a) { - gDPSetCombineMode(gDisplayListHead++, BLANK, BLANK); - gDPSetCycleType( gDisplayListHead++, G_CYC_1CYCLE); + Gfx *tempGfxHead = gDisplayListHead; + + gDPSetCombineMode(tempGfxHead++, BLANK, BLANK); + gDPSetCycleType( tempGfxHead++, G_CYC_1CYCLE); if (a !=255) { - gDPSetRenderMode(gDisplayListHead++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + gDPSetRenderMode(tempGfxHead++, G_RM_XLU_SURF, G_RM_XLU_SURF2); } else { - gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF); + gDPSetRenderMode(tempGfxHead++, G_RM_OPA_SURF, G_RM_OPA_SURF); } - gDPSetEnvColor( gDisplayListHead++, r, g, b, a); - gDPFillRectangle( gDisplayListHead++, x1, y1, x2, y2); - gDPPipeSync( gDisplayListHead++); - gDPSetEnvColor( gDisplayListHead++, 255, 255, 255, 255); - gDPSetCycleType( gDisplayListHead++, G_CYC_1CYCLE); - gSPDisplayList( gDisplayListHead++,dl_hud_img_end); + gDPSetEnvColor( tempGfxHead++, r, g, b, a); + gDPFillRectangle( tempGfxHead++, x1, y1, x2, y2); + gDPPipeSync( tempGfxHead++); + gDPSetEnvColor( tempGfxHead++, 255, 255, 255, 255); + gDPSetCycleType( tempGfxHead++, G_CYC_1CYCLE); + gSPDisplayList( tempGfxHead++,dl_hud_img_end); + + gDisplayListHead = tempGfxHead; } //I actually took the time to redo this, properly. Lmao. Please don't bully me over this anymore :( diff --git a/src/game/puppyprint.c b/src/game/puppyprint.c index 9ef3b863..5da36fdd 100644 --- a/src/game/puppyprint.c +++ b/src/game/puppyprint.c @@ -522,12 +522,16 @@ void puppyprint_render_minimal(void) { } void render_coverage_map(void) { - gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE); - gDPSetBlendColor(gDisplayListHead++, 0xFF, 0xFF, 0xFF, 0xFF); - gDPSetPrimDepth(gDisplayListHead++, 0xFFFF, 0xFFFF); - gDPSetDepthSource(gDisplayListHead++, G_ZS_PRIM); - gDPSetRenderMode(gDisplayListHead++, G_RM_VISCVG, G_RM_VISCVG2); - gDPFillRectangle(gDisplayListHead++, 0,0, SCREEN_WIDTH-1, SCREEN_HEIGHT-1); + Gfx *tempGfxHead = gDisplayListHead; + + gDPSetCycleType(tempGfxHead++, G_CYC_1CYCLE); + gDPSetBlendColor(tempGfxHead++, 0xFF, 0xFF, 0xFF, 0xFF); + gDPSetPrimDepth(tempGfxHead++, 0xFFFF, 0xFFFF); + gDPSetDepthSource(tempGfxHead++, G_ZS_PRIM); + gDPSetRenderMode(tempGfxHead++, G_RM_VISCVG, G_RM_VISCVG2); + gDPFillRectangle(tempGfxHead++, 0,0, SCREEN_WIDTH-1, SCREEN_HEIGHT-1); + + gDisplayListHead = tempGfxHead; } void puppycamera_debug_view(void) { diff --git a/src/game/screen_transition.c b/src/game/screen_transition.c index 2376b1f7..a59e2559 100644 --- a/src/game/screen_transition.c +++ b/src/game/screen_transition.c @@ -140,43 +140,47 @@ s32 render_textured_transition(s8 transTime, struct WarpTransitionData *transDat if (verts != NULL) { + Gfx *tempGfxHead = gDisplayListHead; + make_tex_transition_vertices(verts, centerTransX, centerTransY, texTransRadius, transTexType); - gSPDisplayList(gDisplayListHead++, dl_proj_mtx_fullscreen); + gSPDisplayList(tempGfxHead++, dl_proj_mtx_fullscreen); u8 r = transData->red; u8 g = transData->green; u8 b = transData->blue; - gDPSetPrimColor(gDisplayListHead++, 0, 0, r, g, b, 255); + gDPSetPrimColor(tempGfxHead++, 0, 0, r, g, b, 255); - gDPSetCombineMode(gDisplayListHead++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_OPA_SURF, G_RM_AA_OPA_SURF2); + gDPSetCombineMode(tempGfxHead++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); + gDPSetRenderMode(tempGfxHead++, G_RM_AA_OPA_SURF, G_RM_AA_OPA_SURF2); - gSPVertex(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(verts), 8, 0); - gSPDisplayList(gDisplayListHead++, dl_transition_draw_filled_region); - gDPPipeSync(gDisplayListHead++); + gSPVertex(tempGfxHead++, VIRTUAL_TO_PHYSICAL(verts), 8, 0); + gSPDisplayList(tempGfxHead++, dl_transition_draw_filled_region); + gDPPipeSync(tempGfxHead++); - gDPSetCombineLERP(gDisplayListHead++, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, + gDPSetCombineLERP(tempGfxHead++, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_XLU_SURF, G_RM_AA_XLU_SURF2); - gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP); + gDPSetRenderMode(tempGfxHead++, G_RM_AA_XLU_SURF, G_RM_AA_XLU_SURF2); + gDPSetTextureFilter(tempGfxHead++, G_TF_BILERP); switch (transTexType) { case TRANS_TYPE_MIRROR: - gDPLoadTextureBlock(gDisplayListHead++, sTextureTransitionID[texID], G_IM_FMT_IA, G_IM_SIZ_8b, 32, 64, 0, + gDPLoadTextureBlock(tempGfxHead++, sTextureTransitionID[texID], G_IM_FMT_IA, G_IM_SIZ_8b, 32, 64, 0, G_TX_WRAP | G_TX_MIRROR, G_TX_WRAP | G_TX_MIRROR, 5, 6, G_TX_NOLOD, G_TX_NOLOD); break; case TRANS_TYPE_CLAMP: - gDPLoadTextureBlock(gDisplayListHead++, sTextureTransitionID[texID], G_IM_FMT_IA, G_IM_SIZ_8b, 64, 64, 0, + gDPLoadTextureBlock(tempGfxHead++, sTextureTransitionID[texID], G_IM_FMT_IA, G_IM_SIZ_8b, 64, 64, 0, G_TX_CLAMP, G_TX_CLAMP, 6, 6, G_TX_NOLOD, G_TX_NOLOD); break; } - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON); - gSPVertex(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(verts), 4, 0); - gSPDisplayList(gDisplayListHead++, dl_draw_quad_verts_0123); - gSPTexture(gDisplayListHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF); - gSPDisplayList(gDisplayListHead++, dl_screen_transition_end); + gSPTexture(tempGfxHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON); + gSPVertex(tempGfxHead++, VIRTUAL_TO_PHYSICAL(verts), 4, 0); + gSPDisplayList(tempGfxHead++, dl_draw_quad_verts_0123); + gSPTexture(tempGfxHead++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_OFF); + gSPDisplayList(tempGfxHead++, dl_screen_transition_end); sTransitionTextureAngle += transData->angleSpeed; + + gDisplayListHead = tempGfxHead; } return set_and_reset_transition_fade_timer(transTime); } @@ -197,17 +201,21 @@ s32 dl_transition_color(u8 transTime, struct WarpTransitionData *transData, u8 a Vtx *verts = vertex_transition_color(); if (verts != NULL) { + Gfx *tempGfxHead = gDisplayListHead; + u8 r = transData->red; u8 g = transData->green; u8 b = transData->blue; - gDPSetPrimColor(gDisplayListHead++, 0, 0, r, g, b, alpha); + gDPSetPrimColor(tempGfxHead++, 0, 0, r, g, b, alpha); - gSPDisplayList(gDisplayListHead++, dl_proj_mtx_fullscreen); - gDPSetCombineMode(gDisplayListHead++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); - gDPSetRenderMode(gDisplayListHead++, G_RM_AA_XLU_SURF, G_RM_AA_XLU_SURF2); - gSPVertex(gDisplayListHead++, VIRTUAL_TO_PHYSICAL(verts), 4, 0); - gSPDisplayList(gDisplayListHead++, dl_draw_quad_verts_0123); - gSPDisplayList(gDisplayListHead++, dl_screen_transition_end); + gSPDisplayList(tempGfxHead++, dl_proj_mtx_fullscreen); + gDPSetCombineMode(tempGfxHead++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); + gDPSetRenderMode(tempGfxHead++, G_RM_AA_XLU_SURF, G_RM_AA_XLU_SURF2); + gSPVertex(tempGfxHead++, VIRTUAL_TO_PHYSICAL(verts), 4, 0); + gSPDisplayList(tempGfxHead++, dl_draw_quad_verts_0123); + gSPDisplayList(tempGfxHead++, dl_screen_transition_end); + + gDisplayListHead = tempGfxHead; } return set_and_reset_transition_fade_timer(transTime); }