all repos — mgba @ a5f664ca72882ef3865b94e8bd5c1dca7fdaef41

mGBA Game Boy Advance Emulator

DS Video: Layer toggling
Vicki Pfau vi@endrift.com
Sat, 22 Apr 2017 02:45:26 -0700
commit

a5f664ca72882ef3865b94e8bd5c1dca7fdaef41

parent

154dd2e8e7c064568b901387de5fdfb4341b0577

M include/mgba/internal/ds/video.hinclude/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.csrc/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.csrc/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.cppsrc/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);