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