From 74786231c547e9c555f0f1a650f9184c0bdf0e93 Mon Sep 17 00:00:00 2001 From: SarahW Date: Fri, 8 Apr 2016 21:40:15 +0100 Subject: [PATCH] Added Voodoo depth biasing. --- src/vid_voodoo.c | 7 ++++++- src/vid_voodoo_codegen_x86-64.h | 9 +++++++++ src/vid_voodoo_codegen_x86.h | 9 +++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/vid_voodoo.c b/src/vid_voodoo.c index 35fe473..9c430ac 100644 --- a/src/vid_voodoo.c +++ b/src/vid_voodoo.c @@ -594,7 +594,9 @@ enum FBZ_DRAW_FRONT = 0x0000, FBZ_DRAW_BACK = 0x4000, FBZ_DRAW_MASK = 0xc000, - + + FBZ_DEPTH_BIAS = (1 << 16), + FBZ_PARAM_ADJUST = (1 << 26) }; @@ -1962,6 +1964,9 @@ static void voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, vood else new_depth = CLAMP16(state->z >> 12); + if (params->fbzMode & FBZ_DEPTH_BIAS) + new_depth = (new_depth + params->zaColor) & 0xffff; + if (params->fbzMode & FBZ_DEPTH_ENABLE) { uint16_t old_depth = aux_mem[x]; diff --git a/src/vid_voodoo_codegen_x86-64.h b/src/vid_voodoo_codegen_x86-64.h index 8794d93..8155127 100644 --- a/src/vid_voodoo_codegen_x86-64.h +++ b/src/vid_voodoo_codegen_x86-64.h @@ -231,6 +231,15 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo addbyte(0xc3); } + if (params->fbzMode & FBZ_DEPTH_BIAS) + { + addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ + addbyte(0x86); + addlong(offsetof(voodoo_params_t, zaColor)); + addbyte(0x25); /*AND EAX, 0xffff*/ + addlong(0xffff); + } + addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ addbyte(0x87); addlong(offsetof(voodoo_state_t, new_depth)); diff --git a/src/vid_voodoo_codegen_x86.h b/src/vid_voodoo_codegen_x86.h index 23a2845..11f87b2 100644 --- a/src/vid_voodoo_codegen_x86.h +++ b/src/vid_voodoo_codegen_x86.h @@ -212,6 +212,15 @@ static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo addbyte(0x47); addbyte(0xc3); } + + if (params->fbzMode & FBZ_DEPTH_BIAS) + { + addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ + addbyte(0x86); + addlong(offsetof(voodoo_params_t, zaColor)); + addbyte(0x25); /*AND EAX, 0xffff*/ + addlong(0xffff); + } addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ addbyte(0x87);