GBA Video: Optimize when BLD* registers are written frequently

This commit is contained in:
Vicki Pfau 2017-02-03 16:50:05 -08:00
parent ee5dbd9f82
commit 1bb496d0fe
3 changed files with 15 additions and 5 deletions

View File

@ -63,6 +63,7 @@ Misc:
- GBA, GB: ROM is now unloaded if a patch is applied
- Util: Add 8-bit PNG write support
- Qt: Rename "Resample video" option to "Bilinear filtering"
- GBA Video: Optimize when BLD* registers are written frequently
0.5.2: (2016-12-31)
Bugfixes:

View File

@ -126,6 +126,7 @@ struct GBAVideoSoftwareRenderer {
unsigned target1Bd;
unsigned target2Obj;
unsigned target2Bd;
bool blendDirty;
enum BlendEffect blendEffect;
color_t normalPalette[512];
color_t variantPalette[512];

View File

@ -97,6 +97,7 @@ static void GBAVideoSoftwareRendererReset(struct GBAVideoRenderer* renderer) {
LOAD_16(entry, i, softwareRenderer->d.palette);
GBAVideoSoftwareRendererWritePalette(renderer, i, entry);
}
softwareRenderer->blendDirty = false;
_updatePalettes(softwareRenderer);
softwareRenderer->blda = 0;
@ -261,11 +262,14 @@ static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRender
value &= 0x1F1F;
break;
case REG_BLDY:
softwareRenderer->bldy = value & 0x1F;
if (softwareRenderer->bldy > 0x10) {
softwareRenderer->bldy = 0x10;
value &= 0x1F;
if (value > 0x10) {
value = 0x10;
}
if (softwareRenderer->bldy != value) {
softwareRenderer->bldy = value;
softwareRenderer->blendDirty = true;
}
_updatePalettes(softwareRenderer);
break;
case REG_WIN0H:
softwareRenderer->winN[0].h.end = value;
@ -515,6 +519,10 @@ static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* render
}
GBAVideoSoftwareRendererUpdateDISPCNT(softwareRenderer);
if (softwareRenderer->blendDirty) {
_updatePalettes(softwareRenderer);
softwareRenderer->blendDirty = false;
}
int w;
x = 0;
@ -702,7 +710,7 @@ static void GBAVideoSoftwareRendererWriteBLDCNT(struct GBAVideoSoftwareRenderer*
renderer->target2Bd = GBARegisterBLDCNTGetTarget2Bd(value);
if (oldEffect != renderer->blendEffect) {
_updatePalettes(renderer);
renderer->blendDirty = true;
}
}