[PATCH 7/7] d3dcompiler: Store the "array" field in struct hlsl_deref as a struct hlsl_deref pointer.

Matteo Bruni matteo.mystral at gmail.com
Wed Mar 11 12:57:38 CDT 2020


On Sat, Mar 7, 2020 at 12:25 AM Zebediah Figura <z.figura12 at gmail.com> wrote:
>
> Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
> ---
>  dlls/d3dcompiler_43/d3dcompiler_private.h |  2 +-
>  dlls/d3dcompiler_43/hlsl.y                | 25 ++++++++++++++++++++---
>  dlls/d3dcompiler_43/utils.c               |  6 +++++-
>  3 files changed, 28 insertions(+), 5 deletions(-)
>
> diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
> index d221d1056fa..f4f68b9e4cf 100644
> --- a/dlls/d3dcompiler_43/d3dcompiler_private.h
> +++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
> @@ -907,7 +907,7 @@ struct hlsl_deref
>          struct hlsl_ir_var *var;
>          struct
>          {
> -            struct hlsl_ir_node *array;
> +            struct hlsl_deref *array;
>              struct hlsl_ir_node *index;
>          } array;
>          struct
> diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y
> index 40159c60dcc..11dd8026c16 100644
> --- a/dlls/d3dcompiler_43/hlsl.y
> +++ b/dlls/d3dcompiler_43/hlsl.y
> @@ -2114,8 +2114,17 @@ postfix_expr:             primary_expr
>                                  /* This may be an array dereference or a vector/matrix
>                                   * subcomponent access.
>                                   * We store it as an array dereference in any case. */
> -                                struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref));
> -                                struct hlsl_type *expr_type = node_from_list($1)->data_type;
> +                                struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref)), *src;
> +                                struct hlsl_ir_node *node = node_from_list($1);
> +                                struct hlsl_type *expr_type = node->data_type;
> +
> +                                if (node->type != HLSL_IR_DEREF)
> +                                {
> +                                    FIXME("Unimplemented index of node type %s.\n",
> +                                            debug_node_type(node->type));
> +                                    YYABORT;
> +                                }
> +                                src = deref_from_node(node);

It looks like it's legal in HLSL to array dereference an arbitrary
vector expression. E.g.:

uniform int i;
uniform float4 b;
...
float4 a = {0.25, 0.5, 0.75, 1.0};
float r = (a * b)[i];

How do you plan to handle that? Mostly wondering if this patch would
have to be effectively reverted in the future or you have something
else in mind.



More information about the wine-devel mailing list