[PATCH vkd3d v3 12/17] vkd3d-shader/hlsl: Introduce hlsl_new_store_index().

Giovanni Mascellani wine at mascellani.eu
Fri Jul 22 07:35:52 CDT 2022


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

Il 20/07/22 15:23, Francisco Casas ha scritto:
> Signed-off-by: Francisco Casas <fcasas at codeweavers.com>
> ---
> 
> v3:
> * Using hlsl_new_store_component() in initialize_var_components() was
>    moved to the previous patch.
> 
> Signed-off-by: Francisco Casas <fcasas at codeweavers.com>
> ---
>   libs/vkd3d-shader/hlsl.c | 115 +++++++++++----------------------------
>   libs/vkd3d-shader/hlsl.h |   4 +-
>   libs/vkd3d-shader/hlsl.y |  27 ++-------
>   3 files changed, 40 insertions(+), 106 deletions(-)
> 
> diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c
> index 8e95ee83..2d5fe40a 100644
> --- a/libs/vkd3d-shader/hlsl.c
> +++ b/libs/vkd3d-shader/hlsl.c
> @@ -249,87 +249,6 @@ static struct hlsl_type *hlsl_new_type(struct hlsl_ctx *ctx, const char *name, e
>       return type;
>   }
>   
> -/* Returns the register offset of a given component within a type, given its index.
> - * *comp_type will be set to the type of the component. */
> -unsigned int hlsl_compute_component_offset(struct hlsl_ctx *ctx, struct hlsl_type *type,
> -        unsigned int idx, struct hlsl_type **comp_type)
> -{
> -    switch (type->type)
> -    {
> -        case HLSL_CLASS_SCALAR:
> -        case HLSL_CLASS_VECTOR:
> -        {
> -            assert(idx < type->dimx * type->dimy);
> -            *comp_type = hlsl_get_scalar_type(ctx, type->base_type);
> -            return idx;
> -        }
> -        case HLSL_CLASS_MATRIX:
> -        {
> -            unsigned int minor, major, x = idx % type->dimx, y = idx / type->dimx;
> -
> -            assert(idx < type->dimx * type->dimy);
> -
> -            if (hlsl_type_is_row_major(type))
> -            {
> -                minor = x;
> -                major = y;
> -            }
> -            else
> -            {
> -                minor = y;
> -                major = x;
> -            }
> -
> -            *comp_type = hlsl_get_scalar_type(ctx, type->base_type);
> -            return 4 * major + minor;
> -        }
> -
> -        case HLSL_CLASS_ARRAY:
> -        {
> -            unsigned int elem_comp_count = hlsl_type_component_count(type->e.array.type);
> -            unsigned int array_idx = idx / elem_comp_count;
> -            unsigned int idx_in_elem = idx % elem_comp_count;
> -
> -            assert(array_idx < type->e.array.elements_count);
> -
> -            return array_idx * hlsl_type_get_array_element_reg_size(type->e.array.type) +
> -                    hlsl_compute_component_offset(ctx, type->e.array.type, idx_in_elem, comp_type);
> -        }
> -
> -        case HLSL_CLASS_STRUCT:
> -        {
> -            struct hlsl_struct_field *field;
> -            unsigned int elem_comp_count, i;
> -
> -            for (i = 0; i < type->e.record.field_count; ++i)
> -            {
> -                field = &type->e.record.fields[i];
> -                elem_comp_count = hlsl_type_component_count(field->type);
> -
> -                if (idx < elem_comp_count)
> -                {
> -                    return field->reg_offset +
> -                            hlsl_compute_component_offset(ctx, field->type, idx, comp_type);
> -                }
> -                idx -= elem_comp_count;
> -            }
> -
> -            assert(0);
> -            return 0;
> -        }
> -
> -        case HLSL_CLASS_OBJECT:
> -        {
> -            assert(idx == 0);
> -            *comp_type = type;
> -            return 0;
> -        }
> -    }
> -
> -    assert(0);
> -    return 0;
> -}
> -
>   static bool type_is_single_component(const struct hlsl_type *type)
>   {
>       return type->type == HLSL_CLASS_SCALAR || type->type == HLSL_CLASS_OBJECT;
> @@ -985,7 +904,39 @@ void hlsl_init_simple_deref_from_var(struct hlsl_deref *deref, struct hlsl_ir_va
>   
>   struct hlsl_ir_store *hlsl_new_simple_store(struct hlsl_ctx *ctx, struct hlsl_ir_var *lhs, struct hlsl_ir_node *rhs)
>   {
> -    return hlsl_new_store(ctx, lhs, NULL, rhs, 0, rhs->loc);
> +    struct hlsl_deref lhs_deref;
> +
> +    hlsl_init_simple_deref_from_var(&lhs_deref, lhs);
> +    return hlsl_new_store_index(ctx, &lhs_deref, NULL, rhs, 0, &rhs->loc);
> +}
> +
> +struct hlsl_ir_store *hlsl_new_store_index(struct hlsl_ctx *ctx, const struct hlsl_deref *lhs,
> +        struct hlsl_ir_node *idx, struct hlsl_ir_node *rhs, unsigned int writemask, const struct vkd3d_shader_location *loc)
> +{
> +    struct hlsl_ir_store *store;
> +    unsigned int i;
> +
> +    assert(lhs);
> +    assert(!lhs->offset.node);
> +
> +    if (!(store = hlsl_alloc(ctx, sizeof(*store))))
> +        return NULL;
> +    init_node(&store->node, HLSL_IR_STORE, NULL, *loc);
> +
> +    if (!init_deref(ctx, &store->lhs, lhs->var, lhs->path_len + !!idx))
> +        return NULL;
> +    for (i = 0; i < lhs->path_len; ++i)
> +        hlsl_src_from_node(&store->lhs.path[i], lhs->path[i].node);
> +    if (idx)
> +        hlsl_src_from_node(&store->lhs.path[lhs->path_len], idx);
> +
> +    hlsl_src_from_node(&store->rhs, rhs);
> +
> +    if (!writemask && type_is_single_reg(rhs->data_type))
> +        writemask = (1 << rhs->data_type->dimx) - 1;
> +    store->writemask = writemask;
> +
> +    return store;
>   }
>   
>   struct hlsl_ir_store *hlsl_new_store_component(struct hlsl_ctx *ctx, struct hlsl_block *block,
> diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h
> index c8820711..72e7fab2 100644
> --- a/libs/vkd3d-shader/hlsl.h
> +++ b/libs/vkd3d-shader/hlsl.h
> @@ -768,6 +768,8 @@ struct hlsl_ir_load *hlsl_new_load_component(struct hlsl_ctx *ctx, struct hlsl_b
>           const struct hlsl_deref *deref, unsigned int comp, const struct vkd3d_shader_location *loc);
>   
>   struct hlsl_ir_store *hlsl_new_simple_store(struct hlsl_ctx *ctx, struct hlsl_ir_var *lhs, struct hlsl_ir_node *rhs);
> +struct hlsl_ir_store *hlsl_new_store_index(struct hlsl_ctx *ctx, const struct hlsl_deref *lhs,
> +        struct hlsl_ir_node *idx, struct hlsl_ir_node *rhs, unsigned int writemask, const struct vkd3d_shader_location *loc);
>   struct hlsl_ir_store *hlsl_new_store_component(struct hlsl_ctx *ctx, struct hlsl_block *block,
>           const struct hlsl_deref *lhs, unsigned int comp, struct hlsl_ir_node *rhs);
>   
> @@ -817,8 +819,6 @@ struct hlsl_type *hlsl_type_clone(struct hlsl_ctx *ctx, struct hlsl_type *old,
>           unsigned int default_majority, unsigned int modifiers);
>   unsigned int hlsl_type_component_count(const struct hlsl_type *type);
>   unsigned int hlsl_type_get_array_element_reg_size(const struct hlsl_type *type);
> -unsigned int hlsl_compute_component_offset(struct hlsl_ctx *ctx, struct hlsl_type *type,
> -        unsigned int idx, struct hlsl_type **comp_type);
>   struct hlsl_type *hlsl_type_get_component_type(struct hlsl_ctx *ctx, struct hlsl_type *type,
>           unsigned int index);
>   bool hlsl_type_is_row_major(const struct hlsl_type *type);
> diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
> index b51735af..e7ab6abe 100644
> --- a/libs/vkd3d-shader/hlsl.y
> +++ b/libs/vkd3d-shader/hlsl.y
> @@ -1202,6 +1202,7 @@ static struct hlsl_ir_node *add_expr(struct hlsl_ctx *ctx, struct list *instrs,
>           struct vkd3d_string_buffer *name;
>           static unsigned int counter = 0;
>           struct hlsl_type *vector_type;
> +        struct hlsl_deref var_deref;
>           struct hlsl_ir_load *load;
>           struct hlsl_ir_var *var;
>   
> @@ -1213,6 +1214,7 @@ static struct hlsl_ir_node *add_expr(struct hlsl_ctx *ctx, struct list *instrs,
>           vkd3d_string_buffer_release(&ctx->string_buffers, name);
>           if (!var)
>               return NULL;
> +        hlsl_init_simple_deref_from_var(&var_deref, var);
>   
>           for (i = 0; i < hlsl_type_major_size(type); i++)
>           {
> @@ -1240,11 +1242,7 @@ static struct hlsl_ir_node *add_expr(struct hlsl_ctx *ctx, struct list *instrs,
>               if (!(value = add_expr(ctx, instrs, op, vector_operands, vector_type, loc)))
>                   return NULL;
>   
> -            if (!(c = hlsl_new_uint_constant(ctx, 4 * i, loc)))
> -                return NULL;
> -            list_add_tail(instrs, &c->node.entry);
> -
> -            if (!(store = hlsl_new_store(ctx, var, &c->node, value, 0, *loc)))
> +            if (!(store = hlsl_new_store_index(ctx, &var_deref, &c->node, value, 0, loc)))
>                   return NULL;
>               list_add_tail(instrs, &store->node.entry);
>           }
> @@ -1606,10 +1604,8 @@ static struct hlsl_ir_node *add_assignment(struct hlsl_ctx *ctx, struct list *in
>   {
>       struct hlsl_type *lhs_type = lhs->data_type;
>       struct hlsl_ir_store *store;
> -    struct hlsl_ir_node *offset;
>       struct hlsl_ir_expr *copy;
>       unsigned int writemask = 0;
> -    struct hlsl_block block;
>   
>       if (assign_op == ASSIGN_OP_SUB)
>       {
> @@ -1634,15 +1630,11 @@ static struct hlsl_ir_node *add_assignment(struct hlsl_ctx *ctx, struct list *in
>               return NULL;
>       }
>   
> -    if (!(store = hlsl_alloc(ctx, sizeof(*store))))
> -        return NULL;
> -
>       while (lhs->type != HLSL_IR_LOAD)
>       {
>           if (lhs->type == HLSL_IR_EXPR && hlsl_ir_expr(lhs)->op == HLSL_OP1_CAST)
>           {
>               hlsl_fixme(ctx, &lhs->loc, "Cast on the LHS.");
> -            vkd3d_free(store);
>               return NULL;
>           }
>           else if (lhs->type == HLSL_IR_SWIZZLE)
> @@ -1656,13 +1648,11 @@ static struct hlsl_ir_node *add_assignment(struct hlsl_ctx *ctx, struct list *in
>               if (!invert_swizzle(&s, &writemask, &width))
>               {
>                   hlsl_error(ctx, &lhs->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_WRITEMASK, "Invalid writemask.");
> -                vkd3d_free(store);
>                   return NULL;
>               }
>   
>               if (!(new_swizzle = hlsl_new_swizzle(ctx, s, width, rhs, &swizzle->node.loc)))
>               {
> -                vkd3d_free(store);
>                   return NULL;
>               }
>               list_add_tail(instrs, &new_swizzle->node.entry);
> @@ -1673,19 +1663,12 @@ static struct hlsl_ir_node *add_assignment(struct hlsl_ctx *ctx, struct list *in
>           else
>           {
>               hlsl_error(ctx, &lhs->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_LVALUE, "Invalid lvalue.");
> -            vkd3d_free(store);
>               return NULL;
>           }
>       }
>   
> -    offset = hlsl_new_offset_node_from_deref(ctx, &block, &hlsl_ir_load(lhs)->src, &lhs->loc);
> -    list_move_tail(instrs, &block.instrs);
> -
> -    init_node(&store->node, HLSL_IR_STORE, NULL, lhs->loc);
> -    store->writemask = writemask;
> -    store->lhs.var = hlsl_ir_load(lhs)->src.var;
> -    hlsl_src_from_node(&store->lhs.offset, offset);
> -    hlsl_src_from_node(&store->rhs, rhs);
> +    if (!(store = hlsl_new_store_index(ctx, &hlsl_ir_load(lhs)->src, NULL, rhs, writemask, &rhs->loc)))
> +        return NULL;
>       list_add_tail(instrs, &store->node.entry);
>   
>       /* Don't use the instruction itself as a source, as this makes structure



More information about the wine-devel mailing list