From e6b4f8806522d734d59bcd03c1d2744a38c3f5a6 Mon Sep 17 00:00:00 2001 From: SarahW Date: Sun, 5 Feb 2017 16:34:59 +0000 Subject: [PATCH] Voodoo only writes to depth buffer when depth buffering enabled, regardless of whether depth writes are enabled or not V2 clipping coordinates are 12 bits, instead of 10 as on Voodoo Graphics. V2 block width is 6 bits long. Battlezone now works at 1024x768 on Voodoo 2. --- src/vid_voodoo.c | 30 ++++++++++++++++++++++++------ src/vid_voodoo_codegen_x86-64.h | 2 +- src/vid_voodoo_codegen_x86.h | 2 +- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/vid_voodoo.c b/src/vid_voodoo.c index b03c6a4..62a4304 100644 --- a/src/vid_voodoo.c +++ b/src/vid_voodoo.c @@ -1086,7 +1086,9 @@ static void voodoo_recalc(voodoo_t *voodoo) voodoo->block_width = ((voodoo->fbiInit1 >> 4) & 15) * 2; if (voodoo->fbiInit6 & (1 << 30)) - voodoo->fbiInit1 += 1; + voodoo->block_width += 1; + if (voodoo->fbiInit1 & (1 << 24)) + voodoo->block_width += 32; voodoo->row_width = voodoo->block_width * 32 * 2; /* pclog("voodoo_recalc : front_offset %08X back_offset %08X aux_offset %08X draw_offset %08x\n", voodoo->params.front_offset, voodoo->back_offset, voodoo->params.aux_offset, voodoo->params.draw_offset); @@ -3100,7 +3102,7 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood if (params->fbzMode & FBZ_RGB_WMASK) fb_mem[x] = src_b | (src_g << 5) | (src_r << 11); - if (params->fbzMode & FBZ_DEPTH_WMASK) + if ((params->fbzMode & (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) == (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) aux_mem[x] = new_depth; } } @@ -4429,12 +4431,28 @@ static void voodoo_reg_writel(uint32_t addr, uint32_t val, void *p) break; case SST_clipLeftRight: - voodoo->params.clipRight = val & 0x3ff; - voodoo->params.clipLeft = (val >> 16) & 0x3ff; + if (voodoo->type >= VOODOO_2) + { + voodoo->params.clipRight = val & 0xfff; + voodoo->params.clipLeft = (val >> 16) & 0xfff; + } + else + { + voodoo->params.clipRight = val & 0x3ff; + voodoo->params.clipLeft = (val >> 16) & 0x3ff; + } break; case SST_clipLowYHighY: - voodoo->params.clipHighY = val & 0x3ff; - voodoo->params.clipLowY = (val >> 16) & 0x3ff; + if (voodoo->type >= VOODOO_2) + { + voodoo->params.clipHighY = val & 0xfff; + voodoo->params.clipLowY = (val >> 16) & 0xfff; + } + else + { + voodoo->params.clipHighY = val & 0x3ff; + voodoo->params.clipLowY = (val >> 16) & 0x3ff; + } break; case SST_nopCMD: diff --git a/src/vid_voodoo_codegen_x86-64.h b/src/vid_voodoo_codegen_x86-64.h index a2686a0..73a294f 100644 --- a/src/vid_voodoo_codegen_x86-64.h +++ b/src/vid_voodoo_codegen_x86-64.h @@ -2980,7 +2980,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo addbyte(0x56); } - if (params->fbzMode & FBZ_DEPTH_WMASK) + if ((params->fbzMode & (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) == (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) { addbyte(0x66); /*MOV AX, new_depth*/ addbyte(0x8b); diff --git a/src/vid_voodoo_codegen_x86.h b/src/vid_voodoo_codegen_x86.h index 864c14a..abd2578 100644 --- a/src/vid_voodoo_codegen_x86.h +++ b/src/vid_voodoo_codegen_x86.h @@ -2972,7 +2972,7 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo addbyte(0x56); } - if (params->fbzMode & FBZ_DEPTH_WMASK) + if ((params->fbzMode & (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) == (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) { addbyte(0x66); /*MOV AX, new_depth*/ addbyte(0x8b);