Implement Voodoo alpha planes and alpha mask support

Fallback to interpreter if alpha planes are used for now
This commit is contained in:
Cacodemon345
2025-12-14 23:27:18 +06:00
parent 495d23042d
commit 601155fdd6
3 changed files with 50 additions and 7 deletions

View File

@@ -656,6 +656,7 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
int block_pos = 0;
int z_skip_pos = 0;
int a_skip_pos = 0;
int amask_skip_pos = 0;
int chroma_skip_pos = 0;
int depth_jump_pos = 0;
int depth_jump_pos2 = 0;
@@ -1732,6 +1733,15 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
addbyte(0xdb);
break;
}
if (params->fbzMode & FBZ_ALPHA_MASK) {
addbyte(0xf7); /*TEST EBX, 1*/
addbyte(0xc3);
addlong(1);
addbyte(0x0f); /* JZ amask_skip_pos */
addbyte(0x84);
amask_skip_pos = block_pos;
addlong(0);
}
/*ECX = a_local*/
switch (cca_localselect) {
case CCA_LOCALSELECT_ITER_A:
@@ -2986,6 +2996,8 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
*(uint32_t *) &code_block[a_skip_pos] = (block_pos - a_skip_pos) - 4;
if (chroma_skip_pos)
*(uint32_t *) &code_block[chroma_skip_pos] = (block_pos - chroma_skip_pos) - 4;
if (amask_skip_pos)
*(uint32_t *) &code_block[amask_skip_pos] = (block_pos - amask_skip_pos) - 4;
addbyte(0x4c); /*MOV RSI, R15*/
addbyte(0x89);
@@ -3225,6 +3237,12 @@ voodoo_get_block(voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *stat
voodoo_x86_data_t *voodoo_x86_data = voodoo->codegen_data;
voodoo_x86_data_t *data;
if (params->fbzMode & FBZ_ALPHA_ENABLE) {
// Lands of Lore III relies on the alpha buffer functionality to create its transparent textures.
// Fallback to interpreter.
return NULL;
}
for (uint8_t c = 0; c < 8; c++) {
data = &voodoo_x86_data[odd_even + c * 4]; //&voodoo_x86_data[odd_even][b];

View File

@@ -366,11 +366,14 @@ enum {
FBZ_DEPTH_WMASK = (1 << 10),
FBZ_DITHER_2x2 = (1 << 11),
FBZ_ALPHA_MASK = (1 << 13),
FBZ_DRAW_FRONT = 0x0000,
FBZ_DRAW_BACK = 0x4000,
FBZ_DRAW_MASK = 0xc000,
FBZ_DEPTH_BIAS = (1 << 16),
FBZ_ALPHA_ENABLE = (1 << 18),
FBZ_DITHER_SUB = (1 << 19),
FBZ_DEPTH_SOURCE = (1 << 20),
@@ -655,6 +658,8 @@ enum {
#define src_afunc ((params->alphaMode >> 8) & 0xf)
#define dest_afunc ((params->alphaMode >> 12) & 0xf)
#define src_aafunc ((params->alphaMode >> 16) & 0xf)
#define dest_aafunc ((params->alphaMode >> 20) & 0xf)
#define alpha_func ((params->alphaMode >> 1) & 7)
#define a_ref (params->alphaMode >> 24)
#define depth_op ((params->fbzMode >> 5) & 7)