From: Giovanni Mascellani gmascellani@codeweavers.com
Differently from write masks, swizzles are considered to be applied to the raw 4x32 bit register, rather than to its typed interpretation. Even for scalar registers, we still want to generate swizzles that are valid for a 64 bit type (i.e., .xyxy, .xyzw, .zwxy or .zwzw) so that the backend can use them oblivious of whether the register is scalar or not. --- libs/vkd3d-shader/dxil.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d-shader/dxil.c b/libs/vkd3d-shader/dxil.c index 186460540..7c77695ed 100644 --- a/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d-shader/dxil.c @@ -2144,20 +2144,26 @@ static void dst_param_init_ssa_scalar(struct vkd3d_shader_dst_param *param, cons
static inline void src_param_init(struct vkd3d_shader_src_param *param) { - param->swizzle = VKD3D_SHADER_SWIZZLE(X, X, X, X); + if (data_type_is_64_bit(param->reg.data_type)) + param->swizzle = VKD3D_SHADER_SWIZZLE(X, Y, X, Y); + else + param->swizzle = VKD3D_SHADER_SWIZZLE(X, X, X, X); param->modifiers = VKD3DSPSM_NONE; }
static void src_param_init_scalar(struct vkd3d_shader_src_param *param, unsigned int component_idx) { - param->swizzle = vkd3d_shader_create_swizzle(component_idx, component_idx, component_idx, component_idx); + if (data_type_is_64_bit(param->reg.data_type)) + param->swizzle = vkd3d_shader_create_swizzle(2 * component_idx, 2 * component_idx + 1, 2 * component_idx, 2 * component_idx + 1); + else + param->swizzle = vkd3d_shader_create_swizzle(component_idx, component_idx, component_idx, component_idx); param->modifiers = VKD3DSPSM_NONE; }
static void src_param_init_from_value(struct vkd3d_shader_src_param *param, const struct sm6_value *src) { - src_param_init(param); param->reg = src->u.reg; + src_param_init(param); }
static void src_param_init_vector_from_reg(struct vkd3d_shader_src_param *param, @@ -4268,7 +4274,10 @@ static void sm6_parser_emit_extractval(struct sm6_parser *sm6, const struct dxil
src_param = instruction_src_params_alloc(ins, 1, sm6); src_param_init_from_value(src_param, src); - src_param->swizzle = vkd3d_shader_create_swizzle(elem_idx, elem_idx, elem_idx, elem_idx); + if (data_type_is_64_bit(src_param->reg.data_type)) + src_param->swizzle = vkd3d_shader_create_swizzle(2 * elem_idx, 2 * elem_idx + 1, 2 * elem_idx, 2 * elem_idx + 1); + else + src_param->swizzle = vkd3d_shader_create_swizzle(elem_idx, elem_idx, elem_idx, elem_idx);
instruction_dst_param_init_ssa_scalar(ins, sm6); }