Core: Add more video log types

This commit is contained in:
Vicki Pfau 2017-04-18 01:53:49 -07:00
parent db4a873d9c
commit 1b6531e320
3 changed files with 55 additions and 5 deletions

View File

@ -127,7 +127,7 @@ void mVideoLoggerRendererWriteOAM(struct mVideoLogger* logger, uint32_t address,
logger->writeData(logger, &dirty, sizeof(dirty)); logger->writeData(logger, &dirty, sizeof(dirty));
} }
void mVideoLoggerRendererDrawScanline(struct mVideoLogger* logger, int y) { static void _flushVRAM(struct mVideoLogger* logger) {
size_t i; size_t i;
for (i = 0; i < _roundUp(logger->vramSize, 17); ++i) { for (i = 0; i < _roundUp(logger->vramSize, 17); ++i) {
if (logger->vramDirtyBitmap[i]) { if (logger->vramDirtyBitmap[i]) {
@ -141,7 +141,7 @@ void mVideoLoggerRendererDrawScanline(struct mVideoLogger* logger, int y) {
struct mVideoLoggerDirtyInfo dirty = { struct mVideoLoggerDirtyInfo dirty = {
DIRTY_VRAM, DIRTY_VRAM,
j * 0x1000, j * 0x1000,
0xABCD, 0x1000,
0xDEADBEEF, 0xDEADBEEF,
}; };
logger->writeData(logger, &dirty, sizeof(dirty)); 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 = { struct mVideoLoggerDirtyInfo dirty = {
DIRTY_SCANLINE, DIRTY_SCANLINE,
y, y,
@ -158,6 +162,17 @@ void mVideoLoggerRendererDrawScanline(struct mVideoLogger* logger, int y) {
logger->writeData(logger, &dirty, sizeof(dirty)); 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) { void mVideoLoggerRendererFlush(struct mVideoLogger* logger) {
struct mVideoLoggerDirtyInfo dirty = { struct mVideoLoggerDirtyInfo dirty = {
DIRTY_FLUSH, DIRTY_FLUSH,
@ -168,6 +183,27 @@ void mVideoLoggerRendererFlush(struct mVideoLogger* logger) {
logger->writeData(logger, &dirty, sizeof(dirty)); 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) { bool mVideoLoggerRendererRun(struct mVideoLogger* logger, bool block) {
struct mVideoLoggerDirtyInfo item = {0}; struct mVideoLoggerDirtyInfo item = {0};
while (logger->readData(logger, &item, sizeof(item), block)) { while (logger->readData(logger, &item, sizeof(item), block)) {
@ -178,6 +214,9 @@ bool mVideoLoggerRendererRun(struct mVideoLogger* logger, bool block) {
case DIRTY_VRAM: case DIRTY_VRAM:
case DIRTY_SCANLINE: case DIRTY_SCANLINE:
case DIRTY_FLUSH: case DIRTY_FLUSH:
case DIRTY_FRAME:
case DIRTY_RANGE:
case DIRTY_BUFFER:
if (!logger->parsePacket(logger, &item)) { if (!logger->parsePacket(logger, &item)) {
return true; return true;
} }

View File

@ -19,14 +19,17 @@ enum mVideoLoggerDirtyType {
DIRTY_REGISTER, DIRTY_REGISTER,
DIRTY_OAM, DIRTY_OAM,
DIRTY_PALETTE, DIRTY_PALETTE,
DIRTY_VRAM DIRTY_VRAM,
DIRTY_FRAME,
DIRTY_RANGE,
DIRTY_BUFFER,
}; };
struct mVideoLoggerDirtyInfo { struct mVideoLoggerDirtyInfo {
enum mVideoLoggerDirtyType type; enum mVideoLoggerDirtyType type;
uint32_t address; uint32_t address;
uint16_t value; uint32_t value;
uint32_t padding; uint32_t value2;
}; };
struct VFile; 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 mVideoLoggerRendererWritePalette(struct mVideoLogger* logger, uint32_t address, uint16_t value);
void mVideoLoggerRendererWriteOAM(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 mVideoLoggerRendererDrawScanline(struct mVideoLogger* logger, int y);
void mVideoLoggerRendererDrawRange(struct mVideoLogger* logger, int startX, int endX, int y);
void mVideoLoggerRendererFlush(struct mVideoLogger* logger); void mVideoLoggerRendererFlush(struct mVideoLogger* logger);
void mVideoLoggerRendererFinishFrame(struct mVideoLogger* logger);
bool mVideoLoggerRendererRun(struct mVideoLogger* logger, bool block); bool mVideoLoggerRendererRun(struct mVideoLogger* logger, bool block);

View File

@ -144,6 +144,9 @@ static bool _parsePacket(struct mVideoLogger* logger, const struct mVideoLoggerD
case DIRTY_SCANLINE: case DIRTY_SCANLINE:
proxyRenderer->backend->drawScanline(proxyRenderer->backend, item->address); proxyRenderer->backend->drawScanline(proxyRenderer->backend, item->address);
break; break;
case DIRTY_FRAME:
proxyRenderer->backend->finishFrame(proxyRenderer->backend);
break;
case DIRTY_FLUSH: case DIRTY_FLUSH:
return false; return false;
default: default:
@ -235,6 +238,7 @@ void GBAVideoProxyRendererFinishFrame(struct GBAVideoRenderer* renderer) {
proxyRenderer->logger->lock(proxyRenderer->logger); proxyRenderer->logger->lock(proxyRenderer->logger);
proxyRenderer->logger->wait(proxyRenderer->logger); proxyRenderer->logger->wait(proxyRenderer->logger);
} }
mVideoLoggerRendererFinishFrame(proxyRenderer->logger);
mVideoLoggerRendererFlush(proxyRenderer->logger); mVideoLoggerRendererFlush(proxyRenderer->logger);
if (proxyRenderer->logger->block && proxyRenderer->logger->wait) { if (proxyRenderer->logger->block && proxyRenderer->logger->wait) {
proxyRenderer->logger->unlock(proxyRenderer->logger); proxyRenderer->logger->unlock(proxyRenderer->logger);