[v2 PATCH vkd3d 2/4] vkd3d-shader/hlsl: Cast round() input to float.

Matteo Bruni matteo.mystral at gmail.com
Thu Jan 20 06:12:53 CST 2022


On Thu, Jan 20, 2022 at 12:42 AM Zebediah Figura (she/her)
<zfigura at codeweavers.com> wrote:
>
> On 1/19/22 06:03, Matteo Bruni wrote:
> > On Mon, Dec 20, 2021 at 10:44 PM Zebediah Figura (she/her)
> > <zfigura at codeweavers.com> wrote:
> >>
> >> On 12/20/21 12:15, Zebediah Figura (she/her) wrote:
> >>> On 12/19/21 06:41, Nikolay Sivov wrote:
> >>>> +static struct hlsl_ir_node *intrinsic_float_convert_arg(struct
> >>>> hlsl_ctx *ctx,
> >>>> +        const struct parse_initializer *params, struct hlsl_ir_node
> >>>> *arg, const struct vkd3d_shader_location *loc)
> >>>> +{
> >>>> +    struct hlsl_type *type = arg->data_type;
> >>>> +
> >>>> +    if (type->base_type == HLSL_TYPE_FLOAT || type->base_type ==
> >>>> HLSL_TYPE_HALF)
> >>>> +        return arg;
> >>>
> >>> add_implicit_conversion() already does this.
> >>
> >> Sorry, turns out I'm wrong; this preserves the input type for half,
> >> whereas add_implicit_conversion() alone would not.
> >
> > I wonder if that's what it should do in the first place?
>
> Yes, witness the following shader:
>
> ---
>
> uint func(float x) { return 1; }
> uint func(half x) { return 2; }
>
> float4 main(void) : sv_target
> {
>      return float4(func(float(0)), func(half(0)), func(int(0)),
> func(uint(0)));
> }
>
> ---
>
> Native reduces this to (1, 2, 1, 1).

Fun... But at least it means we can fix add_implicit_conversion() and
avoid that kind of workarounds, if I understand correctly.



More information about the wine-devel mailing list