[PATCH vkd3d v3 3/6] vkd3d-shader/hlsl: Write SM4 unsigned multiplication instructions.

Zebediah Figura (she/her) zfigura at codeweavers.com
Thu Jan 27 16:36:50 CST 2022


On 1/27/22 08:09, Giovanni Mascellani wrote:
> @@ -1266,6 +1266,31 @@ static void write_sm4_binary_op(struct vkd3d_bytecode_buffer *buffer, enum vkd3d
>       write_sm4_instruction(buffer, &instr);
>   }
>   
> +static void write_sm4_binary_op_with_two_destinations(struct vkd3d_bytecode_buffer *buffer,
> +        enum vkd3d_sm4_opcode opcode, const struct hlsl_ir_node *dst, unsigned dst_idx,
> +        const struct hlsl_ir_node *src1, const struct hlsl_ir_node *src2)
> +{
> +    struct sm4_instruction instr;
> +    unsigned int writemask;
> +
> +    memset(&instr, 0, sizeof(instr));
> +    instr.opcode = opcode;
> +
> +    instr.dsts[1 - dst_idx].reg.type = VKD3D_SM4_RT_NULL;
> +    instr.dsts[1 - dst_idx].reg.dim = VKD3D_SM4_DIMENSION_NONE;
> +    instr.dsts[1 - dst_idx].reg.idx_count = 0;
> +    sm4_register_from_node(&instr.dsts[dst_idx].reg, &instr.dsts[dst_idx].writemask, NULL, dst);
> +    instr.dst_count = 2;
> +
> +    sm4_register_from_node(&instr.srcs[0].reg, &writemask, &instr.srcs[0].swizzle_type, src1);
> +    instr.srcs[0].swizzle = hlsl_map_swizzle(hlsl_swizzle_from_writemask(writemask), instr.dsts[dst_idx].writemask);
> +    sm4_register_from_node(&instr.srcs[1].reg, &writemask, &instr.srcs[1].swizzle_type, src2);
> +    instr.srcs[1].swizzle = hlsl_map_swizzle(hlsl_swizzle_from_writemask(writemask), instr.dsts[dst_idx].writemask);
> +    instr.src_count = 2;
> +
> +    write_sm4_instruction(buffer, &instr);
> +}
> +

This crashes now, because sm4_register_from_node() doesn't treat the 
swizzle_type parameter as optional.

I would recommend using the new sm4_src_from_node() and 
sm4_dst_from_node() helpers.



More information about the wine-devel mailing list