Module: vkd3d Branch: master Commit: 41cce4cbf1c94365975ce742ddf3b61f7c22d11f URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/41cce4cbf1c94365975ce742ddf3b6...
Author: Conor McCarthy cmccarthy@codeweavers.com Date: Mon Jan 22 15:18:27 2024 +1000
vkd3d-shader/dxil: Handle floating point special value comparisons in sm6_parser_emit_dx_unary().
---
libs/vkd3d-shader/d3d_asm.c | 3 +++ libs/vkd3d-shader/dxil.c | 15 +++++++++++++++ libs/vkd3d-shader/vkd3d_shader_private.h | 3 +++ 3 files changed, 21 insertions(+)
diff --git a/libs/vkd3d-shader/d3d_asm.c b/libs/vkd3d-shader/d3d_asm.c index d9751945..6ec7a9c9 100644 --- a/libs/vkd3d-shader/d3d_asm.c +++ b/libs/vkd3d-shader/d3d_asm.c @@ -198,8 +198,11 @@ static const char * const shader_opcode_names[] = [VKD3DSIH_IMUL ] = "imul", [VKD3DSIH_INE ] = "ine", [VKD3DSIH_INEG ] = "ineg", + [VKD3DSIH_ISFINITE ] = "isfinite", [VKD3DSIH_ISHL ] = "ishl", [VKD3DSIH_ISHR ] = "ishr", + [VKD3DSIH_ISINF ] = "isinf", + [VKD3DSIH_ISNAN ] = "isnan", [VKD3DSIH_ITOD ] = "itod", [VKD3DSIH_ITOF ] = "itof", [VKD3DSIH_ITOI ] = "itoi", diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index 2a0ff61c..c089d132 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -328,6 +328,9 @@ enum dx_intrinsic_opcode { DX_LOAD_INPUT = 4, DX_STORE_OUTPUT = 5, + DX_ISNAN = 8, + DX_ISINF = 9, + DX_ISFINITE = 10, DX_EXP = 21, DX_FRC = 22, DX_LOG = 23, @@ -3494,6 +3497,12 @@ static enum vkd3d_shader_opcode map_dx_unary_op(enum dx_intrinsic_opcode op) { switch (op) { + case DX_ISNAN: + return VKD3DSIH_ISNAN; + case DX_ISINF: + return VKD3DSIH_ISINF; + case DX_ISFINITE: + return VKD3DSIH_ISFINITE; case DX_EXP: return VKD3DSIH_EXP; case DX_FRC: @@ -3806,6 +3815,7 @@ struct sm6_dx_opcode_info };
/* + 1 -> int1 8 -> int8 b -> constant int1 c -> constant int8/16/32 @@ -3839,6 +3849,9 @@ static const struct sm6_dx_opcode_info sm6_dx_op_table[] = [DX_FRC ] = {"g", "R", sm6_parser_emit_dx_unary}, [DX_IMAX ] = {"m", "RR", sm6_parser_emit_dx_binary}, [DX_IMIN ] = {"m", "RR", sm6_parser_emit_dx_binary}, + [DX_ISFINITE ] = {"1", "g", sm6_parser_emit_dx_unary}, + [DX_ISINF ] = {"1", "g", sm6_parser_emit_dx_unary}, + [DX_ISNAN ] = {"1", "g", sm6_parser_emit_dx_unary}, [DX_LEGACY_F16TOF32 ] = {"f", "i", sm6_parser_emit_dx_unary}, [DX_LEGACY_F32TOF16 ] = {"i", "f", sm6_parser_emit_dx_unary}, [DX_LOAD_INPUT ] = {"o", "ii8i", sm6_parser_emit_dx_load_input}, @@ -3867,6 +3880,8 @@ static bool sm6_parser_validate_operand_type(struct sm6_parser *sm6, const struc case 0: FIXME("Invalid operand count.\n"); return false; + case '1': + return sm6_type_is_bool(type); case '8': return sm6_type_is_i8(type); case 'b': diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 03d95472..51daf215 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -392,8 +392,11 @@ enum vkd3d_shader_opcode VKD3DSIH_IMUL, VKD3DSIH_INE, VKD3DSIH_INEG, + VKD3DSIH_ISFINITE, VKD3DSIH_ISHL, VKD3DSIH_ISHR, + VKD3DSIH_ISINF, + VKD3DSIH_ISNAN, VKD3DSIH_ITOD, VKD3DSIH_ITOF, VKD3DSIH_ITOI,