From 990f1868ec0b201afac8833aa17fe8fe841aaa96 Mon Sep 17 00:00:00 2001 From: Konstantin Seurer Date: Sun, 5 Oct 2025 09:50:41 +0200 Subject: [PATCH] vulkan/cmd_queue: Free all elements of struct arrays Acked-by: Mike Blumenkrantz Part-of: --- .../frontends/lavapipe/ci/lvp-asan-fails.txt | 6 ------ src/vulkan/util/vk_cmd_queue_gen.py | 17 +++++++++++++++-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/gallium/frontends/lavapipe/ci/lvp-asan-fails.txt b/src/gallium/frontends/lavapipe/ci/lvp-asan-fails.txt index b9df3bb79bf..55187b59ca0 100644 --- a/src/gallium/frontends/lavapipe/ci/lvp-asan-fails.txt +++ b/src/gallium/frontends/lavapipe/ci/lvp-asan-fails.txt @@ -28,9 +28,3 @@ dEQP-VK.dynamic_state.monolithic.compute_transfer.single.compute.vertex_input_bi # New fails in 1.4.1.1 dEQP-VK.pipeline.pipeline_library.bind_buffers_2.maintenance5.robustness2.triangle_list.buffers9.stride_offset_rnd654.true_size.beyond_size,Fail - -# New fails in 1.4.3.3 -dEQP-VK.api.fragment_shader_output.different_signedness.sint2sint_unorm2snorm,Fail -dEQP-VK.pipeline.fast_linked_library.color_write_enable.alpha_channel.cmd_buffer_start.enable_first,Fail -dEQP-VK.pipeline.fast_linked_library.color_write_enable.red_channel.before_draw.enable_second,Fail -dEQP-VK.pipeline.fast_linked_library.multisample.multisampled_render_to_single_sampled.multi_renderpass.r8g8b8a8_unorm_r16g16b16a16_sfloat_r32g32b32a32_uint_d24_unorm_s8_uint.random_326,Fail diff --git a/src/vulkan/util/vk_cmd_queue_gen.py b/src/vulkan/util/vk_cmd_queue_gen.py index 09a8fedd25c..904a1e75feb 100644 --- a/src/vulkan/util/vk_cmd_queue_gen.py +++ b/src/vulkan/util/vk_cmd_queue_gen.py @@ -600,7 +600,7 @@ def get_command_struct_free(command, param, types): builder.add("vk_free(queue->alloc, (void*)%s);" % (field_name)) return builder.code -def get_struct_free(builder, field_name, nullable, struct_type, types): +def get_struct_free(builder, field_name, nullable, struct_type, types, parent_name=None, len=None): if struct_type not in types: return @@ -610,6 +610,15 @@ def get_struct_free(builder, field_name, nullable, struct_type, types): builder.add("if (%s) {" % (field_name)) builder.level += 1 + struct_array_copy = len and len != "struct-ptr" and struct_type != "void" + if struct_array_copy: + array_index = builder.get_variable_name("i") + builder.add("for (uint32_t %s = 0; %s < %s->%s; %s++) {" % (array_index, array_index, parent_name, len, array_index)) + builder.level += 1 + element_name = builder.get_variable_name("element") + builder.add("%s *%s = %s + %s; (void)%s;" % (struct_type, element_name, field_name, array_index, element_name)) + field_name = element_name + for member in members: member_name = "%s->%s" % (field_name, member.name) if member.len and member.len != 'null-terminated': @@ -621,7 +630,7 @@ def get_struct_free(builder, field_name, nullable, struct_type, types): builder.add("if (%s->%s) {" % (field_name, member.len)) builder.level += 1 - get_struct_free(builder, local_member_name, not guard, member.type, types) + get_struct_free(builder, local_member_name, not guard, member.type, types, field_name, member.len) if guard: builder.level -= 1 @@ -632,6 +641,10 @@ def get_struct_free(builder, field_name, nullable, struct_type, types): elif member.name == 'pNext': get_pnext_member_free(builder, struct_type, types, member_name) + if struct_array_copy: + builder.level -= 1 + builder.add("}") + if members and nullable: builder.level -= 1 builder.add("}")