Voodoo: Fixes HUD transparency bugs in Extreme Assault Voodoo executable (interpreter and x86-64 recompiler only).

This commit is contained in:
OBattler
2025-01-08 11:26:15 +01:00
parent c3faf20226
commit f39c3491bf
4 changed files with 72 additions and 12 deletions

View File

@@ -2157,6 +2157,12 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
addbyte(0xc2);
}
addbyte(0xf3); /*MOVQ XMM15(colbfog), XMM0 */
addbyte(0x44);
addbyte(0x0f);
addbyte(0x7e);
addbyte(0xf8);
if (params->fogMode & FOG_ENABLE) {
if (params->fogMode & FOG_CONSTANT) {
addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/
@@ -2580,17 +2586,17 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
addbyte(0xef);
addbyte(0xe4);
break;
case AFUNC_ASATURATE:
addbyte(0x66); /*PMULLW XMM4, XMM11(minus_254)*/
case AFUNC_ACOLORBEFOREFOG:
addbyte(0x66); /*PMULLW XMM4, XMM15(colbfog)*/
addbyte(0x41);
addbyte(0x0f);
addbyte(0xd5);
addbyte(0xe3);
addbyte(0xe7);
addbyte(0xf3); /*MOVQ XMM5, XMM4*/
addbyte(0x0f);
addbyte(0x7e);
addbyte(0xec);
addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/
addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/
addbyte(0x41);
addbyte(0x0f);
addbyte(0xfd);
@@ -2610,6 +2616,7 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
addbyte(0x71);
addbyte(0xd4);
addbyte(8);
break;
}
switch (src_afunc) {
@@ -2762,7 +2769,36 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
addbyte(0xef);
addbyte(0xc0);
break;
case AFUNC_ACOLORBEFOREFOG:
case AFUNC_ASATURATE:
addbyte(0x66); /*PMULLW XMM0, XMM11(minus_254)*/
addbyte(0x41);
addbyte(0x0f);
addbyte(0xd5);
addbyte(0xc3);
addbyte(0xf3); /*MOVQ XMM5, XMM0*/
addbyte(0x0f);
addbyte(0x7e);
addbyte(0xe8);
addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/
addbyte(0x41);
addbyte(0x0f);
addbyte(0xfd);
addbyte(0x42);
addbyte(8 * 2);
addbyte(0x66); /*PSRLW XMM5, 8*/
addbyte(0x0f);
addbyte(0x71);
addbyte(0xd5);
addbyte(8);
addbyte(0x66); /*PADDW XMM0, XMM5*/
addbyte(0x0f);
addbyte(0xfd);
addbyte(0xc5);
addbyte(0x66); /*PSRLW XMM0, 8*/
addbyte(0x0f);
addbyte(0x71);
addbyte(0xd0);
addbyte(8);
break;
}

View File

@@ -210,11 +210,10 @@ void voodoo_codegen_close(voodoo_t *voodoo);
newdest_g = (dest_g * (255 - dest_a)) / 255; \
newdest_b = (dest_b * (255 - dest_a)) / 255; \
break; \
case AFUNC_ASATURATE: \
_a = MIN(src_a, 1 - dest_a); \
newdest_r = (dest_r * _a) / 255; \
newdest_g = (dest_g * _a) / 255; \
newdest_b = (dest_b * _a) / 255; \
case AFUNC_ACOLORBEFOREFOG: \
newdest_r = (dest_r * colbfog_r) / 255; \
newdest_g = (dest_g * colbfog_g) / 255; \
newdest_b = (dest_b * colbfog_b) / 255; \
break; \
} \
\
@@ -254,8 +253,11 @@ void voodoo_codegen_close(voodoo_t *voodoo);
src_g = (src_g * (255 - dest_a)) / 255; \
src_b = (src_b * (255 - dest_a)) / 255; \
break; \
case AFUNC_ACOLORBEFOREFOG: \
fatal("AFUNC_ACOLORBEFOREFOG\n"); \
case AFUNC_ASATURATE: \
_a = MIN(src_a, 1 - dest_a); \
src_r = (dest_r * _a) / 255; \
src_g = (dest_g * _a) / 255; \
src_b = (dest_b * _a) / 255; \
break; \
} \
\

View File

@@ -252,6 +252,9 @@ voodoo_fb_writew(uint32_t addr, uint16_t val, void *priv)
{
rgba8_t write_data = colour_data;
uint16_t new_depth = depth_data;
int colbfog_r = 0;
int colbfog_g = 0;
int colbfog_b = 0;
if (params->fbzMode & FBZ_DEPTH_ENABLE) {
uint16_t old_depth = *(uint16_t *) (&voodoo->fb_mem[write_addr_aux & voodoo->fb_mask]);
@@ -262,6 +265,10 @@ voodoo_fb_writew(uint32_t addr, uint16_t val, void *priv)
if ((params->fbzMode & FBZ_CHROMAKEY) && write_data.r == params->chromaKey_r && write_data.g == params->chromaKey_g && write_data.b == params->chromaKey_b)
goto skip_pixel;
colbfog_r = write_data.r;
colbfog_g = write_data.g;
colbfog_b = write_data.b;
if (params->fogMode & FOG_ENABLE) {
int32_t z = new_depth << 12;
int64_t w_depth = (int64_t) (int32_t) new_depth;
@@ -438,6 +445,9 @@ voodoo_fb_writel(uint32_t addr, uint32_t val, void *priv)
for (int c = 0; c < count; c++) {
rgba8_t write_data = colour_data[c];
uint16_t new_depth = depth_data[c];
int colbfog_r = 0;
int colbfog_g = 0;
int colbfog_b = 0;
if (params->fbzMode & FBZ_DEPTH_ENABLE) {
uint16_t old_depth = *(uint16_t *) (&voodoo->fb_mem[write_addr_aux & voodoo->fb_mask]);
@@ -448,6 +458,10 @@ voodoo_fb_writel(uint32_t addr, uint32_t val, void *priv)
if ((params->fbzMode & FBZ_CHROMAKEY) && write_data.r == params->chromaKey_r && write_data.g == params->chromaKey_g && write_data.b == params->chromaKey_b)
goto skip_pixel;
colbfog_r = write_data.r;
colbfog_g = write_data.g;
colbfog_b = write_data.b;
if (params->fogMode & FOG_ENABLE) {
int32_t z = new_depth << 12;
int64_t w_depth = new_depth;

View File

@@ -967,6 +967,10 @@ voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *
int src_g = 0;
int src_b = 0;
int src_a = 0;
int colbfog_r = 0;
int colbfog_g = 0;
int colbfog_b = 0;
int colbfog_a = 0;
int msel_r;
int msel_g;
int msel_b;
@@ -1263,6 +1267,10 @@ voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *
if (cca_invert_output)
src_a ^= 0xff;
colbfog_r = src_r;
colbfog_g = src_g;
colbfog_b = src_b;
if (params->fogMode & FOG_ENABLE)
APPLY_FOG(src_r, src_g, src_b, state->z, state->ia, state->w);