DS Video: Layer toggling
Vicki Pfau vi@endrift.com
Sat, 22 Apr 2017 02:45:26 -0700
4 files changed,
58 insertions(+),
7 deletions(-)
M
include/mgba/internal/ds/video.h
→
include/mgba/internal/ds/video.h
@@ -112,6 +112,12 @@ uint16_t* vramBBG[32];
uint16_t* vramBOBJ[32]; uint16_t* vramBBGExtPal[4]; uint16_t* vramBOBJExtPal; + + bool disableABG[4]; + bool disableAOBJ; + bool disableBBG[4]; + bool disableBOBJ; + union DSOAM* oam; struct DSGX* gx; };
M
src/ds/core.c
→
src/ds/core.c
@@ -24,11 +24,11 @@ { 1, "abg1", "A BG1", NULL },
{ 2, "abg2", "A BG2", NULL }, { 3, "abg3", "A BG3", NULL }, { 4, "aobj", "A OBJ", NULL }, - { 5, "bbg0", "B BG0", "2D/3D" }, - { 6, "bbg1", "B BG1", NULL }, - { 7, "bbg2", "B BG2", NULL }, - { 8, "bbg3", "B BG3", NULL }, - { 9, "bobj", "B OBJ", NULL }, + { 10, "bbg0", "B BG0", "2D/3D" }, + { 11, "bbg1", "B BG1", NULL }, + { 12, "bbg2", "B BG2", NULL }, + { 13, "bbg3", "B BG3", NULL }, + { 14, "bobj", "B OBJ", NULL }, }; const static struct mCoreChannelInfo _DSAudioChannels[] = {@@ -564,7 +564,28 @@ }
static void _DSCoreEnableVideoLayer(struct mCore* core, size_t id, bool enable) { struct DS* ds = core->board; - // TODO + switch (id) { + case 0: + case 1: + case 2: + case 3: + ds->video.renderer->disableABG[id] = !enable; + break; + case 4: + ds->video.renderer->disableAOBJ = !enable; + break; + case 10: + case 11: + case 12: + case 13: + ds->video.renderer->disableBBG[id - 10] = !enable; + break; + case 14: + ds->video.renderer->disableBOBJ = !enable; + break; + default: + break; + } } static void _DSCoreEnableAudioChannel(struct mCore* core, size_t id, bool enable) {
M
src/ds/renderers/software.c
→
src/ds/renderers/software.c
@@ -146,6 +146,18 @@ renderer->d.finishFrame = DSVideoSoftwareRendererFinishFrame;
renderer->d.getPixels = DSVideoSoftwareRendererGetPixels; renderer->d.putPixels = DSVideoSoftwareRendererPutPixels; + renderer->d.disableABG[0] = false; + renderer->d.disableABG[1] = false; + renderer->d.disableABG[2] = false; + renderer->d.disableABG[3] = false; + renderer->d.disableAOBJ = false; + + renderer->d.disableBBG[0] = false; + renderer->d.disableBBG[1] = false; + renderer->d.disableBBG[2] = false; + renderer->d.disableBBG[3] = false; + renderer->d.disableBOBJ = false; + renderer->engA.d.cache = NULL; GBAVideoSoftwareRendererCreate(&renderer->engA); renderer->engA.combinedObjSort = true;@@ -610,6 +622,18 @@ } else {
softwareRenderer->engA.outputBuffer = softwareRenderer->outputBuffer; softwareRenderer->engB.outputBuffer = &softwareRenderer->outputBuffer[softwareRenderer->outputBufferStride * DS_VIDEO_VERTICAL_PIXELS]; } + + softwareRenderer->engA.d.disableBG[0] = softwareRenderer->d.disableABG[0]; + softwareRenderer->engA.d.disableBG[1] = softwareRenderer->d.disableABG[1]; + softwareRenderer->engA.d.disableBG[2] = softwareRenderer->d.disableABG[2]; + softwareRenderer->engA.d.disableBG[3] = softwareRenderer->d.disableABG[3]; + softwareRenderer->engA.d.disableOBJ = softwareRenderer->d.disableAOBJ; + + softwareRenderer->engB.d.disableBG[0] = softwareRenderer->d.disableBBG[0]; + softwareRenderer->engB.d.disableBG[1] = softwareRenderer->d.disableBBG[1]; + softwareRenderer->engB.d.disableBG[2] = softwareRenderer->d.disableBBG[2]; + softwareRenderer->engB.d.disableBG[3] = softwareRenderer->d.disableBBG[3]; + softwareRenderer->engB.d.disableOBJ = softwareRenderer->d.disableBOBJ; _drawScanlineA(softwareRenderer, y); _drawScanlineB(softwareRenderer, y);
M
src/platform/qt/GameController.cpp
→
src/platform/qt/GameController.cpp
@@ -902,7 +902,7 @@ }
} void GameController::setVideoLayerEnabled(int layer, bool enable) { - if (layer > 4 || layer < 0) { + if (layer > 32 || layer < 0) { return; } m_videoLayers.reserve(layer + 1);