GBA Video: Fix OAM in thread proxy

This commit is contained in:
Jeffrey Pfau 2016-08-01 23:33:49 -07:00
parent 54b4c967b8
commit a97276b3a0
1 changed files with 3 additions and 15 deletions

View File

@ -80,7 +80,6 @@ void GBAVideoThreadProxyRendererInit(struct GBAVideoRenderer* renderer) {
proxyRenderer->backend->init(proxyRenderer->backend); proxyRenderer->backend->init(proxyRenderer->backend);
proxyRenderer->vramDirtyBitmap = 0; proxyRenderer->vramDirtyBitmap = 0;
memset(proxyRenderer->oamDirtyBitmap, 0, sizeof(proxyRenderer->oamDirtyBitmap));
proxyRenderer->threadState = PROXY_THREAD_IDLE; proxyRenderer->threadState = PROXY_THREAD_IDLE;
ThreadCreate(&proxyRenderer->thread, _proxyThread, proxyRenderer); ThreadCreate(&proxyRenderer->thread, _proxyThread, proxyRenderer);
} }
@ -91,13 +90,9 @@ void GBAVideoThreadProxyRendererReset(struct GBAVideoRenderer* renderer) {
while (proxyRenderer->threadState == PROXY_THREAD_BUSY) { while (proxyRenderer->threadState == PROXY_THREAD_BUSY) {
ConditionWait(&proxyRenderer->fromThreadCond, &proxyRenderer->mutex); ConditionWait(&proxyRenderer->fromThreadCond, &proxyRenderer->mutex);
} }
int i; memcpy(&proxyRenderer->oamProxy.raw, &renderer->oam->raw, SIZE_OAM);
for (i = 0; i < 128; ++i) { memcpy(proxyRenderer->paletteProxy, renderer->palette, SIZE_PALETTE_RAM);
proxyRenderer->oamProxy.raw[i * 4] = 0x0200; memcpy(proxyRenderer->vramProxy, renderer->vram, SIZE_VRAM);
proxyRenderer->oamProxy.raw[i * 4 + 1] = 0x0000;
proxyRenderer->oamProxy.raw[i * 4 + 2] = 0x0000;
proxyRenderer->oamProxy.raw[i * 4 + 3] = 0x0000;
}
proxyRenderer->backend->reset(proxyRenderer->backend); proxyRenderer->backend->reset(proxyRenderer->backend);
MutexUnlock(&proxyRenderer->mutex); MutexUnlock(&proxyRenderer->mutex);
} }
@ -183,12 +178,6 @@ void GBAVideoThreadProxyRendererWritePalette(struct GBAVideoRenderer* renderer,
void GBAVideoThreadProxyRendererWriteOAM(struct GBAVideoRenderer* renderer, uint32_t oam) { void GBAVideoThreadProxyRendererWriteOAM(struct GBAVideoRenderer* renderer, uint32_t oam) {
struct GBAVideoThreadProxyRenderer* proxyRenderer = (struct GBAVideoThreadProxyRenderer*) renderer; struct GBAVideoThreadProxyRenderer* proxyRenderer = (struct GBAVideoThreadProxyRenderer*) renderer;
int bit = 1 << (oam & 31);
int base = oam >> 5;
if (proxyRenderer->oamDirtyBitmap[base] & bit) {
return;
}
proxyRenderer->oamDirtyBitmap[base] |= bit;
struct GBAVideoDirtyInfo dirty = { struct GBAVideoDirtyInfo dirty = {
DIRTY_OAM, DIRTY_OAM,
oam, oam,
@ -247,7 +236,6 @@ void GBAVideoThreadProxyRendererFinishFrame(struct GBAVideoRenderer* renderer) {
} while (proxyRenderer->threadState == PROXY_THREAD_BUSY); } while (proxyRenderer->threadState == PROXY_THREAD_BUSY);
proxyRenderer->backend->finishFrame(proxyRenderer->backend); proxyRenderer->backend->finishFrame(proxyRenderer->backend);
proxyRenderer->vramDirtyBitmap = 0; proxyRenderer->vramDirtyBitmap = 0;
memset(proxyRenderer->oamDirtyBitmap, 0, sizeof(proxyRenderer->oamDirtyBitmap));
MutexUnlock(&proxyRenderer->mutex); MutexUnlock(&proxyRenderer->mutex);
} }