mirror of https://github.com/mgba-emu/mgba.git
GBA Video: Fix OAM in thread proxy
This commit is contained in:
parent
54b4c967b8
commit
a97276b3a0
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue