From 134ca8206f27b91b467e2780777e14121d6e2f2f Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 14 May 2023 19:41:59 +1000 Subject: [PATCH] Introduce NUM_FRAMEBUFFERS and NUM_GFXTASKS constants --- src/game/gfxmemory.c | 21 ++++++++++++--------- src/game/langinit.c | 2 +- src/game/playermgr.c | 2 +- src/game/room.c | 4 ++-- src/game/roomtick.c | 2 +- src/include/bss.h | 6 +++--- src/include/constants.h | 2 ++ src/include/data.h | 6 +++--- src/include/types.h | 2 +- src/lib/main.c | 6 +++--- src/lib/sched.c | 16 ++++++++-------- src/lib/vi.c | 36 ++++++++++++++++++------------------ 12 files changed, 55 insertions(+), 50 deletions(-) diff --git a/src/game/gfxmemory.c b/src/game/gfxmemory.c index 143c9f6f4..280bea1e1 100644 --- a/src/game/gfxmemory.c +++ b/src/game/gfxmemory.c @@ -35,9 +35,9 @@ * marker for the end of the second element's allocation. */ -u8 *g_GfxBuffers[3]; +u8 *g_GfxBuffers[NUM_GFXTASKS + 1]; u32 var800aa58c; -u8 *g_VtxBuffers[3]; +u8 *g_VtxBuffers[NUM_GFXTASKS + 1]; u8 *g_GfxMemPos; u8 g_GfxActiveBufferIndex; u32 g_GfxRequestedDisplayList; @@ -56,8 +56,8 @@ u32 g_VtxSizesByPlayerCount[] = { 0x00028000, }; -s32 g_GfxNumSwapsPerBuffer[2] = {0, 1}; -u32 g_GfxNumSwaps = 0x00000002; +s32 g_GfxNumSwapsPerBuffer[NUM_GFXTASKS] = {0, 1}; +u32 g_GfxNumSwaps = 2; /** * Allocate graphics memory from the heap. Presumably called on stage load. @@ -102,12 +102,12 @@ void gfxReset(void) } // %d Players : Allocating %d bytes for master dl's\n - g_GfxBuffers[0] = mempAlloc(g_GfxSizesByPlayerCount[PLAYERCOUNT() - 1] * 2, MEMPOOL_STAGE); + g_GfxBuffers[0] = mempAlloc(g_GfxSizesByPlayerCount[PLAYERCOUNT() - 1] * NUM_GFXTASKS, MEMPOOL_STAGE); g_GfxBuffers[1] = g_GfxBuffers[0] + g_GfxSizesByPlayerCount[PLAYERCOUNT() - 1]; g_GfxBuffers[2] = g_GfxBuffers[1] + g_GfxSizesByPlayerCount[PLAYERCOUNT() - 1]; // Allocating %d bytes for mtxvtx space\n - g_VtxBuffers[0] = mempAlloc(g_VtxSizesByPlayerCount[PLAYERCOUNT() - 1] * 2, MEMPOOL_STAGE); + g_VtxBuffers[0] = mempAlloc(g_VtxSizesByPlayerCount[PLAYERCOUNT() - 1] * NUM_GFXTASKS, MEMPOOL_STAGE); g_VtxBuffers[1] = g_VtxBuffers[0] + g_VtxSizesByPlayerCount[PLAYERCOUNT() - 1]; g_VtxBuffers[2] = g_VtxBuffers[1] + g_VtxSizesByPlayerCount[PLAYERCOUNT() - 1]; @@ -140,10 +140,15 @@ void *gfxAllocateMatrix(void) return ptr; } +/** + * sizeof(LookAt) is 0x10 and it consists of two Light structs of 0x8 each. + * The function allocates 0x8 for every count, so it could be allocating lights + * instead, however it's only used for LookAts so it's named as LookAt. + */ void *gfxAllocateLookAt(s32 count) { void *ptr = g_GfxMemPos; - g_GfxMemPos += count * 0x10; + g_GfxMemPos += count * (sizeof(LookAt) / 2); return ptr; } @@ -166,8 +171,6 @@ void *gfxAllocate(u32 size) return ptr; } -extern s32 g_GfxNumSwapsPerBuffer[2]; - void gfxSwapBuffers(void) { g_GfxActiveBufferIndex ^= 1; diff --git a/src/game/langinit.c b/src/game/langinit.c index e8e9f2865..e7b48c326 100644 --- a/src/game/langinit.c +++ b/src/game/langinit.c @@ -5,7 +5,7 @@ #include "data.h" #include "types.h" -u16 *g_FrameBuffers[2]; +u16 *g_FrameBuffers[NUM_FRAMEBUFFERS]; void langInit(void) { diff --git a/src/game/playermgr.c b/src/game/playermgr.c index 6ada7291f..aad0d2c03 100644 --- a/src/game/playermgr.c +++ b/src/game/playermgr.c @@ -375,7 +375,7 @@ void playermgrAllocatePlayer(s32 index) g_Vars.players[index]->floorflags = 0; - for (i = 0; i < 2; i++) { + for (i = 0; i < ARRAYCOUNT(g_Vars.players[index]->viewport); i++) { g_Vars.players[index]->viewport[i].vp.vscale[0] = 640; g_Vars.players[index]->viewport[i].vp.vscale[1] = (PAL ? 544 : 480); g_Vars.players[index]->viewport[i].vp.vscale[2] = 511; diff --git a/src/game/room.c b/src/game/room.c index 8354a4446..51e889ac8 100644 --- a/src/game/room.c +++ b/src/game/room.c @@ -77,7 +77,7 @@ void roomFreeMtx(s32 index) roomUnlinkMtx(index, g_RoomMtxLinkedRooms[index]); } - g_RoomMtxAges[index] = 2; + g_RoomMtxAges[index] = NUM_GFXTASKS; g_RoomMtxBaseRooms[index] = -1; g_RoomMtxScales[index] = 1; } @@ -87,7 +87,7 @@ s32 roomAllocateMtx(void) s32 i; for (i = 0; i < g_RoomMtxNumSlots; i++) { - if (g_RoomMtxAges[i] >= 2 && g_RoomMtxBaseRooms[i] == -1) { + if (g_RoomMtxAges[i] >= NUM_GFXTASKS && g_RoomMtxBaseRooms[i] == -1) { return i; } } diff --git a/src/game/roomtick.c b/src/game/roomtick.c index d99c166fa..50b63c118 100644 --- a/src/game/roomtick.c +++ b/src/game/roomtick.c @@ -13,7 +13,7 @@ void roomsTick(void) if (g_RoomMtxBaseRooms[i] >= 0) { g_RoomMtxAges[i]++; - if (g_RoomMtxAges[i] > 1) { + if (g_RoomMtxAges[i] >= NUM_GFXTASKS) { roomFreeMtx(i); } } diff --git a/src/include/bss.h b/src/include/bss.h index a7c6d7217..7f81eb1f2 100644 --- a/src/include/bss.h +++ b/src/include/bss.h @@ -7,8 +7,8 @@ extern OSThread g_MainThread; extern OSMesgQueue g_MainMesgQueue; extern OSSched g_Sched; -extern OSViMode var8008dcc0[2]; -extern OSViMode *var8008dd60[2]; +extern OSViMode var8008dcc0[NUM_GFXTASKS]; +extern OSViMode *var8008dd60[NUM_GFXTASKS]; extern s32 var8008de08; extern s32 var8008de0c; extern s32 var8008de10; @@ -61,7 +61,7 @@ extern OSTimer __osEepromTimer; extern OSMesgQueue __osEepromTimerQ; extern OSMesg __osEepromTimerMsg; extern u32 var8009ca84; -extern u16 *g_FrameBuffers[2]; +extern u16 *g_FrameBuffers[NUM_FRAMEBUFFERS]; extern u8 var8009caec; extern u8 var8009caed; extern u8 var8009caee; diff --git a/src/include/constants.h b/src/include/constants.h index 18eddd6f6..c6cb8312c 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -2940,6 +2940,8 @@ #define NUM_CYCLEABLE_WEAPONS 45 #define NUM_EXPLOSIONTYPES 26 #define NUM_FIRESLOTS 20 +#define NUM_FRAMEBUFFERS 2 +#define NUM_GFXTASKS 2 #define NUM_MPBEAUHEADS 5 #define NUM_MPBOTCOMMANDS 14 #define NUM_MPBODIES 61 diff --git a/src/include/data.h b/src/include/data.h index e2c3605d8..ff4db24a0 100644 --- a/src/include/data.h +++ b/src/include/data.h @@ -11,9 +11,9 @@ extern u8 *g_StackLeftAddrs[7]; extern u8 *g_StackRightAddrs[7]; extern u8 *g_StackAllocatedPos; extern s32 var8005ce74; -extern f32 g_ViXScalesBySlot[2]; -extern f32 g_ViYScalesBySlot[2]; -extern bool g_SchedViModesPending[2]; +extern f32 g_ViXScalesBySlot[NUM_GFXTASKS]; +extern f32 g_ViYScalesBySlot[NUM_GFXTASKS]; +extern bool g_SchedViModesPending[NUM_GFXTASKS]; extern s32 g_ViUnblackTimer; extern s32 g_ViShakeDirection; extern s32 g_ViShakeIntensity; diff --git a/src/include/types.h b/src/include/types.h index 25d1bca58..398924eb9 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -2560,7 +2560,7 @@ struct player { /*0x0494*/ union modelrwdata *bondheadsave[30]; /*0x050c*/ u32 unk050c; /*0x0510*/ Mtxf bondheadmatrices[4]; - /*0x0610*/ Vp viewport[2]; + /*0x0610*/ Vp viewport[NUM_FRAMEBUFFERS]; /*0x0630*/ s16 viewwidth; // 320 lo-res, 640 hi-res /*0x0632*/ s16 viewheight; // 220 regardless of res /*0x0634*/ s16 viewleft; // 0 diff --git a/src/lib/main.c b/src/lib/main.c index 8f2ea9ee3..2907df57d 100644 --- a/src/lib/main.c +++ b/src/lib/main.c @@ -419,7 +419,7 @@ void mainInit(void) addr = K0BASE + 8 * 1024 * 1024; } - addr -= 640 * 480 * 2; // the framebuffer itself + addr -= 640 * 480 * NUM_FRAMEBUFFERS; // the framebuffer itself addr -= 0x40; // align down to a multiple of 0x40 fb = (u16 *) ALIGN64(PHYS_TO_K0(addr)); @@ -564,7 +564,7 @@ void mainInit(void) addr = K0BASE + 8 * 1024 * 1024; } - addr -= 640 * 480 * 2; // the framebuffer itself + addr -= 640 * 480 * NUM_FRAMEBUFFERS; // the framebuffer itself addr -= 0x40; // align down to a multiple of 0x40 fb = (u16 *) ALIGN64(PHYS_TO_K0(addr)); @@ -1413,7 +1413,7 @@ void mainTick(void) OSScMsg msg = {OS_SC_DONE_MSG}; s32 i; - if (g_MainChangeToStageNum < 0 && g_MainNumGfxTasks < 2) { + if (g_MainChangeToStageNum < 0 && g_MainNumGfxTasks < NUM_GFXTASKS) { frametimeCalculate(); profile00009a98(); profileReset(); diff --git a/src/lib/sched.c b/src/lib/sched.c index e0feac2a4..a0eec9f42 100644 --- a/src/lib/sched.c +++ b/src/lib/sched.c @@ -60,9 +60,9 @@ void __scExec(OSSched *sc, OSScTask *sp, OSScTask *dp); void __scYield(OSSched *s); s32 __scSchedule(OSSched *sc, OSScTask **sp, OSScTask **dp, s32 availRCP); -OSViMode var8008dcc0[2]; -OSViMode *var8008dd60[2]; -OSViMode var8008dd68[2]; +OSViMode var8008dcc0[NUM_GFXTASKS]; +OSViMode *var8008dd60[NUM_GFXTASKS]; +OSViMode var8008dd68[NUM_GFXTASKS]; s32 var8008de08; s32 var8008de0c; s32 var8008de10; @@ -82,10 +82,10 @@ u32 g_SchedCrashRenderInterval = 45000000; u32 g_SchedCrashLastRendered = 0; s32 var8005ce74 = 0; -f32 g_ViXScalesBySlot[2] = {1, 1}; -f32 g_ViYScalesBySlot[2] = {1, 1}; -bool g_SchedViModesPending[2] = {false, false}; -s32 g_ViUnblackTimer = 3; +f32 g_ViXScalesBySlot[NUM_GFXTASKS] = {1, 1}; +f32 g_ViYScalesBySlot[NUM_GFXTASKS] = {1, 1}; +bool g_SchedViModesPending[NUM_GFXTASKS] = {false, false}; +s32 g_ViUnblackTimer = NUM_FRAMEBUFFERS + 1; s32 g_ViShakeDirection = 1; s32 g_ViShakeIntensity = 0; s32 g_ViShakeTimer = 0; @@ -661,7 +661,7 @@ s32 __scTaskComplete(OSSched *sc, OSScTask *t) g_SchedViModesPending[1 - var8005ce74] = false; } - if (g_ViUnblackTimer != 0 && g_ViUnblackTimer < 3) { + if (g_ViUnblackTimer != 0 && g_ViUnblackTimer <= NUM_FRAMEBUFFERS) { g_ViUnblackTimer--; } diff --git a/src/lib/vi.c b/src/lib/vi.c index f9e856034..f44c64aad 100644 --- a/src/lib/vi.c +++ b/src/lib/vi.c @@ -28,7 +28,7 @@ u16 g_ViPerspScale; u8 g_ViFrontIndex; u8 g_ViBackIndex; -struct rend_vidat g_ViDataArray[] = { +struct rend_vidat g_ViDataArray[NUM_GFXTASKS] = { { 0, 0, 0, 0, FBALLOC_WIDTH_LO, FBALLOC_HEIGHT_LO, // x and y @@ -115,7 +115,7 @@ void viConfigureForCopyright(u16 *texturedata) { s32 i; - for (i = 0; i < 2; i++) { + for (i = 0; i < NUM_GFXTASKS; i++) { g_FrameBuffers[i] = texturedata; g_ViDataArray[i].x = 576; @@ -144,7 +144,7 @@ void viConfigureForLegal(void) { s32 i; - for (i = 0; i < 2; i++) { + for (i = 0; i < NUM_GFXTASKS; i++) { g_ViDataArray[i].x = FBALLOC_WIDTH_LO; g_ViDataArray[i].bufx = FBALLOC_WIDTH_LO; g_ViDataArray[i].viewx = FBALLOC_WIDTH_LO; @@ -187,10 +187,10 @@ void viReset(s32 stagenum) if (stagenum == STAGE_TITLE || stagenum == STAGE_TEST_OLD) { if (IS4MB()) { viSetMode(VIMODE_HI); - fbsize = (FBALLOC_WIDTH_LO * 2) * (FBALLOC_HEIGHT_LO * 2) * 2; + fbsize = (FBALLOC_WIDTH_LO * 2) * (FBALLOC_HEIGHT_LO * 2) * NUM_FRAMEBUFFERS; } else { viSetMode(VIMODE_HI); - fbsize = g_ViModeWidths[2] * g_ViModeHeights[2] * 2; + fbsize = g_ViModeWidths[2] * g_ViModeHeights[2] * NUM_FRAMEBUFFERS; } } else { viSetMode(VIMODE_LO); @@ -198,24 +198,24 @@ void viReset(s32 stagenum) if (1); fbsize = IS4MB() - ? FBALLOC_WIDTH_LO * FBALLOC_HEIGHT_LO * 2 - : FBALLOC_WIDTH_HI * FBALLOC_HEIGHT_HI * 2; + ? FBALLOC_WIDTH_LO * FBALLOC_HEIGHT_LO * NUM_FRAMEBUFFERS + : FBALLOC_WIDTH_HI * FBALLOC_HEIGHT_HI * NUM_FRAMEBUFFERS; if (IS4MB() && PLAYERCOUNT() == 2) { // 4MB 2-player: The viewports are 110px tall #if VERSION >= VERSION_NTSC_1_0 - fbsize = FBALLOC_WIDTH_LO * (FBALLOC_HEIGHT_LO / 2) * 2; + fbsize = FBALLOC_WIDTH_LO * (FBALLOC_HEIGHT_LO / 2) * NUM_FRAMEBUFFERS; #else - fbsize = SCREEN_320 * (SCREEN_240 / 2) * 2; + fbsize = SCREEN_320 * (SCREEN_240 / 2) * NUM_FRAMEBUFFERS; #endif g_Vars.fourmeg2player = true; } else if ((g_Vars.coopplayernum >= 0 || g_Vars.antiplayernum >= 0) && PLAYERCOUNT() == 2) { // PAL is using its correct size - fbsize = SCREEN_WIDTH_LO * SCREEN_HEIGHT_LO * 2; + fbsize = SCREEN_WIDTH_LO * SCREEN_HEIGHT_LO * NUM_FRAMEBUFFERS; } } - ptr = mempAlloc(fbsize * 2 + 0x40, MEMPOOL_STAGE); + ptr = mempAlloc(fbsize * sizeof(u16) + 0x40, MEMPOOL_STAGE); ptr = (u8 *)(((uintptr_t) ptr + 0x3f) & 0xffffffc0); @@ -238,14 +238,14 @@ void viReset(s32 stagenum) /** * If black is true, set the video output to black indefinitely. - * g_ViUnblackTimer is set to 3 which causes the timer to be paused. + * If black is false, unblack once all the framebuffers have been cycled through. * - * If black is false, set the timer to 2. This causes it to tick down once per - * frame and unblack once it reaches 0. + * The g_ViUnblackTimer value only ticks down when it's 2 or less, + * so passing true to this function makes it not tick. */ void viBlack(bool black) { - black += 2; + black += NUM_FRAMEBUFFERS; g_ViUnblackTimer = black; } @@ -1156,15 +1156,15 @@ void viUpdateMode(void) } // 908 - slot = (slot + 1) % 2; + slot = (slot + 1) % NUM_GFXTASKS; g_ViSlot = slot; g_RdpCurTask->framebuffer = g_ViIs16Bit ? g_ViBackData->fb : g_FrameBuffers[0]; prevdata = g_ViBackData; - g_ViFrontIndex = (g_ViFrontIndex + 1) % 2; - g_ViBackIndex = (g_ViBackIndex + 1) % 2; + g_ViFrontIndex = (g_ViFrontIndex + 1) % NUM_FRAMEBUFFERS; + g_ViBackIndex = (g_ViBackIndex + 1) % NUM_FRAMEBUFFERS; g_ViFrontData = g_ViDataArray + g_ViFrontIndex; g_ViBackData = g_ViDataArray + g_ViBackIndex;