[PATCH vkd3d v4 3/5] vkd3d-shader/hlsl: Parse explicitly typed texture types.

Giovanni Mascellani gmascellani at codeweavers.com
Fri Oct 8 03:42:34 CDT 2021


Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>

Il 08/10/21 04:58, Zebediah Figura ha scritto:
> Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
> ---
> v3: Check the format type in compare_param_hlsl_types() as well.
> 
>   libs/vkd3d-shader/hlsl.c | 25 +++++++++++++++-----
>   libs/vkd3d-shader/hlsl.h |  3 ++-
>   libs/vkd3d-shader/hlsl.y | 49 +++++++++++++++++++++++++++++-----------
>   3 files changed, 57 insertions(+), 20 deletions(-)
> 
> diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c
> index 6462ce8fc..aecc4a639 100644
> --- a/libs/vkd3d-shader/hlsl.c
> +++ b/libs/vkd3d-shader/hlsl.c
> @@ -261,7 +261,7 @@ struct hlsl_type *hlsl_new_struct_type(struct hlsl_ctx *ctx, const char *name, s
>       return type;
>   }
>   
> -struct hlsl_type *hlsl_new_texture_type(struct hlsl_ctx *ctx, enum hlsl_sampler_dim dim)
> +struct hlsl_type *hlsl_new_texture_type(struct hlsl_ctx *ctx, enum hlsl_sampler_dim dim, struct hlsl_type *format)
>   {
>       struct hlsl_type *type;
>   
> @@ -272,6 +272,7 @@ struct hlsl_type *hlsl_new_texture_type(struct hlsl_ctx *ctx, enum hlsl_sampler_
>       type->dimx = 4;
>       type->dimy = 1;
>       type->sampler_dim = dim;
> +    type->e.resource_format = format;
>       list_add_tail(&ctx->types, &type->entry);
>       return type;
>   }
> @@ -344,9 +345,14 @@ bool hlsl_types_are_equal(const struct hlsl_type *t1, const struct hlsl_type *t2
>           return false;
>       if (t1->base_type != t2->base_type)
>           return false;
> -    if ((t1->base_type == HLSL_TYPE_SAMPLER || t1->base_type == HLSL_TYPE_TEXTURE)
> -            && t1->sampler_dim != t2->sampler_dim)
> -        return false;
> +    if (t1->base_type == HLSL_TYPE_SAMPLER || t1->base_type == HLSL_TYPE_TEXTURE)
> +    {
> +        if (t1->sampler_dim != t2->sampler_dim)
> +            return false;
> +        if (t1->base_type == HLSL_TYPE_TEXTURE && t1->sampler_dim != HLSL_SAMPLER_DIM_GENERIC
> +                && !hlsl_types_are_equal(t1->e.resource_format, t2->e.resource_format))
> +            return false;
> +    }
>       if ((t1->modifiers & HLSL_MODIFIER_ROW_MAJOR)
>               != (t2->modifiers & HLSL_MODIFIER_ROW_MAJOR))
>           return false;
> @@ -742,6 +748,8 @@ void hlsl_pop_scope(struct hlsl_ctx *ctx)
>   
>   static int compare_param_hlsl_types(const struct hlsl_type *t1, const struct hlsl_type *t2)
>   {
> +    int r;
> +
>       if (t1->type != t2->type)
>       {
>           if (!((t1->type == HLSL_CLASS_SCALAR && t2->type == HLSL_CLASS_VECTOR)
> @@ -752,7 +760,13 @@ static int compare_param_hlsl_types(const struct hlsl_type *t1, const struct hls
>           return t1->base_type - t2->base_type;
>       if ((t1->base_type == HLSL_TYPE_SAMPLER || t1->base_type == HLSL_TYPE_TEXTURE)
>               && t1->sampler_dim != t2->sampler_dim)
> -        return t1->sampler_dim - t2->sampler_dim;
> +    {
> +        if (t1->sampler_dim != t2->sampler_dim)
> +            return t1->sampler_dim - t2->sampler_dim;
> +        if (t1->base_type == HLSL_TYPE_TEXTURE && t1->sampler_dim != HLSL_SAMPLER_DIM_GENERIC
> +                && (r = compare_param_hlsl_types(t1->e.resource_format, t2->e.resource_format)))
> +            return r;
> +    }
>       if (t1->dimx != t2->dimx)
>           return t1->dimx - t2->dimx;
>       if (t1->dimy != t2->dimy)
> @@ -761,7 +775,6 @@ static int compare_param_hlsl_types(const struct hlsl_type *t1, const struct hls
>       {
>           struct list *t1cur, *t2cur;
>           struct hlsl_struct_field *t1field, *t2field;
> -        int r;
>   
>           t1cur = list_head(t1->e.elements);
>           t2cur = list_head(t2->e.elements);
> diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h
> index 65c6f34e0..64a90ffdc 100644
> --- a/libs/vkd3d-shader/hlsl.h
> +++ b/libs/vkd3d-shader/hlsl.h
> @@ -126,6 +126,7 @@ struct hlsl_type
>               struct hlsl_type *type;
>               unsigned int elements_count;
>           } array;
> +        struct hlsl_type *resource_format;
>       } e;
>   
>       unsigned int reg_size;
> @@ -655,7 +656,7 @@ struct hlsl_ir_swizzle *hlsl_new_swizzle(struct hlsl_ctx *ctx, DWORD s, unsigned
>           struct hlsl_ir_node *val, struct vkd3d_shader_location *loc);
>   struct hlsl_ir_var *hlsl_new_synthetic_var(struct hlsl_ctx *ctx, const char *name, struct hlsl_type *type,
>           const struct vkd3d_shader_location loc);
> -struct hlsl_type *hlsl_new_texture_type(struct hlsl_ctx *ctx, enum hlsl_sampler_dim dim);
> +struct hlsl_type *hlsl_new_texture_type(struct hlsl_ctx *ctx, enum hlsl_sampler_dim dim, struct hlsl_type *format);
>   struct hlsl_ir_constant *hlsl_new_uint_constant(struct hlsl_ctx *ctx, unsigned int n,
>           const struct vkd3d_shader_location loc);
>   struct hlsl_ir_node *hlsl_new_unary_expr(struct hlsl_ctx *ctx, enum hlsl_ir_expr_op op, struct hlsl_ir_node *arg,
> diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
> index b8149950d..32dd418d1 100644
> --- a/libs/vkd3d-shader/hlsl.y
> +++ b/libs/vkd3d-shader/hlsl.y
> @@ -1789,6 +1789,7 @@ static struct list *add_constructor(struct hlsl_ctx *ctx, struct hlsl_type *type
>       struct parse_colon_attribute colon_attribute;
>       struct hlsl_semantic semantic;
>       enum hlsl_buffer_type buffer_type;
> +    enum hlsl_sampler_dim sampler_dim;
>   }
>   
>   %token KW_BLENDSTATE
> @@ -1963,6 +1964,8 @@ static struct list *add_constructor(struct hlsl_ctx *ctx, struct hlsl_type *type
>   
>   %type <reg_reservation> register_opt
>   
> +%type <sampler_dim> texture_type
> +
>   %type <semantic> semantic
>   
>   %type <type> field_type
> @@ -2376,6 +2379,24 @@ input_mod:
>               $$ = HLSL_STORAGE_IN | HLSL_STORAGE_OUT;
>           }
>   
> +texture_type:
> +      KW_TEXTURE1D
> +        {
> +            $$ = HLSL_SAMPLER_DIM_1D;
> +        }
> +    | KW_TEXTURE2D
> +        {
> +            $$ = HLSL_SAMPLER_DIM_2D;
> +        }
> +    | KW_TEXTURE3D
> +        {
> +            $$ = HLSL_SAMPLER_DIM_3D;
> +        }
> +    | KW_TEXTURECUBE
> +        {
> +            $$ = HLSL_SAMPLER_DIM_CUBE;
> +        }
> +
>   type:
>         KW_VECTOR '<' type ',' C_INTEGER '>'
>           {
> @@ -2453,23 +2474,25 @@ type:
>           }
>       | KW_TEXTURE
>           {
> -            $$ = hlsl_new_texture_type(ctx, HLSL_SAMPLER_DIM_GENERIC);
> -        }
> -    | KW_TEXTURE1D
> -        {
> -            $$ = hlsl_new_texture_type(ctx, HLSL_SAMPLER_DIM_1D);
> +            $$ = hlsl_new_texture_type(ctx, HLSL_SAMPLER_DIM_GENERIC, NULL);
>           }
> -    | KW_TEXTURE2D
> +    | texture_type
>           {
> -            $$ = hlsl_new_texture_type(ctx, HLSL_SAMPLER_DIM_2D);
> +            $$ = hlsl_new_texture_type(ctx, $1, ctx->builtin_types.vector[HLSL_TYPE_FLOAT][4 - 1]);
>           }
> -    | KW_TEXTURE3D
> +    | texture_type '<' type '>'
>           {
> -            $$ = hlsl_new_texture_type(ctx, HLSL_SAMPLER_DIM_3D);
> -        }
> -    | KW_TEXTURECUBE
> -        {
> -            $$ = hlsl_new_texture_type(ctx, HLSL_SAMPLER_DIM_CUBE);
> +            if ($3->type > HLSL_CLASS_VECTOR)
> +            {
> +                struct vkd3d_string_buffer *string;
> +
> +                string = hlsl_type_to_string(ctx, $3);
> +                if (string)
> +                    hlsl_error(ctx, @3, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
> +                            "Texture data type %s is not scalar or vector.\n", string->buffer);
> +                hlsl_release_string_buffer(ctx, string);
> +            }
> +            $$ = hlsl_new_texture_type(ctx, $1, $3);
>           }
>       | TYPE_IDENTIFIER
>           {
> 



More information about the wine-devel mailing list