From a9041b122ff7d6d16482a3ca2a58c24b103d69ed Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 10 Feb 2025 02:23:53 -0800 Subject: [PATCH] GBA Video: Allow proxy flush timing configuration --- include/mgba/internal/gba/renderers/proxy.h | 1 + src/gba/core.c | 12 ++++++++++++ src/gba/extra/proxy.c | 8 +++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/include/mgba/internal/gba/renderers/proxy.h b/include/mgba/internal/gba/renderers/proxy.h index 6cb58d092..3d70d5666 100644 --- a/include/mgba/internal/gba/renderers/proxy.h +++ b/include/mgba/internal/gba/renderers/proxy.h @@ -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); diff --git a/src/gba/core.c b/src/gba/core.c index da782d06c..b369c92df 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -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) { diff --git a/src/gba/extra/proxy.c b/src/gba/extra/proxy.c index e33c7b568..bcf91f5f4 100644 --- a/src/gba/extra/proxy.c +++ b/src/gba/extra/proxy.c @@ -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) {