mirror of
https://github.com/86Box/86Box.git
synced 2026-02-23 01:48:21 -07:00
Implement Voodoo alpha planes and alpha mask support
Fallback to interpreter if alpha planes are used for now
This commit is contained in:
@@ -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];
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user