[PATCH vkd3d v2 3/6] vkd3d-shader: Allocate temporary registers for anonymous expressions.

Matteo Bruni matteo.mystral at gmail.com
Thu Apr 8 14:29:54 CDT 2021


On Mon, Apr 5, 2021 at 6:32 AM Zebediah Figura <zfigura at codeweavers.com> wrote:
>
> Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
> ---
>  libs/vkd3d-shader/hlsl.h         |  1 +
>  libs/vkd3d-shader/hlsl_codegen.c | 12 ++++++++++++
>  2 files changed, 13 insertions(+)
>
> diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h
> index e642fee1..a1549304 100644
> --- a/libs/vkd3d-shader/hlsl.h
> +++ b/libs/vkd3d-shader/hlsl.h
> @@ -171,6 +171,7 @@ struct hlsl_ir_node
>       * true even for loops, since currently we can't have a reference to a
>       * value generated in an earlier iteration of the loop. */
>      unsigned int index, last_read;
> +    struct hlsl_reg reg;
>  };
>
>  struct hlsl_src
> diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
> index a7007886..81f4f39f 100644
> --- a/libs/vkd3d-shader/hlsl_codegen.c
> +++ b/libs/vkd3d-shader/hlsl_codegen.c
> @@ -745,6 +745,18 @@ static void allocate_temp_registers_recurse(struct list *instrs, struct liveness
>
>      LIST_FOR_EACH_ENTRY(instr, instrs, struct hlsl_ir_node, entry)
>      {
> +        if (!instr->reg.allocated && instr->last_read)
> +        {
> +            if (instr->data_type->reg_size > 1)
> +                instr->reg = allocate_range(liveness, instr->index,
> +                        instr->last_read, instr->data_type->reg_size);
> +            else
> +                instr->reg = allocate_register(liveness, instr->index,
> +                        instr->last_read, instr->data_type->dimx);
> +            TRACE("Allocated anonymous expression @%u to %s (liveness %u-%u).\n", instr->index,
> +                    debug_register('r', instr->reg, instr->data_type), instr->index, instr->last_read);
> +        }
> +
>          switch (instr->type)
>          {
>              case HLSL_IR_IF:

It's most likely never going to matter (and right now it doesn't make
any difference for sure) but to go "in order" you would allocate the
temporary registers for instructions after assigning them for the
variables used by the instruction.
...
I think you can safely ignore this one.



More information about the wine-devel mailing list