From bb82579d6ad316a40087020b8781f817ffd211c7 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 20 Jul 2018 17:16:58 -0700 Subject: [PATCH] GBA Video: Improve sprite cycle counting (fixes #1126) --- CHANGES | 1 + src/gba/renderers/software-obj.c | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 712a83b11..3c0389abe 100644 --- a/CHANGES +++ b/CHANGES @@ -9,6 +9,7 @@ Bugfixes: - GBA Serialize: Fix loading channel 3 volume (fixes mgba.io/i/1107) - GBA BIOS: Fix BitUnPack final byte - GB I/O: DMA register is R/W + - GBA Video: Improve sprite cycle counting (fixes mgba.io/i/1126) Misc: - FFmpeg: Support libswresample (fixes mgba.io/i/1120, mgba.io/b/123) diff --git a/src/gba/renderers/software-obj.c b/src/gba/renderers/software-obj.c index 397e84f48..a092a50e9 100644 --- a/src/gba/renderers/software-obj.c +++ b/src/gba/renderers/software-obj.c @@ -192,7 +192,6 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re if (GBAObjAttributesAIsTransformed(sprite->a)) { int totalWidth = width << GBAObjAttributesAGetDoubleSize(sprite->a); int totalHeight = height << GBAObjAttributesAGetDoubleSize(sprite->a); - renderer->spriteCyclesRemaining -= 10; struct GBAOAMMatrix mat; LOAD_16(mat.a, 0, &renderer->d.oam->mat[GBAObjAttributesBGetMatIndex(sprite->b)].a); LOAD_16(mat.b, 0, &renderer->d.oam->mat[GBAObjAttributesBGetMatIndex(sprite->b)].b); @@ -252,6 +251,7 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re if (outX < start || outX >= condition) { return 0; } + renderer->spriteCyclesRemaining -= 10; if (!GBAObjAttributesAIs256Color(sprite->a)) { palette = &palette[GBAObjAttributesCGetPalette(sprite->c) << 4]; @@ -272,7 +272,7 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re SPRITE_TRANSFORMED_LOOP(256, NORMAL); } } - if (x + totalWidth > VIDEO_HORIZONTAL_PIXELS) { + if (end == VIDEO_HORIZONTAL_PIXELS && x + totalWidth > VIDEO_HORIZONTAL_PIXELS) { renderer->spriteCyclesRemaining -= (x + totalWidth - VIDEO_HORIZONTAL_PIXELS) * 2; } } else { @@ -332,7 +332,7 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re SPRITE_NORMAL_LOOP(256, NORMAL); } } - if (x + width > VIDEO_HORIZONTAL_PIXELS) { + if (end == VIDEO_HORIZONTAL_PIXELS && x + width > VIDEO_HORIZONTAL_PIXELS) { renderer->spriteCyclesRemaining -= x + width - VIDEO_HORIZONTAL_PIXELS; } }