From 669fb5232b672aca39e48b32cf44c7a021ca7b91 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 28 Sep 2021 12:49:39 -0700 Subject: [PATCH] GBA Video: Improve BG enable latching --- src/gba/renderers/video-software.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/gba/renderers/video-software.c b/src/gba/renderers/video-software.c index d9f8904e2..cd4bfc0e4 100644 --- a/src/gba/renderers/video-software.c +++ b/src/gba/renderers/video-software.c @@ -635,19 +635,19 @@ static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* render } } - if (softwareRenderer->bg[0].enabled > 0 && softwareRenderer->bg[0].enabled < 4) { + if (softwareRenderer->bg[0].enabled != 0 && softwareRenderer->bg[0].enabled < 4) { ++softwareRenderer->bg[0].enabled; DIRTY_SCANLINE(softwareRenderer, y); } - if (softwareRenderer->bg[1].enabled > 0 && softwareRenderer->bg[1].enabled < 4) { + if (softwareRenderer->bg[1].enabled != 0 && softwareRenderer->bg[1].enabled < 4) { ++softwareRenderer->bg[1].enabled; DIRTY_SCANLINE(softwareRenderer, y); } - if (softwareRenderer->bg[2].enabled > 0 && softwareRenderer->bg[2].enabled < 4) { + if (softwareRenderer->bg[2].enabled != 0 && softwareRenderer->bg[2].enabled < 4) { ++softwareRenderer->bg[2].enabled; DIRTY_SCANLINE(softwareRenderer, y); } - if (softwareRenderer->bg[3].enabled > 0 && softwareRenderer->bg[3].enabled < 4) { + if (softwareRenderer->bg[3].enabled != 0 && softwareRenderer->bg[3].enabled < 4) { ++softwareRenderer->bg[3].enabled; DIRTY_SCANLINE(softwareRenderer, y); } @@ -725,7 +725,11 @@ static void GBAVideoSoftwareRendererPutPixels(struct GBAVideoRenderer* renderer, static void _enableBg(struct GBAVideoSoftwareRenderer* renderer, int bg, bool active) { int wasActive = renderer->bg[bg].enabled; if (!active) { - renderer->bg[bg].enabled = 0; + if (renderer->nextY == 0 || (wasActive > 0 && wasActive < 4)) { + renderer->bg[bg].enabled = 0; + } else if (wasActive == 4) { + renderer->bg[bg].enabled = -2; + } } else if (!wasActive && active) { if (renderer->nextY == 0) { // TODO: Investigate in more depth how switching background works in different modes @@ -735,6 +739,8 @@ static void _enableBg(struct GBAVideoSoftwareRenderer* renderer, int bg, bool ac } else { renderer->bg[bg].enabled = 1; } + } else if (wasActive < 0 && active) { + renderer->bg[bg].enabled = 4; } }