mirror of https://github.com/mgba-emu/mgba.git
Core: Add more video log types
This commit is contained in:
parent
db4a873d9c
commit
1b6531e320
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue