[PATCH vkd3d 5/8] vkd3d-shader/hlsl: Support initialization of implicit size arrays.

Zebediah Figura (she/her) zfigura at codeweavers.com
Tue May 3 12:57:50 CDT 2022


On 5/3/22 04:57, Giovanni Mascellani wrote:
> diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c
> index 95ce9445..ed94e903 100644
> --- a/libs/vkd3d-shader/hlsl.c
> +++ b/libs/vkd3d-shader/hlsl.c
> @@ -165,6 +165,8 @@ static void hlsl_type_calculate_reg_size(struct hlsl_ctx *ctx, struct hlsl_type
>           {
>               unsigned int element_size = type->e.array.type->reg_size;
>   
> +            if (type->e.array.elements_count == HLSL_ARRAY_ELEMENTS_COUNT_IMPLICIT)
> +                type->reg_size = 0;

This ends up breaking copy-prop, though, which is the main reason we 
needed to set reg_size for objects in the first place. Consider the 
following program, which is (surprisingly) legal in 5.1:

     Texture2D t1[];

     float4 main() : sv_target
     {
         Texture2D t2[] = t1;

         return t2[4].Load(0);
     }

On the other hand, this is legal in 5.0, but illegal in 5.1:

     Texture2D t1[5];
     Texture2D t3;

     float4 main() : sv_target
     {
         Texture2D t2[] = t1;

         t2[4] = t3;

         return t2[4].Load(0);
     }

Which suggests that, for the purposes of copy-prop, reg_size should be 1 
for texture arrays (regardless of element count) in 5.1.

(Perhaps there's an argument we shouldn't be abusing reg_size like that. 
I have never liked the logic, but I've also never found a better way to 
write it.)

It'd be fine to punt for now though, by skipping creation of resource 
array types (and variables).

>               if (is_sm4)
>                   type->reg_size = (type->e.array.elements_count - 1) * align(element_size, 4) + element_size;
>               else

...

> diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
> index 44e4964f..eb96a4c2 100644
> --- a/libs/vkd3d-shader/hlsl.y
> +++ b/libs/vkd3d-shader/hlsl.y
> @@ -789,7 +789,26 @@ static struct list *gen_struct_fields(struct hlsl_ctx *ctx,
>   
>           field->type = type;
>           for (i = 0; i < v->arrays.count; ++i)
> +        {
> +            if (v->arrays.sizes[i] == HLSL_ARRAY_ELEMENTS_COUNT_IMPLICIT)
> +            {
> +                if (i < v->arrays.count - 1)
> +                {
> +                    hlsl_error(ctx, &v->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
> +                            "Inner array cannot be implicit.");

Nitpick, I'd say "array /size/ cannot be implicit". Same below.



More information about the wine-devel mailing list