diff options
author | Zebediah Figura <zfigura@codeweavers.com> | 2021-09-12 00:53:18 +0300 |
---|---|---|
committer | Giovanni Mascellani <gmascellani@codeweavers.com> | 2022-07-26 15:48:51 +0300 |
commit | d654c0eb1c5d090d8570efd4b22f5a9fd7712437 (patch) | |
tree | 937d25208db2562e618d77d1e607c427f35d064b | |
parent | 4512c6a4307b638e9b41b1312e8ffb4bd13c2b5b (diff) |
vkd3d-shader/hlsl: Keep the first hlsl_ir_function_decl pointer, instead of the one that has a body.
HLSL_IR_CALL instructions will refer to it.
-rw-r--r-- | libs/vkd3d-shader/hlsl.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c index 6831cf5a..d78bcaa2 100644 --- a/libs/vkd3d-shader/hlsl.c +++ b/libs/vkd3d-shader/hlsl.c @@ -1878,7 +1878,6 @@ void hlsl_add_function(struct hlsl_ctx *ctx, char *name, struct hlsl_ir_function { struct hlsl_ir_function_decl *old_decl = RB_ENTRY_VALUE(old_entry, struct hlsl_ir_function_decl, entry); - unsigned int i; if (!decl->has_body) { @@ -1887,19 +1886,24 @@ void hlsl_add_function(struct hlsl_ctx *ctx, char *name, struct hlsl_ir_function return; } - for (i = 0; i < decl->attr_count; ++i) - hlsl_free_attribute((void *)decl->attrs[i]); - vkd3d_free((void *)decl->attrs); - decl->attr_count = old_decl->attr_count; - decl->attrs = old_decl->attrs; - old_decl->attr_count = 0; - old_decl->attrs = NULL; + assert(!old_decl->has_body); + list_move_tail(&old_decl->body.instrs, &decl->body.instrs); + old_decl->has_body = true; + + old_decl->return_var = decl->return_var; + decl->return_var = NULL; + + vkd3d_free(old_decl->parameters); + old_decl->parameters = decl->parameters; + decl->parameters = NULL; - rb_remove(&func->overloads, old_entry); - free_function_decl(old_decl); + free_function_decl(decl); + } + else + { + rb_put(&func->overloads, decl->parameters, &decl->entry); + vkd3d_free(name); } - rb_put(&func->overloads, decl->parameters, &decl->entry); - vkd3d_free(name); return; } func = hlsl_alloc(ctx, sizeof(*func)); |