[PATCH vkd3d 2/3] vkd3d-shader/hlsl: Take writemask into account when emitting a SM4 constant.

Matteo Bruni matteo.mystral at gmail.com
Wed Nov 17 03:52:31 CST 2021


On Tue, Nov 16, 2021 at 10:23 AM Giovanni Mascellani
<gmascellani at codeweavers.com> wrote:
>
> Hi,
>
> On 15/11/21 18:48, Zebediah Figura (she/her) wrote:
> > This is probably quibbling, but how about this?
> >
> > j = 0;
> > for (i = 0; i < 4; ++i)
> > {
> >      if (instr.dsts[0].writemask & (1u << i))
> >          instr.srcs[0].reg.immconst_uint[i] = constant->value[j++].u;
> > }
> >
> > Feels a bit simpler to me.
>
> I agree it's simpler, but as written it's also wrong. :-)
>
> The problem is that when dimx == 1, we set the register to have
> dimension VKD3D_SM4_DIMENSION_SCALAR, which means that the constant must
> be written in the first register, no matter the writemask.

That's probably right but it raises all kinds of red flags for me. Why
is dimx == 1 such a special case (aside from the SCALAR / VEC4
dimension)? We're basically saying that we ignore the writemask for
scalar constants. Why?

The code being convoluted, or mostly duplicated, is a consequence of
the above. It feels like we should fix that instead.



More information about the wine-devel mailing list