GBA Video: Clean up flag calculation

This commit is contained in:
Vicki Pfau 2022-01-30 14:29:52 -08:00
parent 16125e8623
commit 16df8fe957
4 changed files with 70 additions and 23 deletions

View File

@ -40,6 +40,9 @@ struct GBAVideoSoftwareBackground {
int32_t sy; int32_t sy;
int yCache; int yCache;
uint16_t mapCache[64]; uint16_t mapCache[64];
uint32_t flags;
uint32_t objwinFlags;
bool variant;
int32_t offsetX; int32_t offsetX;
int32_t offsetY; int32_t offsetY;
bool highlight; bool highlight;

View File

@ -517,19 +517,12 @@ void GBAVideoSoftwareRendererDrawBackgroundMode0(struct GBAVideoSoftwareRenderer
unsigned xBase; unsigned xBase;
uint32_t flags = (background->priority << OFFSET_PRIORITY) | (background->index << OFFSET_INDEX) | FLAG_IS_BACKGROUND; uint32_t flags = background->flags;
flags |= FLAG_TARGET_2 * background->target2; uint32_t objwinFlags = background->objwinFlags;
int objwinFlags = FLAG_TARGET_1 * (background->target1 && renderer->blendEffect == BLEND_ALPHA && GBAWindowControlIsBlendEnable(renderer->objwin.packed)); bool variant = background->variant;
objwinFlags |= flags;
flags |= FLAG_TARGET_1 * (background->target1 && renderer->blendEffect == BLEND_ALPHA && GBAWindowControlIsBlendEnable(renderer->currentWindow.packed));
if (renderer->blendEffect == BLEND_ALPHA && renderer->blda == 0x10 && renderer->bldb == 0) {
flags &= ~(FLAG_TARGET_1 | FLAG_TARGET_2);
objwinFlags &= ~(FLAG_TARGET_1 | FLAG_TARGET_2);
}
uint32_t screenBase; uint32_t screenBase;
uint32_t charBase; uint32_t charBase;
int variant = background->target1 && GBAWindowControlIsBlendEnable(renderer->currentWindow.packed) && (renderer->blendEffect == BLEND_BRIGHTEN || renderer->blendEffect == BLEND_DARKEN);
color_t* mainPalette = renderer->normalPalette; color_t* mainPalette = renderer->normalPalette;
if (renderer->d.highlightAmount && background->highlight) { if (renderer->d.highlightAmount && background->highlight) {
mainPalette = renderer->highlightPalette; mainPalette = renderer->highlightPalette;

View File

@ -189,19 +189,9 @@ static inline void _compositeNoBlendNoObjwin(struct GBAVideoSoftwareRenderer* re
localY += background->sy + startX * background->dy; \ localY += background->sy + startX * background->dy; \
} \ } \
\ \
uint32_t flags = (background->priority << OFFSET_PRIORITY) | (background->index << OFFSET_INDEX) | FLAG_IS_BACKGROUND; \ uint32_t flags = background->flags; \
flags |= FLAG_TARGET_2 * background->target2; \ uint32_t objwinFlags = background->objwinFlags; \
int objwinFlags = FLAG_TARGET_1 * (background->target1 && renderer->blendEffect == BLEND_ALPHA && \ bool variant = background->variant; \
GBAWindowControlIsBlendEnable(renderer->objwin.packed)); \
objwinFlags |= flags; \
flags |= FLAG_TARGET_1 * (background->target1 && renderer->blendEffect == BLEND_ALPHA && \
GBAWindowControlIsBlendEnable(renderer->currentWindow.packed)); \
if (renderer->blendEffect == BLEND_ALPHA && renderer->blda == 0x10 && renderer->bldb == 0) { \
flags &= ~(FLAG_TARGET_1 | FLAG_TARGET_2); \
objwinFlags &= ~(FLAG_TARGET_1 | FLAG_TARGET_2); \
} \
int variant = background->target1 && GBAWindowControlIsBlendEnable(renderer->currentWindow.packed) && \
(renderer->blendEffect == BLEND_BRIGHTEN || renderer->blendEffect == BLEND_DARKEN); \
color_t* palette = renderer->normalPalette; \ color_t* palette = renderer->normalPalette; \
if (renderer->d.highlightAmount && background->highlight) { \ if (renderer->d.highlightAmount && background->highlight) { \
palette = renderer->highlightPalette; \ palette = renderer->highlightPalette; \

View File

@ -40,6 +40,7 @@ static void GBAVideoSoftwareRendererPostprocessBuffer(struct GBAVideoSoftwareRen
static int GBAVideoSoftwareRendererPreprocessSpriteLayer(struct GBAVideoSoftwareRenderer* renderer, int y); static int GBAVideoSoftwareRendererPreprocessSpriteLayer(struct GBAVideoSoftwareRenderer* renderer, int y);
static void _updatePalettes(struct GBAVideoSoftwareRenderer* renderer); static void _updatePalettes(struct GBAVideoSoftwareRenderer* renderer);
static void _updateFlags(struct GBAVideoSoftwareRenderer* renderer, struct GBAVideoSoftwareBackground* bg);
static void _breakWindow(struct GBAVideoSoftwareRenderer* softwareRenderer, struct WindowN* win, int y); static void _breakWindow(struct GBAVideoSoftwareRenderer* softwareRenderer, struct WindowN* win, int y);
static void _breakWindowInner(struct GBAVideoSoftwareRenderer* softwareRenderer, struct WindowN* win); static void _breakWindowInner(struct GBAVideoSoftwareRenderer* softwareRenderer, struct WindowN* win);
@ -579,6 +580,40 @@ static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* render
softwareRenderer->start = softwareRenderer->end; softwareRenderer->start = softwareRenderer->end;
softwareRenderer->end = softwareRenderer->windows[w].endX; softwareRenderer->end = softwareRenderer->windows[w].endX;
softwareRenderer->currentWindow = softwareRenderer->windows[w].control; softwareRenderer->currentWindow = softwareRenderer->windows[w].control;
switch (GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt)) {
case 0:
if (softwareRenderer->bg[0].enabled == ENABLED_MAX) {
_updateFlags(softwareRenderer, &softwareRenderer->bg[0]);
}
if (softwareRenderer->bg[1].enabled == ENABLED_MAX) {
_updateFlags(softwareRenderer, &softwareRenderer->bg[1]);
}
// Fall through
case 2:
if (softwareRenderer->bg[3].enabled == ENABLED_MAX) {
_updateFlags(softwareRenderer, &softwareRenderer->bg[3]);
}
// Fall through
case 3:
case 4:
case 5:
if (softwareRenderer->bg[2].enabled == ENABLED_MAX) {
_updateFlags(softwareRenderer, &softwareRenderer->bg[2]);
}
break;
case 1:
if (softwareRenderer->bg[0].enabled == ENABLED_MAX) {
_updateFlags(softwareRenderer, &softwareRenderer->bg[0]);
}
if (softwareRenderer->bg[1].enabled == ENABLED_MAX) {
_updateFlags(softwareRenderer, &softwareRenderer->bg[1]);
}
if (softwareRenderer->bg[2].enabled == ENABLED_MAX) {
_updateFlags(softwareRenderer, &softwareRenderer->bg[2]);
}
break;
}
for (priority = 0; priority < 4; ++priority) { for (priority = 0; priority < 4; ++priority) {
if (spriteLayers & (1 << priority)) { if (spriteLayers & (1 << priority)) {
GBAVideoSoftwareRendererPostprocessSprite(softwareRenderer, priority); GBAVideoSoftwareRendererPostprocessSprite(softwareRenderer, priority);
@ -761,6 +796,8 @@ static void GBAVideoSoftwareRendererWriteBGCNT(struct GBAVideoSoftwareRenderer*
bg->overflow = GBARegisterBGCNTGetOverflow(value); bg->overflow = GBARegisterBGCNTGetOverflow(value);
bg->size = GBARegisterBGCNTGetSize(value); bg->size = GBARegisterBGCNTGetSize(value);
bg->yCache = -1; bg->yCache = -1;
_updateFlags(renderer, bg);
} }
static void GBAVideoSoftwareRendererWriteBGX_LO(struct GBAVideoSoftwareBackground* bg, uint16_t value) { static void GBAVideoSoftwareRendererWriteBGX_LO(struct GBAVideoSoftwareBackground* bg, uint16_t value) {
@ -1007,3 +1044,27 @@ static void _updatePalettes(struct GBAVideoSoftwareRenderer* renderer) {
} }
} }
} }
void _updateFlags(struct GBAVideoSoftwareRenderer* renderer, struct GBAVideoSoftwareBackground* background) {
uint32_t flags = (background->priority << OFFSET_PRIORITY) | (background->index << OFFSET_INDEX) | FLAG_IS_BACKGROUND;
if (background->target2) {
flags |= FLAG_TARGET_2;
}
uint32_t objwinFlags = flags;
if (renderer->blendEffect == BLEND_ALPHA) {
if (renderer->blda == 0x10 && renderer->bldb == 0) {
flags &= ~FLAG_TARGET_2;
objwinFlags &= ~FLAG_TARGET_2;
} else if (background->target1) {
if (GBAWindowControlIsBlendEnable(renderer->currentWindow.packed)) {
flags |= FLAG_TARGET_1;
}
if (GBAWindowControlIsBlendEnable(renderer->objwin.packed)) {
objwinFlags |= FLAG_TARGET_1;
}
}
}
background->flags = flags;
background->objwinFlags = objwinFlags;
background->variant = background->target1 && GBAWindowControlIsBlendEnable(renderer->currentWindow.packed) && (renderer->blendEffect == BLEND_BRIGHTEN || renderer->blendEffect == BLEND_DARKEN);
}