diff --git a/src/feature/video-logger.c b/src/feature/video-logger.c index edb5d1f7c..1ef7e910d 100644 --- a/src/feature/video-logger.c +++ b/src/feature/video-logger.c @@ -127,7 +127,7 @@ void mVideoLoggerRendererWriteOAM(struct mVideoLogger* logger, uint32_t address, logger->writeData(logger, &dirty, sizeof(dirty)); } -void mVideoLoggerRendererDrawScanline(struct mVideoLogger* logger, int y) { +static void _flushVRAM(struct mVideoLogger* logger) { size_t i; for (i = 0; i < _roundUp(logger->vramSize, 17); ++i) { if (logger->vramDirtyBitmap[i]) { @@ -141,7 +141,7 @@ void mVideoLoggerRendererDrawScanline(struct mVideoLogger* logger, int y) { struct mVideoLoggerDirtyInfo dirty = { DIRTY_VRAM, j * 0x1000, - 0xABCD, + 0x1000, 0xDEADBEEF, }; logger->writeData(logger, &dirty, sizeof(dirty)); @@ -149,6 +149,10 @@ void mVideoLoggerRendererDrawScanline(struct mVideoLogger* logger, int y) { } } } +} + +void mVideoLoggerRendererDrawScanline(struct mVideoLogger* logger, int y) { + _flushVRAM(logger); struct mVideoLoggerDirtyInfo dirty = { DIRTY_SCANLINE, y, @@ -158,6 +162,17 @@ void mVideoLoggerRendererDrawScanline(struct mVideoLogger* logger, int y) { logger->writeData(logger, &dirty, sizeof(dirty)); } +void mVideoLoggerRendererDrawRange(struct mVideoLogger* logger, int startX, int endX, int y) { + _flushVRAM(logger); + struct mVideoLoggerDirtyInfo dirty = { + DIRTY_RANGE, + y, + startX, + endX, + }; + logger->writeData(logger, &dirty, sizeof(dirty)); +} + void mVideoLoggerRendererFlush(struct mVideoLogger* logger) { struct mVideoLoggerDirtyInfo dirty = { DIRTY_FLUSH, @@ -168,6 +183,27 @@ void mVideoLoggerRendererFlush(struct mVideoLogger* logger) { logger->writeData(logger, &dirty, sizeof(dirty)); } +void mVideoLoggerRendererFinishFrame(struct mVideoLogger* logger) { + struct mVideoLoggerDirtyInfo dirty = { + DIRTY_FRAME, + 0, + 0, + 0xDEADBEEF, + }; + logger->writeData(logger, &dirty, sizeof(dirty)); +} + +void mVideoLoggerWriteBuffer(struct mVideoLogger* logger, uint32_t bufferId, uint32_t offset, uint32_t length, const void* data) { + struct mVideoLoggerDirtyInfo dirty = { + DIRTY_BUFFER, + bufferId, + offset, + length, + }; + logger->writeData(logger, &dirty, sizeof(dirty)); + logger->writeData(logger, data, length); +} + bool mVideoLoggerRendererRun(struct mVideoLogger* logger, bool block) { struct mVideoLoggerDirtyInfo item = {0}; while (logger->readData(logger, &item, sizeof(item), block)) { @@ -178,6 +214,9 @@ bool mVideoLoggerRendererRun(struct mVideoLogger* logger, bool block) { case DIRTY_VRAM: case DIRTY_SCANLINE: case DIRTY_FLUSH: + case DIRTY_FRAME: + case DIRTY_RANGE: + case DIRTY_BUFFER: if (!logger->parsePacket(logger, &item)) { return true; } diff --git a/src/feature/video-logger.h b/src/feature/video-logger.h index 0023d3b3c..41fb8ff47 100644 --- a/src/feature/video-logger.h +++ b/src/feature/video-logger.h @@ -19,14 +19,17 @@ enum mVideoLoggerDirtyType { DIRTY_REGISTER, DIRTY_OAM, DIRTY_PALETTE, - DIRTY_VRAM + DIRTY_VRAM, + DIRTY_FRAME, + DIRTY_RANGE, + DIRTY_BUFFER, }; struct mVideoLoggerDirtyInfo { enum mVideoLoggerDirtyType type; uint32_t address; - uint16_t value; - uint32_t padding; + uint32_t value; + uint32_t value2; }; struct VFile; @@ -104,8 +107,12 @@ void mVideoLoggerRendererWriteVRAM(struct mVideoLogger* logger, uint32_t address void mVideoLoggerRendererWritePalette(struct mVideoLogger* logger, uint32_t address, uint16_t value); void mVideoLoggerRendererWriteOAM(struct mVideoLogger* logger, uint32_t address, uint16_t value); +void mVideoLoggerWriteBuffer(struct mVideoLogger* logger, uint32_t bufferId, uint32_t offset, uint32_t length, const void* data); + void mVideoLoggerRendererDrawScanline(struct mVideoLogger* logger, int y); +void mVideoLoggerRendererDrawRange(struct mVideoLogger* logger, int startX, int endX, int y); void mVideoLoggerRendererFlush(struct mVideoLogger* logger); +void mVideoLoggerRendererFinishFrame(struct mVideoLogger* logger); bool mVideoLoggerRendererRun(struct mVideoLogger* logger, bool block); diff --git a/src/gba/renderers/proxy.c b/src/gba/renderers/proxy.c index 4f8f62243..ef9493379 100644 --- a/src/gba/renderers/proxy.c +++ b/src/gba/renderers/proxy.c @@ -144,6 +144,9 @@ static bool _parsePacket(struct mVideoLogger* logger, const struct mVideoLoggerD case DIRTY_SCANLINE: proxyRenderer->backend->drawScanline(proxyRenderer->backend, item->address); break; + case DIRTY_FRAME: + proxyRenderer->backend->finishFrame(proxyRenderer->backend); + break; case DIRTY_FLUSH: return false; default: @@ -235,6 +238,7 @@ void GBAVideoProxyRendererFinishFrame(struct GBAVideoRenderer* renderer) { proxyRenderer->logger->lock(proxyRenderer->logger); proxyRenderer->logger->wait(proxyRenderer->logger); } + mVideoLoggerRendererFinishFrame(proxyRenderer->logger); mVideoLoggerRendererFlush(proxyRenderer->logger); if (proxyRenderer->logger->block && proxyRenderer->logger->wait) { proxyRenderer->logger->unlock(proxyRenderer->logger);