From a471c150c992f85390bc9e812d7b194626d1f7dc Mon Sep 17 00:00:00 2001 From: byuu Date: Tue, 21 Jun 2005 09:13:40 +0000 Subject: [PATCH] Update to bsnes v008 release. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit moving the window + main color window clipping into the bg/oam/mode7 rendering routines themselves, I was able to greatly simplify the most complicated part of rendering: the final pass where color add/sub effects are applied. As a result, the new PPU core is not only ~35% faster (on graphics intensive screens, even faster on simpler screens), but more accurate as well. Awesome. In celebration, I´m releasing bsnes v0.008. I can actually run all games I have at >60fps on my Athlon 1.67ghz PC. Probably not something to brag about, though ... Oh, and I also updated the keyboard polling code to only capture keypresses if the main window has focus. I´ve been meaning to do this for the better part of a year now, but never got around to it. If, for some reason, you still want to use the old renderer, you can uncomment the first line in src/ppu/bppu/bppu.h and recompile the emulator yourself. Or you can use v0.007a, I´ll leave it up for a bit. --- bsnes.cfg | 6 + bsnes_g2.exe | Bin 270336 -> 270336 bytes src/ppu/bppu/bppu.cpp | 19 +- src/ppu/bppu/bppu.h | 10 +- src/ppu/bppu/bppu_old_render.cpp | 133 ++++++++++ src/ppu/bppu/bppu_old_render.h | 70 ++++++ src/ppu/bppu/bppu_old_render_cache.cpp | 33 +++ ...nder_main.cpp => bppu_old_render_main.cpp} | 0 src/ppu/bppu/bppu_old_render_mode7.cpp | 110 ++++++++ src/ppu/bppu/bppu_old_render_windows.cpp | 159 ++++++++++++ src/ppu/bppu/bppu_render.cpp | 182 +++++++------- src/ppu/bppu/bppu_render.h | 95 +++---- src/ppu/bppu/bppu_render_addsub.cpp | 95 +++++++ src/ppu/bppu/bppu_render_bg.cpp | 234 +++++++++++++++++ src/ppu/bppu/bppu_render_cache.cpp | 125 ++++++++-- src/ppu/bppu/bppu_render_line.cpp | 73 ++++++ src/ppu/bppu/bppu_render_mode7.cpp | 88 ++++--- src/ppu/bppu/bppu_render_oam.cpp | 191 ++++++++++++++ src/ppu/bppu/bppu_render_windows.cpp | 236 ++++++++++-------- src/ppu/ppu.h | 1 + src/win/Makefile | 2 +- src/win/bsnes.cpp | 29 ++- src/win/config.cpp | 5 + src/win/{ui_render.cpp => dd_renderer.cpp} | 116 +++++---- src/win/dd_renderer.h | 27 ++ src/win/ui.cpp | 16 +- src/win/ui.h | 25 -- src/win/ui_main.cpp | 2 +- src/win/winmain.cpp | 3 +- 29 files changed, 1700 insertions(+), 385 deletions(-) create mode 100644 src/ppu/bppu/bppu_old_render.cpp create mode 100644 src/ppu/bppu/bppu_old_render.h create mode 100644 src/ppu/bppu/bppu_old_render_cache.cpp rename src/ppu/bppu/{bppu_render_main.cpp => bppu_old_render_main.cpp} (100%) create mode 100644 src/ppu/bppu/bppu_old_render_mode7.cpp create mode 100644 src/ppu/bppu/bppu_old_render_windows.cpp create mode 100644 src/ppu/bppu/bppu_render_addsub.cpp create mode 100644 src/ppu/bppu/bppu_render_bg.cpp create mode 100644 src/ppu/bppu/bppu_render_line.cpp create mode 100644 src/ppu/bppu/bppu_render_oam.cpp rename src/win/{ui_render.cpp => dd_renderer.cpp} (78%) create mode 100644 src/win/dd_renderer.h diff --git a/bsnes.cfg b/bsnes.cfg index 006dea98..4d0ac23f 100644 --- a/bsnes.cfg +++ b/bsnes.cfg @@ -19,3 +19,9 @@ video.mode = 1 # way to guarantee that the output image will not be # filtered. video.use_vram = true +#video.use_vram = false + +#[show fps] +# true: show fps in titlebar +# false: do not show fps in titlebar +#gui.show_fps = false diff --git a/bsnes_g2.exe b/bsnes_g2.exe index aff51ac78dbdb4f43918c13bbfa94ae4fcb2ccdd..f18dd6d8136c9332f552c30f07bc2827860f943a 100644 GIT binary patch literal 270336 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

JFBP;LeAAC!)R8`B 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

UbjUPZ`n|CQ7n$Nk7d1bY-HXzIUmlrD;I9noXAU z768I7q_fm)z!Of`%$HI#712EM6i_qDrmj<;rW|`lf+O;+&=ER9;8O3UlC;^JH9wqB z7)f+Ih<0jIbc~;lj)^B1bdetYH$-O?Pm{Ldvp8#OC{Os;r-yYVV8=4-%G1N1n}D@4 zY#m^~tc^eUG)~Cp?+_tpBZK)BFa~p7s3t4pK=eK!>%zz2I+rSAIogwqPTdHA@XoaK zY^@_v+%sI<|E2+1v>PN4iPRb{DU=3e&?;p~9x6%AkUlC=(kw2iHUrRS@Cww2yecl~ zoHU>T+71R%OQ@t%qx6 z4l`M1C1t2KK~hA$<>=rmjgZ42H=LMp&tK~Ud_{sbGe-*7q$#zDZi!u!&I z255InAZn`(0ICcB4nRBvJcCE4_R05U%RfPRGY$cRv`LbX2Z)f{C_DASgtWU)o}yz}*GaK!|-BLSC5T!v_O zNMIuYKN0H#hu)&9eE2=diAM-WifkA)J7?qe+795l@T~-N8XbOk0(cz*+tVD;)jL|*u0L4UFo?N<_r8h0L-v?l{lyDX`eO8TF)^jvLTqNK50 z()|EZtpwg{Jt z4%2qR2~Zye9sq1zIC@%OllEi+csT>_{1V`03E+7Q{3HQ?+4$n%9O^Wpc?p2OYJ8c< zXlD@G6dB6VKBqGyjcO5Lx*#n*TYHPsxy3*K3$^&bG$4!iM+rnNeh@%);rEC4FUg?& zNS3q#0O40Nq%TgC^fZ_B^9(@K6D8ftCH)``Xn2ORV*VxWFXC9^Uv_~16+P5FsH=P!4pyrWq z2MKQNm%vSva2pBk&IDZMapf!t{5%0q1MpXg$wL6F3!hJDQ^drm?S|Vf#AG>P%A)iJ z*tCMYHoz*KKD3jzN}tEb{(>%-ip;F}C9+yV_WQJSMN>JQTVO0;T;T^Z08N%aBy$!n zX;B8CGi6Di>_bUcr={m=r|A5MZ0mi1afQnOq;?Yc_po`FQHyzk0JXZ=a+JwJhQui2 zr<@ND))=|8o_bF`oQKkQu#eACtSPnxt15ZbhM z6(`Qh>cokzqo^o217fU-H7!_Bux0*P>^kN;ZIw;L)D}n+VZ||q(=q0lGId+0OmU*N zz)C@f0h!jxwt`H5rEIH?Rq#Ro-*fK${qpYfM<_7;T$=N^uXE2m_uS`Cq_l-n+8jYQ zDR(oSTYMdO3fg`V!DLek1QUtoLC$Gm1d~x2BXTOIoNkUnw+3>W&N*Ec!IYr9|30e) zt+I18?bW{A_!l z^oJ(b8v)^V)6F8WRg{=$t}t)IqFf@%vX-L%UrfFsN{ZlnkoYEa!}lJxy3z6##CKYN zFS?a^K`_rI=J!x`^cox9eS;rDWwS!!!oXM53w!I2IycGECeWGQm8T zm|bA*$xKZJV`1AQN;YJaOH}@i4I5M=hf*3DK{qL{Go8&;26zhEJ{=mKh)sD?Fp-KJ zeuHv)D}u?WED|~G0Ylp}QRv?YP9DlB4|M8t zrR9{Svg{_ILSLh3(Vd~c;`Fi{AZKzphJv@$PKnvkhgcs+19B>pWMUss*NSSUhA2Pa z)Jkm>ePcI#w+p_*yTG?1Cf`uyO2OAkeDeZ)(bOb`?-!tPn~C{KFh@62PlH^jR7@9U zC>wmCou&@-0%f|S)2pnZN@P}^#O9}*Csa^kZExW`5Q�&ogaj=}b-~MW*sHF@&gM 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 e20|DJVIYKo5C%dR2w@vcounter(); - if(v > 0 && v < clock->visible_scanlines()) { + _y = clock->vcounter(); + if(_y > 0 && _y < clock->visible_scanlines()) { if(clock->interlace() || regs.oam_halve == true) { - output->frame_mode |= PPUOutput::INTERLACE; - output->scanline_mode[v] |= PPUOutput::INTERLACE; + output->frame_mode |= PPUOutput::INTERLACE; + output->scanline_mode[_y] |= PPUOutput::INTERLACE; } if(regs.bg_mode == 5 || regs.bg_mode == 6) { - output->frame_mode |= PPUOutput::DOUBLEWIDTH; - output->scanline_mode[v] |= PPUOutput::DOUBLEWIDTH; + output->frame_mode |= PPUOutput::DOUBLEWIDTH; + output->scanline_mode[_y] |= PPUOutput::DOUBLEWIDTH; } - render_line(v); + render_line(); } } diff --git a/src/ppu/bppu/bppu.h b/src/ppu/bppu/bppu.h index f92c0e5b..f89d7493 100644 --- a/src/ppu/bppu/bppu.h +++ b/src/ppu/bppu/bppu.h @@ -1,3 +1,5 @@ +//#define _BPPU_OLDRENDER + class bPPU; class bPPUMMIO : public MMIO { @@ -194,10 +196,16 @@ struct { void latch_counters(); /* PPU render functions */ + +#ifdef _BPPU_OLDRENDER +#include "bppu_old_render.h" +#else #include "bppu_render.h" +#endif + uint16 *light_table; uint16 *mosaic_table[16]; - void render_line(uint16 line); + void render_line(); /* Required functions */ void run(); diff --git a/src/ppu/bppu/bppu_old_render.cpp b/src/ppu/bppu/bppu_old_render.cpp new file mode 100644 index 00000000..9bdc3cf6 --- /dev/null +++ b/src/ppu/bppu/bppu_old_render.cpp @@ -0,0 +1,133 @@ +#include "bppu_old_render_cache.cpp" +#include "bppu_old_render_windows.cpp" +#include "bppu_old_render_main.cpp" +#include "bppu_old_render_mode7.cpp" + +namespace bPPURenderTables { +enum { BG1 = 0, BG2 = 1, BG3 = 2, BG4 = 3, OAM = 4, BACK = 5 }; + uint8 lookup_mode0[12] = { + BG4, BG3, OAM, BG4, BG3, OAM, BG2, BG1, OAM, BG2, BG1, OAM + }; + uint8 lookup_mode1_pri0[10] = { + BG3, OAM, BG3, OAM, BG2, BG1, OAM, BG2, BG1, OAM + }; + uint8 lookup_mode1_pri1[10] = { + BG3, OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM, BG3 + }; + uint8 lookup_mode2[8] = { + OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM + }; + uint8 lookup_mode3[8] = { + OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM + }; + uint8 lookup_mode4[8] = { + OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM + }; + uint8 lookup_mode5[8] = { + OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM + }; + uint8 lookup_mode6[6] = { + OAM, OAM, BG1, OAM, BG1, OAM + }; + uint8 lookup_mode7[5] = { + OAM, BG1, OAM, OAM, OAM + }; + uint8 lookup_mode7_extbg[6] = { + BG2, OAM, OAM, BG2, OAM, OAM + }; +}; + +void bPPU::render_line_mode0() { + render_line_bg (7, 10, COLORDEPTH_4, BG1); + render_line_bg (6, 9, COLORDEPTH_4, BG2); + render_line_bg (1, 4, COLORDEPTH_4, BG3); + render_line_bg (0, 3, COLORDEPTH_4, BG4); + render_line_oam(2, 5, 8, 11); + set_layer_pixels(12, bPPURenderTables::lookup_mode0); +} + +void bPPU::render_line_mode1() { + switch(regs.bg3_priority) { + case 0: + render_line_bg (5, 8, COLORDEPTH_16, BG1); + render_line_bg (4, 7, COLORDEPTH_16, BG2); + render_line_bg (0, 2, COLORDEPTH_4, BG3); + render_line_oam(1, 3, 6, 9); + set_layer_pixels(10, bPPURenderTables::lookup_mode1_pri0); + break; + case 1: + render_line_bg (4, 7, COLORDEPTH_16, BG1); + render_line_bg (3, 6, COLORDEPTH_16, BG2); + render_line_bg (0, 9, COLORDEPTH_4, BG3); + render_line_oam(1, 2, 5, 8); + set_layer_pixels(10, bPPURenderTables::lookup_mode1_pri1); + break; + } +} + +void bPPU::render_line_mode2() { + render_line_bg (3, 6, COLORDEPTH_16, BG1); + render_line_bg (2, 5, COLORDEPTH_16, BG2); + render_line_oam(0, 1, 4, 7); + set_layer_pixels(8, bPPURenderTables::lookup_mode2); +} + +void bPPU::render_line_mode3() { + render_line_bg (3, 6, COLORDEPTH_256, BG1); + render_line_bg (2, 5, COLORDEPTH_16, BG2); + render_line_oam(0, 1, 4, 7); + set_layer_pixels(8, bPPURenderTables::lookup_mode3); +} + +void bPPU::render_line_mode4() { + render_line_bg (3, 6, COLORDEPTH_256, BG1); + render_line_bg (2, 5, COLORDEPTH_4, BG2); + render_line_oam(0, 1, 4, 7); + set_layer_pixels(8, bPPURenderTables::lookup_mode4); +} + +void bPPU::render_line_mode5() { + render_line_bg (3, 6, COLORDEPTH_16, BG1); + render_line_bg (2, 5, COLORDEPTH_4, BG2); + render_line_oam(0, 1, 4, 7); + set_layer_pixels(8, bPPURenderTables::lookup_mode5); +} + +void bPPU::render_line_mode6() { + render_line_bg (2, 4, COLORDEPTH_16, BG1); + render_line_oam(0, 1, 3, 5); + set_layer_pixels(8, bPPURenderTables::lookup_mode6); +} + +void bPPU::render_line_mode7() { + if(regs.mode7_extbg == false) { + render_line_m7 (1, 0, 0); //bg2 priorities are ignored + render_line_oam(0, 2, 3, 4); + set_layer_pixels(5, bPPURenderTables::lookup_mode7); + } else { + render_line_m7 (0, 0, 3); //bg1 priority is ignored + render_line_oam(1, 2, 4, 5); + set_layer_pixels(6, bPPURenderTables::lookup_mode7_extbg); + } +} + +void bPPU::render_line() { + if(regs.display_disabled == true) { + memset(output->buffer + (_y << 1) * 512, 0, 2048); + return; + } + + clear_layer_cache(); + clear_pixel_cache(); + switch(regs.bg_mode) { + case 0:render_line_mode0();break; + case 1:render_line_mode1();break; + case 2:render_line_mode2();break; + case 3:render_line_mode3();break; + case 4:render_line_mode4();break; + case 5:render_line_mode5();break; + case 6:render_line_mode6();break; + case 7:render_line_mode7();break; + } + render_line_to_output(); +} diff --git a/src/ppu/bppu/bppu_old_render.h b/src/ppu/bppu/bppu_old_render.h new file mode 100644 index 00000000..128b54ec --- /dev/null +++ b/src/ppu/bppu/bppu_old_render.h @@ -0,0 +1,70 @@ +//bppu_render.cpp +void render_line_mode0(); +void render_line_mode1(); +void render_line_mode2(); +void render_line_mode3(); +void render_line_mode4(); +void render_line_mode5(); +void render_line_mode6(); +void render_line_mode7(); + +//bppu_render_cache.cpp +enum { BLENDTYPE_BACK = 0, BLENDTYPE_MAIN = 1, BLENDTYPE_SUB = 2, BLENDTYPE_COMBINE = 3 }; +enum { COLORDEPTH_4 = 0, COLORDEPTH_16 = 1, COLORDEPTH_256 = 2 }; +enum { TILE_2BIT = 0, TILE_4BIT = 1, TILE_8BIT = 2 }; + +struct { + uint8 color_main, color_sub; + uint8 src_main, src_sub; + uint8 blend_type; +}pixel_cache[512]; +uint8 layer_cache[512 * 12]; + +uint8 *bg_tiledata[3]; +uint8 *bg_tiledata_state[3]; + +void clear_pixel_cache(void); +void clear_layer_cache(void); +void init_tiledata_cache(void); +void clear_tiledata_cache(void); + +//bppu_render_windows.cpp +enum { WINDOWMASK_OR = 0, WINDOWMASK_AND = 1, WINDOWMASK_XOR = 2, WINDOWMASK_XNOR = 3 }; + +bool windows_not_obstructing(uint8 layer, uint8 bg, uint16 x); +bool color_windows_not_obstructing(uint16 x, uint8 color_mask_type); + +//bppu_render_main.cpp +enum { + SH_2 = 1, SH_4 = 2, SH_8 = 3, SH_16 = 4, + SH_32 = 5, SH_64 = 6, SH_128 = 7, SH_256 = 8, + SH_512 = 9, SH_1024 = 10, SH_2048 = 11, SH_4096 = 12 +}; +enum { COLORMODE_ADD = 0, COLORMODE_SUB = 1 }; +enum { PPU_MAIN = 0, PPU_SUB = 1 }; +enum { OAM_PRI_NONE = 4 }; +uint8 oam_line_pal[512], oam_line_pri[512]; + +struct { + byte num; + byte width, height; + word x, y; + word character; + byte v_flip, h_flip; + byte palette; + byte priority; +}current_sprite; + +void render_line_to_output(); +inline uint16 addsub_pixels(uint8 x, uint8 cdest_index, uint8 cdest_bg, uint8 csrc_index, uint8 csrc_bg); +inline uint16 addsub_pixel(uint8 x, uint8 cdest_index, uint8 cdest_bg); +void render_bg_tile(uint8 color_depth, uint8 bg, uint16 tile_num); +void set_pixel(uint8 bg, uint16 x, uint8 pal_index); +void set_layer_pixels(uint8 layer_count, uint8 *layer_bg_lookup); +void set_sprite_attributes(uint8 sprite_num); +void render_oam_sprite(void); +void render_line_oam(uint8 layer_pos_pri0, uint8 layer_pos_pri1, uint8 layer_pos_pri2, uint8 layer_pos_pri3); +void render_line_bg(uint8 layer_pos_pri0, uint8 layer_pos_pri1, uint8 color_depth, uint8 bg); + +//bppu_render_mode7.cpp +void render_line_m7(uint8 layer_pos_bg1, uint8 layer_pos_bg2_pri0, uint8 layer_pos_bg2_pri1); diff --git a/src/ppu/bppu/bppu_old_render_cache.cpp b/src/ppu/bppu/bppu_old_render_cache.cpp new file mode 100644 index 00000000..508aed97 --- /dev/null +++ b/src/ppu/bppu/bppu_old_render_cache.cpp @@ -0,0 +1,33 @@ +//this should be reset once every scanline +void bPPU::clear_pixel_cache(void) { + for(int i=0;i<512;i++) { + pixel_cache[i].color_main = 0; + pixel_cache[i].color_sub = 0; + pixel_cache[i].src_main = BACK; + pixel_cache[i].src_sub = BACK; + pixel_cache[i].blend_type = BLENDTYPE_BACK; + } +} + +//this should be reset once every scanline +void bPPU::clear_layer_cache(void) { + memset(&layer_cache, 0, 512 * 12); +} + +void bPPU::init_tiledata_cache(void) { + bg_tiledata[TILE_2BIT] = (uint8*)malloc(262144); + bg_tiledata[TILE_4BIT] = (uint8*)malloc(131072); + bg_tiledata[TILE_8BIT] = (uint8*)malloc( 65536); + bg_tiledata_state[TILE_2BIT] = (uint8*)malloc( 4096); + bg_tiledata_state[TILE_4BIT] = (uint8*)malloc( 2048); + bg_tiledata_state[TILE_8BIT] = (uint8*)malloc( 1024); +} + +void bPPU::clear_tiledata_cache(void) { + memset(bg_tiledata[TILE_2BIT], 0, 262144); + memset(bg_tiledata[TILE_4BIT], 0, 131072); + memset(bg_tiledata[TILE_4BIT], 0, 65536); + memset(bg_tiledata_state[TILE_2BIT], 0, 4096); + memset(bg_tiledata_state[TILE_4BIT], 0, 2048); + memset(bg_tiledata_state[TILE_8BIT], 0, 1024); +} diff --git a/src/ppu/bppu/bppu_render_main.cpp b/src/ppu/bppu/bppu_old_render_main.cpp similarity index 100% rename from src/ppu/bppu/bppu_render_main.cpp rename to src/ppu/bppu/bppu_old_render_main.cpp diff --git a/src/ppu/bppu/bppu_old_render_mode7.cpp b/src/ppu/bppu/bppu_old_render_mode7.cpp new file mode 100644 index 00000000..823eb555 --- /dev/null +++ b/src/ppu/bppu/bppu_old_render_mode7.cpp @@ -0,0 +1,110 @@ +#define CLIP_10BIT_SIGNED(x) \ + ((x) & ((1 << 10) - 1)) + (((((x) & (1 << 13)) ^ (1 << 13)) - (1 << 13)) >> 3) + +#define CAST_WORDTOINT(x) \ + (int)(((x & 0x8000)?(x | 0xffff0000):(x & 0x00007fff))) + +void bPPU::render_line_m7(uint8 layer_pos_bg1, uint8 layer_pos_bg2_pri0, uint8 layer_pos_bg2_pri1) { +int x; +int step_m7a, step_m7c, m7a, m7b, m7c, m7d; +int hoffset, voffset; +int centerx, centery; +int xx, yy; +int px, py; +int tx, ty, tile, palette, priority; +uint8 layer_pos; + hoffset = (CAST_WORDTOINT(regs.bg_hofs[BG1]) << 7) >> 7; + voffset = (CAST_WORDTOINT(regs.bg_vofs[BG1]) << 7) >> 7; + + centerx = (CAST_WORDTOINT(regs.m7x) << 7) >> 7; + centery = (CAST_WORDTOINT(regs.m7y) << 7) >> 7; + + if(regs.mode7_vflip == true) { + yy = 223 - clock->vcounter(); + } else { + yy = clock->vcounter(); + } + yy += CLIP_10BIT_SIGNED(voffset - centery); + + m7b = CAST_WORDTOINT(regs.m7b) * yy + (centerx << 8); + m7d = CAST_WORDTOINT(regs.m7d) * yy + (centery << 8); + + step_m7a = CAST_WORDTOINT(regs.m7a); + step_m7c = CAST_WORDTOINT(regs.m7c); + + xx = CLIP_10BIT_SIGNED(hoffset - centerx); + + m7a = CAST_WORDTOINT(regs.m7a) * xx; + m7c = CAST_WORDTOINT(regs.m7c) * xx; + + for(x=0;x<256;x++) { + px = ((m7a + m7b) >> 8); + py = ((m7c + m7d) >> 8); + + switch(regs.mode7_repeat) { + case 0: //screen repitition outside of screen area + case 1: //same as case 0 + px &= 1023; + py &= 1023; + tx = ((px >> SH_8) & 127); + ty = ((py >> SH_8) & 127); + tile = vram[(ty * 128 + tx) << 1]; + palette = vram[(((tile << SH_64) + ((py & 7) << SH_8) + (px & 7)) << 1) + 1]; + break; + case 2: //character 0 repetition outside of screen area + if(px < 0 || px > 1023 || py < 0 || py > 1023) { + tx = 0; + ty = 0; + } else { + px &= 1023; + py &= 1023; + tx = ((px >> SH_8) & 127); + ty = ((py >> SH_8) & 127); + } + tile = vram[(ty * 128 + tx) << 1]; + palette = vram[(((tile << SH_64) + ((py & 7) << SH_8) + (px & 7)) << 1) + 1]; + break; + case 3: //palette color 0 outside of screen area + if(px < 0 || px > 1023 || py < 0 || py > 1023) { + palette = 0; + } else { + px &= 1023; + py &= 1023; + tx = ((px >> SH_8) & 127); + ty = ((py >> SH_8) & 127); + tile = vram[(ty * 128 + tx) << 1]; + palette = vram[(((tile << SH_64) + ((py & 7) << SH_8) + (px & 7)) << 1) + 1]; + } + break; + } + + if(regs.mode7_extbg == false) { + if(palette) { + layer_pos = layer_pos_bg1; + if(regs.mode7_hflip == true) { + set_layer_pixel(255 - x, palette); + } else { + set_layer_pixel(x, palette); + } + } + } else { + priority = (palette >> 7); + palette &= 0x7f; + if(palette) { + if(priority == 0) { + layer_pos = layer_pos_bg2_pri0; + } else { + layer_pos = layer_pos_bg2_pri1; + } + if(regs.mode7_hflip == true) { + set_layer_pixel(255 - x, palette); + } else { + set_layer_pixel(x, palette); + } + } + } + + m7a += step_m7a; + m7c += step_m7c; + } +} diff --git a/src/ppu/bppu/bppu_old_render_windows.cpp b/src/ppu/bppu/bppu_old_render_windows.cpp new file mode 100644 index 00000000..cc0cc5e4 --- /dev/null +++ b/src/ppu/bppu/bppu_old_render_windows.cpp @@ -0,0 +1,159 @@ +bool bPPU::windows_not_obstructing(uint8 layer, uint8 bg, uint16 x) { +uint8 w1_mask, w2_mask; //1 = masked, 0 = not masked +uint16 window1_left, window1_right, window2_left, window2_right; + if(layer == PPU_MAIN) { + if(regs.bg_window_enabled[bg] == false)return true; + } else if(layer == PPU_SUB) { + if(regs.bgsub_window_enabled[bg] == false)return true; + } + + window1_left = regs.window1_left; + window1_right = regs.window1_right; + window2_left = regs.window2_left; + window2_right = regs.window2_right; + + if(regs.bg_mode == 5 || regs.bg_mode == 6) { + window1_left <<= 1; + window1_right <<= 1; + window2_left <<= 1; + window2_right <<= 1; + } + + if(regs.bg_window1_enabled[bg] == true && regs.bg_window2_enabled[bg] == false) { + if(regs.bg_window1_invert[bg] == false) { + if(x >= window1_left && x <= window1_right)return false; + return true; + } else { + if(x < window1_left || x > window1_right)return false; + return true; + } + } else if(regs.bg_window2_enabled[bg] == true && regs.bg_window1_enabled[bg] == false) { + if(regs.bg_window2_invert[bg] == false) { + if(x >= window2_left && x <= window2_right)return false; + return true; + } else { + if(x < window2_left || x > window2_right)return false; + return true; + } + } else if(regs.bg_window1_enabled[bg] == true && regs.bg_window2_enabled[bg] == true) { + if(regs.bg_window1_invert[bg] == false) { + if(x >= window1_left && x <= window1_right)w1_mask = 1; + else w1_mask = 0; + } else { + if(x < window1_left || x > window1_right)w1_mask = 1; + else w1_mask = 0; + } + + if(regs.bg_window2_invert[bg] == false) { + if(x >= window2_left && x <= window2_right)w2_mask = 1; + else w2_mask = 0; + } else { + if(x < window2_left || x > window2_right)w2_mask = 1; + else w2_mask = 0; + } + + switch(regs.bg_window_mask[bg]) { + case WINDOWMASK_OR: + if((w1_mask | w2_mask) == 1)return false; + return true; + case WINDOWMASK_AND: + if((w1_mask & w2_mask) == 1)return false; + return true; + case WINDOWMASK_XOR: + if((w1_mask ^ w2_mask) == 1)return false; + return true; + case WINDOWMASK_XNOR: + if((w1_mask ^ w2_mask) == 0)return false; + return true; + } + } + return true; +} + +bool bPPU::color_windows_not_obstructing(uint16 x, uint8 color_mask_type) { +uint8 w1_mask, w2_mask; //1 = masked, 0 = not masked +uint8 color_mask; +bool r; +uint16 window1_left, window1_right, window2_left, window2_right; + if(color_mask_type == PPU_MAIN) { + color_mask = regs.color_mask; + } else { + color_mask = regs.colorsub_mask; + } + + if(color_mask == 0)return false; + if(color_mask == 3)return true; + + window1_left = regs.window1_left; + window1_right = regs.window1_right; + window2_left = regs.window2_left; + window2_right = regs.window2_right; + + if(regs.bg_mode == 5 || regs.bg_mode == 6) { + window1_left <<= 1; + window1_right <<= 1; + window2_left <<= 1; + window2_right <<= 1; + } + + if(regs.color_window1_enabled == false && regs.color_window2_enabled == false) { + r = true; + } else if(regs.color_window1_enabled == true && regs.color_window2_enabled == false) { + if(regs.color_window1_invert == false) { + if(x >= window1_left && x <= window1_right)r = false; + else r = true; + } else { + if(x < window1_left || x > window1_right)r = false; + else r = true; + } + } else if(regs.color_window1_enabled == false && regs.color_window2_enabled == true) { + if(regs.color_window2_invert == false) { + if(x >= window2_left && x <= window2_right)r = false; + else r = true; + } else { + if(x < window2_left || x > window2_right)r = false; + else r = true; + } + } else if(regs.color_window1_enabled == true && regs.color_window2_enabled == true) { + if(regs.color_window1_invert == false) { + if(x >= window1_left && x <= window1_right)w1_mask = 1; + else w1_mask = 0; + } else { + if(x < window1_left || x > window1_right)w1_mask = 1; + else w1_mask = 0; + } + + if(regs.color_window2_invert == false) { + if(x >= window2_left && x <= window2_right)w2_mask = 1; + else w2_mask = 0; + } else { + if(x < window2_left || x > window2_right)w2_mask = 1; + else w2_mask = 0; + } + + switch(regs.color_window_mask) { + case WINDOWMASK_OR: + if((w1_mask | w2_mask) == 1)r = false; + else r = true; + break; + case WINDOWMASK_AND: + if((w1_mask & w2_mask) == 1)r = false; + else r = true; + break; + case WINDOWMASK_XOR: + if((w1_mask ^ w2_mask) == 1)r = false; + else r = true; + break; + case WINDOWMASK_XNOR: + if((w1_mask ^ w2_mask) == 0)r = false; + else r = true; + break; + } + } + + if(color_mask == 2) { + r = (r == true)?false:true; + } + + return r; +} diff --git a/src/ppu/bppu/bppu_render.cpp b/src/ppu/bppu/bppu_render.cpp index 9640a9a6..0cc9096a 100644 --- a/src/ppu/bppu/bppu_render.cpp +++ b/src/ppu/bppu/bppu_render.cpp @@ -1,124 +1,134 @@ #include "bppu_render_cache.cpp" #include "bppu_render_windows.cpp" -#include "bppu_render_main.cpp" +#include "bppu_render_bg.cpp" +#include "bppu_render_oam.cpp" #include "bppu_render_mode7.cpp" +#include "bppu_render_addsub.cpp" +#include "bppu_render_line.cpp" -namespace bPPURenderTables { -enum { BG1 = 0, BG2 = 1, BG3 = 2, BG4 = 3, OAM = 4, BACK = 5 }; - uint8 lookup_mode0[12] = { - BG4, BG3, OAM, BG4, BG3, OAM, BG2, BG1, OAM, BG2, BG1, OAM - }; - uint8 lookup_mode1_pri0[10] = { - BG3, OAM, BG3, OAM, BG2, BG1, OAM, BG2, BG1, OAM - }; - uint8 lookup_mode1_pri1[10] = { - BG3, OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM, BG3 - }; - uint8 lookup_mode2[8] = { - OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM - }; - uint8 lookup_mode3[8] = { - OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM - }; - uint8 lookup_mode4[8] = { - OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM - }; - uint8 lookup_mode5[8] = { - OAM, OAM, BG2, BG1, OAM, BG2, BG1, OAM - }; - uint8 lookup_mode6[6] = { - OAM, OAM, BG1, OAM, BG1, OAM - }; - uint8 lookup_mode7[5] = { - OAM, BG1, OAM, OAM, OAM - }; - uint8 lookup_mode7_extbg[6] = { - BG2, OAM, OAM, BG2, OAM, OAM - }; -}; - -void bPPU::render_line_mode0() { - render_line_bg (7, 10, COLORDEPTH_4, BG1); - render_line_bg (6, 9, COLORDEPTH_4, BG2); - render_line_bg (1, 4, COLORDEPTH_4, BG3); - render_line_bg (0, 3, COLORDEPTH_4, BG4); - render_line_oam(2, 5, 8, 11); - set_layer_pixels(12, bPPURenderTables::lookup_mode0); +/* +Mode 0: -> + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 + BG4B, BG3B, OAM0, BG4A, BG3A, OAM1, BG2B, BG1B, OAM2, BG2A, BG1A, OAM3 +*/ +inline void bPPU::render_line_mode0() { + render_line_bg(BG1, COLORDEPTH_4, 8, 11); + render_line_bg(BG2, COLORDEPTH_4, 7, 10); + render_line_bg(BG3, COLORDEPTH_4, 2, 5); + render_line_bg(BG4, COLORDEPTH_4, 1, 4); + render_line_oam(3, 6, 9, 12); } -void bPPU::render_line_mode1() { +/* +Mode 1 (pri=0): -> + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + BG3B, OAM0, BG3A, OAM1, BG2B, BG1B, OAM2, BG2A, BG1A, OAM3 + +Mode 1 (pri=1): -> + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + BG3B, OAM0, OAM1, BG2B, BG1B, OAM2, BG2A, BG1A, OAM3, BG3A +*/ +inline void bPPU::render_line_mode1() { switch(regs.bg3_priority) { case 0: - render_line_bg (5, 8, COLORDEPTH_16, BG1); - render_line_bg (4, 7, COLORDEPTH_16, BG2); - render_line_bg (0, 2, COLORDEPTH_4, BG3); - render_line_oam(1, 3, 6, 9); - set_layer_pixels(10, bPPURenderTables::lookup_mode1_pri0); + render_line_bg(BG1, COLORDEPTH_16, 6, 9); + render_line_bg(BG2, COLORDEPTH_16, 5, 8); + render_line_bg(BG3, COLORDEPTH_4, 1, 3); + render_line_oam(2, 4, 7, 10); break; case 1: - render_line_bg (4, 7, COLORDEPTH_16, BG1); - render_line_bg (3, 6, COLORDEPTH_16, BG2); - render_line_bg (0, 9, COLORDEPTH_4, BG3); - render_line_oam(1, 2, 5, 8); - set_layer_pixels(10, bPPURenderTables::lookup_mode1_pri1); + render_line_bg(BG1, COLORDEPTH_16, 5, 8); + render_line_bg(BG2, COLORDEPTH_16, 4, 7); + render_line_bg(BG3, COLORDEPTH_4, 1, 10); + render_line_oam(2, 3, 6, 9); break; } } -void bPPU::render_line_mode2() { - render_line_bg (3, 6, COLORDEPTH_16, BG1); - render_line_bg (2, 5, COLORDEPTH_16, BG2); - render_line_oam(0, 1, 4, 7); - set_layer_pixels(8, bPPURenderTables::lookup_mode2); +/* +Mode 2: -> + 1, 2, 3, 4, 5, 6, 7, 8 + OAM0, OAM1, BG2B, BG1B, OAM2, BG2A, BG1A, OAM3 +*/ +inline void bPPU::render_line_mode2() { + render_line_bg(BG1, COLORDEPTH_16, 4, 7); + render_line_bg(BG2, COLORDEPTH_16, 3, 6); + render_line_oam(1, 2, 5, 8); } -void bPPU::render_line_mode3() { - render_line_bg (3, 6, COLORDEPTH_256, BG1); - render_line_bg (2, 5, COLORDEPTH_16, BG2); - render_line_oam(0, 1, 4, 7); - set_layer_pixels(8, bPPURenderTables::lookup_mode3); +/* +Mode 3: -> + 1, 2, 3, 4, 5, 6, 7, 8 + OAM0, OAM1, BG2B, BG1B, OAM2, BG2A, BG1A, OAM3 +*/ +inline void bPPU::render_line_mode3() { + render_line_bg(BG1, COLORDEPTH_256, 4, 7); + render_line_bg(BG2, COLORDEPTH_16, 3, 6); } -void bPPU::render_line_mode4() { - render_line_bg (3, 6, COLORDEPTH_256, BG1); - render_line_bg (2, 5, COLORDEPTH_4, BG2); - render_line_oam(0, 1, 4, 7); - set_layer_pixels(8, bPPURenderTables::lookup_mode4); +/* +Mode 4: -> + 1, 2, 3, 4, 5, 6, 7, 8 + OAM0, OAM1, BG2B, BG1B, OAM2, BG2A, BG1A, OAM3 +*/ +inline void bPPU::render_line_mode4() { + render_line_bg(BG1, COLORDEPTH_256, 4, 7); + render_line_bg(BG2, COLORDEPTH_4, 3, 6); + render_line_oam(1, 2, 5, 8); } -void bPPU::render_line_mode5() { - render_line_bg (3, 6, COLORDEPTH_16, BG1); - render_line_bg (2, 5, COLORDEPTH_4, BG2); - render_line_oam(0, 1, 4, 7); - set_layer_pixels(8, bPPURenderTables::lookup_mode5); +/* +Mode 5: -> + 1, 2, 3, 4, 5, 6, 7, 8 + OAM0, OAM1, BG2B, BG1B, OAM2, BG2A, BG1A, OAM3 +*/ +inline void bPPU::render_line_mode5() { + render_line_bg(BG1, COLORDEPTH_16, 4, 7); + render_line_bg(BG2, COLORDEPTH_4, 3, 6); + render_line_oam(1, 2, 5, 8); } -void bPPU::render_line_mode6() { - render_line_bg (2, 4, COLORDEPTH_16, BG1); - render_line_oam(0, 1, 3, 5); - set_layer_pixels(8, bPPURenderTables::lookup_mode6); +/* +Mode 6: -> + 1, 2, 3, 4, 5, 6 + OAM0, OAM1, BG1B, OAM2, BG1A, OAM3 +*/ +inline void bPPU::render_line_mode6() { + render_line_bg(BG1, COLORDEPTH_16, 3, 5); + render_line_oam(1, 2, 4, 6); } -void bPPU::render_line_mode7() { +/* +Mode7: -> + 1, 2, 3, 4, 5 + OAM0, BG1n, OAM1, OAM2, OAM3 + +Mode 7 (extbg): -> + 1, 2, 3, 4, 5, 6 + BG2B, OAM0, OAM1, BG2A, OAM2, OAM3 +*/ +inline void bPPU::render_line_mode7() { if(regs.mode7_extbg == false) { - render_line_m7 (1, 0, 0); //bg2 priorities are ignored + render_line_mode7(1, 0, 0); //bg2 priorities are ignored render_line_oam(0, 2, 3, 4); - set_layer_pixels(5, bPPURenderTables::lookup_mode7); } else { - render_line_m7 (0, 0, 3); //bg1 priority is ignored + render_line_mode7(0, 0, 3); //bg1 priority is ignored render_line_oam(1, 2, 4, 5); - set_layer_pixels(6, bPPURenderTables::lookup_mode7_extbg); } } -void bPPU::render_line(uint16 line) { +void bPPU::render_line() { + _screen_width = (regs.bg_mode == 5 || regs.bg_mode == 6)?512:256; + _interlace = clock->interlace(); + _interlace_field = clock->interlace_field(); + if(regs.display_disabled == true) { - memset(output->buffer + (line << 1) * 512, 0, 2048); + memset(output->buffer + (((_y << 1) + _interlace_field) << 9), 0, 1024); return; } - clear_layer_cache(); clear_pixel_cache(); + build_color_window_tables(); switch(regs.bg_mode) { case 0:render_line_mode0();break; case 1:render_line_mode1();break; @@ -129,5 +139,5 @@ void bPPU::render_line(uint16 line) { case 6:render_line_mode6();break; case 7:render_line_mode7();break; } - render_line_to_output(); + render_line_output(); } diff --git a/src/ppu/bppu/bppu_render.h b/src/ppu/bppu/bppu_render.h index 128b54ec..cfaafba7 100644 --- a/src/ppu/bppu/bppu_render.h +++ b/src/ppu/bppu/bppu_render.h @@ -1,50 +1,54 @@ //bppu_render.cpp -void render_line_mode0(); -void render_line_mode1(); -void render_line_mode2(); -void render_line_mode3(); -void render_line_mode4(); -void render_line_mode5(); -void render_line_mode6(); -void render_line_mode7(); +int _screen_width; +bool _interlace; +int _interlace_field; + +inline void render_line_mode0(); +inline void render_line_mode1(); +inline void render_line_mode2(); +inline void render_line_mode3(); +inline void render_line_mode4(); +inline void render_line_mode5(); +inline void render_line_mode6(); +inline void render_line_mode7(); //bppu_render_cache.cpp -enum { BLENDTYPE_BACK = 0, BLENDTYPE_MAIN = 1, BLENDTYPE_SUB = 2, BLENDTYPE_COMBINE = 3 }; enum { COLORDEPTH_4 = 0, COLORDEPTH_16 = 1, COLORDEPTH_256 = 2 }; enum { TILE_2BIT = 0, TILE_4BIT = 1, TILE_8BIT = 2 }; -struct { - uint8 color_main, color_sub; - uint8 src_main, src_sub; - uint8 blend_type; +enum { PC_BG1 = 0x80, PC_BG2 = 0x81, PC_BG3 = 0x82, PC_BG4 = 0x83, PC_OAM = 0x84, PC_BACK = 0x00 }; +struct _pixel { +//palette # index for main/subscreen pixels +//0 = transparent / use palette color # 0 +uint8 src_main, src_sub; +//indicates source of palette # for main/subscreen (BG1-4, OAM, or back) +uint8 bg_main, bg_sub; +//priority level of src_n. to set src_n, +//the priority of the pixel must be >pri_n +uint8 pri_main, pri_sub; }pixel_cache[512]; -uint8 layer_cache[512 * 12]; uint8 *bg_tiledata[3]; uint8 *bg_tiledata_state[3]; -void clear_pixel_cache(void); -void clear_layer_cache(void); -void init_tiledata_cache(void); -void clear_tiledata_cache(void); +void render_bg_tile(uint8 color_depth, uint16 tile_num); +inline void clear_pixel_cache(); +void init_tiledata_cache(); +void clear_tiledata_cache(); //bppu_render_windows.cpp -enum { WINDOWMASK_OR = 0, WINDOWMASK_AND = 1, WINDOWMASK_XOR = 2, WINDOWMASK_XNOR = 3 }; +uint8 main_windowtable[5][512], sub_windowtable[5][512], + main_colorwindowtable[512], sub_colorwindowtable[512]; -bool windows_not_obstructing(uint8 layer, uint8 bg, uint16 x); -bool color_windows_not_obstructing(uint16 x, uint8 color_mask_type); +void build_window_table(uint8 bg, uint8 *wtbl, bool mainscreen); +void build_window_tables(uint8 bg); +void build_color_window_table(uint8 *wtbl, uint8 mask); +void build_color_window_tables(); -//bppu_render_main.cpp -enum { - SH_2 = 1, SH_4 = 2, SH_8 = 3, SH_16 = 4, - SH_32 = 5, SH_64 = 6, SH_128 = 7, SH_256 = 8, - SH_512 = 9, SH_1024 = 10, SH_2048 = 11, SH_4096 = 12 -}; -enum { COLORMODE_ADD = 0, COLORMODE_SUB = 1 }; -enum { PPU_MAIN = 0, PPU_SUB = 1 }; -enum { OAM_PRI_NONE = 4 }; -uint8 oam_line_pal[512], oam_line_pri[512]; +//bppu_render_bg.cpp +void render_line_bg(uint8 bg, uint8 color_depth, uint8 pri0_pos, uint8 pri1_pos); +//bppu_render_oam.cpp struct { byte num; byte width, height; @@ -55,16 +59,23 @@ struct { byte priority; }current_sprite; -void render_line_to_output(); -inline uint16 addsub_pixels(uint8 x, uint8 cdest_index, uint8 cdest_bg, uint8 csrc_index, uint8 csrc_bg); -inline uint16 addsub_pixel(uint8 x, uint8 cdest_index, uint8 cdest_bg); -void render_bg_tile(uint8 color_depth, uint8 bg, uint16 tile_num); -void set_pixel(uint8 bg, uint16 x, uint8 pal_index); -void set_layer_pixels(uint8 layer_count, uint8 *layer_bg_lookup); -void set_sprite_attributes(uint8 sprite_num); -void render_oam_sprite(void); -void render_line_oam(uint8 layer_pos_pri0, uint8 layer_pos_pri1, uint8 layer_pos_pri2, uint8 layer_pos_pri3); -void render_line_bg(uint8 layer_pos_pri0, uint8 layer_pos_pri1, uint8 color_depth, uint8 bg); +enum { OAM_PRI_NONE = 4 }; +uint8 oam_line_pal[512], oam_line_pri[512]; + +void set_sprite_attributes(uint8 sprite_num); +void render_oam_sprite(); +void render_line_oam(uint8 pri0_pos, uint8 pri1_pos, uint8 pri2_pos, uint8 pri3_pos); //bppu_render_mode7.cpp -void render_line_m7(uint8 layer_pos_bg1, uint8 layer_pos_bg2_pri0, uint8 layer_pos_bg2_pri1); +void render_line_mode7(uint8 bg1_pri, uint8 bg2b_pri, uint8 bg2a_pri); + +//bppu_render_addsub.cpp +inline uint16 addsub_pixels(int cdest_index, int cdest_bg, int csrc_index, int csrc_bg); +inline uint16 addsub_pixel(int cdest_index, int cdest_bg); + +//bppu_render_line.cpp +enum { BLENDTYPE_BACK = 0, BLENDTYPE_MAIN = 1, BLENDTYPE_SUB = 2, BLENDTYPE_COMBINE = 3 }; + +inline uint16 get_palette(int index); +inline uint16 get_pixel(int x); +inline void render_line_output(); diff --git a/src/ppu/bppu/bppu_render_addsub.cpp b/src/ppu/bppu/bppu_render_addsub.cpp new file mode 100644 index 00000000..35367bab --- /dev/null +++ b/src/ppu/bppu/bppu_render_addsub.cpp @@ -0,0 +1,95 @@ +namespace bPPUAddSubTables { + uint8 adjust_buffer_full[96] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31 + }; + uint8 adjust_buffer_half[96] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 + }; +}; + +inline uint16 bPPU::addsub_pixels(int cdest_index, int cdest_bg, int csrc_index, int csrc_bg) { +int r, g, b; +uint16 cdest = get_palette(cdest_index); +uint16 csrc = get_palette(csrc_index); +uint16 res; +//oam palettes 0-3 are not affected by color add/sub + if(cdest_bg == OAM) { + if(cdest_index < 192) { + return cdest; + } + } + if(csrc_bg == OAM) { + if(csrc_index < 192) { + return csrc; + } + } + + switch(regs.color_mode) { + case 0: //COLORMODE_ADD: + if(regs.color_halve == true) { + r = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )) >> 1; + g = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )) >> 1; + b = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )) >> 1; + } else { + r = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )); + g = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )); + b = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )); + } + break; + case 1: //COLORMODE_SUB: + if(regs.color_halve == true) { + r = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest ) & 31) - ((csrc ) & 31) )) >> 1; + g = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 5) & 31) - ((csrc >> 5) & 31) )) >> 1; + b = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 10) & 31) - ((csrc >> 10) & 31) )) >> 1; + } else { + r = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest ) & 31) - ((csrc ) & 31) )); + g = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 5) & 31) - ((csrc >> 5) & 31) )); + b = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 10) & 31) - ((csrc >> 10) & 31) )); + } + break; + } + return ((r) | (g << 5) | (b << 10)); +} + +inline uint16 bPPU::addsub_pixel(int cdest_index, int cdest_bg) { +int r, g, b; +uint16 cdest = get_palette(cdest_index); +uint16 csrc = (regs.color_r) | (regs.color_g << 5) | (regs.color_b << 10); +uint16 res; +//only oam palettes 4-7 are affected by color add/sub + if(cdest_bg == OAM) { + if(cdest_index < 192) { + return cdest; + } + } + + switch(regs.color_mode) { + case 0: //COLORMODE_ADD: + if(regs.color_halve == true && regs.addsub_mode == 0) { + r = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )) >> 1; + g = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )) >> 1; + b = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )) >> 1; + } else { + r = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest ) & 31) + ((csrc ) & 31) )); + g = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 5) & 31) + ((csrc >> 5) & 31) )); + b = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 10) & 31) + ((csrc >> 10) & 31) )); + } + break; + case 1: //COLORMODE_SUB: + if(regs.color_halve == true && regs.addsub_mode == 0) { + r = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest ) & 31) - ((csrc ) & 31) )) >> 1; + g = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 5) & 31) - ((csrc >> 5) & 31) )) >> 1; + b = *(bPPUAddSubTables::adjust_buffer_half + 32 + ( ((cdest >> 10) & 31) - ((csrc >> 10) & 31) )) >> 1; + } else { + r = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest ) & 31) - ((csrc ) & 31) )); + g = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 5) & 31) - ((csrc >> 5) & 31) )); + b = *(bPPUAddSubTables::adjust_buffer_full + 32 + ( ((cdest >> 10) & 31) - ((csrc >> 10) & 31) )); + } + break; + } + return ((r) | (g << 5) | (b << 10)); +} diff --git a/src/ppu/bppu/bppu_render_bg.cpp b/src/ppu/bppu/bppu_render_bg.cpp new file mode 100644 index 00000000..b01e299f --- /dev/null +++ b/src/ppu/bppu/bppu_render_bg.cpp @@ -0,0 +1,234 @@ +void bPPU::render_line_bg(uint8 bg, uint8 color_depth, uint8 pri0_pos, uint8 pri1_pos) { + if(regs.bg_enabled[bg] == false && regs.bgsub_enabled[bg] == false) { + return; + } + +int x; +int _scaddr = regs.bg_scaddr[bg]; +int _tdaddr = regs.bg_tdaddr[bg]; +bool _bg_enabled = regs.bg_enabled[bg]; +bool _bgsub_enabled = regs.bgsub_enabled[bg]; + +uint16 opt_valid_bit; //offset-per-tile valid flag bit + if(bg == BG1) { + opt_valid_bit = 0x2000; + } else if(bg == BG2) { + opt_valid_bit = 0x4000; + } else { + opt_valid_bit = 0x0000; + } + +uint8 pal_size, tiledata_size; + switch(color_depth) { + case COLORDEPTH_4: + pal_size = 4; + tiledata_size = 4; //<<4=*16 + break; + case COLORDEPTH_16: + pal_size = 16; + tiledata_size = 5; //<<5=*32 + break; + case COLORDEPTH_256: + pal_size = 256; + tiledata_size = 6; //<<6=*64 + break; + } + +uint8 *bg_td, *bg_td_state; + bg_td = (uint8*)bg_tiledata[color_depth]; + bg_td_state = (uint8*)bg_tiledata_state[color_depth]; + +uint16 screen_width, screen_height; + screen_width = _screen_width; + screen_height = _screen_width; //this is correct -- ppu tilemap is a perfect square + +uint8 tile_size, tile_width, tile_height; + tile_size = (regs.bg_tilesize[bg])?4:3; //<<4=*16, <<3=*8 + tile_width = tile_size; + tile_height = tile_size; + +int screen_x, screen_y; + if(_interlace == true && _screen_width == 512) { + screen_y = (_y << 1) + _interlace_field; + } else { + screen_y = _y; + } + +//Modes 5 and 6 seem to force 16-width tiles due to having twice the resolution. +//The tile size attribute in $2105 has no effect on tile width. + if(_screen_width == 512) { + tile_width = 4; //<<4=*16 + } + + if(tile_size == 4) { //16x16 tile size + screen_width <<= 1; + screen_height <<= 1; + } + + if(regs.bg_scsize[bg] & 0x01)screen_width <<= 1; + if(regs.bg_scsize[bg] & 0x02)screen_height <<= 1; + +uint16 screen_width_mask, screen_height_mask; + screen_width_mask = screen_width - 1; + screen_height_mask = screen_height - 1; + +int bg_x, bg_y; +uint16 vscroll, hscroll; + if(_screen_width == 512) { + hscroll = (regs.bg_hofs[bg] << 1) & screen_width_mask; + } else { + hscroll = regs.bg_hofs[bg] & screen_width_mask; + } + bg_x = hscroll; + + if(_screen_width == 512 && _interlace == true) { + vscroll = (regs.bg_vofs[bg] << 1) & screen_height_mask; + } else { + vscroll = regs.bg_vofs[bg] & screen_height_mask; + } + bg_y = (screen_y + vscroll) & screen_height_mask; + +uint16 *mtable; +int mosaic_x, mosaic_y; + if(regs.mosaic_enabled[bg] == true) { + mtable = (uint16*)mosaic_table[regs.mosaic_size]; + } else { + mtable = (uint16*)mosaic_table[0]; + } + mosaic_x = mtable[bg_x]; + mosaic_y = mtable[bg_y]; + +uint8 tile_x; +uint16 t, base_xpos, base_pos, pos; +uint16 tile_num; +int mirror_x, mirror_y; +uint8 pal_index; +uint8 *tile_ptr; +int xpos, ypos; +uint16 map_index, hoffset, voffset, col; + +uint8 *wt_main = main_windowtable[bg]; +uint8 *wt_sub = sub_windowtable[bg]; + build_window_tables(bg); + for(screen_x=0;screen_x<_screen_width;screen_x++) { + if(wt_main[screen_x] && wt_sub[screen_x])continue; + + if(regs.bg_mode == 2 || regs.bg_mode == 4 || regs.bg_mode == 6) { + if(regs.bg_mode == 6) { + tile_x = (mtable[screen_x + (hscroll & 15)] >> 4); + } else { + tile_x = (mtable[screen_x + (hscroll & 7)] >> 3); + } + hoffset = hscroll; + voffset = vscroll; + if(tile_x != 0) { + tile_x = (tile_x - 1) & 31; + if(regs.bg_mode == 4) { + pos = regs.bg_scaddr[BG3] + (tile_x << 1); + t = *((uint16*)vram + (pos >> 1)); + if(t & opt_valid_bit) { + if(!(t & 0x8000)) { + hoffset = ((t & 0x1ff8) | (hscroll & 7)) & screen_width_mask; + } else { + voffset = (t & 0x1fff) & screen_height_mask; + } + } + } else { + pos = regs.bg_scaddr[BG3] + (tile_x << 1); + t = *((uint16*)vram + (pos >> 1)); + if(t & opt_valid_bit) { + hoffset = ((t & 0x1ff8) | (hscroll & 7)) & screen_width_mask; + } + pos = regs.bg_scaddr[BG3] + 64 + (tile_x << 1); + t = *((uint16*)vram + (pos >> 1)); + if(t & opt_valid_bit) { + voffset = (t & 0x1fff) & screen_height_mask; + } + } + } + mosaic_x = mtable[(screen_x + hoffset) & screen_width_mask ]; + mosaic_y = mtable[(screen_y + voffset) & screen_height_mask]; + } + + switch(regs.bg_scsize[bg]) { + case 0: + map_index = 0; + break; + case 1: + map_index = ((mosaic_x >> tile_size) >> 5) << 11; + break; + case 2: + map_index = ((mosaic_y >> tile_size) >> 5) << 11; + break; + case 3: + map_index = ((mosaic_x >> tile_size) >> 5) << 11 | + ((mosaic_y >> tile_size) >> 5) << 12; + break; + } + + base_xpos = ((mosaic_x >> 3) & 31); + base_pos = (((mosaic_y >> tile_height) & 31) << 5) + ((mosaic_x >> tile_width) & 31); + pos = _scaddr + map_index + (base_pos << 1); + t = *((uint16*)vram + (pos >> 1)); + mirror_y = (t & 0x8000)?1:0; + mirror_x = (t & 0x4000)?1:0; + +int _pri; + _pri = (t & 0x2000) ? pri1_pos : pri0_pos; + + tile_num = t & 0x03ff; + if(tile_width == 4) { + if(((mosaic_x & 15) >= 8 && !mirror_x) || + ((mosaic_x & 15) < 8 && mirror_x))tile_num++; + tile_num &= 0x03ff; + } + if(tile_height == 4) { + if(((mosaic_y & 15) >= 8 && !mirror_y) || + ((mosaic_y & 15) < 8 && mirror_y))tile_num += 16; + tile_num &= 0x03ff; + } + tile_num += (_tdaddr >> tiledata_size); + + if(bg_td_state[tile_num] == 1) { + render_bg_tile(color_depth, tile_num); + } + + pal_index = ((t >> 10) & 7) * pal_size; + + if(mirror_y) { ypos = (7 - (mosaic_y & 7)); } + else { ypos = ( (mosaic_y & 7)); } + +//loop while we are rendering from the same tile, as there's no need to do all of the above work +//unless we have rendered all of the visible tile, taking mosaic into account. + tile_ptr = (uint8*)bg_td + (tile_num << 6) + (ypos << 3); + while(1) { + if(mirror_x) { xpos = (7 - (mosaic_x & 7)); } + else { xpos = ( (mosaic_x & 7)); } + col = *(tile_ptr + xpos); + if(col && main_colorwindowtable[screen_x]) { + if(_bg_enabled == true && !wt_main[screen_x]) { + if(pixel_cache[screen_x].pri_main < _pri) { + pixel_cache[screen_x].pri_main = _pri; + pixel_cache[screen_x].bg_main = 0x80 | bg; + pixel_cache[screen_x].src_main = col + pal_index; + } + } + if(_bgsub_enabled == true && !wt_sub[screen_x]) { + if(pixel_cache[screen_x].pri_sub < _pri) { + pixel_cache[screen_x].pri_sub = _pri; + pixel_cache[screen_x].bg_sub = 0x80 | bg; + pixel_cache[screen_x].src_sub = col + pal_index; + } + } + } + + bg_x++; + bg_x &= screen_width_mask; + mosaic_x = mtable[bg_x]; + + if(base_xpos != ((mosaic_x >> 3) & 31))break; + screen_x++; + if(screen_x >= _screen_width)break; + } + } +} diff --git a/src/ppu/bppu/bppu_render_cache.cpp b/src/ppu/bppu/bppu_render_cache.cpp index 06b397d7..1cf45204 100644 --- a/src/ppu/bppu/bppu_render_cache.cpp +++ b/src/ppu/bppu/bppu_render_cache.cpp @@ -1,30 +1,115 @@ -//this should be reset once every scanline -void bPPU::clear_pixel_cache(void) { -int i; - for(i=0;i<512;i++) { - pixel_cache[i].color_main = 0; - pixel_cache[i].color_sub = 0; - pixel_cache[i].src_main = BACK; - pixel_cache[i].src_sub = BACK; - pixel_cache[i].blend_type = BLENDTYPE_BACK; +#define render_bg_tile_line_4(__m) \ + col = 0; \ + if(d0 & __m)col += 1; \ + if(d1 & __m)col += 2; \ + *dest++ = col +#define render_bg_tile_line_16(__m) \ + col = 0; \ + if(d0 & __m)col += 1; \ + if(d1 & __m)col += 2; \ + if(d2 & __m)col += 4; \ + if(d3 & __m)col += 8; \ + *dest++ = col +#define render_bg_tile_line_256(__m) \ + col = 0; \ + if(d0 & __m)col += 1; \ + if(d1 & __m)col += 2; \ + if(d2 & __m)col += 4; \ + if(d3 & __m)col += 8; \ + if(d4 & __m)col += 16; \ + if(d5 & __m)col += 32; \ + if(d6 & __m)col += 64; \ + if(d7 & __m)col += 128; \ + *dest++ = col + +void bPPU::render_bg_tile(uint8 color_depth, uint16 tile_num) { +uint8 mask, d0, d1, d2, d3, d4, d5, d6, d7, col; +int x, y; +uint32 pos; +uint8 *dest; + switch(color_depth) { + case COLORDEPTH_4: + dest = (uint8*)bg_tiledata[TILE_2BIT] + tile_num * 64; + pos = tile_num * 16; + y = 8; + while(y--) { + d0 = vram[pos ]; + d1 = vram[pos + 1]; + render_bg_tile_line_4(0x80); + render_bg_tile_line_4(0x40); + render_bg_tile_line_4(0x20); + render_bg_tile_line_4(0x10); + render_bg_tile_line_4(0x08); + render_bg_tile_line_4(0x04); + render_bg_tile_line_4(0x02); + render_bg_tile_line_4(0x01); + pos += 2; + } + bg_tiledata_state[TILE_2BIT][tile_num] = 0; + break; + case COLORDEPTH_16: + dest = (uint8*)bg_tiledata[TILE_4BIT] + tile_num * 64; + pos = tile_num * 32; + y = 8; + while(y--) { + d0 = vram[pos ]; + d1 = vram[pos + 1]; + d2 = vram[pos + 16]; + d3 = vram[pos + 17]; + render_bg_tile_line_16(0x80); + render_bg_tile_line_16(0x40); + render_bg_tile_line_16(0x20); + render_bg_tile_line_16(0x10); + render_bg_tile_line_16(0x08); + render_bg_tile_line_16(0x04); + render_bg_tile_line_16(0x02); + render_bg_tile_line_16(0x01); + pos += 2; + } + bg_tiledata_state[TILE_4BIT][tile_num] = 0; + break; + case COLORDEPTH_256: + dest = (uint8*)bg_tiledata[TILE_8BIT] + tile_num * 64; + pos = tile_num * 64; + y = 8; + while(y--) { + d0 = vram[pos ]; + d1 = vram[pos + 1]; + d2 = vram[pos + 16]; + d3 = vram[pos + 17]; + d4 = vram[pos + 32]; + d5 = vram[pos + 33]; + d6 = vram[pos + 48]; + d7 = vram[pos + 49]; + render_bg_tile_line_256(0x80); + render_bg_tile_line_256(0x40); + render_bg_tile_line_256(0x20); + render_bg_tile_line_256(0x10); + render_bg_tile_line_256(0x08); + render_bg_tile_line_256(0x04); + render_bg_tile_line_256(0x02); + render_bg_tile_line_256(0x01); + pos += 2; + } + bg_tiledata_state[TILE_8BIT][tile_num] = 0; + break; } } -//this should be reset once every scanline -void bPPU::clear_layer_cache(void) { - memset(&layer_cache, 0, 512 * 12); +inline void bPPU::clear_pixel_cache() { + memset(pixel_cache, 0, sizeof(pixel_cache)); } -void bPPU::init_tiledata_cache(void) { - bg_tiledata[TILE_2BIT] = (byte*)malloc(262144); - bg_tiledata[TILE_4BIT] = (byte*)malloc(131072); - bg_tiledata[TILE_8BIT] = (byte*)malloc( 65536); - bg_tiledata_state[TILE_2BIT] = (byte*)malloc( 4096); - bg_tiledata_state[TILE_4BIT] = (byte*)malloc( 2048); - bg_tiledata_state[TILE_8BIT] = (byte*)malloc( 1024); +void bPPU::init_tiledata_cache() { + bg_tiledata[TILE_2BIT] = (uint8*)malloc(262144); + bg_tiledata[TILE_4BIT] = (uint8*)malloc(131072); + bg_tiledata[TILE_8BIT] = (uint8*)malloc( 65536); + bg_tiledata_state[TILE_2BIT] = (uint8*)malloc( 4096); + bg_tiledata_state[TILE_4BIT] = (uint8*)malloc( 2048); + bg_tiledata_state[TILE_8BIT] = (uint8*)malloc( 1024); } -void bPPU::clear_tiledata_cache(void) { +void bPPU::clear_tiledata_cache() { memset(bg_tiledata[TILE_2BIT], 0, 262144); memset(bg_tiledata[TILE_4BIT], 0, 131072); memset(bg_tiledata[TILE_4BIT], 0, 65536); diff --git a/src/ppu/bppu/bppu_render_line.cpp b/src/ppu/bppu/bppu_render_line.cpp new file mode 100644 index 00000000..5df8e34c --- /dev/null +++ b/src/ppu/bppu/bppu_render_line.cpp @@ -0,0 +1,73 @@ +inline uint16 bPPU::get_palette(int index) { + return *((uint16*)cgram + index); +} + +inline uint16 bPPU::get_pixel(int x) { +_pixel *p = &pixel_cache[x]; +uint16 _r; + if(p->bg_main && p->bg_sub) { + if(regs.bg_color_enabled[p->bg_main & 0x7f] && sub_colorwindowtable[x]) { + if(regs.addsub_mode) { + _r = addsub_pixels(p->src_main, p->bg_main & 0x7f, p->src_sub, p->bg_sub & 0x7f); + } else { + _r = addsub_pixel(p->src_main, p->bg_main & 0x7f); + } + } else { + _r = get_palette(p->src_main); + } + } else if(p->bg_main) { + if(regs.bg_color_enabled[p->bg_main & 0x7f] && sub_colorwindowtable[x]) { + _r = addsub_pixel(p->src_main, p->bg_main & 0x7f); + } else { + _r = get_palette(p->src_main); + } + } else if(p->bg_sub) { + if(regs.bg_color_enabled[BACK]) { + if(sub_colorwindowtable[x]) { + if(regs.addsub_mode) { + _r = addsub_pixels(0, BACK, p->src_sub, p->bg_sub & 0x7f); + } else { + _r = addsub_pixel(0, BACK); + } + } else { + _r = get_palette(0); + } + } else { + _r = 0x0000; + } + } else { + if(main_colorwindowtable[x]) { + if(regs.bg_color_enabled[BACK] && sub_colorwindowtable[x]) { + _r = addsub_pixel(0, BACK); + } else { + _r = get_palette(0); + } + } else { + _r = 0x0000; + } + } + return _r; +} + +inline void bPPU::render_line_output() { +int x; +uint16 _r; +uint16 *ptr; + ptr = (uint16*)output->buffer + (((_y << 1) + _interlace_field) << 9); //((y * 2) + interlace) * scanline_width + +uint16 *ltable; + ltable = (uint16*)light_table + (regs.display_brightness << 16); + + if(_screen_width == 256) { + for(x=0;x<256;x++) { + _r = get_pixel(x); + *ptr = *(ltable + _r); + ptr += 2; + } + } else { + for(x=0;x<512;x++) { + _r = get_pixel(x); + *ptr++ = *(ltable + _r); + } + } +} diff --git a/src/ppu/bppu/bppu_render_mode7.cpp b/src/ppu/bppu/bppu_render_mode7.cpp index 823eb555..128cdd12 100644 --- a/src/ppu/bppu/bppu_render_mode7.cpp +++ b/src/ppu/bppu/bppu_render_mode7.cpp @@ -4,14 +4,14 @@ #define CAST_WORDTOINT(x) \ (int)(((x & 0x8000)?(x | 0xffff0000):(x & 0x00007fff))) -void bPPU::render_line_m7(uint8 layer_pos_bg1, uint8 layer_pos_bg2_pri0, uint8 layer_pos_bg2_pri1) { +void bPPU::render_line_mode7(uint8 bg1_pri, uint8 bg2b_pri, uint8 bg2a_pri) { int x; int step_m7a, step_m7c, m7a, m7b, m7c, m7d; int hoffset, voffset; int centerx, centery; int xx, yy; int px, py; -int tx, ty, tile, palette, priority; +int tx, ty, tile, palette; uint8 layer_pos; hoffset = (CAST_WORDTOINT(regs.bg_hofs[BG1]) << 7) >> 7; voffset = (CAST_WORDTOINT(regs.bg_vofs[BG1]) << 7) >> 7; @@ -20,9 +20,9 @@ uint8 layer_pos; centery = (CAST_WORDTOINT(regs.m7y) << 7) >> 7; if(regs.mode7_vflip == true) { - yy = 223 - clock->vcounter(); + yy = 223 - _y; } else { - yy = clock->vcounter(); + yy = _y; } yy += CLIP_10BIT_SIGNED(voffset - centery); @@ -37,6 +37,23 @@ uint8 layer_pos; m7a = CAST_WORDTOINT(regs.m7a) * xx; m7c = CAST_WORDTOINT(regs.m7c) * xx; +int _pri, _x, _bg; +bool _bg_enabled, _bgsub_enabled; + if(regs.mode7_extbg == false) { + _pri = bg1_pri; + _bg = BG1; + _bg_enabled = regs.bg_enabled[BG1]; + _bgsub_enabled = regs.bgsub_enabled[BG1]; + } else { + _bg = BG2; + _bg_enabled = regs.bg_enabled[BG2]; + _bgsub_enabled = regs.bgsub_enabled[BG2]; + } + +uint8 *wt_main = main_windowtable[_bg]; +uint8 *wt_sub = sub_windowtable[_bg]; + build_window_tables(_bg); + for(x=0;x<256;x++) { px = ((m7a + m7b) >> 8); py = ((m7c + m7d) >> 8); @@ -46,10 +63,10 @@ uint8 layer_pos; case 1: //same as case 0 px &= 1023; py &= 1023; - tx = ((px >> SH_8) & 127); - ty = ((py >> SH_8) & 127); + tx = ((px >> 3) & 127); + ty = ((py >> 3) & 127); tile = vram[(ty * 128 + tx) << 1]; - palette = vram[(((tile << SH_64) + ((py & 7) << SH_8) + (px & 7)) << 1) + 1]; + palette = vram[(((tile << 6) + ((py & 7) << 3) + (px & 7)) << 1) + 1]; break; case 2: //character 0 repetition outside of screen area if(px < 0 || px > 1023 || py < 0 || py > 1023) { @@ -58,11 +75,11 @@ uint8 layer_pos; } else { px &= 1023; py &= 1023; - tx = ((px >> SH_8) & 127); - ty = ((py >> SH_8) & 127); + tx = ((px >> 3) & 127); + ty = ((py >> 3) & 127); } tile = vram[(ty * 128 + tx) << 1]; - palette = vram[(((tile << SH_64) + ((py & 7) << SH_8) + (px & 7)) << 1) + 1]; + palette = vram[(((tile << 6) + ((py & 7) << 3) + (px & 7)) << 1) + 1]; break; case 3: //palette color 0 outside of screen area if(px < 0 || px > 1023 || py < 0 || py > 1023) { @@ -70,40 +87,51 @@ uint8 layer_pos; } else { px &= 1023; py &= 1023; - tx = ((px >> SH_8) & 127); - ty = ((py >> SH_8) & 127); + tx = ((px >> 3) & 127); + ty = ((py >> 3) & 127); tile = vram[(ty * 128 + tx) << 1]; - palette = vram[(((tile << SH_64) + ((py & 7) << SH_8) + (px & 7)) << 1) + 1]; + palette = vram[(((tile << 6) + ((py & 7) << 3) + (px & 7)) << 1) + 1]; } break; } + if(!palette)goto _end_setpixel; + if(regs.mode7_extbg == false) { - if(palette) { - layer_pos = layer_pos_bg1; - if(regs.mode7_hflip == true) { - set_layer_pixel(255 - x, palette); - } else { - set_layer_pixel(x, palette); - } + //_pri set at top of function, as it is static + if(regs.mode7_hflip == true) { + _x = 255 - x; + } else { + _x = x; } } else { - priority = (palette >> 7); + _pri = (palette >> 7) ? bg2a_pri : bg2b_pri; palette &= 0x7f; - if(palette) { - if(priority == 0) { - layer_pos = layer_pos_bg2_pri0; - } else { - layer_pos = layer_pos_bg2_pri1; + if(regs.mode7_hflip == true) { + _x = 255 - x; + } else { + _x = x; + } + } + + if(main_colorwindowtable[_x]) { + if(_bg_enabled == true && !wt_main[_x]) { + if(pixel_cache[_x].pri_main < _pri) { + pixel_cache[_x].pri_main = _pri; + pixel_cache[_x].bg_main = 0x80 | _bg; + pixel_cache[_x].src_main = palette; } - if(regs.mode7_hflip == true) { - set_layer_pixel(255 - x, palette); - } else { - set_layer_pixel(x, palette); + } + if(_bgsub_enabled == true && !wt_sub[_x]) { + if(pixel_cache[_x].pri_sub < _pri) { + pixel_cache[_x].pri_sub = _pri; + pixel_cache[_x].bg_sub = 0x80 | _bg; + pixel_cache[_x].src_sub = palette; } } } +_end_setpixel: m7a += step_m7a; m7c += step_m7c; } diff --git a/src/ppu/bppu/bppu_render_oam.cpp b/src/ppu/bppu/bppu_render_oam.cpp new file mode 100644 index 00000000..ba5de57c --- /dev/null +++ b/src/ppu/bppu/bppu_render_oam.cpp @@ -0,0 +1,191 @@ +void bPPU::set_sprite_attributes(uint8 sprite_num) { +uint32 t; +uint8 size, b; +uint16 x; + t = *((uint32*)oam + sprite_num); + b = oam[512 + (sprite_num >> 2)]; + + switch(sprite_num & 3) { + case 0: size = !!(b & 0x02); x = (b & 0x01)?0x100:0; break; + case 1: size = !!(b & 0x08); x = (b & 0x04)?0x100:0; break; + case 2: size = !!(b & 0x20); x = (b & 0x10)?0x100:0; break; + case 3: size = !!(b & 0x80); x = (b & 0x40)?0x100:0; break; + } + + current_sprite.num = sprite_num; + current_sprite.priority = (t >> 28) & 3; + current_sprite.x = x | (t & 0xff); + current_sprite.y = ((t >> 8) + 1) & 0xff; + current_sprite.v_flip = !!(t & 0x80000000); + current_sprite.h_flip = !!(t & 0x40000000); + current_sprite.palette = (t >> 25) & 7; + current_sprite.character = (t >> 16) & 0x01ff; + +//size: 0 = small, 1 = large + switch(regs.oam_basesize) { + case 0: + if(!size) { current_sprite.width = 8; current_sprite.height = 8; } + else { current_sprite.width = 16; current_sprite.height = 16; } + break; + case 1: + if(!size) { current_sprite.width = 8; current_sprite.height = 8; } + else { current_sprite.width = 32; current_sprite.height = 32; } + break; + case 2: + if(!size) { current_sprite.width = 8; current_sprite.height = 8; } + else { current_sprite.width = 64; current_sprite.height = 64; } + break; + case 3: + if(!size) { current_sprite.width = 16; current_sprite.height = 16; } + else { current_sprite.width = 32; current_sprite.height = 32; } + break; + case 4: + if(!size) { current_sprite.width = 16; current_sprite.height = 16; } + else { current_sprite.width = 64; current_sprite.height = 64; } + break; + case 5: + if(!size) { current_sprite.width = 32; current_sprite.height = 32; } + else { current_sprite.width = 64; current_sprite.height = 64; } + break; + case 6: + if(!size) { current_sprite.width = 16; current_sprite.height = 32; } + else { current_sprite.width = 32; current_sprite.height = 64; } + break; + case 7: + if(!size) { current_sprite.width = 16; current_sprite.height = 32; } + else { current_sprite.width = 32; current_sprite.height = 32; } + break; + } +} + +void bPPU::render_oam_sprite() { +uint16 pos, col, chr, tiledata_inc; +uint8 d0, d1, d2, d3, pal_index; +int x, y, z, x1, mx, mask, p; +int tile_width; + tile_width = current_sprite.width >> 3; //e.x. 16x16 sprite = 2x2 tiles + + if(_interlace == true && _screen_width == 512) { + y = (_y << 1) + _interlace_field; + } else { + y = _y; + } + + x = current_sprite.x; + if(_screen_width == 512) { + x <<= 1; + } + + if(current_sprite.v_flip) { + y = ((current_sprite.height - 1) - (_y - current_sprite.y)); + } else { + y = (_y - current_sprite.y); + } + y &= 255; + if(regs.oam_halve == true) { + y <<= 1; + y += _interlace_field; + } + + chr = current_sprite.character; + tiledata_inc = (chr & 0x100)?(regs.oam_nameselect << 13):0; + chr += (y >> 3) << 4; + pal_index = (current_sprite.palette << 4); + for(x1=0;x1> z; + } + x &= 511; + if(x < _screen_width) { + col = 0; + if(d0 & mask)col += 1; + if(d1 & mask)col += 2; + if(d2 & mask)col += 4; + if(d3 & mask)col += 8; + if(col) { + col += pal_index; + col += 128; + if(oam_line_pri[x] == OAM_PRI_NONE) { + oam_line_pal[x] = col; + oam_line_pri[x] = current_sprite.priority; + } + if(_screen_width == 512) { + if(oam_line_pri[x + 1] == OAM_PRI_NONE) { + oam_line_pal[x + 1] = col; + oam_line_pri[x + 1] = current_sprite.priority; + } + } + } + } + x += (_screen_width == 512)?2:1; + } + } +} + +void bPPU::render_line_oam(uint8 pri0_pos, uint8 pri1_pos, uint8 pri2_pos, uint8 pri3_pos) { +int s; +bool _bg_enabled = regs.bg_enabled[OAM]; +bool _bgsub_enabled = regs.bgsub_enabled[OAM]; + if(_bg_enabled == false && _bgsub_enabled == false)return; + +uint8 *wt_main = main_windowtable[OAM]; +uint8 *wt_sub = sub_windowtable[OAM]; + build_window_tables(OAM); + + memset(oam_line_pri, OAM_PRI_NONE, 512); + for(s=0;s<128;s++) { + set_sprite_attributes(s); + if(regs.oam_halve == false) { + if(_y >= current_sprite.y && _y < (current_sprite.y + current_sprite.height)) { + render_oam_sprite(); + } else if((current_sprite.y + current_sprite.height) >= 256 && _y < ((current_sprite.y + current_sprite.height) & 255)) { + render_oam_sprite(); + } + } else { + if(_y >= current_sprite.y && _y < (current_sprite.y + (current_sprite.height >> 1))) { + render_oam_sprite(); + } else if((current_sprite.y + current_sprite.height) >= 256 && _y < ((current_sprite.y + (current_sprite.height >> 1)) & 255)) { + render_oam_sprite(); + } + } + } + +int _pri; + for(int x=0;x<_screen_width;x++) { + if(oam_line_pri[x] == OAM_PRI_NONE)continue; + + switch(oam_line_pri[x]) { + case 0:_pri = pri0_pos;break; + case 1:_pri = pri1_pos;break; + case 2:_pri = pri2_pos;break; + case 3:_pri = pri3_pos;break; + } + + if(main_colorwindowtable[x]) { + if(_bg_enabled == true && !wt_main[x]) { + if(pixel_cache[x].pri_main < _pri) { + pixel_cache[x].pri_main = _pri; + pixel_cache[x].bg_main = PC_OAM; + pixel_cache[x].src_main = oam_line_pal[x]; + } + } + if(_bgsub_enabled == true && !wt_sub[x]) { + if(pixel_cache[x].pri_sub < _pri) { + pixel_cache[x].pri_sub = _pri; + pixel_cache[x].bg_sub = PC_OAM; + pixel_cache[x].src_sub = oam_line_pal[x]; + } + } + } + } +} diff --git a/src/ppu/bppu/bppu_render_windows.cpp b/src/ppu/bppu/bppu_render_windows.cpp index cc0cc5e4..1d74b67b 100644 --- a/src/ppu/bppu/bppu_render_windows.cpp +++ b/src/ppu/bppu/bppu_render_windows.cpp @@ -1,95 +1,122 @@ -bool bPPU::windows_not_obstructing(uint8 layer, uint8 bg, uint16 x) { -uint8 w1_mask, w2_mask; //1 = masked, 0 = not masked -uint16 window1_left, window1_right, window2_left, window2_right; - if(layer == PPU_MAIN) { - if(regs.bg_window_enabled[bg] == false)return true; - } else if(layer == PPU_SUB) { - if(regs.bgsub_window_enabled[bg] == false)return true; +void bPPU::build_window_table(uint8 bg, uint8 *wtbl, bool mainscreen) { + if(mainscreen == true && regs.bg_window_enabled[bg] == false) { + memset(wtbl, 0, _screen_width); + return; + } + if(mainscreen == false && regs.bgsub_window_enabled[bg] == false) { + memset(wtbl, 0, _screen_width); + return; } +uint16 window1_left, window1_right, window2_left, window2_right; +int w1_mask, w2_mask; //1 = masked, 0 = not masked +int x; +bool r; window1_left = regs.window1_left; window1_right = regs.window1_right; window2_left = regs.window2_left; window2_right = regs.window2_right; - if(regs.bg_mode == 5 || regs.bg_mode == 6) { + if(_screen_width == 512) { window1_left <<= 1; window1_right <<= 1; window2_left <<= 1; window2_right <<= 1; } - if(regs.bg_window1_enabled[bg] == true && regs.bg_window2_enabled[bg] == false) { + if(regs.bg_window1_enabled[bg] == false && regs.bg_window2_enabled[bg] == false) { + memset(wtbl, 0, _screen_width); + } else if(regs.bg_window1_enabled[bg] == true && regs.bg_window2_enabled[bg] == false) { if(regs.bg_window1_invert[bg] == false) { - if(x >= window1_left && x <= window1_right)return false; - return true; + for(x=0;x<_screen_width;x++) { + wtbl[x] = (x >= window1_left && x <= window1_right)?true:false; + } } else { - if(x < window1_left || x > window1_right)return false; - return true; + for(x=0;x<_screen_width;x++) { + wtbl[x] = (x < window1_left || x > window1_right)?true:false; + } } - } else if(regs.bg_window2_enabled[bg] == true && regs.bg_window1_enabled[bg] == false) { + } else if(regs.bg_window1_enabled[bg] == false && regs.bg_window2_enabled[bg] == true) { if(regs.bg_window2_invert[bg] == false) { - if(x >= window2_left && x <= window2_right)return false; - return true; + for(x=0;x<_screen_width;x++) { + wtbl[x] = (x >= window2_left && x <= window2_right)?true:false; + } } else { - if(x < window2_left || x > window2_right)return false; - return true; - } - } else if(regs.bg_window1_enabled[bg] == true && regs.bg_window2_enabled[bg] == true) { - if(regs.bg_window1_invert[bg] == false) { - if(x >= window1_left && x <= window1_right)w1_mask = 1; - else w1_mask = 0; - } else { - if(x < window1_left || x > window1_right)w1_mask = 1; - else w1_mask = 0; + for(x=0;x<_screen_width;x++) { + wtbl[x] = (x < window2_left || x > window2_right)?true:false; + } } + } else { //if(regs.bg_window1_enabled[bg] == true && regs.bg_window2_enabled[bg] == true) { + for(x=0;x<_screen_width;x++) { + if(regs.bg_window1_invert[bg] == false) { + w1_mask = (x >= window1_left && x <= window1_right); + } else { + w1_mask = (x < window1_left || x > window1_right); + } - if(regs.bg_window2_invert[bg] == false) { - if(x >= window2_left && x <= window2_right)w2_mask = 1; - else w2_mask = 0; - } else { - if(x < window2_left || x > window2_right)w2_mask = 1; - else w2_mask = 0; - } + if(regs.bg_window2_invert[bg] == false) { + w2_mask = (x >= window2_left && x <= window2_right); + } else { + w2_mask = (x < window2_left || x > window2_right); + } - switch(regs.bg_window_mask[bg]) { - case WINDOWMASK_OR: - if((w1_mask | w2_mask) == 1)return false; - return true; - case WINDOWMASK_AND: - if((w1_mask & w2_mask) == 1)return false; - return true; - case WINDOWMASK_XOR: - if((w1_mask ^ w2_mask) == 1)return false; - return true; - case WINDOWMASK_XNOR: - if((w1_mask ^ w2_mask) == 0)return false; - return true; + switch(regs.bg_window_mask[bg]) { + case 0: //WINDOWMASK_OR: + wtbl[x] = ((w1_mask | w2_mask) == 1)?true:false; + break; + case 1: //WINDOWMASK_AND: + wtbl[x] = ((w1_mask & w2_mask) == 1)?true:false; + break; + case 2: //WINDOWMASK_XOR: + wtbl[x] = ((w1_mask ^ w2_mask) == 1)?true:false; + break; + case 3: //WINDOWMASK_XNOR: + wtbl[x] = ((w1_mask ^ w2_mask) == 0)?true:false; + break; + } } } - return true; } -bool bPPU::color_windows_not_obstructing(uint16 x, uint8 color_mask_type) { -uint8 w1_mask, w2_mask; //1 = masked, 0 = not masked -uint8 color_mask; -bool r; -uint16 window1_left, window1_right, window2_left, window2_right; - if(color_mask_type == PPU_MAIN) { - color_mask = regs.color_mask; - } else { - color_mask = regs.colorsub_mask; +void bPPU::build_window_tables(uint8 bg) { + build_window_table(bg, main_windowtable[bg], true); + build_window_table(bg, sub_windowtable[bg], false); +} + +void bPPU::build_color_window_table(uint8 *wtbl, uint8 mask) { + if(mask == 0) { + //always + memset(wtbl, 1, _screen_width); + return; } - if(color_mask == 0)return false; - if(color_mask == 3)return true; + if(mask == 3) { + //never + memset(wtbl, 0, _screen_width); + return; + } +int _true, _false; + if(mask == 1) { + //inside window only + _true = 1; + _false = 0; + } else { //mask == 2 + //outside window only + _true = 0; + _false = 1; + } + +uint16 window1_left, window1_right, window2_left, window2_right; +int w1_mask, w2_mask; //1 = masked, 0 = not masked +int x; +bool r; window1_left = regs.window1_left; window1_right = regs.window1_right; window2_left = regs.window2_left; window2_right = regs.window2_right; - if(regs.bg_mode == 5 || regs.bg_mode == 6) { + if(_screen_width == 512) { window1_left <<= 1; window1_right <<= 1; window2_left <<= 1; @@ -97,63 +124,60 @@ uint16 window1_left, window1_right, window2_left, window2_right; } if(regs.color_window1_enabled == false && regs.color_window2_enabled == false) { - r = true; + memset(wtbl, _false, _screen_width); } else if(regs.color_window1_enabled == true && regs.color_window2_enabled == false) { if(regs.color_window1_invert == false) { - if(x >= window1_left && x <= window1_right)r = false; - else r = true; + for(x=0;x<_screen_width;x++) { + wtbl[x] = (x >= window1_left && x <= window1_right)?_true:_false; + } } else { - if(x < window1_left || x > window1_right)r = false; - else r = true; + for(x=0;x<_screen_width;x++) { + wtbl[x] = (x < window1_left || x > window1_right)?_true:_false; + } } } else if(regs.color_window1_enabled == false && regs.color_window2_enabled == true) { if(regs.color_window2_invert == false) { - if(x >= window2_left && x <= window2_right)r = false; - else r = true; + for(x=0;x<_screen_width;x++) { + wtbl[x] = (x >= window2_left && x <= window2_right)?_true:_false; + } } else { - if(x < window2_left || x > window2_right)r = false; - else r = true; - } - } else if(regs.color_window1_enabled == true && regs.color_window2_enabled == true) { - if(regs.color_window1_invert == false) { - if(x >= window1_left && x <= window1_right)w1_mask = 1; - else w1_mask = 0; - } else { - if(x < window1_left || x > window1_right)w1_mask = 1; - else w1_mask = 0; + for(x=0;x<_screen_width;x++) { + wtbl[x] = (x < window2_left || x > window2_right)?_true:_false; + } } + } else { //if(regs.color_window1_enabled == true && regs.color_window2_enabled == true) { + for(x=0;x<_screen_width;x++) { + if(regs.color_window1_invert == false) { + w1_mask = (x >= window1_left && x <= window1_right); + } else { + w1_mask = (x < window1_left || x > window1_right); + } - if(regs.color_window2_invert == false) { - if(x >= window2_left && x <= window2_right)w2_mask = 1; - else w2_mask = 0; - } else { - if(x < window2_left || x > window2_right)w2_mask = 1; - else w2_mask = 0; - } + if(regs.color_window2_invert == false) { + w2_mask = (x >= window2_left && x <= window2_right); + } else { + w2_mask = (x < window2_left || x > window2_right); + } - switch(regs.color_window_mask) { - case WINDOWMASK_OR: - if((w1_mask | w2_mask) == 1)r = false; - else r = true; - break; - case WINDOWMASK_AND: - if((w1_mask & w2_mask) == 1)r = false; - else r = true; - break; - case WINDOWMASK_XOR: - if((w1_mask ^ w2_mask) == 1)r = false; - else r = true; - break; - case WINDOWMASK_XNOR: - if((w1_mask ^ w2_mask) == 0)r = false; - else r = true; - break; + switch(regs.color_window_mask) { + case 0: //WINDOWMASK_OR: + wtbl[x] = ((w1_mask | w2_mask) == 1)?_true:_false; + break; + case 1: //WINDOWMASK_AND: + wtbl[x] = ((w1_mask & w2_mask) == 1)?_true:_false; + break; + case 2: //WINDOWMASK_XOR: + wtbl[x] = ((w1_mask ^ w2_mask) == 1)?_true:_false; + break; + case 3: //WINDOWMASK_XNOR: + wtbl[x] = ((w1_mask ^ w2_mask) == 0)?_true:_false; + break; + } } } - - if(color_mask == 2) { - r = (r == true)?false:true; - } - - return r; +} + +void bPPU::build_color_window_tables() { + build_color_window_table(main_colorwindowtable, regs.color_mask); + build_color_window_table(sub_colorwindowtable, regs.colorsub_mask); } diff --git a/src/ppu/ppu.h b/src/ppu/ppu.h index c008bcc3..1e16b35b 100644 --- a/src/ppu/ppu.h +++ b/src/ppu/ppu.h @@ -14,6 +14,7 @@ uint16 *buffer; class PPU { public: +int _y; PPUOutput *output; MMIO *mmio; virtual uint8 vram_read (uint16 addr) = 0; diff --git a/src/win/Makefile b/src/win/Makefile index f0d80f1e..2abf98c7 100644 --- a/src/win/Makefile +++ b/src/win/Makefile @@ -1,5 +1,5 @@ CC = cl -CFLAGS = /nologo /O2 /Ob2 +CFLAGS = /nologo /O2 /Ogityb2 /Gr /Gs OBJS = winmain.obj \ libstring.obj libconfig.obj \ clock.obj bclock.obj \ diff --git a/src/win/bsnes.cpp b/src/win/bsnes.cpp index 1450a00d..91738a51 100644 --- a/src/win/bsnes.cpp +++ b/src/win/bsnes.cpp @@ -86,7 +86,7 @@ void bSNES::run() { } void bSNES::render_frame() { - renderer->update(); + dd_renderer->update(); } /*********************** @@ -94,18 +94,21 @@ void bSNES::render_frame() { ***********************/ #define KeyState(key) ((GetAsyncKeyState(key) & 0x8000)?1:0) void bSNES::poll_input() { - joypad1.up = KeyState(VK_UP); - joypad1.down = KeyState(VK_DOWN); - joypad1.left = KeyState(VK_LEFT); - joypad1.right = KeyState(VK_RIGHT); - joypad1.select = KeyState(VK_LSHIFT) | KeyState(VK_RSHIFT); - joypad1.start = KeyState(VK_RETURN); - joypad1.y = KeyState('A'); - joypad1.b = KeyState('Z'); - joypad1.x = KeyState('S'); - joypad1.a = KeyState('X'); - joypad1.l = KeyState('D'); - joypad1.r = KeyState('C'); +/* Only capture input when main window has focus */ + if(GetForegroundWindow() == w_main->hwnd) { + joypad1.up = KeyState(VK_UP); + joypad1.down = KeyState(VK_DOWN); + joypad1.left = KeyState(VK_LEFT); + joypad1.right = KeyState(VK_RIGHT); + joypad1.select = KeyState(VK_LSHIFT) | KeyState(VK_RSHIFT); + joypad1.start = KeyState(VK_RETURN); + joypad1.y = KeyState('A'); + joypad1.b = KeyState('Z'); + joypad1.x = KeyState('S'); + joypad1.a = KeyState('X'); + joypad1.l = KeyState('D'); + joypad1.r = KeyState('C'); + } //Check for debugger-based key locks if(is_debugger_enabled == true) { diff --git a/src/win/config.cpp b/src/win/config.cpp index 1c28ad53..ba910014 100644 --- a/src/win/config.cpp +++ b/src/win/config.cpp @@ -8,8 +8,13 @@ struct { uint32 use_vram; }video; +struct { + uint32 show_fps; +}gui; + Config() { __config_add(video.mode, 1, DEC); __config_add(video.use_vram, true, TRUEFALSE); + __config_add(gui.show_fps, true, TRUEFALSE); } }cfg; diff --git a/src/win/ui_render.cpp b/src/win/dd_renderer.cpp similarity index 78% rename from src/win/ui_render.cpp rename to src/win/dd_renderer.cpp index 19b81736..f753cc85 100644 --- a/src/win/ui_render.cpp +++ b/src/win/dd_renderer.cpp @@ -1,19 +1,13 @@ -//This is in the global namespace for inline assembly optimizations. -//If it were in a class, I would have to cast a pointer to it, and -//to read from a pointer array requires an extra opcode: -//mov eax,[array+eax*4] -> lea ebx,[parray] ; mov ebx,[ebx+eax*4] -uint32 color_lookup_table[65536]; - -Render::Render() { +DDRenderer::DDRenderer() { lpdd = 0; lpdds = 0; lpddsb = 0; lpddc = 0; } -void Render::update_color_lookup_table() { +void DDRenderer::update_color_lookup_table() { int i, r, g, b; - lpdds->GetSurfaceDesc(&ddsd); + lpddsb->GetSurfaceDesc(&ddsd); color_depth = ddsd.ddpfPixelFormat.dwRGBBitCount; if(color_depth == 15) { for(i=0;i<65536;i++) { @@ -45,9 +39,66 @@ int i, r, g, b; } } -void Render::set_window(HWND hwnd_handle) { hwnd = hwnd_handle; } +void DDRenderer::set_window(HWND hwnd_handle) { hwnd = hwnd_handle; } -void Render::to_windowed() { +/* + This function tries to create a 16-bit backbuffer whenever possible, + even in 24/32-bit mode. This is possible because DDraw automatically + handles conversion from 16bpp->32bpp in hardware. This only works + when both the source and dest buffers are in VRAM, though. +*/ +void DDRenderer::create_backbuffer() { +int color_depth; + lpdds->GetSurfaceDesc(&ddsd); + color_depth = ddsd.ddpfPixelFormat.dwRGBBitCount; + if(color_depth == 15 || color_depth == 16) { + goto try_native_backbuffer; + } else { + if(cfg.video.use_vram == false) { + goto try_native_backbuffer; + } + } + + memset(&ddsd, 0, sizeof(DDSURFACEDESC)); + ddsd.dwSize = sizeof(DDSURFACEDESC); + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT; + ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; + if(cfg.video.use_vram) { + ddsd.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; + } else { + ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + } + + ddsd.dwWidth = 512; + ddsd.dwHeight = 478; + + ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; + ddsd.ddpfPixelFormat.dwRGBBitCount = 16; + ddsd.ddpfPixelFormat.dwRBitMask = 0xf800; + ddsd.ddpfPixelFormat.dwGBitMask = 0x07e0; + ddsd.ddpfPixelFormat.dwBBitMask = 0x001f; + + if(lpdd->CreateSurface(&ddsd, &lpddsb, 0) == DD_OK)return; + +try_native_backbuffer: + memset(&ddsd, 0, sizeof(DDSURFACEDESC)); + ddsd.dwSize = sizeof(DDSURFACEDESC); + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; + if(cfg.video.use_vram) { + ddsd.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; + } else { + ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + } + + ddsd.dwWidth = 512; + ddsd.dwHeight = 478; + + lpdd->CreateSurface(&ddsd, &lpddsb, 0); +} + +void DDRenderer::to_windowed() { destroy(); DirectDrawCreate(0, &lpdd, 0); lpdd->SetCooperativeLevel(hwnd, DDSCL_NORMAL); @@ -62,24 +113,12 @@ void Render::to_windowed() { lpddc->SetHWnd(0, hwnd); lpdds->SetClipper(lpddc); - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - if(cfg.video.use_vram) { - ddsd.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; - } else { - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - } - ddsd.dwWidth = 512; - ddsd.dwHeight = 478; - lpdd->CreateSurface(&ddsd, &lpddsb, 0); - + create_backbuffer(); update_color_lookup_table(); update(); } -void Render::to_fullscreen() { +void DDRenderer::to_fullscreen() { destroy(); DirectDrawCreate(0, &lpdd, 0); lpdd->SetCooperativeLevel(hwnd, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE); @@ -95,24 +134,12 @@ void Render::to_fullscreen() { lpddc->SetHWnd(0, hwnd); lpdds->SetClipper(lpddc); - memset(&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - if(cfg.video.use_vram) { - ddsd.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; - } else { - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - } - ddsd.dwWidth = 512; - ddsd.dwHeight = 478; - lpdd->CreateSurface(&ddsd, &lpddsb, 0); - + create_backbuffer(); update_color_lookup_table(); update(); } -void Render::set_source_window(RECT *rs) { +void DDRenderer::set_source_window(RECT *rs) { switch(ppu->output->frame_mode) { case 0:SetRect(rs, 0, 0, 256, 223);break; case 1:SetRect(rs, 0, 0, 256, 446);break; @@ -121,7 +148,7 @@ void Render::set_source_window(RECT *rs) { } } -void Render::redraw() { +void DDRenderer::redraw() { RECT rd, rs; POINT p; HRESULT hr; @@ -136,6 +163,7 @@ HRESULT hr; lpddsb->Restore(); } + if(cfg.gui.show_fps == false)return; uint32 fps; char s[256], t[256]; fps_timer->tick(); @@ -155,7 +183,7 @@ char s[256], t[256]; } } -void Render::update16() { +void DDRenderer::update16() { HRESULT hr; hr = lpddsb->Lock(0, &ddsd, DDLOCK_WAIT, 0); if(hr != DD_OK)return; @@ -227,7 +255,7 @@ int x, y; lpddsb->Unlock(0); } -void Render::update32() { +void DDRenderer::update32() { HRESULT hr; hr = lpddsb->Lock(0, &ddsd, DDLOCK_WAIT, 0); if(hr != DD_OK)return; @@ -299,7 +327,7 @@ int x, y; lpddsb->Unlock(0); } -void Render::update() { +void DDRenderer::update() { switch(color_depth) { case 15: case 16: @@ -312,7 +340,7 @@ void Render::update() { redraw(); } -void Render::destroy() { +void DDRenderer::destroy() { if(lpddc) { lpddc->Release(); lpddc = 0; diff --git a/src/win/dd_renderer.h b/src/win/dd_renderer.h new file mode 100644 index 00000000..acaf8bfe --- /dev/null +++ b/src/win/dd_renderer.h @@ -0,0 +1,27 @@ +#include +class DDRenderer { +public: +LPDIRECTDRAW lpdd; +LPDIRECTDRAWSURFACE lpdds, lpddsb; +LPDIRECTDRAWCLIPPER lpddc; +DDSURFACEDESC ddsd; +DDSCAPS ddscaps; +HWND hwnd; +uint8 color_depth; +uint32 color_lookup_table[65536]; + void set_window(HWND hwnd_handle); + void create_backbuffer(); + void to_windowed(); + void to_fullscreen(); + void set_source_window(RECT *rs); + void redraw(); + void update16(); + void update32(); + void update(); + void destroy(); + void update_color_lookup_table(); + + DDRenderer(); +}; + +DDRenderer *dd_renderer; diff --git a/src/win/ui.cpp b/src/win/ui.cpp index b7f18d31..91f4e315 100644 --- a/src/win/ui.cpp +++ b/src/win/ui.cpp @@ -1,7 +1,7 @@ HFONT hFont, hMonofont; +#include "dd_renderer.cpp" #include "ui_window.cpp" -#include "ui_render.cpp" #include "ui_main.cpp" #include "ui_console.cpp" #include "ui_bp.cpp" @@ -29,18 +29,18 @@ void CreateWindows() { } void init_ui0() { - renderer = new Render(); - w_main = new MainWindow(); - w_console = new Console(); - w_bp = new BreakpointEditor(); - w_memory = new MemoryEditor(); + dd_renderer = new DDRenderer(); + w_main = new MainWindow(); + w_console = new Console(); + w_bp = new BreakpointEditor(); + w_memory = new MemoryEditor(); } void init_ui1() { CreateFonts(); CreateWindows(); SetFocus(w_main->hwnd); - renderer->set_window(w_main->hwnd); - renderer->to_windowed(); + dd_renderer->set_window(w_main->hwnd); + dd_renderer->to_windowed(); bsnes->debugger_deactivate(); } diff --git a/src/win/ui.h b/src/win/ui.h index e2c8d5b9..f8def5da 100644 --- a/src/win/ui.h +++ b/src/win/ui.h @@ -225,28 +225,3 @@ uint32 edit_mode, edit_addr, edit_mask; }; MemoryEditor *w_memory; - -#include -class Render { -public: -LPDIRECTDRAW lpdd; -LPDIRECTDRAWSURFACE lpdds, lpddsb; -LPDIRECTDRAWCLIPPER lpddc; -DDSURFACEDESC ddsd; -DDSCAPS ddscaps; -HWND hwnd; -uint8 color_depth; - void set_window(HWND hwnd_handle); - void to_windowed(); - void to_fullscreen(); - void set_source_window(RECT *rs); - void redraw(); - void update16(); - void update32(); - void update(); - void destroy(); - void update_color_lookup_table(); - Render(); -}; - -Render *renderer; diff --git a/src/win/ui_main.cpp b/src/win/ui_main.cpp index 1d5bf2d1..b105956c 100644 --- a/src/win/ui_main.cpp +++ b/src/win/ui_main.cpp @@ -137,7 +137,7 @@ long __stdcall wndproc_main(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { PostQuitMessage(0); break; case WM_PAINT: - renderer->redraw(); + dd_renderer->redraw(); break; } return DefWindowProc(hwnd, msg, wparam, lparam); diff --git a/src/win/winmain.cpp b/src/win/winmain.cpp index a1afb2f4..239954cc 100644 --- a/src/win/winmain.cpp +++ b/src/win/winmain.cpp @@ -1,5 +1,5 @@ #define INTERFACE_MAIN -#define BSNES_VERSION "0.007a" +#define BSNES_VERSION "0.008" #include "winmain.h" #include "../base.h" @@ -7,6 +7,7 @@ #include "bsnes.h" #include "ui.h" +#include "dd_renderer.h" #include "timer.cpp" fpstimer *fps_timer;