diff --git a/include/regs.h b/include/regs.h index 6657c334bc..48339bccca 100644 --- a/include/regs.h +++ b/include/regs.h @@ -56,7 +56,7 @@ #define R_FB_FILTER_A SREG(84) #define R_FB_FILTER_ENV_COLOR(c) SREG(85 + (c)) #define R_ENABLE_FB_FILTER SREG(88) -#define R_PAUSE_MENU_MODE SREG(94) +#define R_PAUSE_BG_PRERENDER_STATE SREG(94) // `PauseBgPreRenderState` #define R_CAM_MAX_PHI OREG(5) #define R_CAM_DEFA_PHI_UPDRATE OREG(7) #define R_DEFA_CAM_ANIM_TIME OREG(23) diff --git a/include/z64.h b/include/z64.h index fab278cecd..e30376cf37 100644 --- a/include/z64.h +++ b/include/z64.h @@ -783,12 +783,12 @@ typedef enum { } PauseCtxUnk1EC; typedef enum { - /* 0 */ PAUSE_MENU_REG_MODE_0, - /* 1 */ PAUSE_MENU_REG_MODE_1, - /* 2 */ PAUSE_MENU_REG_MODE_2, - /* 3 */ PAUSE_MENU_REG_MODE_3, - /* 4 */ PAUSE_MENU_REG_MODE_MAX -} PauseMenuRegMode; + /* 0 */ PAUSE_BG_PRERENDER_OFF, // Inactive, do nothing. + /* 1 */ PAUSE_BG_PRERENDER_DRAW, // The current frame is only drawn for the purpose of serving as the pause background. + /* 2 */ PAUSE_BG_PRERENDER_FILTER, // The previous frame was PAUSE_BG_PRERENDER_DRAW, now apply prerender filters. + /* 3 */ PAUSE_BG_PRERENDER_DONE, // The pause background is ready to be used. + /* 4 */ PAUSE_BG_PRERENDER_MAX +} PauseBgPreRenderState; typedef struct { /* 0x0000 */ View view; diff --git a/src/code/game.c b/src/code/game.c index 05fb0179d1..68a7057196 100644 --- a/src/code/game.c +++ b/src/code/game.c @@ -309,7 +309,7 @@ void GameState_Update(GameState* gameState) { } } - if (R_PAUSE_MENU_MODE != (u32)PAUSE_MENU_REG_MODE_2) { + if (R_PAUSE_BG_PRERENDER_STATE != (u32)PAUSE_BG_PRERENDER_FILTER) { GameState_Draw(gameState, gfxCtx); func_800C49F4(gfxCtx); } diff --git a/src/code/z_kaleido_scope_call.c b/src/code/z_kaleido_scope_call.c index 8deb0e94d1..6078c37e0d 100644 --- a/src/code/z_kaleido_scope_call.c +++ b/src/code/z_kaleido_scope_call.c @@ -61,7 +61,7 @@ void KaleidoScopeCall_Update(PlayState* play) { if (Letterbox_GetSize() == 0) { HREG(80) = 7; HREG(82) = 3; - R_PAUSE_MENU_MODE = PAUSE_MENU_REG_MODE_1; + R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_DRAW; pauseCtx->unk_1E4_ps6_ = PAUSE_S6_0_IDLE_; pauseCtx->unk_1EC_ps7_ = PAUSE_S7_0; pauseCtx->state = (pauseCtx->state & 0xFFFF) + 1; // PAUSE_STATE_2 @@ -69,14 +69,14 @@ void KaleidoScopeCall_Update(PlayState* play) { } else if (pauseCtx->state == PAUSE_STATE_8) { HREG(80) = 7; HREG(82) = 3; - R_PAUSE_MENU_MODE = PAUSE_MENU_REG_MODE_1; + R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_DRAW; pauseCtx->unk_1E4_ps6_ = PAUSE_S6_0_IDLE_; pauseCtx->unk_1EC_ps7_ = PAUSE_S7_0; pauseCtx->state = (pauseCtx->state & 0xFFFF) + 1; // PAUSE_STATE_9 } else if ((pauseCtx->state == PAUSE_STATE_2) || (pauseCtx->state == PAUSE_STATE_9)) { - osSyncPrintf("PR_KAREIDOSCOPE_MODE=%d\n", R_PAUSE_MENU_MODE); + osSyncPrintf("PR_KAREIDOSCOPE_MODE=%d\n", R_PAUSE_BG_PRERENDER_STATE); - if (R_PAUSE_MENU_MODE >= PAUSE_MENU_REG_MODE_3) { + if (R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_DONE) { pauseCtx->state++; // PAUSE_STATE_3 or PAUSE_STATE_10 } } else if (pauseCtx->state != PAUSE_STATE_0) { @@ -118,7 +118,7 @@ void KaleidoScopeCall_Update(PlayState* play) { void KaleidoScopeCall_Draw(PlayState* play) { KaleidoMgrOverlay* kaleidoScopeOvl = &gKaleidoMgrOverlayTable[KALEIDO_OVL_KALEIDO_SCOPE]; - if (R_PAUSE_MENU_MODE >= PAUSE_MENU_REG_MODE_3) { + if (R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_DONE) { if (((play->pauseCtx.state >= PAUSE_STATE_4) && (play->pauseCtx.state <= PAUSE_STATE_7_SAVE_PROMPT_) /* PAUSE_STATE_4, PAUSE_STATE_5, PAUSE_STATE_6, PAUSE_STATE_7_SAVE_PROMPT_ */) || ((play->pauseCtx.state >= PAUSE_STATE_11) && (play->pauseCtx.state <= PAUSE_STATE_18_FLIP_PAGES_AND_UNPAUSE) diff --git a/src/code/z_parameter.c b/src/code/z_parameter.c index ee4689d7ec..7d35f72020 100644 --- a/src/code/z_parameter.c +++ b/src/code/z_parameter.c @@ -3208,7 +3208,8 @@ void Interface_Draw(PlayState* play) { Magic_DrawMeter(play); Minimap_Draw(play); - if ((R_PAUSE_MENU_MODE != PAUSE_MENU_REG_MODE_2) && (R_PAUSE_MENU_MODE != PAUSE_MENU_REG_MODE_3)) { + if ((R_PAUSE_BG_PRERENDER_STATE != PAUSE_BG_PRERENDER_FILTER) && + (R_PAUSE_BG_PRERENDER_STATE != PAUSE_BG_PRERENDER_DONE)) { func_8002C124(&play->actorCtx.targetCtx, play); // Draw Z-Target } diff --git a/src/code/z_play.c b/src/code/z_play.c index bb423a59be..4217bd36dd 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -178,7 +178,7 @@ void Play_Destroy(GameState* thisx) { this->state.gfxCtx->callbackParam = 0; SREG(91) = 0; - R_PAUSE_MENU_MODE = PAUSE_MENU_REG_MODE_0; + R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_OFF; PreRender_Destroy(&this->pauseBgPreRender); Effect_DeleteAll(this); @@ -355,7 +355,7 @@ void Play_Init(GameState* thisx) { } SREG(91) = -1; - R_PAUSE_MENU_MODE = PAUSE_MENU_REG_MODE_0; + R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_OFF; PreRender_Init(&this->pauseBgPreRender); PreRender_SetValuesSave(&this->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL, NULL); PreRender_SetValues(&this->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL); @@ -1110,19 +1110,25 @@ void Play_Draw(PlayState* this) { } else { PreRender_SetValues(&this->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, gfxCtx->curFrameBuffer, gZBuffer); - if (R_PAUSE_MENU_MODE == PAUSE_MENU_REG_MODE_2) { + if (R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_FILTER) { + // Wait for the previous frame's DList to be processed, + // so that `pauseBgPreRender.fbufSave` and `pauseBgPreRender.cvgSave` are filled with the appropriate + // content and can be used by `PreRender_ApplyFilters` below. Sched_FlushTaskQueue(); + PreRender_ApplyFilters(&this->pauseBgPreRender); - R_PAUSE_MENU_MODE = PAUSE_MENU_REG_MODE_3; - } else if (R_PAUSE_MENU_MODE >= PAUSE_MENU_REG_MODE_MAX) { - R_PAUSE_MENU_MODE = PAUSE_MENU_REG_MODE_0; + + R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_DONE; + } else if (R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_MAX) { + R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_OFF; } - if (R_PAUSE_MENU_MODE == PAUSE_MENU_REG_MODE_3) { - Gfx* sp84 = POLY_OPA_DISP; + if (R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_DONE) { + Gfx* gfxP = POLY_OPA_DISP; + + PreRender_RestoreFramebuffer(&this->pauseBgPreRender, &gfxP); + POLY_OPA_DISP = gfxP; - PreRender_RestoreFramebuffer(&this->pauseBgPreRender, &sp84); - POLY_OPA_DISP = sp84; goto Play_Draw_DrawOverlayElements; } else { s32 roomDrawFlags; @@ -1233,17 +1239,19 @@ void Play_Draw(PlayState* this) { DebugDisplay_DrawObjects(this); } - if ((R_PAUSE_MENU_MODE == PAUSE_MENU_REG_MODE_1) || (gTrnsnUnkState == 1)) { + if ((R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_DRAW) || (gTrnsnUnkState == 1)) { Gfx* gfxP = OVERLAY_DISP; + // Copy the frame buffer contents at this point in the DList to the zbuffer + // The zbuffer must then stay untouched until unpausing this->pauseBgPreRender.fbuf = gfxCtx->curFrameBuffer; this->pauseBgPreRender.fbufSave = (u16*)gZBuffer; PreRender_SaveFramebuffer(&this->pauseBgPreRender, &gfxP); - if (R_PAUSE_MENU_MODE == PAUSE_MENU_REG_MODE_1) { + if (R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_DRAW) { this->pauseBgPreRender.cvgSave = (u8*)gfxCtx->curFrameBuffer; PreRender_DrawCoverage(&this->pauseBgPreRender, &gfxP); - R_PAUSE_MENU_MODE = PAUSE_MENU_REG_MODE_2; + R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_FILTER; } else { gTrnsnUnkState = 2; } diff --git a/src/code/z_rcp.c b/src/code/z_rcp.c index 1679c0d34c..da4cd93070 100644 --- a/src/code/z_rcp.c +++ b/src/code/z_rcp.c @@ -1469,8 +1469,9 @@ void Gfx_SetupFrame(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b) { gDPSetDepthImage(POLY_XLU_DISP++, gZBuffer); gDPSetDepthImage(OVERLAY_DISP++, gZBuffer); - if ((R_PAUSE_MENU_MODE < PAUSE_MENU_REG_MODE_2) /* PAUSE_MENU_REG_MODE_0, PAUSE_MENU_REG_MODE_1 */ && - (gTrnsnUnkState < 2)) { + if ((R_PAUSE_BG_PRERENDER_STATE <= PAUSE_BG_PRERENDER_DRAW) + /* PAUSE_BG_PRERENDER_OFF, PAUSE_BG_PRERENDER_DRAW */ + && (gTrnsnUnkState < 2)) { s32 letterboxSize = Letterbox_GetSize(); if (HREG(80) == 16) { diff --git a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c index 31536d3ab1..2ae8d4e46d 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c @@ -2640,7 +2640,7 @@ void KaleidoScope_Update(PlayState* play) { s16 stepA; s32 pad; - if ((R_PAUSE_MENU_MODE >= PAUSE_MENU_REG_MODE_3) && + if ((R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_DONE) && (((pauseCtx->state >= PAUSE_STATE_4) && (pauseCtx->state <= PAUSE_STATE_7_SAVE_PROMPT_) /* PAUSE_STATE_4, PAUSE_STATE_5, PAUSE_STATE_6, PAUSE_STATE_7_SAVE_PROMPT_ */ ) || @@ -3571,7 +3571,7 @@ void KaleidoScope_Update(PlayState* play) { interfaceCtx->unk_244 = 255; pauseCtx->state = PAUSE_STATE_0; R_UPDATE_RATE = 3; - R_PAUSE_MENU_MODE = PAUSE_MENU_REG_MODE_0; + R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_OFF; func_800981B8(&play->objectCtx); func_800418D0(&play->colCtx, play); if (pauseCtx->promptChoice == 0) { @@ -3629,7 +3629,7 @@ void KaleidoScope_Update(PlayState* play) { case PAUSE_STATE_19_UNPAUSE: pauseCtx->state = PAUSE_STATE_0; R_UPDATE_RATE = 3; - R_PAUSE_MENU_MODE = PAUSE_MENU_REG_MODE_0; + R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_OFF; func_800981B8(&play->objectCtx); func_800418D0(&play->colCtx, play);