vkd3d-shader: Implement UMAD

Signed-off-by: Joshua Ashton <joshua@froggi.es>
This commit is contained in:
Joshua Ashton 2020-10-19 18:02:23 +01:00
parent a64a34eb9d
commit 650375bf6a
4 changed files with 8 additions and 1 deletions

View File

@ -1110,6 +1110,7 @@ static const struct vkd3d_sm4_opcode_info opcode_table[] =
{VKD3D_SM4_OP_ULT, VKD3DSIH_ULT, "u", "uu"},
{VKD3D_SM4_OP_UGE, VKD3DSIH_UGE, "u", "uu"},
{VKD3D_SM4_OP_UMUL, VKD3DSIH_UMUL, "uu", "uu"},
{VKD3D_SM4_OP_UMAD, VKD3DSIH_UMAD, "u", "uuu"},
{VKD3D_SM4_OP_UMAX, VKD3DSIH_UMAX, "u", "uu"},
{VKD3D_SM4_OP_UMIN, VKD3DSIH_UMIN, "u", "uu"},
{VKD3D_SM4_OP_USHR, VKD3DSIH_USHR, "u", "uu"},

View File

@ -6972,7 +6972,10 @@ static void vkd3d_dxbc_compiler_emit_imad(struct vkd3d_dxbc_compiler *compiler,
unsigned int i, component_count;
component_count = vkd3d_write_mask_component_count(dst->write_mask);
type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_INT, component_count);
if (instruction->handler_idx == VKD3DSIH_UMAD)
type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_UINT, component_count);
else
type_id = vkd3d_spirv_get_type_id(builder, VKD3D_TYPE_INT, component_count);
for (i = 0; i < ARRAY_SIZE(src_ids); ++i)
src_ids[i] = vkd3d_dxbc_compiler_emit_load_src(compiler, &src[i], dst->write_mask);
@ -9483,6 +9486,7 @@ int vkd3d_dxbc_compiler_handle_instruction(struct vkd3d_dxbc_compiler *compiler,
case VKD3DSIH_IMUL:
vkd3d_dxbc_compiler_emit_imul(compiler, instruction);
break;
case VKD3DSIH_UMAD:
case VKD3DSIH_IMAD:
vkd3d_dxbc_compiler_emit_imad(compiler, instruction);
break;

View File

@ -230,6 +230,7 @@ static const char * const shader_opcode_names[] =
/* VKD3DSIH_UMAX */ "umax",
/* VKD3DSIH_UMIN */ "umin",
/* VKD3DSIH_UMUL */ "umul",
/* VKD3DSIH_UMAD */ "umad",
/* VKD3DSIH_USHR */ "ushr",
/* VKD3DSIH_UTOF */ "utof",
/* VKD3DSIH_XOR */ "xor",

View File

@ -268,6 +268,7 @@ enum VKD3D_SHADER_INSTRUCTION_HANDLER
VKD3DSIH_UMAX,
VKD3DSIH_UMIN,
VKD3DSIH_UMUL,
VKD3DSIH_UMAD,
VKD3DSIH_USHR,
VKD3DSIH_UTOF,
VKD3DSIH_XOR,