From 82c06bb42e7874bfc658a58d4a12be8230ac055d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 5 Aug 2020 01:51:47 -0700 Subject: [PATCH] DS Video: Use separate value for maximum sprite cycles (fixes #624) --- CHANGES | 1 + src/ds/renderers/software.c | 1 + src/gba/renderers/video-software.c | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 91ccf4a30..e117252bb 100644 --- a/CHANGES +++ b/CHANGES @@ -23,6 +23,7 @@ Bugfixes: - DS Video: Fix size of VRAM zeroes buffer - DS GX: Fix depth test scaling - DS GX: Fix overflow causing a division crash + - DS Video: Use separate value for maximum sprite cycles (fixes mgba.io/i/624) Misc: - ARM: Add F-block instruction decoding - DS GX: Clean up and unify texture mapping diff --git a/src/ds/renderers/software.c b/src/ds/renderers/software.c index ad5552022..196401671 100644 --- a/src/ds/renderers/software.c +++ b/src/ds/renderers/software.c @@ -400,6 +400,7 @@ static void DSVideoSoftwareRendererDrawGBAScanline(struct GBAVideoRenderer* rend } GBAVideoSoftwareRendererPreprocessBuffer(softwareRenderer, y); + softwareRenderer->spriteCyclesRemaining = 1530; // TODO: Figure out the actual value; this value is just a fudge factor for now int spriteLayers = GBAVideoSoftwareRendererPreprocessSpriteLayer(softwareRenderer, y); memset(softwareRenderer->alphaA, softwareRenderer->blda, sizeof(softwareRenderer->alphaA)); memset(softwareRenderer->alphaB, softwareRenderer->bldb, sizeof(softwareRenderer->alphaB)); diff --git a/src/gba/renderers/video-software.c b/src/gba/renderers/video-software.c index 7a5910c1b..8770c8a79 100644 --- a/src/gba/renderers/video-software.c +++ b/src/gba/renderers/video-software.c @@ -582,6 +582,7 @@ static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* render } GBAVideoSoftwareRendererPreprocessBuffer(softwareRenderer, y); + softwareRenderer->spriteCyclesRemaining = GBARegisterDISPCNTIsHblankIntervalFree(softwareRenderer->dispcnt) ? OBJ_HBLANK_FREE_LENGTH : OBJ_LENGTH; int spriteLayers = GBAVideoSoftwareRendererPreprocessSpriteLayer(softwareRenderer, y); softwareRenderer->d.vramOBJ[0] = objVramBase; if (softwareRenderer->lastHighlightAmount != softwareRenderer->d.highlightAmount) { @@ -959,7 +960,6 @@ int GBAVideoSoftwareRendererPreprocessSpriteLayer(struct GBAVideoSoftwareRendere renderer->oamMax = GBAVideoRendererCleanOAM(renderer->d.oam->obj, renderer->sprites, renderer->objOffsetY, renderer->masterHeight, renderer->combinedObjSort); renderer->oamDirty = false; } - renderer->spriteCyclesRemaining = GBARegisterDISPCNTIsHblankIntervalFree(renderer->dispcnt) ? OBJ_HBLANK_FREE_LENGTH : OBJ_LENGTH; int mosaicV = GBAMosaicControlGetObjV(renderer->mosaic) + 1; int mosaicY = y - (y % mosaicV); int i;