From dd3524444daca8cdcba206ecd9b615bb7c1fdf42 Mon Sep 17 00:00:00 2001 From: "Anna (navi) Figueiredo Gomes" Date: Wed, 12 Nov 2025 18:28:22 +0100 Subject: [PATCH] vkd3d-shader/hlsl: Properly free default values when discarding them. --- libs/vkd3d-shader/hlsl.c | 28 ++++++++++++++++++++-------- libs/vkd3d-shader/hlsl.h | 2 ++ libs/vkd3d-shader/hlsl.y | 20 +++++++++----------- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c index dc9886b53..afa7958d0 100644 --- a/libs/vkd3d-shader/hlsl.c +++ b/libs/vkd3d-shader/hlsl.c @@ -153,6 +153,25 @@ void hlsl_free_state_block(struct hlsl_state_block *state_block) vkd3d_free(state_block); } +void hlsl_free_default_value(struct hlsl_default_value *value) +{ + vkd3d_free((void *)value->string); +} + +void hlsl_free_default_values(struct hlsl_ir_var *decl) +{ + unsigned int component_count; + + if (!decl->default_values) + return; + + component_count = hlsl_type_component_count(decl->data_type); + for (size_t i = 0; i < component_count; ++i) + hlsl_free_default_value(&decl->default_values[i]); + vkd3d_free(decl->default_values); + decl->default_values = NULL; +} + void hlsl_free_var(struct hlsl_ir_var *decl) { unsigned int k, i; @@ -162,14 +181,7 @@ void hlsl_free_var(struct hlsl_ir_var *decl) for (k = 0; k <= HLSL_REGSET_LAST_OBJECT; ++k) vkd3d_free((void *)decl->objects_usage[k]); - if (decl->default_values) - { - unsigned int component_count = hlsl_type_component_count(decl->data_type); - - for (k = 0; k < component_count; ++k) - vkd3d_free((void *)decl->default_values[k].string); - vkd3d_free(decl->default_values); - } + hlsl_free_default_values(decl); for (i = 0; i < decl->state_block_count; ++i) hlsl_free_state_block(decl->state_blocks[i]); diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index bd2789611..6fa836402 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -1675,6 +1675,8 @@ void hlsl_free_ir_switch_case(struct hlsl_ir_switch_case *c); void hlsl_replace_node(struct hlsl_ir_node *old, struct hlsl_ir_node *new); void hlsl_free_attribute(struct hlsl_attribute *attr); +void hlsl_free_default_value(struct hlsl_default_value *value); +void hlsl_free_default_values(struct hlsl_ir_var *decl); void hlsl_free_instr(struct hlsl_ir_node *node); void hlsl_free_instr_list(struct list *list); void hlsl_free_state_block(struct hlsl_state_block *state_block); diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 92bfd7040..e34902952 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -2246,18 +2246,14 @@ static void initialize_var_components(struct hlsl_ctx *ctx, struct hlsl_block *i if (src->type == HLSL_IR_COMPILE || src->type == HLSL_IR_SAMPLER_STATE) { - if (hlsl_is_numeric_type(dst_comp_type)) + /* Default values are discarded if they contain an object + * literal expression for a numeric component. */ + if (hlsl_is_numeric_type(dst_comp_type) && dst->default_values) { - /* Default values are discarded if they contain an object - * literal expression for a numeric component. */ - if (dst->default_values) - { - hlsl_warning(ctx, &src->loc, VKD3D_SHADER_WARNING_HLSL_IGNORED_DEFAULT_VALUE, - "Component %u in variable '%s' initializer is object literal. Default values discarded.", - k, dst->name); - vkd3d_free(dst->default_values); - dst->default_values = NULL; - } + hlsl_warning(ctx, &src->loc, VKD3D_SHADER_WARNING_HLSL_IGNORED_DEFAULT_VALUE, + "Component %u in variable '%s' initializer is object literal. Default values discarded.", + k, dst->name); + hlsl_free_default_values(dst); } } else @@ -2268,6 +2264,8 @@ static void initialize_var_components(struct hlsl_ctx *ctx, struct hlsl_block *i if (dst->default_values) dst->default_values[*store_index] = default_value; + else + hlsl_free_default_value(&default_value); hlsl_block_cleanup(&block); }