vulkan/cmd_queue: Drop vk_cmd_queue::error
authorJason Ekstrand <jason.ekstrand@collabora.com>
Wed, 31 Aug 2022 20:00:02 +0000 (15:00 -0500)
committerMarge Bot <emma+marge@anholt.net>
Thu, 1 Sep 2022 14:11:55 +0000 (14:11 +0000)
Instead, we return errors from each of the enqueue functions and record
those errors (if any) in vk_command_buffer::record_result.  This also
involves some awkward changes to each of the three drivers that uses
vk_cmd_queue but those are resolved in later commits as we convert those
drivers to the common error tracking.

Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16918>

src/gallium/frontends/lavapipe/lvp_cmd_buffer.c
src/microsoft/vulkan/dzn_cmd_buffer.c
src/panfrost/vulkan/panvk_vX_cmd_buffer.c
src/vulkan/util/vk_cmd_queue_gen.py

index 84f20f9..10b8ebd 100644 (file)
@@ -169,13 +169,13 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_EndCommandBuffer(
    VkCommandBuffer                             commandBuffer)
 {
    LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
+   VkResult result = vk_command_buffer_get_record_result(&cmd_buffer->vk);
 
-   cmd_buffer->status =
-      cmd_buffer->vk.cmd_queue.error == VK_SUCCESS ?
+   cmd_buffer->status = result == VK_SUCCESS ?
       LVP_CMD_BUFFER_STATUS_EXECUTABLE :
       LVP_CMD_BUFFER_STATUS_INVALID;
 
-   return cmd_buffer->vk.cmd_queue.error;
+   return result;
 }
 
 VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateCommandPool(
index 0a3aa9a..b3be557 100644 (file)
@@ -879,7 +879,7 @@ dzn_EndCommandBuffer(VkCommandBuffer commandBuffer)
       if (FAILED(hres))
          cmdbuf->error = vk_error(cmdbuf->vk.base.device, VK_ERROR_OUT_OF_HOST_MEMORY);
    } else {
-      cmdbuf->error = cmdbuf->vk.cmd_queue.error;
+      cmdbuf->error = vk_command_buffer_get_record_result(&cmdbuf->vk);
    }
 
    return cmdbuf->error;
index 53d212d..9e8aa00 100644 (file)
@@ -907,7 +907,8 @@ panvk_per_arch(EndCommandBuffer)(VkCommandBuffer commandBuffer)
    VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
    VkResult ret =
       cmdbuf->vk.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY ?
-      cmdbuf->vk.cmd_queue.error : cmdbuf->record_result;
+      vk_command_buffer_get_record_result(&cmdbuf->vk) :
+      cmdbuf->record_result;
 
    panvk_per_arch(cmd_close_batch)(cmdbuf);
    cmdbuf->status = ret == VK_SUCCESS ?
index 8303787..b5e1af3 100644 (file)
@@ -78,7 +78,6 @@ struct vk_device_dispatch_table;
 struct vk_cmd_queue {
    const VkAllocationCallbacks *alloc;
    struct list_head cmds;
-   VkResult error;
 };
 
 enum vk_cmd_type {
@@ -141,7 +140,7 @@ struct vk_cmd_queue_entry {
 % if c.guard is not None:
 #ifdef ${c.guard}
 % endif
-  void vk_enqueue_${to_underscore(c.name)}(struct vk_cmd_queue *queue
+  VkResult vk_enqueue_${to_underscore(c.name)}(struct vk_cmd_queue *queue
 % for p in c.params[1:]:
    , ${p.decl}
 % endfor
@@ -159,7 +158,6 @@ vk_cmd_queue_init(struct vk_cmd_queue *queue, VkAllocationCallbacks *alloc)
 {
    queue->alloc = alloc;
    list_inithead(&queue->cmds);
-   queue->error = VK_SUCCESS;
 }
 
 static inline void
@@ -167,7 +165,6 @@ vk_cmd_queue_reset(struct vk_cmd_queue *queue)
 {
    vk_free_queue(queue);
    list_inithead(&queue->cmds);
-   queue->error = VK_SUCCESS;
 }
 
 static inline void
@@ -236,19 +233,16 @@ struct vk_cmd_queue_entry *cmd)
 }
 
 % if c.name not in manual_commands and c.name not in no_enqueue_commands:
-void vk_enqueue_${to_underscore(c.name)}(struct vk_cmd_queue *queue
+VkResult vk_enqueue_${to_underscore(c.name)}(struct vk_cmd_queue *queue
 % for p in c.params[1:]:
 , ${p.decl}
 % endfor
 )
 {
-   if (queue->error)
-      return;
-
    struct vk_cmd_queue_entry *cmd = vk_zalloc(queue->alloc,
                                               sizeof(*cmd), 8,
                                               VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
-   if (!cmd) { queue->error = VK_ERROR_OUT_OF_HOST_MEMORY; return; }
+   if (!cmd) return VK_ERROR_OUT_OF_HOST_MEMORY;
 
    cmd->type = ${to_enum_name(c.name)};
    \
@@ -273,13 +267,13 @@ void vk_enqueue_${to_underscore(c.name)}(struct vk_cmd_queue *queue
 % endfor
 
    list_addtail(&cmd->cmd_link, &queue->cmds);
-   return;
+   return VK_SUCCESS;
 
 % if need_error_handling:
 err:
-   queue->error = VK_ERROR_OUT_OF_HOST_MEMORY;
    if (cmd)
       vk_free_${to_underscore(c.name)}(queue, cmd);
+   return VK_ERROR_OUT_OF_HOST_MEMORY;
 % endif
 }
 % endif
@@ -356,12 +350,16 @@ vk_cmd_enqueue_${c.name}(${c.decl_params()})
 {
    VK_FROM_HANDLE(vk_command_buffer, cmd_buffer, commandBuffer);
 
+   if (vk_command_buffer_has_error(cmd_buffer))
+      return;
 % if len(c.params) == 1:
-   vk_enqueue_${to_underscore(c.name)}(&cmd_buffer->cmd_queue);
+   VkResult result = vk_enqueue_${to_underscore(c.name)}(&cmd_buffer->cmd_queue);
 % else:
-   vk_enqueue_${to_underscore(c.name)}(&cmd_buffer->cmd_queue,
+   VkResult result = vk_enqueue_${to_underscore(c.name)}(&cmd_buffer->cmd_queue,
                                        ${c.call_params(1)});
 % endif
+   if (unlikely(result != VK_SUCCESS))
+      vk_command_buffer_set_error(cmd_buffer, result);
 }
 % endif