GBA Video: Allow proxy flush timing configuration

This commit is contained in:
Vicki Pfau 2025-02-10 02:23:53 -08:00
parent fc14b4b0da
commit a9041b122f
3 changed files with 20 additions and 1 deletions

View File

@ -17,6 +17,7 @@ struct GBAVideoProxyRenderer {
struct GBAVideoRenderer d;
struct GBAVideoRenderer* backend;
struct mVideoLogger* logger;
int flushScanline;
};
void GBAVideoProxyRendererCreate(struct GBAVideoProxyRenderer* renderer, struct GBAVideoRenderer* backend, struct mVideoLogger* logger);

View File

@ -479,6 +479,14 @@ static void _GBACoreReloadConfigOption(struct mCore* core, const char* option, c
GBAVideoAssociateRenderer(&gba->video, renderer);
}
}
#ifndef MINIMAL_CORE
if (strcmp("threadedVideo.flushScanline", option) == 0) {
int flushScanline = -1;
mCoreConfigGetIntValue(config, "threadedVideo.flushScanline", &flushScanline);
gbacore->proxyRenderer.flushScanline = flushScanline;
}
#endif
}
static void _GBACoreSetOverride(struct mCore* core, const void* override) {
@ -730,6 +738,10 @@ static void _GBACoreReset(struct mCore* core) {
if (renderer && core->videoLogger) {
GBAVideoProxyRendererCreate(&gbacore->proxyRenderer, renderer, core->videoLogger);
renderer = &gbacore->proxyRenderer.d;
int flushScanline = -1;
mCoreConfigGetIntValue(&core->config, "threadedVideo.flushScanline", &flushScanline);
gbacore->proxyRenderer.flushScanline = flushScanline;
}
#endif
if (renderer) {

View File

@ -75,6 +75,7 @@ void GBAVideoProxyRendererCreate(struct GBAVideoProxyRenderer* renderer, struct
logger->vramSize = GBA_SIZE_VRAM;
logger->oamSize = GBA_SIZE_OAM;
renderer->flushScanline = -1;
renderer->backend = backend;
}
@ -359,6 +360,9 @@ void GBAVideoProxyRendererWriteOAM(struct GBAVideoRenderer* renderer, uint32_t o
void GBAVideoProxyRendererDrawScanline(struct GBAVideoRenderer* renderer, int y) {
struct GBAVideoProxyRenderer* proxyRenderer = (struct GBAVideoProxyRenderer*) renderer;
if (proxyRenderer->flushScanline == y) {
mVideoLoggerRendererFlush(proxyRenderer->logger);
}
if (!proxyRenderer->logger->block) {
_copyExtraState(proxyRenderer);
proxyRenderer->backend->drawScanline(proxyRenderer->backend, y);
@ -375,7 +379,9 @@ void GBAVideoProxyRendererFinishFrame(struct GBAVideoRenderer* renderer) {
proxyRenderer->backend->finishFrame(proxyRenderer->backend);
}
mVideoLoggerRendererFinishFrame(proxyRenderer->logger);
mVideoLoggerRendererFlush(proxyRenderer->logger);
if (proxyRenderer->flushScanline < 0) {
mVideoLoggerRendererFlush(proxyRenderer->logger);
}
}
static void GBAVideoProxyRendererGetPixels(struct GBAVideoRenderer* renderer, size_t* stride, const void** pixels) {