From 26bfbf29c2940b7ae21fb0f14a5e0f6fe7c6c369 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Wed, 4 Mar 2020 11:12:08 +0100 Subject: [PATCH] v3dv: don't reset loader data on command buffers We were clearing memory to 0 on create and reset, including the loader data, which is not correct on reset since it would cleat the loader dispatch table for the command buffer. We should only clear driver data. Also, don't use vk_zalloc for the command buffer allocation, since we are already clearing on reset and we always reset when we begin recording. Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 28b8a08..547a4cd 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -115,9 +115,14 @@ cmd_buffer_init(struct v3dv_cmd_buffer *cmd_buffer, struct v3dv_cmd_pool *pool, VkCommandBufferLevel level) { - memset(cmd_buffer, 0, sizeof(*cmd_buffer)); + /* Do not reset the loader data header! If we are calling this from + * a command buffer reset that would reset the loader's dispatch table for + * the command buffer. + */ + const uint32_t ld_size = sizeof(VK_LOADER_DATA); + uint8_t *cmd_buffer_driver_start = ((uint8_t *) cmd_buffer) + ld_size; + memset(cmd_buffer_driver_start, 0, sizeof(*cmd_buffer) - ld_size); - cmd_buffer->_loader_data.loaderMagic = ICD_LOADER_MAGIC; cmd_buffer->device = device; cmd_buffer->pool = pool; cmd_buffer->level = level; @@ -137,13 +142,15 @@ cmd_buffer_create(struct v3dv_device *device, VkCommandBuffer *pCommandBuffer) { struct v3dv_cmd_buffer *cmd_buffer; - cmd_buffer = vk_zalloc(&pool->alloc, sizeof(*cmd_buffer), 8, - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + cmd_buffer = vk_alloc(&pool->alloc, sizeof(*cmd_buffer), 8, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); if (cmd_buffer == NULL) return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY); cmd_buffer_init(cmd_buffer, device, pool, level); + cmd_buffer->_loader_data.loaderMagic = ICD_LOADER_MAGIC; + *pCommandBuffer = v3dv_cmd_buffer_to_handle(cmd_buffer); return VK_SUCCESS; -- 2.7.4