anv/cmd_buffer: Reset state in cmd_buffer_destroy
This ensures that everything gets cleaned up properly. In particular, it fixes a memory leak where we were leaking the push constants structs. Valgrind stats on dEQP-VK.pipeline.push_constant.graphics_pipeline.range_size_128 : Before: HEAP SUMMARY: in use at exit: 2,467,513 bytes in 1,305 blocks total heap usage: 697,853 allocs, 696,530 frees, 138,466,600 bytes allocated LEAK SUMMARY: definitely lost: 1,068 bytes in 11 blocks indirectly lost: 24,669 bytes in 412 blocks possibly lost: 0 bytes in 0 blocks still reachable: 2,441,776 bytes in 882 blocks suppressed: 0 bytes in 0 blocks After: HEAP SUMMARY: in use at exit: 2,467,381 bytes in 1,304 blocks total heap usage: 697,853 allocs, 696,531 frees, 138,466,600 bytes allocated LEAK SUMMARY: definitely lost: 936 bytes in 10 blocks indirectly lost: 24,669 bytes in 412 blocks possibly lost: 0 bytes in 0 blocks still reachable: 2,441,776 bytes in 882 blocks suppressed: 0 bytes in 0 blocks Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> Cc: "17.2 17.1" <mesa-stable@lists.freedesktop.org>
This commit is contained in:
@@ -150,10 +150,8 @@ anv_cmd_state_reset(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
state->pma_fix_enabled = false;
|
state->pma_fix_enabled = false;
|
||||||
state->hiz_enabled = false;
|
state->hiz_enabled = false;
|
||||||
|
|
||||||
if (state->attachments != NULL) {
|
vk_free(&cmd_buffer->pool->alloc, state->attachments);
|
||||||
vk_free(&cmd_buffer->pool->alloc, state->attachments);
|
state->attachments = NULL;
|
||||||
state->attachments = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
state->gen7.index_buffer = NULL;
|
state->gen7.index_buffer = NULL;
|
||||||
}
|
}
|
||||||
@@ -271,8 +269,6 @@ VkResult anv_AllocateCommandBuffers(
|
|||||||
static void
|
static void
|
||||||
anv_cmd_buffer_destroy(struct anv_cmd_buffer *cmd_buffer)
|
anv_cmd_buffer_destroy(struct anv_cmd_buffer *cmd_buffer)
|
||||||
{
|
{
|
||||||
struct anv_cmd_state *state = &cmd_buffer->state;
|
|
||||||
|
|
||||||
list_del(&cmd_buffer->pool_link);
|
list_del(&cmd_buffer->pool_link);
|
||||||
|
|
||||||
anv_cmd_buffer_fini_batch_bo_chain(cmd_buffer);
|
anv_cmd_buffer_fini_batch_bo_chain(cmd_buffer);
|
||||||
@@ -280,10 +276,8 @@ anv_cmd_buffer_destroy(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
anv_state_stream_finish(&cmd_buffer->surface_state_stream);
|
anv_state_stream_finish(&cmd_buffer->surface_state_stream);
|
||||||
anv_state_stream_finish(&cmd_buffer->dynamic_state_stream);
|
anv_state_stream_finish(&cmd_buffer->dynamic_state_stream);
|
||||||
|
|
||||||
for (uint32_t i = 0; i < ARRAY_SIZE(state->push_descriptors); i++)
|
anv_cmd_state_reset(cmd_buffer);
|
||||||
vk_free(&cmd_buffer->pool->alloc, state->push_descriptors[i]);
|
|
||||||
|
|
||||||
vk_free(&cmd_buffer->pool->alloc, state->attachments);
|
|
||||||
vk_free(&cmd_buffer->pool->alloc, cmd_buffer);
|
vk_free(&cmd_buffer->pool->alloc, cmd_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user