all repos — mgba @ faf99ac304cdf16e09e0d85536866f7f84819ab6

mGBA Game Boy Advance Emulator

DS Video: Allow capture of 2D engine
Vicki Pfau vi@endrift.com
Sat, 04 Mar 2017 21:52:25 -0800
commit

faf99ac304cdf16e09e0d85536866f7f84819ab6

parent

4bde13effb788e4e30c0165ae521e357897ebfa0

3 files changed, 29 insertions(+), 6 deletions(-)

jump to
M include/mgba/internal/ds/video.hinclude/mgba/internal/ds/video.h

@@ -10,6 +10,7 @@ #include <mgba-util/common.h>

CXX_GUARD_START +#include <mgba/core/interface.h> #include <mgba/core/log.h> #include <mgba/core/timing.h> #include <mgba/internal/gba/video.h>

@@ -95,6 +96,7 @@ void (*writePalette)(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value);

void (*writeOAM)(struct DSVideoRenderer* renderer, uint32_t oam); void (*invalidateExtPal)(struct DSVideoRenderer* renderer, bool obj, bool engB, int slot); void (*drawScanline)(struct DSVideoRenderer* renderer, int y); + void (*drawScanlineDirectly)(struct DSVideoRenderer* renderer, int y, color_t* scanline); void (*finishFrame)(struct DSVideoRenderer* renderer); void (*getPixels)(struct DSVideoRenderer* renderer, size_t* stride, const void** pixels);
M src/ds/renderers/software.csrc/ds/renderers/software.c

@@ -18,6 +18,7 @@ static void DSVideoSoftwareRendererWritePalette(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value);

static void DSVideoSoftwareRendererWriteOAM(struct DSVideoRenderer* renderer, uint32_t oam); static void DSVideoSoftwareRendererInvalidateExtPal(struct DSVideoRenderer* renderer, bool obj, bool engB, int slot); static void DSVideoSoftwareRendererDrawScanline(struct DSVideoRenderer* renderer, int y); +static void DSVideoSoftwareRendererDrawScanlineDirectly(struct DSVideoRenderer* renderer, int y, color_t* scanline); static void DSVideoSoftwareRendererFinishFrame(struct DSVideoRenderer* renderer); static void DSVideoSoftwareRendererGetPixels(struct DSVideoRenderer* renderer, size_t* stride, const void** pixels); static void DSVideoSoftwareRendererPutPixels(struct DSVideoRenderer* renderer, size_t stride, const void* pixels);

@@ -139,6 +140,7 @@ renderer->d.writePalette = DSVideoSoftwareRendererWritePalette;

renderer->d.writeOAM = DSVideoSoftwareRendererWriteOAM; renderer->d.invalidateExtPal = DSVideoSoftwareRendererInvalidateExtPal; renderer->d.drawScanline = DSVideoSoftwareRendererDrawScanline; + renderer->d.drawScanlineDirectly = DSVideoSoftwareRendererDrawScanlineDirectly; renderer->d.finishFrame = DSVideoSoftwareRendererFinishFrame; renderer->d.getPixels = DSVideoSoftwareRendererGetPixels; renderer->d.putPixels = DSVideoSoftwareRendererPutPixels;

@@ -576,6 +578,17 @@ }

_drawScanlineA(softwareRenderer, y); _drawScanlineB(softwareRenderer, y); +} + +static void DSVideoSoftwareRendererDrawScanlineDirectly(struct DSVideoRenderer* renderer, int y, color_t* scanline) { + struct DSVideoSoftwareRenderer* softwareRenderer = (struct DSVideoSoftwareRenderer*) renderer; + if (!DSRegisterPOWCNT1IsSwap(softwareRenderer->powcnt)) { + softwareRenderer->engA.outputBuffer = &softwareRenderer->outputBuffer[softwareRenderer->outputBufferStride * DS_VIDEO_VERTICAL_PIXELS]; + } else { + softwareRenderer->engA.outputBuffer = softwareRenderer->outputBuffer; + } + + DSVideoSoftwareRendererDrawGBAScanline(&softwareRenderer->engA.d, softwareRenderer->d.gx, y); } static void DSVideoSoftwareRendererFinishFrame(struct DSVideoRenderer* renderer) {
M src/ds/video.csrc/ds/video.c

@@ -23,6 +23,7 @@ static void DSVideoDummyRendererWritePalette(struct DSVideoRenderer* renderer, uint32_t address, uint16_t value);

static void DSVideoDummyRendererWriteOAM(struct DSVideoRenderer* renderer, uint32_t oam); static void DSVideoDummyRendererInvalidateExtPal(struct DSVideoRenderer* renderer, bool obj, bool engB, int slot); static void DSVideoDummyRendererDrawScanline(struct DSVideoRenderer* renderer, int y); +static void DSVideoDummyRendererDrawScanlineDirectly(struct DSVideoRenderer* renderer, int y, color_t* scanline); static void DSVideoDummyRendererFinishFrame(struct DSVideoRenderer* renderer); static void DSVideoDummyRendererGetPixels(struct DSVideoRenderer* renderer, size_t* stride, const void** pixels); static void DSVideoDummyRendererPutPixels(struct DSVideoRenderer* renderer, size_t stride, const void* pixels);

@@ -136,6 +137,7 @@ .writePalette = DSVideoDummyRendererWritePalette,

.writeOAM = DSVideoDummyRendererWriteOAM, .invalidateExtPal = DSVideoDummyRendererInvalidateExtPal, .drawScanline = DSVideoDummyRendererDrawScanline, + .drawScanlineDirectly = DSVideoDummyRendererDrawScanlineDirectly, .finishFrame = DSVideoDummyRendererFinishFrame, .getPixels = DSVideoDummyRendererGetPixels, .putPixels = DSVideoDummyRendererPutPixels,

@@ -221,6 +223,7 @@ return;

} uint16_t* vram = &video->vram[0x10000 * block + DSRegisterDISPCAPCNTGetWriteOffset(dispcap) * 0x4000]; const color_t* pixelsA; + color_t pixels[DS_VIDEO_VERTICAL_PIXELS]; int width = DS_VIDEO_HORIZONTAL_PIXELS; switch (DSRegisterDISPCAPCNTGetCaptureSize(dispcap)) { case 0:

@@ -239,15 +242,13 @@ break;

} video->p->gx.renderer->getScanline(video->p->gx.renderer, y, &pixelsA); - /*if (DSRegisterDISPCAPCNTIsSourceA(dispcap)) { + if (DSRegisterDISPCAPCNTIsSourceA(dispcap)) { // TODO: Process scanline regardless of output type video->p->gx.renderer->getScanline(video->p->gx.renderer, y, &pixelsA); } else { - size_t stride; - const void* pixels; - video->renderer->getPixels(video->renderer, &stride, &pixels); - pixelsA = &((const color_t*) pixels)[stride * y]; - }*/ + video->renderer->drawScanlineDirectly(video->renderer, y, pixels); + pixelsA = pixels; + } uint16_t pixel; int x;

@@ -633,6 +634,13 @@

static void DSVideoDummyRendererDrawScanline(struct DSVideoRenderer* renderer, int y) { UNUSED(renderer); UNUSED(y); + // Nothing to do +} + +static void DSVideoDummyRendererDrawScanlineDirectly(struct DSVideoRenderer* renderer, int y, color_t* scanline) { + UNUSED(renderer); + UNUSED(y); + UNUSED(scanline); // Nothing to do }