all repos — mgba @ 66ee98513fa240be9b0bf0b98b4a1f697fcf0c6c

mGBA Game Boy Advance Emulator

Pass pointers instead of offsets to composite
Jeffrey Pfau jeffrey@endrift.com
Sun, 03 Nov 2013 00:54:02 -0700
commit

66ee98513fa240be9b0bf0b98b4a1f697fcf0c6c

parent

32e0591fd0db4fc2b868865dd5db96e9bce73157

1 files changed, 86 insertions(+), 76 deletions(-)

jump to
M src/gba/renderers/video-software.csrc/gba/renderers/video-software.c

@@ -611,49 +611,49 @@ renderer->bg[3].sx += renderer->bg[3].dmx;

renderer->bg[3].sy += renderer->bg[3].dmy; } -static void _composite(struct GBAVideoSoftwareRenderer* renderer, int offset, uint32_t color, uint32_t current) { +static void _composite(struct GBAVideoSoftwareRenderer* renderer, uint32_t* pixel, uint32_t color, uint32_t current) { // We stash the priority on the top bits so we can do a one-operator comparison // The lower the number, the higher the priority, and sprites take precendence over backgrounds // We want to do special processing if the color pixel is target 1, however if (current & FLAG_UNWRITTEN) { - renderer->row[offset] = color | (current & FLAG_OBJWIN); + *pixel = color | (current & FLAG_OBJWIN); } else if ((color & FLAG_ORDER_MASK) < (current & FLAG_ORDER_MASK)) { if (!(color & FLAG_TARGET_1) || !(current & FLAG_TARGET_2)) { - renderer->row[offset] = color | FLAG_FINALIZED; + *pixel = color | FLAG_FINALIZED; } else { - renderer->row[offset] = _mix(renderer->bldb, current, renderer->blda, color) | FLAG_FINALIZED; + *pixel = _mix(renderer->bldb, current, renderer->blda, color) | FLAG_FINALIZED; } } else { if (current & FLAG_TARGET_1 && color & FLAG_TARGET_2) { - renderer->row[offset] = _mix(renderer->blda, current, renderer->bldb, color) | FLAG_FINALIZED; + *pixel = _mix(renderer->blda, current, renderer->bldb, color) | FLAG_FINALIZED; } else { - renderer->row[offset] = current | FLAG_FINALIZED; + *pixel = current | FLAG_FINALIZED; } } } #define BACKGROUND_DRAW_PIXEL_16 \ pixelData = tileData & 0xF; \ - current = renderer->row[outX]; \ + current = *pixel; \ if (pixelData && !(current & FLAG_FINALIZED)) { \ if (!objwinSlowPath) { \ - _composite(renderer, outX, palette[pixelData | paletteData] | flags, current); \ + _composite(renderer, pixel, palette[pixelData | paletteData] | flags, current); \ } else if (objwinForceEnable || !(current & FLAG_OBJWIN) == objwinOnly) { \ color_t* currentPalette = (current & FLAG_OBJWIN) ? objwinPalette : palette; \ - _composite(renderer, outX, currentPalette[pixelData | paletteData] | flags, current); \ + _composite(renderer, pixel, currentPalette[pixelData | paletteData] | flags, current); \ } \ } \ tileData >>= 4; #define BACKGROUND_DRAW_PIXEL_256 \ pixelData = tileData & 0xFF; \ - current = renderer->row[outX]; \ + current = *pixel; \ if (pixelData && !(current & FLAG_FINALIZED)) { \ if (!objwinSlowPath) { \ - _composite(renderer, outX, palette[pixelData] | flags, current); \ + _composite(renderer, pixel, palette[pixelData] | flags, current); \ } else if (objwinForceEnable || !(current & FLAG_OBJWIN) == objwinOnly) { \ color_t* currentPalette = (current & FLAG_OBJWIN) ? objwinPalette : palette; \ - _composite(renderer, outX, currentPalette[pixelData] | flags, current); \ + _composite(renderer, pixel, currentPalette[pixelData] | flags, current); \ } \ } \ tileData >>= 8;

@@ -761,10 +761,12 @@ tileData = ((uint32_t*)renderer->d.vram)[charBase];

if (!GBA_TEXT_MAP_HFLIP(mapData)) { tileData >>= 4 * mod8; for (; outX < end; ++outX) { + uint32_t* pixel = &renderer->row[outX]; BACKGROUND_DRAW_PIXEL_16; } } else { for (outX = end - 1; outX >= renderer->start; --outX) { + uint32_t* pixel = &renderer->row[outX]; BACKGROUND_DRAW_PIXEL_16; } }

@@ -778,6 +780,7 @@ tileData = ((uint32_t*)renderer->d.vram)[charBase];

tileData >>= 8 * shift; shift = 0; for (; outX < end2; ++outX) { + uint32_t* pixel = &renderer->row[outX]; BACKGROUND_DRAW_PIXEL_256; } }

@@ -785,6 +788,7 @@

tileData = ((uint32_t*)renderer->d.vram)[charBase + 1]; tileData >>= 8 * shift; for (; outX < end; ++outX) { + uint32_t* pixel = &renderer->row[outX]; BACKGROUND_DRAW_PIXEL_256; } }

@@ -807,6 +811,7 @@ tileData >>= 4 * -outX;

outX = 0; } for (; outX < renderer->end; ++outX) { + uint32_t* pixel = &renderer->row[outX]; BACKGROUND_DRAW_PIXEL_16; } } else {

@@ -816,6 +821,7 @@ if (end2 < -1) {

end2 = -1; } for (outX = renderer->end - 1; outX > end2; --outX) { + uint32_t* pixel = &renderer->row[outX]; BACKGROUND_DRAW_PIXEL_16; } }

@@ -827,6 +833,7 @@ int end2 = 4 - end;

if (end2 > 0) { tileData = ((uint32_t*)renderer->d.vram)[charBase]; for (; outX < renderer->end - end2; ++outX) { + uint32_t* pixel = &renderer->row[outX]; BACKGROUND_DRAW_PIXEL_256; } ++charBase;

@@ -834,6 +841,7 @@ }

tileData = ((uint32_t*)renderer->d.vram)[charBase]; for (; outX < renderer->end; ++outX) { + uint32_t* pixel = &renderer->row[outX]; BACKGROUND_DRAW_PIXEL_256; } }

@@ -842,6 +850,7 @@ tileX = (inX & 0x7) != 0;

outX = renderer->start + tileX * 8 - (inX & 0x7); } + uint32_t* pixel = &renderer->row[outX]; if (background->mosaic) { int mosaicH = renderer->mosaic.bgH + 1; int x;

@@ -875,7 +884,7 @@ mosaicWait = mosaicH;

} --mosaicWait; BACKGROUND_DRAW_PIXEL_16; - ++outX; + ++pixel; } } } else {

@@ -893,42 +902,42 @@ tileData = ((uint32_t*)renderer->d.vram)[charBase];

if (tileData) { if (!GBA_TEXT_MAP_HFLIP(mapData)) { BACKGROUND_DRAW_PIXEL_16; - ++outX; + ++pixel; BACKGROUND_DRAW_PIXEL_16; - ++outX; + ++pixel; BACKGROUND_DRAW_PIXEL_16; - ++outX; + ++pixel; BACKGROUND_DRAW_PIXEL_16; - ++outX; + ++pixel; BACKGROUND_DRAW_PIXEL_16; - ++outX; + ++pixel; BACKGROUND_DRAW_PIXEL_16; - ++outX; + ++pixel; BACKGROUND_DRAW_PIXEL_16; - ++outX; + ++pixel; BACKGROUND_DRAW_PIXEL_16; - ++outX; + ++pixel; } else { - outX += 7; + pixel += 7; BACKGROUND_DRAW_PIXEL_16; - --outX; + --pixel; BACKGROUND_DRAW_PIXEL_16; - --outX; + --pixel; BACKGROUND_DRAW_PIXEL_16; - --outX; + --pixel; BACKGROUND_DRAW_PIXEL_16; - --outX; + --pixel; BACKGROUND_DRAW_PIXEL_16; - --outX; + --pixel; BACKGROUND_DRAW_PIXEL_16; - --outX; + --pixel; BACKGROUND_DRAW_PIXEL_16; - --outX; + --pixel; BACKGROUND_DRAW_PIXEL_16; - outX += 8; + pixel += 8; } } else { - outX += 8; + pixel += 8; } } } else {

@@ -939,58 +948,54 @@ if (!GBA_TEXT_MAP_HFLIP(mapData)) {

tileData = ((uint32_t*)renderer->d.vram)[charBase]; if (tileData) { BACKGROUND_DRAW_PIXEL_256; - ++outX; + ++pixel; BACKGROUND_DRAW_PIXEL_256; - ++outX; + ++pixel; BACKGROUND_DRAW_PIXEL_256; - ++outX; + ++pixel; BACKGROUND_DRAW_PIXEL_256; - ++outX; + ++pixel; } else { - outX += 4; + pixel += 4; } tileData = ((uint32_t*)renderer->d.vram)[charBase + 1]; if (tileData) { BACKGROUND_DRAW_PIXEL_256; - ++outX; + ++pixel; BACKGROUND_DRAW_PIXEL_256; - ++outX; + ++pixel; BACKGROUND_DRAW_PIXEL_256; - ++outX; + ++pixel; BACKGROUND_DRAW_PIXEL_256; - ++outX; + ++pixel; } else { - outX += 4; + pixel += 4; } } else { uint32_t tileData = ((uint32_t*)renderer->d.vram)[charBase + 1]; if (tileData) { - outX += 3; + pixel += 3; BACKGROUND_DRAW_PIXEL_256; - --outX; + --pixel; BACKGROUND_DRAW_PIXEL_256; - --outX; + --pixel; BACKGROUND_DRAW_PIXEL_256; - --outX; + --pixel; BACKGROUND_DRAW_PIXEL_256; - outX += 4; - } else { - outX += 4; } + pixel += 4; tileData = ((uint32_t*)renderer->d.vram)[charBase]; if (tileData) { - outX += 3; + pixel += 3; BACKGROUND_DRAW_PIXEL_256; - --outX; + --pixel; BACKGROUND_DRAW_PIXEL_256; - --outX; + --pixel; BACKGROUND_DRAW_PIXEL_256; - --outX; + --pixel; BACKGROUND_DRAW_PIXEL_256; - outX += 4; - } else { - outX += 4; } + pixel += 4; } } }

@@ -1038,7 +1043,8 @@ uint8_t mapData;

uint8_t tileData; int outX; - for (outX = renderer->start; outX < renderer->end; ++outX) { + uint32_t* pixel; + for (outX = renderer->start, pixel = &renderer->row[outX]; outX < renderer->end; ++outX, ++pixel) { x += background->dx; y += background->dy;

@@ -1054,13 +1060,13 @@ }

mapData = ((uint8_t*)renderer->d.vram)[screenBase + (localX >> 11) + (((localY >> 7) & 0x7F0) << background->size)]; tileData = ((uint8_t*)renderer->d.vram)[charBase + (mapData << 6) + ((localY & 0x700) >> 5) + ((localX & 0x700) >> 8)]; - uint32_t current = renderer->row[outX]; + uint32_t current = *pixel; if (tileData && !(current & FLAG_FINALIZED)) { if (!objwinSlowPath) { - _composite(renderer, outX, palette[tileData] | flags, current); + _composite(renderer, pixel, palette[tileData] | flags, current); } else if (objwinForceEnable || !(current & FLAG_OBJWIN) == objwinOnly) { color_t* currentPalette = (current & FLAG_OBJWIN) ? objwinPalette : palette; - _composite(renderer, outX, currentPalette[tileData] | flags, current); + _composite(renderer, pixel, currentPalette[tileData] | flags, current); } } }

@@ -1072,7 +1078,8 @@

uint32_t color; int outX; - for (outX = renderer->start; outX < renderer->end; ++outX) { + uint32_t* pixel; + for (outX = renderer->start, pixel = &renderer->row[outX]; outX < renderer->end; ++outX, ++pixel) { BACKGROUND_BITMAP_ITERATE(VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS); color = ((uint16_t*)renderer->d.vram)[(localX >> 8) + (localY >> 8) * VIDEO_HORIZONTAL_PIXELS];

@@ -1085,14 +1092,14 @@ color32 |= (color << 9) & 0xF80000;

color = color32; #endif - uint32_t current = renderer->row[outX]; + uint32_t current = *pixel; if (!(current & FLAG_FINALIZED) && (!objwinSlowPath || !(current & FLAG_OBJWIN) != objwinOnly)) { if (!variant) { - _composite(renderer, outX, color | flags, current); + _composite(renderer, pixel, color | flags, current); } else if (renderer->blendEffect == BLEND_BRIGHTEN) { - _composite(renderer, outX, _brighten(color, renderer->bldy) | flags, current); + _composite(renderer, pixel, _brighten(color, renderer->bldy) | flags, current); } else if (renderer->blendEffect == BLEND_DARKEN) { - _composite(renderer, outX, _darken(color, renderer->bldy) | flags, current); + _composite(renderer, pixel, _darken(color, renderer->bldy) | flags, current); } } }

@@ -1108,18 +1115,19 @@ offset = 0xA000;

} int outX; - for (outX = renderer->start; outX < renderer->end; ++outX) { + uint32_t* pixel; + for (outX = renderer->start, pixel = &renderer->row[outX]; outX < renderer->end; ++outX, ++pixel) { BACKGROUND_BITMAP_ITERATE(VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS); color = ((uint8_t*)renderer->d.vram)[offset + (localX >> 8) + (localY >> 8) * VIDEO_HORIZONTAL_PIXELS]; - uint32_t current = renderer->row[outX]; + uint32_t current = *pixel; if (color && !(current & FLAG_FINALIZED)) { if (!objwinSlowPath) { - _composite(renderer, outX, palette[color] | flags, current); + _composite(renderer, pixel, palette[color] | flags, current); } else if (objwinForceEnable || !(current & FLAG_OBJWIN) == objwinOnly) { color_t* currentPalette = (current & FLAG_OBJWIN) ? objwinPalette : palette; - _composite(renderer, outX, currentPalette[color] | flags, current); + _composite(renderer, pixel, currentPalette[color] | flags, current); } } }

@@ -1135,7 +1143,8 @@ offset = 0xA000;

} int outX; - for (outX = renderer->start; outX < renderer->end; ++outX) { + uint32_t* pixel; + for (outX = renderer->start, pixel = &renderer->row[outX]; outX < renderer->end; ++outX, ++pixel) { BACKGROUND_BITMAP_ITERATE(160, 128); color = ((uint16_t*)renderer->d.vram)[offset + (localX >> 8) + (localY >> 8) * 160];

@@ -1147,14 +1156,14 @@ color32 |= (color << 6) & 0xF800;

color = color32; #endif - uint32_t current = renderer->row[outX]; + uint32_t current = *pixel; if (!(current & FLAG_FINALIZED) && (!objwinSlowPath || !(current & FLAG_OBJWIN) != objwinOnly)) { if (!variant) { - _composite(renderer, outX, color | flags, current); + _composite(renderer, pixel, color | flags, current); } else if (renderer->blendEffect == BLEND_BRIGHTEN) { - _composite(renderer, outX, _brighten(color, renderer->bldy) | flags, current); + _composite(renderer, pixel, _brighten(color, renderer->bldy) | flags, current); } else if (renderer->blendEffect == BLEND_DARKEN) { - _composite(renderer, outX, _darken(color, renderer->bldy) | flags, current); + _composite(renderer, pixel, _darken(color, renderer->bldy) | flags, current); } } }

@@ -1378,11 +1387,12 @@ }

static void _postprocessSprite(struct GBAVideoSoftwareRenderer* renderer, unsigned priority) { int x; - for (x = 0; x < VIDEO_HORIZONTAL_PIXELS; ++x) { + uint32_t* pixel = renderer->row; + for (x = 0; x < VIDEO_HORIZONTAL_PIXELS; ++x, ++pixel) { uint32_t color = renderer->spriteLayer[x]; - uint32_t current = renderer->row[x]; + uint32_t current = *pixel; if ((color & FLAG_FINALIZED) && (color & FLAG_PRIORITY) >> OFFSET_PRIORITY == priority && !(current & FLAG_FINALIZED)) { - _composite(renderer, x, color & ~FLAG_FINALIZED, current); + _composite(renderer, pixel, color & ~FLAG_FINALIZED, current); } } }