Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/alt/ppu-performance/screen/screen.cpp
2 views
1
#ifdef PPU_CPP
2
3
unsigned PPU::Screen::get_palette(unsigned color) {
4
#if defined(ARCH_LSB)
5
return ((uint16*)ppu.cgram)[color];
6
#else
7
color <<= 1;
8
return (ppu.cgram[color + 0] << 0) + (ppu.cgram[color + 1] << 8);
9
#endif
10
}
11
12
unsigned PPU::Screen::get_direct_color(unsigned p, unsigned t) {
13
return ((t & 7) << 2) | ((p & 1) << 1) |
14
(((t >> 3) & 7) << 7) | (((p >> 1) & 1) << 6) |
15
((t >> 6) << 13) | ((p >> 2) << 12);
16
}
17
18
uint16 PPU::Screen::addsub(unsigned x, unsigned y, bool halve) {
19
if(!regs.color_mode) {
20
if(!halve) {
21
unsigned sum = x + y;
22
unsigned carry = (sum - ((x ^ y) & 0x0421)) & 0x8420;
23
return (sum - carry) | (carry - (carry >> 5));
24
} else {
25
return (x + y - ((x ^ y) & 0x0421)) >> 1;
26
}
27
} else {
28
unsigned diff = x - y + 0x8420;
29
unsigned borrow = (diff - ((x ^ y) & 0x8420)) & 0x8420;
30
if(!halve) {
31
return (diff - borrow) & (borrow - (borrow >> 5));
32
} else {
33
return (((diff - borrow) & (borrow - (borrow >> 5))) & 0x7bde) >> 1;
34
}
35
}
36
}
37
38
void PPU::Screen::scanline() {
39
unsigned main_color = get_palette(0);
40
unsigned sub_color = (self.regs.pseudo_hires == false && self.regs.bgmode != 5 && self.regs.bgmode != 6)
41
? regs.color : main_color;
42
43
for(unsigned x = 0; x < 256; x++) {
44
output.main[x].color = main_color;
45
output.main[x].priority = 0;
46
output.main[x].source = 6;
47
48
output.sub[x].color = sub_color;
49
output.sub[x].priority = 0;
50
output.sub[x].source = 6;
51
}
52
53
window.render(0);
54
window.render(1);
55
}
56
57
void PPU::Screen::render_black() {
58
uint32 *data = self.output + self.vcounter() * 1024;
59
if(self.interlace() && self.field()) data += 512;
60
memset(data, 0, self.display.width << 2);
61
}
62
63
uint16 PPU::Screen::get_pixel_main(unsigned x) {
64
auto main = output.main[x];
65
auto sub = output.sub[x];
66
67
if(!regs.addsub_mode) {
68
sub.source = 6;
69
sub.color = regs.color;
70
}
71
72
if(!window.main[x]) {
73
if(!window.sub[x]) {
74
return 0x0000;
75
}
76
main.color = 0x0000;
77
}
78
79
if(main.source != 5 && regs.color_enable[main.source] && window.sub[x]) {
80
bool halve = false;
81
if(regs.color_halve && window.main[x]) {
82
if(!regs.addsub_mode || sub.source != 6) halve = true;
83
}
84
return addsub(main.color, sub.color, halve);
85
}
86
87
return main.color;
88
}
89
90
uint16 PPU::Screen::get_pixel_sub(unsigned x) {
91
auto main = output.sub[x];
92
auto sub = output.main[x];
93
94
if(!regs.addsub_mode) {
95
sub.source = 6;
96
sub.color = regs.color;
97
}
98
99
if(!window.main[x]) {
100
if(!window.sub[x]) {
101
return 0x0000;
102
}
103
main.color = 0x0000;
104
}
105
106
if(main.source != 5 && regs.color_enable[main.source] && window.sub[x]) {
107
bool halve = false;
108
if(regs.color_halve && window.main[x]) {
109
if(!regs.addsub_mode || sub.source != 6) halve = true;
110
}
111
return addsub(main.color, sub.color, halve);
112
}
113
114
return main.color;
115
}
116
117
void PPU::Screen::render() {
118
uint32 *data = self.output + self.vcounter() * 1024;
119
if(self.interlace() && self.field()) data += 512;
120
121
if(!self.regs.pseudo_hires && self.regs.bgmode != 5 && self.regs.bgmode != 6) {
122
for(unsigned i = 0; i < 256; i++) {
123
data[i] = (self.regs.display_brightness << 15) | get_pixel_main(i);
124
}
125
} else {
126
for(unsigned i = 0; i < 256; i++) {
127
*data++ = (self.regs.display_brightness << 15) | get_pixel_sub(i);
128
*data++ = (self.regs.display_brightness << 15) | get_pixel_main(i);
129
}
130
}
131
}
132
133
PPU::Screen::Screen(PPU &self) : self(self) {
134
}
135
136
PPU::Screen::~Screen() {
137
}
138
139
void PPU::Screen::Output::plot_main(unsigned x, unsigned color, unsigned priority, unsigned source) {
140
if(priority > main[x].priority) {
141
main[x].color = color;
142
main[x].priority = priority;
143
main[x].source = source;
144
}
145
}
146
147
void PPU::Screen::Output::plot_sub(unsigned x, unsigned color, unsigned priority, unsigned source) {
148
if(priority > sub[x].priority) {
149
sub[x].color = color;
150
sub[x].priority = priority;
151
sub[x].source = source;
152
}
153
}
154
155
#endif
156
157