mirror of
https://github.com/86Box/86Box.git
synced 2026-02-22 01:25:33 -07:00
Implement alpha planes for x64 Voodoo dynarec
This commit is contained in:
@@ -2407,6 +2407,27 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
|
||||
}
|
||||
|
||||
if (params->alphaMode & (1 << 4)) {
|
||||
if (params->fbzMode & FBZ_ALPHA_ENABLE) {
|
||||
addbyte(0x8b); /*MOV EBX, state->x[EDI]*/
|
||||
addbyte(0x9f);
|
||||
if (params->aux_tiled)
|
||||
addlong(offsetof(voodoo_state_t, x_tiled));
|
||||
else
|
||||
addlong(offsetof(voodoo_state_t, x));
|
||||
addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/
|
||||
addbyte(0x8b);
|
||||
addbyte(0x8f);
|
||||
addlong(offsetof(voodoo_state_t, aux_mem));
|
||||
addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/
|
||||
addbyte(0xb7);
|
||||
addbyte(0x1c);
|
||||
addbyte(0x59);
|
||||
} else {
|
||||
addbyte(0x48); /*MOV RBX, 0xff*/
|
||||
addbyte(0xc7);
|
||||
addbyte(0xc3);
|
||||
addlong(0xff);
|
||||
}
|
||||
addbyte(0x49); /*MOV R8, rgb565*/
|
||||
addbyte(0xb8);
|
||||
addquad((uintptr_t) rgb565);
|
||||
@@ -2422,6 +2443,8 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
|
||||
addlong(offsetof(voodoo_state_t, fb_mem));
|
||||
addbyte(0x01); /*ADD EDX, EDX*/
|
||||
addbyte(0xd2);
|
||||
addbyte(0x01); /*ADD EBX, EBX*/
|
||||
addbyte(0xdb);
|
||||
addbyte(0x0f); /*MOVZX EAX, [RBP+RAX*2]*/
|
||||
addbyte(0xb7);
|
||||
addbyte(0x44);
|
||||
@@ -2516,6 +2539,36 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
|
||||
addbyte(8);
|
||||
break;
|
||||
case AFUNC_ADST_ALPHA:
|
||||
addbyte(0x66); /*PMULLW XMM4, R10(alookup)[EBX*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xd5);
|
||||
addbyte(0x24);
|
||||
addbyte(0xda);
|
||||
addbyte(0xf3); /*MOVQ XMM5, XMM4*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
addbyte(0xec);
|
||||
addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0x62);
|
||||
addbyte(8 * 2);
|
||||
addbyte(0x66); /*PSRLW XMM5, 8*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x71);
|
||||
addbyte(0xd5);
|
||||
addbyte(8);
|
||||
addbyte(0x66); /*PADDW XMM4, XMM5*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0xe5);
|
||||
addbyte(0x66); /*PSRLW XMM4, 8*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x71);
|
||||
addbyte(0xd4);
|
||||
addbyte(8);
|
||||
break;
|
||||
case AFUNC_AONE:
|
||||
break;
|
||||
@@ -2591,10 +2644,36 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
|
||||
addbyte(8);
|
||||
break;
|
||||
case AFUNC_AOMDST_ALPHA:
|
||||
addbyte(0x66); /*PXOR XMM4, XMM4*/
|
||||
addbyte(0x66); /*PMULLW XMM4, R11(aminuslookup)[EBX*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xef);
|
||||
addbyte(0xe4);
|
||||
addbyte(0xd5);
|
||||
addbyte(0x24);
|
||||
addbyte(0xdb);
|
||||
addbyte(0xf3); /*MOVQ XMM5, XMM4*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
addbyte(0xec);
|
||||
addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0x62);
|
||||
addbyte(8 * 2);
|
||||
addbyte(0x66); /*PSRLW XMM5, 8*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x71);
|
||||
addbyte(0xd5);
|
||||
addbyte(8);
|
||||
addbyte(0x66); /*PADDW XMM4, XMM5*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0xfd);
|
||||
addbyte(0xe5);
|
||||
addbyte(0x66); /*PSRLW XMM4, 8*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x71);
|
||||
addbyte(0xd4);
|
||||
addbyte(8);
|
||||
break;
|
||||
case AFUNC_ACOLORBEFOREFOG:
|
||||
addbyte(0x66); /*PMULLW XMM4, XMM15(colbfog)*/
|
||||
@@ -2699,6 +2778,36 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
|
||||
addbyte(8);
|
||||
break;
|
||||
case AFUNC_ADST_ALPHA:
|
||||
addbyte(0x66); /*PMULLW XMM0, R10(alookup)[EBX*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xd5);
|
||||
addbyte(0x04);
|
||||
addbyte(0xda);
|
||||
addbyte(0xf3); /*MOVQ XMM5, XMM0*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
addbyte(0xe8);
|
||||
addbyte(0x66); /*PADDW XMM0, R10(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;
|
||||
case AFUNC_AONE:
|
||||
break;
|
||||
@@ -2774,17 +2883,12 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
|
||||
addbyte(8);
|
||||
break;
|
||||
case AFUNC_AOMDST_ALPHA:
|
||||
addbyte(0x66); /*PXOR XMM0, XMM0*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0xef);
|
||||
addbyte(0xc0);
|
||||
break;
|
||||
case AFUNC_ASATURATE:
|
||||
addbyte(0x66); /*PMULLW XMM0, XMM11(minus_254)*/
|
||||
addbyte(0x66); /*PMULLW XMM0, R11(aminuslookup)[EBX*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xd5);
|
||||
addbyte(0xc3);
|
||||
addbyte(0x04);
|
||||
addbyte(0xdb);
|
||||
addbyte(0xf3); /*MOVQ XMM5, XMM0*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
@@ -2810,6 +2914,51 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
|
||||
addbyte(0xd0);
|
||||
addbyte(8);
|
||||
break;
|
||||
case AFUNC_ASATURATE:
|
||||
addbyte(0x89); /* MOV EAX, EBX */
|
||||
addbyte(0xd8);
|
||||
addbyte(0xd1); /* SHR EAX, 1 */
|
||||
addbyte(0xe8);
|
||||
addbyte(0x34); /* XOR AL, 0xFF */
|
||||
addbyte(0xFF);
|
||||
addbyte(0xd1); /* SHL EAX, 1 */
|
||||
addbyte(0xe0);
|
||||
addbyte(0x39); /* CMP EDX, EAX */
|
||||
addbyte(0xc2);
|
||||
addbyte(0x0f); /* CMOVB EAX, EDX */
|
||||
addbyte(0x42);
|
||||
addbyte(0xc2);
|
||||
addbyte(0x66); /*PMULLW XMM0, R10(alookup)[EAX*8]*/
|
||||
addbyte(0x41);
|
||||
addbyte(0x0f);
|
||||
addbyte(0xd5);
|
||||
addbyte(0x04);
|
||||
addbyte(0xc2);
|
||||
addbyte(0xf3); /*MOVQ XMM5, XMM0*/
|
||||
addbyte(0x0f);
|
||||
addbyte(0x7e);
|
||||
addbyte(0xe8);
|
||||
addbyte(0x66); /*PADDW XMM0, R10(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;
|
||||
}
|
||||
|
||||
addbyte(0x66); /*PADDW XMM0, XMM4*/
|
||||
@@ -2821,6 +2970,48 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
|
||||
addbyte(0x0f);
|
||||
addbyte(0x67);
|
||||
addbyte(0xc0);
|
||||
|
||||
addbyte(0x31); /*XOR EAX, EAX */
|
||||
addbyte(0xc0);
|
||||
|
||||
if (dest_aafunc == 4) {
|
||||
addbyte(0xc1); /*SHL EBX, 0x7*/
|
||||
addbyte(0xe3);
|
||||
addbyte(0x07);
|
||||
addbyte(0x01); /*ADD EAX, EBX*/
|
||||
addbyte(0xd8);
|
||||
}
|
||||
|
||||
if (src_aafunc == 4) {
|
||||
addbyte(0xc1); /*SHL EDX, 0x7*/
|
||||
addbyte(0xe2);
|
||||
addbyte(0x07);
|
||||
addbyte(0x01); /*ADD EAX, EDX*/
|
||||
addbyte(0xd0);
|
||||
}
|
||||
|
||||
addbyte(0xc1); /* SHR EAX, 8 */
|
||||
addbyte(0xc8);
|
||||
addbyte(0x08);
|
||||
addbyte(0x89); /* MOV EDX, EAX */
|
||||
addbyte(0xC2);
|
||||
}
|
||||
|
||||
if ((params->fbzMode & (FBZ_DEPTH_WMASK | FBZ_ALPHA_ENABLE)) == (FBZ_DEPTH_WMASK | FBZ_ALPHA_ENABLE)) {
|
||||
addbyte(0x8b); /*MOV EAX, state->x[EDI]*/
|
||||
addbyte(0x87);
|
||||
if (params->aux_tiled)
|
||||
addlong(offsetof(voodoo_state_t, x_tiled));
|
||||
else
|
||||
addlong(offsetof(voodoo_state_t, x));
|
||||
addbyte(0x48); /*MOV RSI, aux_mem*/
|
||||
addbyte(0x8b);
|
||||
addbyte(0xb7);
|
||||
addlong(offsetof(voodoo_state_t, aux_mem));
|
||||
addbyte(0x66); /*MOV [ESI+EAX*2], DX*/
|
||||
addbyte(0x89);
|
||||
addbyte(0x14);
|
||||
addbyte(0x46);
|
||||
}
|
||||
|
||||
addbyte(0x8b); /*MOV EDX, state->x[EDI]*/
|
||||
@@ -2969,7 +3160,8 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params,
|
||||
addbyte(0x56);
|
||||
}
|
||||
|
||||
if ((params->fbzMode & (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) == (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) {
|
||||
|
||||
if ((params->fbzMode & (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) == (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE) && !(params->fbzMode & FBZ_ALPHA_ENABLE)) {
|
||||
addbyte(0x8b); /*MOV EDX, state->x[EDI]*/
|
||||
addbyte(0x97);
|
||||
if (params->aux_tiled)
|
||||
@@ -3237,12 +3429,6 @@ 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];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user