Module: vkd3d Branch: master Commit: 625e28957479971fc41fef16a65b3736e4492b07 URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/625e28957479971fc41fef16a65b37...
Author: Conor McCarthy cmccarthy@codeweavers.com Date: Mon Jan 22 15:28:44 2024 +1000
vkd3d-shader/dxil: Handle hyperbolic trigonometric functions in sm6_parser_emit_dx_unary().
---
libs/vkd3d-shader/d3d_asm.c | 3 +++ libs/vkd3d-shader/dxil.c | 12 ++++++++++++ libs/vkd3d-shader/spirv.c | 6 ++++++ libs/vkd3d-shader/vkd3d_shader_private.h | 3 +++ tests/hlsl/trigonometry.shader_test | 12 ++++++------ 5 files changed, 30 insertions(+), 6 deletions(-)
diff --git a/libs/vkd3d-shader/d3d_asm.c b/libs/vkd3d-shader/d3d_asm.c index 3ae736a8..3f86bd45 100644 --- a/libs/vkd3d-shader/d3d_asm.c +++ b/libs/vkd3d-shader/d3d_asm.c @@ -171,10 +171,13 @@ static const char * const shader_opcode_names[] = [VKD3DSIH_GATHER4_S ] = "gather4_s", [VKD3DSIH_GEO ] = "ge", [VKD3DSIH_GEU ] = "ge_unord", + [VKD3DSIH_HCOS ] = "hcos", [VKD3DSIH_HS_CONTROL_POINT_PHASE ] = "hs_control_point_phase", [VKD3DSIH_HS_DECLS ] = "hs_decls", [VKD3DSIH_HS_FORK_PHASE ] = "hs_fork_phase", [VKD3DSIH_HS_JOIN_PHASE ] = "hs_join_phase", + [VKD3DSIH_HSIN ] = "hsin", + [VKD3DSIH_HTAN ] = "htan", [VKD3DSIH_IADD ] = "iadd", [VKD3DSIH_IBFE ] = "ibfe", [VKD3DSIH_IDIV ] = "idiv", diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index 89d972ca..a001f6f0 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -342,6 +342,9 @@ enum dx_intrinsic_opcode DX_ACOS = 15, DX_ASIN = 16, DX_ATAN = 17, + DX_HCOS = 18, + DX_HSIN = 19, + DX_HTAN = 20, DX_EXP = 21, DX_FRC = 22, DX_LOG = 23, @@ -3690,6 +3693,12 @@ static enum vkd3d_shader_opcode map_dx_unary_op(enum dx_intrinsic_opcode op) return VKD3DSIH_ASIN; case DX_ATAN: return VKD3DSIH_ATAN; + case DX_HCOS: + return VKD3DSIH_HCOS; + case DX_HSIN: + return VKD3DSIH_HSIN; + case DX_HTAN: + return VKD3DSIH_HTAN; case DX_EXP: return VKD3DSIH_EXP; case DX_FRC: @@ -4263,6 +4272,9 @@ static const struct sm6_dx_opcode_info sm6_dx_op_table[] = [DX_FMIN ] = {"g", "RR", sm6_parser_emit_dx_binary}, [DX_FRC ] = {"g", "R", sm6_parser_emit_dx_unary}, [DX_IBFE ] = {"m", "iiR", sm6_parser_emit_dx_tertiary}, + [DX_HCOS ] = {"g", "R", sm6_parser_emit_dx_unary}, + [DX_HSIN ] = {"g", "R", sm6_parser_emit_dx_unary}, + [DX_HTAN ] = {"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}, diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c index 5f7a33da..a3baeea7 100644 --- a/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d-shader/spirv.c @@ -7008,6 +7008,9 @@ static enum GLSLstd450 spirv_compiler_map_ext_glsl_instruction( {VKD3DSIH_FIRSTBIT_LO, GLSLstd450FindILsb}, {VKD3DSIH_FIRSTBIT_SHI, GLSLstd450FindSMsb}, {VKD3DSIH_FRC, GLSLstd450Fract}, + {VKD3DSIH_HCOS, GLSLstd450Cosh}, + {VKD3DSIH_HSIN, GLSLstd450Sinh}, + {VKD3DSIH_HTAN, GLSLstd450Tanh}, {VKD3DSIH_IMAX, GLSLstd450SMax}, {VKD3DSIH_IMIN, GLSLstd450SMin}, {VKD3DSIH_LOG, GLSLstd450Log2}, @@ -9587,6 +9590,9 @@ static int spirv_compiler_handle_instruction(struct spirv_compiler *compiler, case VKD3DSIH_ACOS: case VKD3DSIH_ASIN: case VKD3DSIH_ATAN: + case VKD3DSIH_HCOS: + case VKD3DSIH_HSIN: + case VKD3DSIH_HTAN: case VKD3DSIH_DFMA: case VKD3DSIH_DMAX: case VKD3DSIH_DMIN: diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 3d043c24..1030adf9 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -366,10 +366,13 @@ enum vkd3d_shader_opcode VKD3DSIH_GATHER4_S, VKD3DSIH_GEO, VKD3DSIH_GEU, + VKD3DSIH_HCOS, VKD3DSIH_HS_CONTROL_POINT_PHASE, VKD3DSIH_HS_DECLS, VKD3DSIH_HS_FORK_PHASE, VKD3DSIH_HS_JOIN_PHASE, + VKD3DSIH_HSIN, + VKD3DSIH_HTAN, VKD3DSIH_IADD, VKD3DSIH_IBFE, VKD3DSIH_IDIV, diff --git a/tests/hlsl/trigonometry.shader_test b/tests/hlsl/trigonometry.shader_test index c9102e0a..034f861b 100644 --- a/tests/hlsl/trigonometry.shader_test +++ b/tests/hlsl/trigonometry.shader_test @@ -86,10 +86,10 @@ float4 main() : sv_target
[test] uniform 0 float4 -6.28318531 -0.88137359 0.88137359 6.28318531 -todo draw quad +todo(sm<6) draw quad probe all rgba (-267.744894, -1.0, 1.0, 267.744894) 2 uniform 0 float4 -0.0 0.0 -90.0 90.0 -todo draw quad +todo(sm<6) draw quad % mingw does not support "inf" for scanf(), but numbers beyond FLOAT_MAX consistently result in inf. probe all rgba (0.0, 0.0, -1.0e39, 1.0e39) 1
@@ -104,10 +104,10 @@ float4 main() : sv_target
[test] uniform 0 float4 -1.76274717 -1.3169579 1.3169579 1.76274717 -todo draw quad +todo(sm<6) draw quad probe all rgba (3.0, 2.0, 2.0, 3.0) 2 uniform 0 float4 -0.0 0.0 -90.0 90.0 -todo draw quad +todo(sm<6) draw quad probe all rgba (1.0, 1.0, 1.0e39, 1.0e39) 1
@@ -121,8 +121,8 @@ float4 main() : sv_target
[test] uniform 0 float4 -1.57079633 -0.54930614 0.54930614 1.57079633 -todo draw quad +todo(sm<6) draw quad probe all rgba (-0.91715234, -0.5, 0.5, 0.91715234) 2 uniform 0 float4 -10.0 -0.0 0.0 10.0 -todo draw quad +todo(sm<6) draw quad probe all rgba (-1.0, 0.0, 0.0, 1.0) 1