vulkan/cmd_queue: Free all elements of struct arrays

Acked-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37710>
This commit is contained in:
Konstantin Seurer 2025-10-05 09:50:41 +02:00
parent a3e77fe5d2
commit 990f1868ec
2 changed files with 15 additions and 8 deletions

View file

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

View file

@ -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("}")