mirror of https://github.com/mgba-emu/mgba.git
GBA Core: Make threaded renderer accessible
This commit is contained in:
parent
67905d281b
commit
a71d1a1368
|
@ -12,6 +12,9 @@
|
||||||
#include "gba/gba.h"
|
#include "gba/gba.h"
|
||||||
#include "gba/extra/cli.h"
|
#include "gba/extra/cli.h"
|
||||||
#include "gba/overrides.h"
|
#include "gba/overrides.h"
|
||||||
|
#ifndef DISABLE_THREADING
|
||||||
|
#include "gba/renderers/thread-proxy.h"
|
||||||
|
#endif
|
||||||
#include "gba/renderers/video-software.h"
|
#include "gba/renderers/video-software.h"
|
||||||
#include "gba/savedata.h"
|
#include "gba/savedata.h"
|
||||||
#include "gba/serialize.h"
|
#include "gba/serialize.h"
|
||||||
|
@ -22,6 +25,10 @@
|
||||||
struct GBACore {
|
struct GBACore {
|
||||||
struct mCore d;
|
struct mCore d;
|
||||||
struct GBAVideoSoftwareRenderer renderer;
|
struct GBAVideoSoftwareRenderer renderer;
|
||||||
|
#ifndef DISABLE_THREADING
|
||||||
|
struct GBAVideoThreadProxyRenderer threadProxy;
|
||||||
|
int threadedVideo;
|
||||||
|
#endif
|
||||||
int keys;
|
int keys;
|
||||||
struct mCPUComponent* components[CPU_COMPONENT_MAX];
|
struct mCPUComponent* components[CPU_COMPONENT_MAX];
|
||||||
const struct Configuration* overrides;
|
const struct Configuration* overrides;
|
||||||
|
@ -55,6 +62,11 @@ static bool _GBACoreInit(struct mCore* core) {
|
||||||
GBAVideoSoftwareRendererCreate(&gbacore->renderer);
|
GBAVideoSoftwareRendererCreate(&gbacore->renderer);
|
||||||
gbacore->renderer.outputBuffer = NULL;
|
gbacore->renderer.outputBuffer = NULL;
|
||||||
|
|
||||||
|
#ifndef DISABLE_THREADING
|
||||||
|
gbacore->threadedVideo = false;
|
||||||
|
GBAVideoThreadProxyRendererCreate(&gbacore->threadProxy, &gbacore->renderer.d);
|
||||||
|
#endif
|
||||||
|
|
||||||
gbacore->keys = 0;
|
gbacore->keys = 0;
|
||||||
gba->keySource = &gbacore->keys;
|
gba->keySource = &gbacore->keys;
|
||||||
|
|
||||||
|
@ -125,6 +137,10 @@ static void _GBACoreLoadConfig(struct mCore* core, const struct mCoreConfig* con
|
||||||
gba->idleOptimization = IDLE_LOOP_DETECT;
|
gba->idleOptimization = IDLE_LOOP_DETECT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef DISABLE_THREADING
|
||||||
|
mCoreConfigGetIntValue(config, "threadedVideo", &gbacore->threadedVideo);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _GBACoreDesiredVideoDimensions(struct mCore* core, unsigned* width, unsigned* height) {
|
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 GBACore* gbacore = (struct GBACore*) core;
|
||||||
struct GBA* gba = (struct GBA*) core->board;
|
struct GBA* gba = (struct GBA*) core->board;
|
||||||
if (gbacore->renderer.outputBuffer) {
|
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);
|
ARMReset(core->cpu);
|
||||||
if (core->opts.skipBios) {
|
if (core->opts.skipBios) {
|
||||||
|
|
|
@ -264,7 +264,7 @@ static THREAD_ENTRY _proxyThread(void* renderer) {
|
||||||
ThreadSetName("Proxy Renderer Thread");
|
ThreadSetName("Proxy Renderer Thread");
|
||||||
|
|
||||||
MutexLock(&proxyRenderer->mutex);
|
MutexLock(&proxyRenderer->mutex);
|
||||||
while (1) {
|
while (proxyRenderer->threadState != PROXY_THREAD_STOPPED) {
|
||||||
ConditionWait(&proxyRenderer->toThreadCond, &proxyRenderer->mutex);
|
ConditionWait(&proxyRenderer->toThreadCond, &proxyRenderer->mutex);
|
||||||
if (proxyRenderer->threadState == PROXY_THREAD_STOPPED) {
|
if (proxyRenderer->threadState == PROXY_THREAD_STOPPED) {
|
||||||
break;
|
break;
|
||||||
|
@ -306,8 +306,6 @@ static THREAD_ENTRY _proxyThread(void* renderer) {
|
||||||
ConditionWake(&proxyRenderer->fromThreadCond);
|
ConditionWake(&proxyRenderer->fromThreadCond);
|
||||||
if (proxyRenderer->threadState != PROXY_THREAD_STOPPED) {
|
if (proxyRenderer->threadState != PROXY_THREAD_STOPPED) {
|
||||||
proxyRenderer->threadState = PROXY_THREAD_IDLE;
|
proxyRenderer->threadState = PROXY_THREAD_IDLE;
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MutexUnlock(&proxyRenderer->mutex);
|
MutexUnlock(&proxyRenderer->mutex);
|
||||||
|
|
Loading…
Reference in New Issue