GB/GBA Video: Move dummy renderer to core

This commit is contained in:
Vicki Pfau 2020-07-31 18:02:29 -07:00
parent 0fdc343689
commit e27963bd29
6 changed files with 125 additions and 85 deletions

View File

@ -10,9 +10,12 @@
CXX_GUARD_START
#include <mgba/core/log.h>
#include <mgba/core/timing.h>
#include <mgba/gb/interface.h>
mLOG_DECLARE_CATEGORY(GB_VIDEO);
enum {
GB_VIDEO_HORIZONTAL_PIXELS = 160,
GB_VIDEO_VERTICAL_PIXELS = 144,
@ -160,7 +163,10 @@ struct GBVideo {
void GBVideoInit(struct GBVideo* video);
void GBVideoReset(struct GBVideo* video);
void GBVideoDeinit(struct GBVideo* video);
void GBVideoDummyRendererCreate(struct GBVideoRenderer*);
void GBVideoAssociateRenderer(struct GBVideo* video, struct GBVideoRenderer* renderer);
void GBVideoSkipBIOS(struct GBVideo* video);
void GBVideoProcessDots(struct GBVideo* video, uint32_t cyclesLate);

View File

@ -221,6 +221,8 @@ struct GBAVideo {
void GBAVideoInit(struct GBAVideo* video);
void GBAVideoReset(struct GBAVideo* video);
void GBAVideoDeinit(struct GBAVideo* video);
void GBAVideoDummyRendererCreate(struct GBAVideoRenderer*);
void GBAVideoAssociateRenderer(struct GBAVideo* video, struct GBAVideoRenderer* renderer);
void GBAVideoWriteDISPSTAT(struct GBAVideo* video, uint16_t value);

View File

@ -64,6 +64,7 @@ struct mVideoLogContext;
struct GBCore {
struct mCore d;
struct GBVideoSoftwareRenderer renderer;
struct GBVideoRenderer dummyRenderer;
#ifndef MINIMAL_CORE
struct GBVideoProxyRenderer proxyRenderer;
struct mVideoLogContext* logContext;
@ -419,6 +420,9 @@ static void _GBCoreReset(struct mCore* core) {
struct GB* gb = (struct GB*) core->board;
if (gbcore->renderer.outputBuffer) {
GBVideoAssociateRenderer(&gb->video, &gbcore->renderer.d);
} else {
GBVideoDummyRendererCreate(&gbcore->dummyRenderer);
GBVideoAssociateRenderer(&gb->video, &gbcore->dummyRenderer);
}
if (gb->memory.rom) {

View File

@ -16,6 +16,8 @@
#include <mgba-util/memory.h>
mLOG_DEFINE_CATEGORY(GB_VIDEO, "GB Video", "gb.video");
static void GBVideoDummyRendererInit(struct GBVideoRenderer* renderer, enum GBModel model, bool borders);
static void GBVideoDummyRendererDeinit(struct GBVideoRenderer* renderer);
static uint8_t GBVideoDummyRendererWriteVideoRegister(struct GBVideoRenderer* renderer, uint16_t address, uint8_t value);
@ -38,26 +40,8 @@ static void _endMode2(struct mTiming* timing, void* context, uint32_t cyclesLate
static void _endMode3(struct mTiming* timing, void* context, uint32_t cyclesLate);
static void _updateFrameCount(struct mTiming* timing, void* context, uint32_t cyclesLate);
static struct GBVideoRenderer dummyRenderer = {
.init = GBVideoDummyRendererInit,
.deinit = GBVideoDummyRendererDeinit,
.writeVideoRegister = GBVideoDummyRendererWriteVideoRegister,
.writeSGBPacket = GBVideoDummyRendererWriteSGBPacket,
.writeVRAM = GBVideoDummyRendererWriteVRAM,
.writeOAM = GBVideoDummyRendererWriteOAM,
.writePalette = GBVideoDummyRendererWritePalette,
.drawRange = GBVideoDummyRendererDrawRange,
.finishScanline = GBVideoDummyRendererFinishScanline,
.finishFrame = GBVideoDummyRendererFinishFrame,
.enableSGBBorder = GBVideoDummyRendererEnableSGBBorder,
.getPixels = GBVideoDummyRendererGetPixels,
.putPixels = GBVideoDummyRendererPutPixels,
};
void GBVideoInit(struct GBVideo* video) {
video->renderer = &dummyRenderer;
video->renderer->cache = NULL;
video->renderer->sgbRenderMode = 0;
video->renderer = NULL;
video->vram = anonymousMemoryMap(GB_SIZE_VRAM);
video->frameskip = 0;
@ -84,12 +68,6 @@ void GBVideoInit(struct GBVideo* video) {
video->dmgPalette[11] = 0x0000;
video->sgbBorders = true;
video->renderer->sgbCharRam = NULL;
video->renderer->sgbMapRam = NULL;
video->renderer->sgbPalRam = NULL;
video->renderer->sgbAttributes = NULL;
video->renderer->sgbAttributeFiles = NULL;
}
void GBVideoReset(struct GBVideo* video) {
@ -116,6 +94,12 @@ void GBVideoReset(struct GBVideo* video) {
memset(video->renderer->sgbAttributes, 0, 90 * 45);
video->sgbCommandHeader = 0;
video->sgbBufferIndex = 0;
} else {
video->renderer->sgbCharRam = NULL;
video->renderer->sgbMapRam = NULL;
video->renderer->sgbPalRam = NULL;
video->renderer->sgbAttributes = NULL;
video->renderer->sgbAttributeFiles = NULL;
}
video->palette[0] = video->dmgPalette[0];
@ -131,6 +115,11 @@ void GBVideoReset(struct GBVideo* video) {
video->palette[9 * 4 + 2] = video->dmgPalette[10];
video->palette[9 * 4 + 3] = video->dmgPalette[11];
if (!video->renderer) {
mLOG(GB_VIDEO, FATAL, "No renderer associated");
return;
}
video->renderer->deinit(video->renderer);
video->renderer->init(video->renderer, video->p->model, video->sgbBorders);
@ -173,15 +162,44 @@ void GBVideoDeinit(struct GBVideo* video) {
}
}
void GBVideoDummyRendererCreate(struct GBVideoRenderer* renderer) {
static const struct GBVideoRenderer dummyRenderer = {
.init = GBVideoDummyRendererInit,
.deinit = GBVideoDummyRendererDeinit,
.writeVideoRegister = GBVideoDummyRendererWriteVideoRegister,
.writeSGBPacket = GBVideoDummyRendererWriteSGBPacket,
.writeVRAM = GBVideoDummyRendererWriteVRAM,
.writeOAM = GBVideoDummyRendererWriteOAM,
.writePalette = GBVideoDummyRendererWritePalette,
.drawRange = GBVideoDummyRendererDrawRange,
.finishScanline = GBVideoDummyRendererFinishScanline,
.finishFrame = GBVideoDummyRendererFinishFrame,
.enableSGBBorder = GBVideoDummyRendererEnableSGBBorder,
.getPixels = GBVideoDummyRendererGetPixels,
.putPixels = GBVideoDummyRendererPutPixels,
};
memcpy(renderer, &dummyRenderer, sizeof(*renderer));
}
void GBVideoAssociateRenderer(struct GBVideo* video, struct GBVideoRenderer* renderer) {
video->renderer->deinit(video->renderer);
renderer->cache = video->renderer->cache;
renderer->sgbRenderMode = video->renderer->sgbRenderMode;
renderer->sgbCharRam = video->renderer->sgbCharRam;
renderer->sgbMapRam = video->renderer->sgbMapRam;
renderer->sgbPalRam = video->renderer->sgbPalRam;
renderer->sgbAttributeFiles = video->renderer->sgbAttributeFiles;
renderer->sgbAttributes = video->renderer->sgbAttributes;
if (video->renderer) {
video->renderer->deinit(video->renderer);
renderer->cache = video->renderer->cache;
renderer->sgbRenderMode = video->renderer->sgbRenderMode;
renderer->sgbCharRam = video->renderer->sgbCharRam;
renderer->sgbMapRam = video->renderer->sgbMapRam;
renderer->sgbPalRam = video->renderer->sgbPalRam;
renderer->sgbAttributeFiles = video->renderer->sgbAttributeFiles;
renderer->sgbAttributes = video->renderer->sgbAttributes;
} else {
renderer->cache = NULL;
renderer->sgbRenderMode = 0;
renderer->sgbCharRam = NULL;
renderer->sgbMapRam = NULL;
renderer->sgbPalRam = NULL;
renderer->sgbAttributeFiles = NULL;
renderer->sgbAttributes = NULL;
}
video->renderer = renderer;
renderer->vram = video->vram;
video->renderer->init(video->renderer, video->p->model, video->sgbBorders);

View File

@ -130,6 +130,7 @@ struct mVideoLogContext;
struct GBACore {
struct mCore d;
struct GBAVideoSoftwareRenderer renderer;
struct GBAVideoRenderer dummyRenderer;
#if defined(BUILD_GLES2) || defined(BUILD_GLES3)
struct GBAVideoGLRenderer glRenderer;
#endif
@ -382,9 +383,11 @@ static void _GBACoreReloadConfigOption(struct mCore* core, const char* option, c
renderer = &gbacore->proxyRenderer.d;
}
#endif
if (renderer) {
GBAVideoAssociateRenderer(&gba->video, renderer);
if (!renderer) {
renderer = &gbacore->dummyRenderer;
GBAVideoDummyRendererCreate(renderer);
}
GBAVideoAssociateRenderer(&gba->video, renderer);
}
}
@ -542,42 +545,39 @@ static void _GBACoreChecksum(const struct mCore* core, void* data, enum mCoreChe
static void _GBACoreReset(struct mCore* core) {
struct GBACore* gbacore = (struct GBACore*) core;
struct GBA* gba = (struct GBA*) core->board;
if (gbacore->renderer.outputBuffer
struct GBAVideoRenderer* renderer = NULL;
if (gbacore->renderer.outputBuffer) {
renderer = &gbacore->renderer.d;
}
int fakeBool ATTRIBUTE_UNUSED;
#if defined(BUILD_GLES2) || defined(BUILD_GLES3)
|| gbacore->glRenderer.outputTex != (unsigned) -1
#endif
) {
struct GBAVideoRenderer* renderer = NULL;
if (gbacore->renderer.outputBuffer) {
renderer = &gbacore->renderer.d;
}
int fakeBool ATTRIBUTE_UNUSED;
#if defined(BUILD_GLES2) || defined(BUILD_GLES3)
if (gbacore->glRenderer.outputTex != (unsigned) -1 && mCoreConfigGetIntValue(&core->config, "hwaccelVideo", &fakeBool) && fakeBool) {
mCoreConfigGetIntValue(&core->config, "videoScale", &gbacore->glRenderer.scale);
renderer = &gbacore->glRenderer.d;
} else {
gbacore->glRenderer.scale = 1;
}
if (gbacore->glRenderer.outputTex != (unsigned) -1 && mCoreConfigGetIntValue(&core->config, "hwaccelVideo", &fakeBool) && fakeBool) {
mCoreConfigGetIntValue(&core->config, "videoScale", &gbacore->glRenderer.scale);
renderer = &gbacore->glRenderer.d;
} else {
gbacore->glRenderer.scale = 1;
}
#endif
#ifndef DISABLE_THREADING
if (mCoreConfigGetIntValue(&core->config, "threadedVideo", &fakeBool) && fakeBool) {
if (!core->videoLogger) {
core->videoLogger = &gbacore->threadProxy.d;
}
}
#endif
#ifndef MINIMAL_CORE
if (renderer && core->videoLogger) {
gbacore->proxyRenderer.logger = core->videoLogger;
GBAVideoProxyRendererCreate(&gbacore->proxyRenderer, renderer);
renderer = &gbacore->proxyRenderer.d;
}
#endif
if (renderer) {
GBAVideoAssociateRenderer(&gba->video, renderer);
if (mCoreConfigGetIntValue(&core->config, "threadedVideo", &fakeBool) && fakeBool) {
if (!core->videoLogger) {
core->videoLogger = &gbacore->threadProxy.d;
}
}
#endif
#ifndef MINIMAL_CORE
if (renderer && core->videoLogger) {
gbacore->proxyRenderer.logger = core->videoLogger;
GBAVideoProxyRendererCreate(&gbacore->proxyRenderer, renderer);
renderer = &gbacore->proxyRenderer.d;
}
#endif
if (!renderer) {
renderer = &gbacore->dummyRenderer;
GBAVideoDummyRendererCreate(renderer);
}
GBAVideoAssociateRenderer(&gba->video, renderer);
#ifndef MINIMAL_CORE
int useAudioMixer;

View File

@ -53,23 +53,8 @@ MGBA_EXPORT const int GBAVideoObjSizes[16][2] = {
{ 0, 0 },
};
static struct GBAVideoRenderer dummyRenderer = {
.init = GBAVideoDummyRendererInit,
.reset = GBAVideoDummyRendererReset,
.deinit = GBAVideoDummyRendererDeinit,
.writeVideoRegister = GBAVideoDummyRendererWriteVideoRegister,
.writeVRAM = GBAVideoDummyRendererWriteVRAM,
.writePalette = GBAVideoDummyRendererWritePalette,
.writeOAM = GBAVideoDummyRendererWriteOAM,
.drawScanline = GBAVideoDummyRendererDrawScanline,
.finishFrame = GBAVideoDummyRendererFinishFrame,
.getPixels = GBAVideoDummyRendererGetPixels,
.putPixels = GBAVideoDummyRendererPutPixels,
};
void GBAVideoInit(struct GBAVideo* video) {
video->renderer = &dummyRenderer;
video->renderer->cache = NULL;
video->renderer = NULL;
video->vram = anonymousMemoryMap(SIZE_VRAM);
video->frameskip = 0;
video->event.name = "GBA Video";
@ -94,12 +79,16 @@ void GBAVideoReset(struct GBAVideo* video) {
video->frameCounter = 0;
video->frameskipCounter = 0;
video->renderer->vram = video->vram;
video->shouldStall = 0;
memset(video->palette, 0, sizeof(video->palette));
memset(video->oam.raw, 0, sizeof(video->oam.raw));
if (!video->renderer) {
mLOG(GBA_VIDEO, FATAL, "No renderer associated");
return;
}
video->renderer->vram = video->vram;
video->renderer->reset(video->renderer);
}
@ -108,9 +97,30 @@ void GBAVideoDeinit(struct GBAVideo* video) {
mappedMemoryFree(video->vram, SIZE_VRAM);
}
void GBAVideoDummyRendererCreate(struct GBAVideoRenderer* renderer) {
static const struct GBAVideoRenderer dummyRenderer = {
.init = GBAVideoDummyRendererInit,
.reset = GBAVideoDummyRendererReset,
.deinit = GBAVideoDummyRendererDeinit,
.writeVideoRegister = GBAVideoDummyRendererWriteVideoRegister,
.writeVRAM = GBAVideoDummyRendererWriteVRAM,
.writePalette = GBAVideoDummyRendererWritePalette,
.writeOAM = GBAVideoDummyRendererWriteOAM,
.drawScanline = GBAVideoDummyRendererDrawScanline,
.finishFrame = GBAVideoDummyRendererFinishFrame,
.getPixels = GBAVideoDummyRendererGetPixels,
.putPixels = GBAVideoDummyRendererPutPixels,
};
memcpy(renderer, &dummyRenderer, sizeof(*renderer));
}
void GBAVideoAssociateRenderer(struct GBAVideo* video, struct GBAVideoRenderer* renderer) {
video->renderer->deinit(video->renderer);
renderer->cache = video->renderer->cache;
if (video->renderer) {
video->renderer->deinit(video->renderer);
renderer->cache = video->renderer->cache;
} else {
renderer->cache = NULL;
}
video->renderer = renderer;
renderer->palette = video->palette;
renderer->vram = video->vram;