Path: blob/master/libsnes/bsnes/snes/alt/ppu-performance/cache/cache.cpp
2 views
#ifdef PPU_CPP12uint8* PPU::Cache::tile_2bpp(unsigned tile) {3if(tilevalid[0][tile] == 0) {4tilevalid[0][tile] = 1;5uint8 *output = (uint8*)tiledata[0] + (tile << 6);6unsigned offset = tile << 4;7unsigned y = 8;8unsigned color, d0, d1;9while(y--) {10d0 = ppu.vram[offset + 0];11d1 = ppu.vram[offset + 1];12#define render_line(mask) \13color = !!(d0 & mask) << 0; \14color |= !!(d1 & mask) << 1; \15*output++ = color16render_line(0x80);17render_line(0x40);18render_line(0x20);19render_line(0x10);20render_line(0x08);21render_line(0x04);22render_line(0x02);23render_line(0x01);24#undef render_line25offset += 2;26}27}28return tiledata[0] + (tile << 6);29}3031uint8* PPU::Cache::tile_4bpp(unsigned tile) {32if(tilevalid[1][tile] == 0) {33tilevalid[1][tile] = 1;34uint8 *output = (uint8*)tiledata[1] + (tile << 6);35unsigned offset = tile << 5;36unsigned y = 8;37unsigned color, d0, d1, d2, d3;38while(y--) {39d0 = ppu.vram[offset + 0];40d1 = ppu.vram[offset + 1];41d2 = ppu.vram[offset + 16];42d3 = ppu.vram[offset + 17];43#define render_line(mask) \44color = !!(d0 & mask) << 0; \45color |= !!(d1 & mask) << 1; \46color |= !!(d2 & mask) << 2; \47color |= !!(d3 & mask) << 3; \48*output++ = color49render_line(0x80);50render_line(0x40);51render_line(0x20);52render_line(0x10);53render_line(0x08);54render_line(0x04);55render_line(0x02);56render_line(0x01);57#undef render_line58offset += 2;59}60}61return tiledata[1] + (tile << 6);62}6364uint8* PPU::Cache::tile_8bpp(unsigned tile) {65if(tilevalid[2][tile] == 0) {66tilevalid[2][tile] = 1;67uint8 *output = (uint8*)tiledata[2] + (tile << 6);68unsigned offset = tile << 6;69unsigned y = 8;70unsigned color, d0, d1, d2, d3, d4, d5, d6, d7;71while(y--) {72d0 = ppu.vram[offset + 0];73d1 = ppu.vram[offset + 1];74d2 = ppu.vram[offset + 16];75d3 = ppu.vram[offset + 17];76d4 = ppu.vram[offset + 32];77d5 = ppu.vram[offset + 33];78d6 = ppu.vram[offset + 48];79d7 = ppu.vram[offset + 49];80#define render_line(mask) \81color = !!(d0 & mask) << 0; \82color |= !!(d1 & mask) << 1; \83color |= !!(d2 & mask) << 2; \84color |= !!(d3 & mask) << 3; \85color |= !!(d4 & mask) << 4; \86color |= !!(d5 & mask) << 5; \87color |= !!(d6 & mask) << 6; \88color |= !!(d7 & mask) << 7; \89*output++ = color90render_line(0x80);91render_line(0x40);92render_line(0x20);93render_line(0x10);94render_line(0x08);95render_line(0x04);96render_line(0x02);97render_line(0x01);98#undef render_line99offset += 2;100}101}102return tiledata[2] + (tile << 6);103}104105uint8* PPU::Cache::tile(unsigned bpp, unsigned tile) {106switch(bpp) {107case 0: return tile_2bpp(tile);108case 1: return tile_4bpp(tile);109case 2: return tile_8bpp(tile);110}111}112113PPU::Cache::Cache(PPU &self) : self(self) {114tiledata[0] = new uint8[262144]();115tiledata[1] = new uint8[131072]();116tiledata[2] = new uint8[ 65536]();117tilevalid[0] = new uint8[ 4096]();118tilevalid[1] = new uint8[ 2048]();119tilevalid[2] = new uint8[ 1024]();120}121122PPU::Cache::~Cache()123{124delete[] tiledata[0];125delete[] tiledata[1];126delete[] tiledata[2];127delete[] tilevalid[0];128delete[] tilevalid[1];129delete[] tilevalid[2];130}131132#endif133134135