diff --git a/src/gba/core.c b/src/gba/core.c index 4d394c0ca..732ae98e7 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -12,6 +12,9 @@ #include "gba/gba.h" #include "gba/extra/cli.h" #include "gba/overrides.h" +#ifndef DISABLE_THREADING +#include "gba/renderers/thread-proxy.h" +#endif #include "gba/renderers/video-software.h" #include "gba/savedata.h" #include "gba/serialize.h" @@ -22,6 +25,10 @@ struct GBACore { struct mCore d; struct GBAVideoSoftwareRenderer renderer; +#ifndef DISABLE_THREADING + struct GBAVideoThreadProxyRenderer threadProxy; + int threadedVideo; +#endif int keys; struct mCPUComponent* components[CPU_COMPONENT_MAX]; const struct Configuration* overrides; @@ -55,6 +62,11 @@ static bool _GBACoreInit(struct mCore* core) { GBAVideoSoftwareRendererCreate(&gbacore->renderer); gbacore->renderer.outputBuffer = NULL; +#ifndef DISABLE_THREADING + gbacore->threadedVideo = false; + GBAVideoThreadProxyRendererCreate(&gbacore->threadProxy, &gbacore->renderer.d); +#endif + gbacore->keys = 0; gba->keySource = &gbacore->keys; @@ -125,6 +137,10 @@ static void _GBACoreLoadConfig(struct mCore* core, const struct mCoreConfig* con gba->idleOptimization = IDLE_LOOP_DETECT; } } + +#ifndef DISABLE_THREADING + mCoreConfigGetIntValue(config, "threadedVideo", &gbacore->threadedVideo); +#endif } static void _GBACoreDesiredVideoDimensions(struct mCore* core, unsigned* width, unsigned* height) { @@ -217,7 +233,13 @@ static void _GBACoreReset(struct mCore* core) { struct GBACore* gbacore = (struct GBACore*) core; struct GBA* gba = (struct GBA*) core->board; if (gbacore->renderer.outputBuffer) { - GBAVideoAssociateRenderer(&gba->video, &gbacore->renderer.d); + struct GBAVideoRenderer* renderer = &gbacore->renderer.d; +#ifndef DISABLE_THREADING + if (gbacore->threadedVideo) { + renderer = &gbacore->threadProxy.d; + } +#endif + GBAVideoAssociateRenderer(&gba->video, renderer); } ARMReset(core->cpu); if (core->opts.skipBios) { diff --git a/src/gba/renderers/thread-proxy.c b/src/gba/renderers/thread-proxy.c index 7e8a64948..bba3b018f 100644 --- a/src/gba/renderers/thread-proxy.c +++ b/src/gba/renderers/thread-proxy.c @@ -264,7 +264,7 @@ static THREAD_ENTRY _proxyThread(void* renderer) { ThreadSetName("Proxy Renderer Thread"); MutexLock(&proxyRenderer->mutex); - while (1) { + while (proxyRenderer->threadState != PROXY_THREAD_STOPPED) { ConditionWait(&proxyRenderer->toThreadCond, &proxyRenderer->mutex); if (proxyRenderer->threadState == PROXY_THREAD_STOPPED) { break; @@ -306,8 +306,6 @@ static THREAD_ENTRY _proxyThread(void* renderer) { ConditionWake(&proxyRenderer->fromThreadCond); if (proxyRenderer->threadState != PROXY_THREAD_STOPPED) { proxyRenderer->threadState = PROXY_THREAD_IDLE; - } else { - break; } } MutexUnlock(&proxyRenderer->mutex);