Path: blob/master/libsnes/bsnes/snes/alt/ppu-compatibility/render/line.cpp
2 views
#ifdef PPU_CPP12inline uint16 PPU::get_palette(uint8 index) {3const unsigned addr = index << 1;4return cgram[addr] + (cgram[addr + 1] << 8);5}67//p = 00000bgr <palette data>8//t = BBGGGRRR <tilemap data>9//r = 0BBb00GGGg0RRRr0 <return data>10inline uint16 PPU::get_direct_color(uint8 p, uint8 t) {11return ((t & 7) << 2) | ((p & 1) << 1) |12(((t >> 3) & 7) << 7) | (((p >> 1) & 1) << 6) |13((t >> 6) << 13) | ((p >> 2) << 12);14}1516inline uint16 PPU::get_pixel_normal(uint32 x) {17pixel_t &p = pixel_cache[x];18uint16 src_main, src_sub;19uint8 bg_sub;20src_main = p.src_main;2122if(!regs.addsub_mode) {23bg_sub = BACK;24src_sub = regs.color_rgb;25} else {26bg_sub = p.bg_sub;27src_sub = p.src_sub;28}2930if(!window[COL].main[x]) {31if(!window[COL].sub[x]) {32return 0x0000;33}34src_main = 0x0000;35}3637if(!p.ce_main && regs.color_enabled[p.bg_main] && window[COL].sub[x]) {38bool halve = false;39if(regs.color_halve && window[COL].main[x]) {40if(regs.addsub_mode && bg_sub == BACK);41else {42halve = true;43}44}45return addsub(src_main, src_sub, halve);46}4748return src_main;49}5051inline uint16 PPU::get_pixel_swap(uint32 x) {52pixel_t &p = pixel_cache[x];53uint16 src_main, src_sub;54uint8 bg_sub;55src_main = p.src_sub;5657if(!regs.addsub_mode) {58bg_sub = BACK;59src_sub = regs.color_rgb;60} else {61bg_sub = p.bg_main;62src_sub = p.src_main;63}6465if(!window[COL].main[x]) {66if(!window[COL].sub[x]) {67return 0x0000;68}69src_main = 0x0000;70}7172if(!p.ce_sub && regs.color_enabled[p.bg_sub] && window[COL].sub[x]) {73bool halve = false;74if(regs.color_halve && window[COL].main[x]) {75if(regs.addsub_mode && bg_sub == BACK);76else {77halve = true;78}79}80return addsub(src_main, src_sub, halve);81}8283return src_main;84}8586inline void PPU::render_line_output() {87uint32 *ptr = (uint32*)output + (line * 1024) + ((interlace() && field()) ? 512 : 0);88uint32 curr, prev;8990if(!regs.pseudo_hires && regs.bg_mode != 5 && regs.bg_mode != 6) {91for(unsigned x = 0; x < 256; x++) {92curr = (regs.display_brightness << 15) | get_pixel_normal(x);93*ptr++ = curr;94}95} else {96for(unsigned x = 0, prev = 0; x < 256; x++) {97//blending is disabled below, as this should be done via video filtering98//blending code is left for reference purposes99100curr = (regs.display_brightness << 15) | get_pixel_swap(x);101*ptr++ = curr; //(prev + curr - ((prev ^ curr) & 0x0421)) >> 1;102//prev = curr;103104curr = (regs.display_brightness << 15) | get_pixel_normal(x);105*ptr++ = curr; //(prev + curr - ((prev ^ curr) & 0x0421)) >> 1;106//prev = curr;107}108}109}110111inline void PPU::render_line_clear() {112uint32 *ptr = (uint32*)output + (line * 1024) + ((interlace() && field()) ? 512 : 0);113unsigned width = (!regs.pseudo_hires && regs.bg_mode != 5 && regs.bg_mode != 6) ? 256 : 512;114memset(ptr, 0, width * 2 * sizeof(uint32));115}116117#endif118119120