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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
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 @@
                 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 @@
                   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;