vkd3d-shader/hlsl: Properly free default values when discarding them.

This commit is contained in:
Anna (navi) Figueiredo Gomes
2025-11-12 18:28:22 +01:00
committed by Henri Verbeet
parent 990be02cca
commit dd3524444d
Notes: Henri Verbeet 2025-11-17 15:29:22 +01:00
Approved-by: Francisco Casas (@fcasas)
Approved-by: Elizabeth Figura (@zfigura)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1827
3 changed files with 31 additions and 19 deletions

View File

@@ -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]);

View File

@@ -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);

View File

@@ -2245,19 +2245,15 @@ static void initialize_var_components(struct hlsl_ctx *ctx, struct hlsl_block *i
struct hlsl_default_value default_value = {0};
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 (dst->default_values)
if (hlsl_is_numeric_type(dst_comp_type) && 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_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);
}