Hi, Il 01/07/22 23:24, Francisco Casas ha scritto:
+struct hlsl_ir_node *hlsl_new_offset_from_path_index(struct hlsl_ctx *ctx, struct hlsl_block *block, + struct hlsl_type *type, struct hlsl_ir_node *offset, struct hlsl_ir_node *idx, + const struct vkd3d_shader_location *loc)
Any reason why you're passing a struct hlsl_block and then copying the instructions instead of the usual pattern of passing the instruction list in depth?
-static struct hlsl_ir_load *add_load(struct hlsl_ctx *ctx, struct list *instrs, struct hlsl_ir_node *var_node, - struct hlsl_ir_node *offset, struct hlsl_type *data_type, const struct vkd3d_shader_location loc) +static struct hlsl_ir_load *add_load_index(struct hlsl_ctx *ctx, struct list *instrs, struct hlsl_ir_node *var_node, + struct hlsl_ir_node *idx, const struct vkd3d_shader_location loc) { - struct hlsl_ir_node *add = NULL; + struct hlsl_type *elem_type; + struct hlsl_ir_node *offset; struct hlsl_ir_load *load; - struct hlsl_ir_var *var; + struct hlsl_block block; + + elem_type = hlsl_get_type_from_path_index(ctx, var_node->data_type, idx);
if (var_node->type == HLSL_IR_LOAD) { const struct hlsl_deref *src = &hlsl_ir_load(var_node)->src;
- var = src->var; - if (src->offset.node) - { - if (!(add = hlsl_new_binary_expr(ctx, HLSL_OP2_ADD, src->offset.node, offset))) - return NULL; - list_add_tail(instrs, &add->entry); - offset = add; - } + if (!(offset = hlsl_new_offset_from_path_index(ctx, &block, var_node->data_type, src->offset.node, idx, &loc))) + return NULL; + list_move_tail(instrs, &block.instrs); + + if (!(load = hlsl_new_load(ctx, src->var, offset, elem_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];
+ if (!(offset = hlsl_new_offset_from_path_index(ctx, &block, var_node->data_type, NULL, idx, &loc))) + return NULL; + list_move_tail(instrs, &block.instrs); + sprintf(name, "<deref-%p>", var_node);
As for 04/12, I think the current trend is to use string buffers.
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, elem_type, loc))) + return NULL; + list_add_tail(instrs, &load->node.entry); }
- if (!(load = hlsl_new_load(ctx, var, offset, data_type, loc))) - return NULL; - list_add_tail(instrs, &load->node.entry);
As I said, I liked it better when the hlsl_new_load() call wasn't duplicated.
return load; }
Giovanni.