From 5ecd28cdc66b4c16bf228bf0717e65453bf6bf4e Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 5 Dec 2020 18:41:44 -0800 Subject: [PATCH] GBA Video: Fix palette when being initialized mid-frame --- include/mgba/internal/gba/renderers/gl.h | 2 +- src/gba/renderers/gl.c | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/include/mgba/internal/gba/renderers/gl.h b/include/mgba/internal/gba/renderers/gl.h index 2e0cc646c..2908e48d9 100644 --- a/include/mgba/internal/gba/renderers/gl.h +++ b/include/mgba/internal/gba/renderers/gl.h @@ -152,7 +152,7 @@ struct GBAVideoGLRenderer { GLuint paletteTex; uint16_t shadowPalette[GBA_VIDEO_VERTICAL_PIXELS][512]; int nextPalette; - int lastPalette; + int paletteDirtyScanlines; bool paletteDirty; GLuint vramTex; diff --git a/src/gba/renderers/gl.c b/src/gba/renderers/gl.c index 68e87c801..3969b4b05 100644 --- a/src/gba/renderers/gl.c +++ b/src/gba/renderers/gl.c @@ -931,7 +931,7 @@ void GBAVideoGLRendererReset(struct GBAVideoRenderer* renderer) { glRenderer->dispcnt = 0x0080; glRenderer->mosaic = 0; glRenderer->nextPalette = 0; - glRenderer->lastPalette = GBA_VIDEO_VERTICAL_PIXELS - 1; + glRenderer->paletteDirtyScanlines = GBA_VIDEO_VERTICAL_PIXELS; memset(glRenderer->shadowRegs, 0, sizeof(glRenderer->shadowRegs)); glRenderer->regsDirty = 0xFFFFFFFFFFFEULL; @@ -965,11 +965,7 @@ void GBAVideoGLRendererWritePalette(struct GBAVideoRenderer* renderer, uint32_t int g = M_G5(value) << 1; g |= g >> 5; int b = M_B5(value); - if (glRenderer->nextPalette) { - glRenderer->lastPalette = glRenderer->nextPalette - 1; - } else { - glRenderer->lastPalette = GBA_VIDEO_VERTICAL_PIXELS - 1; - } + glRenderer->paletteDirtyScanlines = GBA_VIDEO_VERTICAL_PIXELS; glRenderer->shadowPalette[glRenderer->nextPalette][address >> 1] = (r << 11) | (g << 5) | b; } @@ -1376,7 +1372,10 @@ void GBAVideoGLRendererDrawScanline(struct GBAVideoRenderer* renderer, int y) { } if (glRenderer->paletteDirty) { memcpy(glRenderer->shadowPalette[glRenderer->nextPalette], glRenderer->shadowPalette[oldPalette], sizeof(glRenderer->shadowPalette[0])); - if (glRenderer->nextPalette == glRenderer->lastPalette) { + if (glRenderer->paletteDirtyScanlines > 0) { + --glRenderer->paletteDirtyScanlines; + } + if (!glRenderer->paletteDirtyScanlines) { glRenderer->paletteDirty = false; glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, glRenderer->paletteTex);