Fix Framebuffer and ZBuffer things (#25)

* fix the framebuffers and zbuffers

* set some extra save context on load
This commit is contained in:
Archez
2024-05-22 09:04:57 -05:00
committed by Garrett Cox
parent 9f7414bd00
commit c6a114e8d5
10 changed files with 37 additions and 32 deletions
+1
View File
@@ -109,6 +109,7 @@
// #region 2S2H [Port]
// Compute 0x0E segment value as compile time constant for 32bit and 64bit
#define D_0E000000_TO_SEGMENTED(member) ((0x0E000000 + offsetof(GfxMasterList, member)) | 1)
#define D_0F000000_TO_SEGMENTED (0x0F000000 | 1)
// #endregion
#endif // MACROS_H
+6 -6
View File
@@ -20,14 +20,14 @@ extern void* gWorkBuffer;
extern u64* gGfxSPTaskOutputBufferPtr;
extern void* gGfxSPTaskOutputBufferEnd;
extern u16 (*gZBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
extern u16 (*gWorkBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
extern u64 (*gGfxSPTaskOutputBufferLoRes)[0x3000];
extern u16* gZBufferLoRes[SCREEN_WIDTH * SCREEN_HEIGHT];
extern u16* gWorkBufferLoRes[SCREEN_WIDTH * SCREEN_HEIGHT];
extern u64* gGfxSPTaskOutputBufferLoRes[0x3000];
extern void* gGfxSPTaskOutputBufferEndLoRes;
extern u16 (*gZBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
extern u16 (*gWorkBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
extern u64 (*gGfxSPTaskOutputBufferHiRes)[0x3000];
extern u16* gZBufferHiRes[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
extern u16* gWorkBufferHiRes[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
extern u64* gGfxSPTaskOutputBufferHiRes[0x3000];
extern void* gGfxSPTaskOutputBufferEndHiRes;
extern s16 gCfbWidth;
extern s16 gCfbHeight;
+4 -1
View File
@@ -357,6 +357,9 @@ void Graph_Update(GraphicsContext* gfxCtx, GameState* gameState) {
CHECK_BTN_ALL(gameState->input[0].cur.button, BTN_L | BTN_R)) {
STOP_GAMESTATE(gameState);
gSaveContext.gameMode = GAMEMODE_NORMAL;
gSaveContext.nextDayTime = NEXT_TIME_NONE;
gSaveContext.nextTransitionType = TRANS_NEXT_TYPE_DEFAULT;
gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL;
SET_NEXT_GAMESTATE(gameState, MapSelect_Init, sizeof(MapSelectState));
}
}
@@ -386,7 +389,7 @@ void RunFrame() {
}
runFrameContext.nextOvl = &gGameStateOverlayTable[0];
SysCfb_Init();
Graph_Init(&runFrameContext.gfxCtx);
while (runFrameContext.nextOvl) {
runFrameContext.ovl = runFrameContext.nextOvl;
+11 -11
View File
@@ -14,16 +14,16 @@ void* gGfxSPTaskOutputBufferEnd;
void* sCfbLoRes1;
void* sCfbLoRes0;
u16 (*gZBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
u16 (*gWorkBufferLoRes)[SCREEN_WIDTH * SCREEN_HEIGHT];
u64 (*gGfxSPTaskOutputBufferLoRes)[0x3000];
u16* gZBufferLoRes[SCREEN_WIDTH * SCREEN_HEIGHT];
u16* gWorkBufferLoRes[SCREEN_WIDTH * SCREEN_HEIGHT];
u64* gGfxSPTaskOutputBufferLoRes[0x3000];
void* gGfxSPTaskOutputBufferEndLoRes;
void* sCfbHiRes1;
void* sCfbHiRes0;
u16 (*gZBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
u16 (*gWorkBufferHiRes)[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
u64 (*gGfxSPTaskOutputBufferHiRes)[0x3000];
u16* gZBufferHiRes[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
u16* gWorkBufferHiRes[HIRES_BUFFER_WIDTH * HIRES_BUFFER_HEIGHT];
u64* gGfxSPTaskOutputBufferHiRes[0x3000];
void* gGfxSPTaskOutputBufferEndHiRes;
s16 gCfbWidth;
@@ -46,9 +46,9 @@ extern u16 gFramebufferHiRes1[HIRES_BUFFER_WIDTH][HIRES_BUFFER_HEIGHT];
void SysCfb_SetLoResMode(void) {
gFramebuffers[1] = sCfbLoRes1;
gFramebuffers[0] = sCfbLoRes0;
gZBufferPtr = *gZBufferLoRes;
gZBufferPtr = gZBufferLoRes;
gWorkBuffer = gWorkBufferLoRes;
gGfxSPTaskOutputBufferPtr = *gGfxSPTaskOutputBufferLoRes;
gGfxSPTaskOutputBufferPtr = gGfxSPTaskOutputBufferLoRes;
gGfxSPTaskOutputBufferEnd = gGfxSPTaskOutputBufferEndLoRes;
gCfbWidth = SCREEN_WIDTH;
gCfbHeight = SCREEN_HEIGHT;
@@ -63,9 +63,9 @@ void SysCfb_SetLoResMode(void) {
void SysCfb_SetHiResMode(void) {
gFramebuffers[1] = sCfbHiRes1;
gFramebuffers[0] = sCfbHiRes0;
gZBufferPtr = *gZBufferHiRes;
gZBufferPtr = gZBufferHiRes;
gWorkBuffer = gWorkBufferHiRes;
gGfxSPTaskOutputBufferPtr = *gGfxSPTaskOutputBufferHiRes;
gGfxSPTaskOutputBufferPtr = gGfxSPTaskOutputBufferHiRes;
gGfxSPTaskOutputBufferEnd = gGfxSPTaskOutputBufferEndHiRes;
if (1) {}
gCfbWidth = HIRES_BUFFER_WIDTH;
@@ -75,7 +75,7 @@ void SysCfb_SetHiResMode(void) {
gScreenWidth = gCfbWidth;
gScreenHeight = gCfbHeight;
if ((gCfbWidth == SCREEN_WIDTH_HIRES) && (gCfbHeight == SCREEN_HEIGHT_HIRES)) {
//gActiveViMode = &osViModeNtscHpf1;
// gActiveViMode = &osViModeNtscHpf1;
} else {
s32 rightAdjust;
s32 lowerAdjust;
+2 -4
View File
@@ -1231,15 +1231,13 @@ void Play_DrawMain(PlayState* this) {
SET_FULLSCREEN_VIEWPORT(&spA8);
View_ApplyTo(&spA8, &sp218);
// BENTODO: incorrect render
// this->transitionCtx.draw(&this->transitionCtx.instanceData, &sp218);
this->transitionCtx.draw(&this->transitionCtx.instanceData, &sp218);
}
TransitionFade_Draw(&this->unk_18E48, &sp218);
// BENTODO: fill framebuffer?
if (gVisMonoColor.a != 0) {
sPlayVisMono.primColor.rgba = gVisMonoColor.rgba;
// VisMono_Draw(&sPlayVisMono, &sp218);
VisMono_Draw(&sPlayVisMono, &sp218);
}
gSPEndDisplayList(sp218++);
+4 -4
View File
@@ -1462,11 +1462,11 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
gSPDisplayList(&masterGfx[1], sFillSetupDL);
gDPSetColorImage(&masterGfx[2], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000);
gDPSetColorImage(&masterGfx[2], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000_TO_SEGMENTED);
if (zbuffer != NULL) {
gDPSetDepthImage(&masterGfx[3], zbuffer);
} else {
gDPSetDepthImage(&masterGfx[3], D_0F000000);
gDPSetDepthImage(&masterGfx[3], D_0F000000_TO_SEGMENTED);
}
gSPEndDisplayList(&masterGfx[4]);
@@ -1492,7 +1492,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
gSPDisplayList(&masterGfx[5], D_0E000000_TO_SEGMENTED(clearFillRect));
gDPSetColorImage(&masterGfx[6], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000);
gDPSetColorImage(&masterGfx[6], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000_TO_SEGMENTED);
gSPEndDisplayList(&masterGfx[7]);
}
@@ -1500,7 +1500,7 @@ void func_8012CF0C(GraphicsContext* gfxCtx, s32 clearFb, s32 clearZb, u8 r, u8 g
masterGfx = gGfxMasterDL->clearFrameBuffer;
gDPSetColorImage(&masterGfx[0], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000);
gDPSetColorImage(&masterGfx[0], G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000_TO_SEGMENTED);
gDPSetCycleType(&masterGfx[1], G_CYC_FILL);
gDPSetRenderMode(&masterGfx[2], G_RM_NOOP, G_RM_NOOP2);
gDPSetFillColor(&masterGfx[3], (GPACK_RGBA5551(r, g, b, 1) << 16) | GPACK_RGBA5551(r, g, b, 1));
+3 -3
View File
@@ -53,7 +53,7 @@ void VisFbuf_DrawBgToColorImage(Gfx** gfxP, uObjBg* bg, void* img, s32 width, s3
gDPPipeSync(gfx++);
// Reset the color image and scissor to frame's defaults
gDPSetColorImage(gfx++, G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000);
gDPSetColorImage(gfx++, G_IM_FMT_RGBA, G_IM_SIZ_16b, gCfbWidth, D_0F000000_TO_SEGMENTED);
gSPDisplayList(gfx++, D_0E000000_TO_SEGMENTED(setScissor));
*gfxP = gfx;
@@ -312,11 +312,11 @@ void VisFbuf_Draw(VisFbuf* this, Gfx** gfxP, void* img) {
switch (this->mode) {
case VIS_FBUF_MODE_GENERAL:
VisFbuf_DrawGeneral(this, &gfx, D_0F000000, img, gScreenWidth, gScreenHeight);
VisFbuf_DrawGeneral(this, &gfx, D_0F000000_TO_SEGMENTED, img, gScreenWidth, gScreenHeight);
break;
case VIS_FBUF_MODE_INTERPOLATE:
VisFbuf_DrawInterpolate(this, &gfx, D_0F000000, gScreenWidth, gScreenHeight);
VisFbuf_DrawInterpolate(this, &gfx, D_0F000000_TO_SEGMENTED, gScreenWidth, gScreenHeight);
break;
default:
+1 -1
View File
@@ -68,7 +68,7 @@ void VisMono_DesaturateTLUT(u16* tlut) {
Gfx* VisMono_DesaturateDList(Gfx* gfx) {
s32 y;
s32 height = VISMONO_CFBFRAG_HEIGHT;
u16* cfbFrag = D_0F000000;
u16* cfbFrag = D_0F000000_TO_SEGMENTED;
gDPPipeSync(gfx++);
// `G_TT_IA16`: use color-indexed images, and IA16 palettes
@@ -94,7 +94,7 @@ void TransitionWipe5_Draw(void* thisx, Gfx** gfxP) {
G_AD_PATTERN | G_CD_MAGICSQ | G_CK_NONE | G_TC_CONV | G_TF_POINT | G_TT_NONE | G_TL_TILE |
G_TD_CLAMP | G_TP_NONE | G_CYC_COPY | G_PM_NPRIMITIVE,
G_AC_NONE | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2);
VisFbuf_SetBgSimple(&gfx, D_0F000000, workBuffer, width, height, VIS_FBUF_BG_CYC_COPY);
VisFbuf_SetBgSimple(&gfx, D_0F000000_TO_SEGMENTED, workBuffer, width, height, VIS_FBUF_BG_CYC_COPY);
} else {
if (alpha == 255) {
gDPSetOtherMode(gfx++,
@@ -110,7 +110,7 @@ void TransitionWipe5_Draw(void* thisx, Gfx** gfxP) {
gDPSetEnvColor(gfx++, 255, 255, 255, alpha);
gDPSetCombineLERP(gfx++, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0, ENVIRONMENT, TEXEL0, 0, ENVIRONMENT, 0, 0, 0, 0,
ENVIRONMENT);
VisFbuf_SetBgSimple(&gfx, workBuffer, D_0F000000, width, height, VIS_FBUF_BG_CYC_1CYC);
VisFbuf_SetBgSimple(&gfx, workBuffer, D_0F000000_TO_SEGMENTED, width, height, VIS_FBUF_BG_CYC_1CYC);
}
gDPPipeSync(gfx++);
gSPLoadUcode(gfx++, SysUcode_GetUCode(), SysUcode_GetUCodeData());
@@ -145,6 +145,9 @@ void ConsoleLogo_Main(GameState* thisx) {
// #region 2S2H [Debug] Eventually we'll get rid of this
if (CVarGetInteger("gDebugEnabled", 0)) {
gSaveContext.gameMode = GAMEMODE_NORMAL;
gSaveContext.nextDayTime = NEXT_TIME_NONE;
gSaveContext.nextTransitionType = TRANS_NEXT_TYPE_DEFAULT;
gSaveContext.prevHudVisibility = HUD_VISIBILITY_ALL;
SET_NEXT_GAMESTATE(&this->state, MapSelect_Init, sizeof(MapSelectState));
// #endregion
} else {