diff --git a/include/mgba/internal/ds/video.h b/include/mgba/internal/ds/video.h index 521de023b..8cc2e878d 100644 --- a/include/mgba/internal/ds/video.h +++ b/include/mgba/internal/ds/video.h @@ -112,6 +112,12 @@ struct DSVideoRenderer { 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; }; diff --git a/src/ds/core.c b/src/ds/core.c index afa686ecf..66f005d42 100644 --- a/src/ds/core.c +++ b/src/ds/core.c @@ -24,11 +24,11 @@ const static struct mCoreChannelInfo _DSVideoLayers[] = { { 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 size_t _DSCoreListAudioChannels(const struct mCore* core, const struct mC 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) { diff --git a/src/ds/renderers/software.c b/src/ds/renderers/software.c index 845279a06..41df1eadd 100644 --- a/src/ds/renderers/software.c +++ b/src/ds/renderers/software.c @@ -146,6 +146,18 @@ void DSVideoSoftwareRendererCreate(struct DSVideoSoftwareRenderer* renderer) { 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; @@ -611,6 +623,18 @@ static void DSVideoSoftwareRendererDrawScanline(struct DSVideoRenderer* renderer 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); } diff --git a/src/platform/qt/GameController.cpp b/src/platform/qt/GameController.cpp index 7422496f8..2c14890be 100644 --- a/src/platform/qt/GameController.cpp +++ b/src/platform/qt/GameController.cpp @@ -902,7 +902,7 @@ void GameController::startAudio() { } void GameController::setVideoLayerEnabled(int layer, bool enable) { - if (layer > 4 || layer < 0) { + if (layer > 32 || layer < 0) { return; } m_videoLayers.reserve(layer + 1);