/** * Copyright (c) 2026 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "dolphin.h" void displayInitDolphin(void) { VIDEO_Init(); DISPLAY.screenMode = VIDEO_GetPreferredMode(NULL); DISPLAY.frameBuffer[0] = MEM_K0_TO_K1( SYS_AllocateFramebuffer(DISPLAY.screenMode) ); DISPLAY.frameBuffer[1] = MEM_K0_TO_K1( SYS_AllocateFramebuffer(DISPLAY.screenMode) ); VIDEO_Configure(DISPLAY.screenMode); VIDEO_SetNextFramebuffer(DISPLAY.frameBuffer[DISPLAY.whichFrameBuffer]); // VIDEO_SetPostRetraceCallback(copy_buffers); VIDEO_SetBlack(FALSE); VIDEO_Flush(); VIDEO_WaitVSync(); if(DISPLAY.screenMode->viTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync(); DISPLAY.fifoBuffer = memalign(32, DISPLAY_FIFO_SIZE); memoryZero(DISPLAY.fifoBuffer, DISPLAY_FIFO_SIZE); GX_Init(DISPLAY.fifoBuffer, DISPLAY_FIFO_SIZE); // This seems to be mostly related to interlacing vs progressive GX_SetViewport( 0, 0, DISPLAY.screenMode->fbWidth, DISPLAY.screenMode->efbHeight, 0, 1 ); float_t yscale = GX_GetYScaleFactor( DISPLAY.screenMode->efbHeight, DISPLAY.screenMode->xfbHeight ); uint32_t xfbHeight = GX_SetDispCopyYScale(yscale); GX_SetScissor( 0, 0, DISPLAY.screenMode->fbWidth, DISPLAY.screenMode->efbHeight ); GX_SetDispCopySrc( 0, 0, DISPLAY.screenMode->fbWidth, DISPLAY.screenMode->efbHeight ); GX_SetDispCopyDst(DISPLAY.screenMode->fbWidth, xfbHeight); GX_SetCopyFilter( DISPLAY.screenMode->aa, DISPLAY.screenMode->sample_pattern, GX_TRUE, DISPLAY.screenMode->vfilter ); GX_SetFieldMode( DISPLAY.screenMode->field_rendering, ( (DISPLAY.screenMode->viHeight == 2 * DISPLAY.screenMode->xfbHeight) ? GX_ENABLE : GX_DISABLE ) ); // Setup cull modes GX_SetCullMode(GX_CULL_NONE); GX_SetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE); GX_CopyDisp(DISPLAY.frameBuffer[DISPLAY.whichFrameBuffer], GX_TRUE); GX_SetDispCopyGamma(GX_GM_1_0); GX_ClearVtxDesc(); GX_SetVtxDesc(GX_VA_POS, GX_INDEX16); GX_SetVtxDesc(GX_VA_CLR0, GX_INDEX16); GX_SetVtxDesc(GX_VA_TEX0, GX_INDEX16); GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_U8, 0); GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); } void displayDolphinSwap(void) { GX_DrawDone(); DISPLAY.whichFrameBuffer ^= 1; GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); GX_SetColorUpdate(GX_TRUE); GX_CopyDisp(DISPLAY.frameBuffer[DISPLAY.whichFrameBuffer], GX_TRUE); VIDEO_SetNextFramebuffer(DISPLAY.frameBuffer[DISPLAY.whichFrameBuffer]); VIDEO_Flush(); VIDEO_WaitVSync(); }