[PATCH vkd3d 04/12] vkd3d-shader/hlsl: Introduce add_load_component() in hlsl.y.
Giovanni Mascellani
gmascellani at codeweavers.com
Tue Jul 5 05:26:05 CDT 2022
Hi,
about the patch subject, there is probably no real need to explicitly
mention hlsl.y.
Il 01/07/22 23:24, Francisco Casas ha scritto:
> +static struct hlsl_ir_load *add_load_component(struct hlsl_ctx *ctx, struct list *instrs, struct hlsl_ir_node *var_node,
> + unsigned int comp, const struct vkd3d_shader_location loc)
> +{
> + struct hlsl_type *comp_type;
> + struct hlsl_ir_node *offset;
> + struct hlsl_ir_constant *c;
> + struct hlsl_ir_load *load;
> + unsigned int comp_offset;
> + struct hlsl_ir_var *var;
> +
> + comp_offset = hlsl_compute_component_offset(ctx, var_node->data_type, comp, &comp_type);
> +
> + if (!(c = hlsl_new_uint_constant(ctx, comp_offset, &loc)))
> + return NULL;
> + list_add_tail(instrs, &c->node.entry);
> +
> + offset = &c->node;
> +
> + if (var_node->type == HLSL_IR_LOAD)
> + {
> + const struct hlsl_deref *src = &hlsl_ir_load(var_node)->src;
> + struct hlsl_ir_node *add;
> +
> + var = src->var;
> + if (src->offset.node)
> + {
> + if (!(add = hlsl_new_binary_expr(ctx, HLSL_OP2_ADD, src->offset.node, &c->node)))
> + return NULL;
> + list_add_tail(instrs, &add->entry);
> + offset = add;
> + }
> +
> + if (!(load = hlsl_new_load(ctx, var, offset, comp_type, loc)))
> + return NULL;
> + list_add_tail(instrs, &load->node.entry);
> + }
> + else
> + {
> + struct hlsl_ir_store *store;
> + struct hlsl_ir_var *var;
> + char name[27];
> +
> + sprintf(name, "<deref-%p>", var_node);
I think the new trend is to use string buffers. See how this is done in
intrinsic_mul(), for example.
(if you ask me, I would also stop using global static counters, but
that's not happening yet; also, it's just a cosmetic issue)
> + if (!(var = hlsl_new_synthetic_var(ctx, name, var_node->data_type, var_node->loc)))
> + return NULL;
> +
> + if (!(store = hlsl_new_simple_store(ctx, var, var_node)))
> + return NULL;
> + list_add_tail(instrs, &store->node.entry);
> +
> + if (!(load = hlsl_new_load(ctx, var, offset, comp_type, loc)))
> + return NULL;
> + list_add_tail(instrs, &load->node.entry);
This last block is identical in both branches, and it remains mostly
identical also in later patches. Maybe it could be brought outside of
the if, like it is in add_load()?
Thanks, Giovanni.
More information about the wine-devel
mailing list