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 d;
struct GBAVideoRenderer* backend; struct GBAVideoRenderer* backend;
struct mVideoLogger* logger; struct mVideoLogger* logger;
int flushScanline;
}; };
void GBAVideoProxyRendererCreate(struct GBAVideoProxyRenderer* renderer, struct GBAVideoRenderer* backend, struct mVideoLogger* logger); 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); 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) { static void _GBACoreSetOverride(struct mCore* core, const void* override) {
@ -730,6 +738,10 @@ static void _GBACoreReset(struct mCore* core) {
if (renderer && core->videoLogger) { if (renderer && core->videoLogger) {
GBAVideoProxyRendererCreate(&gbacore->proxyRenderer, renderer, core->videoLogger); GBAVideoProxyRendererCreate(&gbacore->proxyRenderer, renderer, core->videoLogger);
renderer = &gbacore->proxyRenderer.d; renderer = &gbacore->proxyRenderer.d;
int flushScanline = -1;
mCoreConfigGetIntValue(&core->config, "threadedVideo.flushScanline", &flushScanline);
gbacore->proxyRenderer.flushScanline = flushScanline;
} }
#endif #endif
if (renderer) { if (renderer) {

View File

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