Permalink
Browse files

DS Video: Simplify VRAM mapping

  • Loading branch information...
endrift committed Jul 16, 2017
1 parent f80bcfa commit de55e441520f1678864c7fe9d1936a013b096a65
Showing with 148 additions and 180 deletions.
  1. +1 −0 CHANGES
  2. +0 −9 src/ds/renderers/software.c
  3. +28 −12 src/ds/video.c
  4. +113 −159 src/gba/renderers/software-mode0.c
  5. +6 −0 src/gba/video.c
View
@@ -7,6 +7,7 @@ Bugfixes:
Misc:
- DS GX: Clean up and unify texture mapping
- DS Core: Add symbol loading
+ - DS Video: Simplify VRAM mapping
0.7.0: (Future)
Features:
@@ -699,9 +699,6 @@ static void DSVideoSoftwareRendererPutPixels(struct DSVideoRenderer* renderer, s
} \
uint32_t charBase = (background->charBase + (GBA_TEXT_MAP_TILE(mapData) << 6)) + ((localY & 0x700) >> 5) + ((localX & 0x700) >> 8); \
uint16_t* vram = renderer->d.vramBG[charBase >> VRAM_BLOCK_OFFSET]; \
- if (UNLIKELY(!vram)) { \
- continue; \
- } \
pixelData = ((uint8_t*) vram)[charBase & VRAM_BLOCK_MASK];
#define EXT_0_MOSAIC(COORD, PAL) \
@@ -839,9 +836,6 @@ void DSVideoSoftwareRendererDrawBackgroundExt1(struct GBAVideoSoftwareRenderer*
if (!mosaicWait) {
uint32_t address = (localX >> 8) + (localY >> 8) * width + screenBase;
uint8_t* vram = (uint8_t*) renderer->d.vramBG[address >> VRAM_BLOCK_OFFSET];
- if (UNLIKELY(!vram)) {
- continue;
- }
color = vram[address & VRAM_BLOCK_MASK];
mosaicWait = mosaicH;
} else {
@@ -896,9 +890,6 @@ void DSVideoSoftwareRendererDrawBackgroundExt2(struct GBAVideoSoftwareRenderer*
if (!mosaicWait) {
uint32_t address = ((localX >> 8) + (localY >> 8) * width + screenBase) << 1;
uint16_t* vram = renderer->d.vramBG[address >> VRAM_BLOCK_OFFSET];
- if (UNLIKELY(!vram)) {
- continue;
- }
LOAD_16(color, address & VRAM_BLOCK_MASK, vram);
#ifndef COLOR_16_BIT
unsigned color32;
View
@@ -45,6 +45,8 @@ static const uint32_t _vramSize[9] = {
0x04000
};
+static uint16_t _zeroes[0x2000] = {};
+
enum DSVRAMBankMode {
MODE_A_BG = 0,
MODE_B_BG = 1,
@@ -186,6 +188,20 @@ void DSVideoReset(struct DSVideo* video) {
video->p->memory.vramBank[7] = &video->vram[0x4C000];
video->p->memory.vramBank[8] = &video->vram[0x50000];
+ int i;
+ for (i = 0; i < 32; ++i) {
+ video->renderer->vramABG[i] = _zeroes;
+ video->renderer->vramBBG[i] = _zeroes;
+ video->renderer->vramAOBJ[i] = _zeroes;
+ video->renderer->vramBOBJ[i] = _zeroes;
+ }
+ for (i = 0; i < 4; ++i) {
+ video->renderer->vramABGExtPal[i] = NULL;
+ video->renderer->vramBBGExtPal[i] = NULL;
+ }
+ video->renderer->vramAOBJExtPal = NULL;
+ video->renderer->vramBOBJExtPal = NULL;
+
video->renderer->deinit(video->renderer);
video->renderer->init(video->renderer);
}
@@ -499,8 +515,8 @@ void DSVideoConfigureVRAM(struct DS* ds, int index, uint8_t value, uint8_t oldVa
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
for (i = 0; i < size; ++i) {
if (ds->video.vramABG[i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
- ds->video.vramABG[i + j] = NULL;
- ds->video.renderer->vramABG[i + j] = NULL;
+ ds->video.vramABG[i + j] = _zeroes;
+ ds->video.renderer->vramABG[i + j] = _zeroes;
}
}
}
@@ -509,8 +525,8 @@ void DSVideoConfigureVRAM(struct DS* ds, int index, uint8_t value, uint8_t oldVa
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
for (i = 0; i < size; ++i) {
if (ds->video.vramBBG[i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
- ds->video.vramBBG[i + j] = NULL;
- ds->video.renderer->vramBBG[i + j] = NULL;
+ ds->video.vramBBG[i + j] = _zeroes;
+ ds->video.renderer->vramBBG[i + j] = _zeroes;
}
}
}
@@ -519,8 +535,8 @@ void DSVideoConfigureVRAM(struct DS* ds, int index, uint8_t value, uint8_t oldVa
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
for (i = 0; i < size; ++i) {
if (ds->video.vramAOBJ[i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
- ds->video.vramAOBJ[i + j] = NULL;
- ds->video.renderer->vramAOBJ[i + j] = NULL;
+ ds->video.vramAOBJ[i + j] = _zeroes;
+ ds->video.renderer->vramAOBJ[i + j] = _zeroes;
}
}
}
@@ -529,8 +545,8 @@ void DSVideoConfigureVRAM(struct DS* ds, int index, uint8_t value, uint8_t oldVa
for (j = offset; j < 0x20; j += oldInfo.mirrorSize) {
for (i = 0; i < size; ++i) {
if (ds->video.vramBOBJ[i + j] == &memory->vramBank[index][i << (DS_VRAM_OFFSET - 1)]) {
- ds->video.vramBOBJ[i + j] = NULL;
- ds->video.renderer->vramBOBJ[i + j] = NULL;
+ ds->video.vramBOBJ[i + j] = _zeroes;
+ ds->video.renderer->vramBOBJ[i + j] = _zeroes;
}
}
}
@@ -569,16 +585,16 @@ void DSVideoConfigureVRAM(struct DS* ds, int index, uint8_t value, uint8_t oldVa
break;
case MODE_3D_TEX:
if (ds->gx.tex[offset] == memory->vramBank[index]) {
- ds->gx.tex[offset] = NULL;
- ds->gx.renderer->tex[offset] = NULL;
+ ds->gx.tex[offset] = _zeroes;
+ ds->gx.renderer->tex[offset] = _zeroes;
ds->gx.renderer->invalidateTex(ds->gx.renderer, offset);
}
break;
case MODE_3D_TEX_PAL:
for (i = 0; i < oldInfo.mirrorSize; ++i) {
if (ds->gx.texPal[offset + i] == &memory->vramBank[index][i << 13]) {
- ds->gx.texPal[offset + i] = NULL;
- ds->gx.renderer->texPal[offset + i] = NULL;
+ ds->gx.texPal[offset + i] = _zeroes;
+ ds->gx.renderer->texPal[offset + i] = _zeroes;
}
}
break;
Oops, something went wrong.

0 comments on commit de55e44

Please sign in to comment.