Wii: Drawing polish (closes #988)

This commit is contained in:
Vicki Pfau 2018-03-22 20:38:18 -07:00
parent de514621e0
commit c623970d0f
2 changed files with 23 additions and 6 deletions

View File

@ -26,6 +26,7 @@ Bugfixes:
- Qt: Fix opening in fullscreen (fixes mgba.io/i/993) - Qt: Fix opening in fullscreen (fixes mgba.io/i/993)
- Python: Fix package directory - Python: Fix package directory
- GB Memory: Fix OAM DMA blocking regions (fixes mgba.io/i/1013) - GB Memory: Fix OAM DMA blocking regions (fixes mgba.io/i/1013)
- Wii: Fix various setup and teardown drawing issues (fixes mgba.io/i/988)
Misc: Misc:
- GBA: Improve multiboot image detection - GBA: Improve multiboot image detection
- GB MBC: Remove erroneous bank 0 wrapping - GB MBC: Remove erroneous bank 0 wrapping

View File

@ -190,18 +190,20 @@ static void reconfigureScreen(struct mGUIRunner* runner) {
free(framebuffer[0]); free(framebuffer[0]);
free(framebuffer[1]); free(framebuffer[1]);
framebuffer[0] = SYS_AllocateFramebuffer(vmode);
framebuffer[1] = SYS_AllocateFramebuffer(vmode);
VIDEO_SetBlack(true); VIDEO_SetBlack(true);
VIDEO_Configure(vmode); VIDEO_Configure(vmode);
framebuffer[0] = SYS_AllocateFramebuffer(vmode);
framebuffer[1] = SYS_AllocateFramebuffer(vmode);
VIDEO_ClearFrameBuffer(vmode, framebuffer[0], COLOR_BLACK);
VIDEO_ClearFrameBuffer(vmode, framebuffer[1], COLOR_BLACK);
VIDEO_SetNextFramebuffer(framebuffer[whichFb]); VIDEO_SetNextFramebuffer(framebuffer[whichFb]);
VIDEO_Flush(); VIDEO_Flush();
VIDEO_WaitVSync(); VIDEO_WaitVSync();
if (vmode->viTVMode & VI_NON_INTERLACE) { if (vmode->viTVMode & VI_NON_INTERLACE) {
VIDEO_WaitVSync(); VIDEO_WaitVSync();
} }
VIDEO_SetBlack(false);
GX_SetViewport(0, 0, vmode->fbWidth, vmode->efbHeight, 0, 1); GX_SetViewport(0, 0, vmode->fbWidth, vmode->efbHeight, 0, 1);
f32 yscale = GX_GetYScaleFactor(vmode->efbHeight, vmode->xfbHeight); f32 yscale = GX_GetYScaleFactor(vmode->efbHeight, vmode->xfbHeight);
@ -234,6 +236,9 @@ static void reconfigureScreen(struct mGUIRunner* runner) {
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
VIDEO_Init(); VIDEO_Init();
VIDEO_SetBlack(true);
VIDEO_Flush();
VIDEO_WaitVSync();
PAD_Init(); PAD_Init();
WPAD_Init(); WPAD_Init();
WPAD_SetDataFormat(0, WPAD_FMT_BTNS_ACC_IR); WPAD_SetDataFormat(0, WPAD_FMT_BTNS_ACC_IR);
@ -473,6 +478,10 @@ int main(int argc, char* argv[]) {
mGUIInit(&runner, "wii"); mGUIInit(&runner, "wii");
reconfigureScreen(&runner); reconfigureScreen(&runner);
// Make sure screen is properly initialized by drawing a blank frame
_drawStart();
_drawEnd();
_mapKey(&runner.params.keyMap, GCN1_INPUT, PAD_BUTTON_A, GUI_INPUT_SELECT); _mapKey(&runner.params.keyMap, GCN1_INPUT, PAD_BUTTON_A, GUI_INPUT_SELECT);
_mapKey(&runner.params.keyMap, GCN1_INPUT, PAD_BUTTON_B, GUI_INPUT_BACK); _mapKey(&runner.params.keyMap, GCN1_INPUT, PAD_BUTTON_B, GUI_INPUT_BACK);
_mapKey(&runner.params.keyMap, GCN1_INPUT, PAD_TRIGGER_Z, GUI_INPUT_CANCEL); _mapKey(&runner.params.keyMap, GCN1_INPUT, PAD_TRIGGER_Z, GUI_INPUT_CANCEL);
@ -508,6 +517,9 @@ int main(int argc, char* argv[]) {
} else { } else {
mGUIRunloop(&runner); mGUIRunloop(&runner);
} }
VIDEO_SetBlack(true);
VIDEO_Flush();
VIDEO_WaitVSync();
mGUIDeinit(&runner); mGUIDeinit(&runner);
free(fifo); free(fifo);
@ -534,6 +546,8 @@ static void _audioDMA(void) {
} }
static void _drawStart(void) { static void _drawStart(void) {
VIDEO_SetBlack(false);
u32 level = 0; u32 level = 0;
_CPU_ISR_Disable(level); _CPU_ISR_Disable(level);
if (referenceRetraceCount > retraceCount) { if (referenceRetraceCount > retraceCount) {
@ -551,12 +565,11 @@ static void _drawStart(void) {
} }
static void _drawEnd(void) { static void _drawEnd(void) {
whichFb = !whichFb;
GX_CopyDisp(framebuffer[whichFb], GX_TRUE); GX_CopyDisp(framebuffer[whichFb], GX_TRUE);
GX_DrawDone(); GX_DrawDone();
VIDEO_SetNextFramebuffer(framebuffer[whichFb]); VIDEO_SetNextFramebuffer(framebuffer[whichFb]);
VIDEO_Flush(); VIDEO_Flush();
whichFb = !whichFb;
u32 level = 0; u32 level = 0;
_CPU_ISR_Disable(level); _CPU_ISR_Disable(level);
@ -701,6 +714,9 @@ void _gameUnloaded(struct mGUIRunner* runner) {
UNUSED(runner); UNUSED(runner);
AUDIO_StopDMA(); AUDIO_StopDMA();
frameLimiter = true; frameLimiter = true;
VIDEO_SetBlack(true);
VIDEO_Flush();
VIDEO_WaitVSync();
} }
void _gameLoaded(struct mGUIRunner* runner) { void _gameLoaded(struct mGUIRunner* runner) {