all repos — mgba @ a71d1a13682aebc1be45be8bc8a96012e9c4730e

mGBA Game Boy Advance Emulator

GBA Core: Make threaded renderer accessible
Jeffrey Pfau jeffrey@endrift.com
Mon, 01 Aug 2016 19:09:46 -0700
commit

a71d1a13682aebc1be45be8bc8a96012e9c4730e

parent

67905d281bfecbb06f51f2ca5ac939df378734a5

2 files changed, 24 insertions(+), 4 deletions(-)

jump to
M src/gba/core.csrc/gba/core.c

@@ -12,6 +12,9 @@ #include "gba/cheats.h"

#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;

@@ -54,6 +61,11 @@ ARMInit(cpu);

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 @@ } else if (strcasecmp(idleOptimization, "detect") == 0) {

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) {
M src/gba/renderers/thread-proxy.csrc/gba/renderers/thread-proxy.c

@@ -264,7 +264,7 @@ struct GBAVideoThreadProxyRenderer* proxyRenderer = 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 @@ MutexLock(&proxyRenderer->mutex);

ConditionWake(&proxyRenderer->fromThreadCond); if (proxyRenderer->threadState != PROXY_THREAD_STOPPED) { proxyRenderer->threadState = PROXY_THREAD_IDLE; - } else { - break; } } MutexUnlock(&proxyRenderer->mutex);