diff --git a/CHANGES b/CHANGES index 3cbbde329..4a5e142d7 100644 --- a/CHANGES +++ b/CHANGES @@ -14,6 +14,7 @@ Emulation fixes: - GB I/O: Filter IE top bits properly (fixes mgba.io/i/1329) - GBA Video: Fix scanline cache with scale factor change edge cases - GBA DMA: Fix DMA0-2 lengths (fixes mgba.io/i/1344) + - GB Video: Fix window y changing mid-window (fixes mgba.io/i/1345) Other fixes: - Qt: More app metadata fixes - Qt: Fix load recent from archive (fixes mgba.io/i/1325) diff --git a/cinema/gb/window/ccmmr-hud/baseline_0000.png b/cinema/gb/window/ccmmr-hud/baseline_0000.png new file mode 100644 index 000000000..75fc1974e Binary files /dev/null and b/cinema/gb/window/ccmmr-hud/baseline_0000.png differ diff --git a/cinema/gb/window/ccmmr-hud/baseline_0001.png b/cinema/gb/window/ccmmr-hud/baseline_0001.png new file mode 100644 index 000000000..75fc1974e Binary files /dev/null and b/cinema/gb/window/ccmmr-hud/baseline_0001.png differ diff --git a/cinema/gb/window/ccmmr-hud/baseline_0002.png b/cinema/gb/window/ccmmr-hud/baseline_0002.png new file mode 100644 index 000000000..75fc1974e Binary files /dev/null and b/cinema/gb/window/ccmmr-hud/baseline_0002.png differ diff --git a/cinema/gb/window/ccmmr-hud/baseline_0003.png b/cinema/gb/window/ccmmr-hud/baseline_0003.png new file mode 100644 index 000000000..b64e44668 Binary files /dev/null and b/cinema/gb/window/ccmmr-hud/baseline_0003.png differ diff --git a/cinema/gb/window/ccmmr-hud/baseline_0004.png b/cinema/gb/window/ccmmr-hud/baseline_0004.png new file mode 100644 index 000000000..b64e44668 Binary files /dev/null and b/cinema/gb/window/ccmmr-hud/baseline_0004.png differ diff --git a/cinema/gb/window/ccmmr-hud/baseline_0005.png b/cinema/gb/window/ccmmr-hud/baseline_0005.png new file mode 100644 index 000000000..9209c6402 Binary files /dev/null and b/cinema/gb/window/ccmmr-hud/baseline_0005.png differ diff --git a/cinema/gb/window/ccmmr-hud/test.mvl b/cinema/gb/window/ccmmr-hud/test.mvl new file mode 100644 index 000000000..ced08c1d9 Binary files /dev/null and b/cinema/gb/window/ccmmr-hud/test.mvl differ diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index 4b1517ae0..169dadf74 100644 --- a/src/gb/renderers/software.c +++ b/src/gb/renderers/software.c @@ -220,15 +220,15 @@ static void GBVideoSoftwareRendererDeinit(struct GBVideoRenderer* renderer) { UNUSED(softwareRenderer); } -static void GBVideoSoftwareRendererUpdateWindow(struct GBVideoSoftwareRenderer* renderer, bool before, bool after) { - if (renderer->lastY >= GB_VIDEO_VERTICAL_PIXELS || after == before) { +static void GBVideoSoftwareRendererUpdateWindow(struct GBVideoSoftwareRenderer* renderer, bool before, bool after, uint8_t oldWy) { + if (renderer->lastY >= GB_VIDEO_VERTICAL_PIXELS || !(after || before)) { return; } if (renderer->lastY >= renderer->wy) { if (!after) { renderer->currentWy -= renderer->lastY; renderer->hasWindow = true; - } else { + } else if (!before) { if (!renderer->hasWindow) { if (renderer->lastY > renderer->wy) { renderer->currentWy = GB_VIDEO_VERTICAL_PIXELS; @@ -241,6 +241,8 @@ static void GBVideoSoftwareRendererUpdateWindow(struct GBVideoSoftwareRenderer* } else { renderer->currentWy += renderer->lastY; } + } else if (renderer->wy != oldWy) { + renderer->currentWy += oldWy - renderer->wy; } } } @@ -251,10 +253,11 @@ static uint8_t GBVideoSoftwareRendererWriteVideoRegister(struct GBVideoRenderer* GBVideoCacheWriteVideoRegister(renderer->cache, address, value); } bool wasWindow = _inWindow(softwareRenderer); + uint8_t wy = softwareRenderer->wy; switch (address) { case REG_LCDC: softwareRenderer->lcdc = value; - GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer)); + GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer), wy); break; case REG_SCY: softwareRenderer->scy = value; @@ -264,11 +267,11 @@ static uint8_t GBVideoSoftwareRendererWriteVideoRegister(struct GBVideoRenderer* break; case REG_WY: softwareRenderer->wy = value; - GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer)); + GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer), wy); break; case REG_WX: softwareRenderer->wx = value; - GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer)); + GBVideoSoftwareRendererUpdateWindow(softwareRenderer, wasWindow, _inWindow(softwareRenderer), wy); break; case REG_BGP: softwareRenderer->lookup[0] = value & 3;