Module: vkd3d Branch: master Commit: 6a56b4e5d81594648054e151adb60f22a51bb5fd URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/6a56b4e5d81594648054e151adb60f...
Author: Conor McCarthy cmccarthy@codeweavers.com Date: Thu Apr 18 10:35:07 2024 +1000
vkd3d-shader/dxil: Implement DX intrinsics WaveGetLaneCount and WaveGetLaneIndex.
---
libs/vkd3d-shader/d3d_asm.c | 8 ++++++++ libs/vkd3d-shader/dxil.c | 24 ++++++++++++++++++++++++ libs/vkd3d-shader/vkd3d_shader_private.h | 2 ++ 3 files changed, 34 insertions(+)
diff --git a/libs/vkd3d-shader/d3d_asm.c b/libs/vkd3d-shader/d3d_asm.c index cd8ba0a7..7a8bbfc1 100644 --- a/libs/vkd3d-shader/d3d_asm.c +++ b/libs/vkd3d-shader/d3d_asm.c @@ -1161,6 +1161,14 @@ static void shader_print_register(struct vkd3d_d3d_asm_compiler *compiler, const vkd3d_string_buffer_printf(buffer, "sr"); break;
+ case VKD3DSPR_WAVELANECOUNT: + vkd3d_string_buffer_printf(buffer, "vWaveLaneCount"); + break; + + case VKD3DSPR_WAVELANEINDEX: + vkd3d_string_buffer_printf(buffer, "vWaveLaneIndex"); + break; + default: vkd3d_string_buffer_printf(buffer, "%s<unhandled register type %#x>%s", compiler->colours.error, reg->type, compiler->colours.reset); diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index ccba66af..f68e3274 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -427,6 +427,8 @@ enum dx_intrinsic_opcode DX_STORE_PATCH_CONSTANT = 106, DX_OUTPUT_CONTROL_POINT_ID = 107, DX_PRIMITIVE_ID = 108, + DX_WAVE_GET_LANE_INDEX = 111, + DX_WAVE_GET_LANE_COUNT = 112, DX_LEGACY_F32TOF16 = 130, DX_LEGACY_F16TOF32 = 131, DX_RAW_BUFFER_LOAD = 139, @@ -5899,6 +5901,26 @@ static void sm6_parser_emit_dx_texture_store(struct sm6_parser *sm6, enum dx_int dst_param_init_with_mask(dst_param, write_mask); }
+static void sm6_parser_emit_dx_wave_builtin(struct sm6_parser *sm6, enum dx_intrinsic_opcode op, + const struct sm6_value **operands, struct function_emission_state *state) +{ + enum vkd3d_shader_register_type type; + + switch (op) + { + case DX_WAVE_GET_LANE_COUNT: + type = VKD3DSPR_WAVELANECOUNT; + break; + case DX_WAVE_GET_LANE_INDEX: + type = VKD3DSPR_WAVELANEINDEX; + break; + default: + vkd3d_unreachable(); + } + + sm6_parser_emit_dx_input_register_mov(sm6, state->ins, type, VKD3D_DATA_UINT); +} + struct sm6_dx_opcode_info { const char *ret_type; @@ -6018,6 +6040,8 @@ static const struct sm6_dx_opcode_info sm6_dx_op_table[] = [DX_UMAD ] = {"m", "RRR", sm6_parser_emit_dx_ma}, [DX_UMAX ] = {"m", "RR", sm6_parser_emit_dx_binary}, [DX_UMIN ] = {"m", "RR", sm6_parser_emit_dx_binary}, + [DX_WAVE_GET_LANE_COUNT ] = {"i", "", sm6_parser_emit_dx_wave_builtin}, + [DX_WAVE_GET_LANE_INDEX ] = {"i", "", sm6_parser_emit_dx_wave_builtin}, };
static bool sm6_parser_validate_operand_type(struct sm6_parser *sm6, const struct sm6_value *value, char info_type, diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 165126b5..d0285fdc 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -590,6 +590,8 @@ enum vkd3d_shader_register_type VKD3DSPR_OUTSTENCILREF, VKD3DSPR_UNDEF, VKD3DSPR_SSA, + VKD3DSPR_WAVELANECOUNT, + VKD3DSPR_WAVELANEINDEX,
VKD3DSPR_COUNT,