[Mesa-dev] [PATCH v2 05/24] anv/cmd_buffer: add a status field to anv_batch

Pohjolainen, Topi topi.pohjolainen at gmail.com
Wed Mar 15 08:33:15 UTC 2017


On Fri, Mar 10, 2017 at 01:38:18PM +0100, Iago Toral Quiroga wrote:
> The vkCmd*() functions do not report errors, instead, any errors should be
> reported by the time we call vkEndCommandBuffer(). This means that we
> need to make the driver robust against incosistent and/or imcomplete
> command  buffer states through the command recording process, particularly,
> avoid crashes due to access to memory that we failed to allocate previously.
> 
> The strategy used to do this is to track the first error ocurred while
> recording a command buffer in the batch associated with it. We use the
> batch to track this information because the command buffer may not be
> visible to all parts of the driver that can produce errors we need to be
> aware of (such as allocation failures during batch emissions).
> 
> Later patches will use this error information to guard parts of the driver
> that may not be safe to execute.
> 
> v2: Move the field from the command buffer to the batch so we can track
>     errors from batch emissions (Jason)
> ---
>  src/intel/vulkan/anv_cmd_buffer.c | 5 +++++
>  src/intel/vulkan/anv_private.h    | 9 +++++++++
>  2 files changed, 14 insertions(+)
> 
> diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c
> index cab1dd7..4a41bc0 100644
> --- a/src/intel/vulkan/anv_cmd_buffer.c
> +++ b/src/intel/vulkan/anv_cmd_buffer.c
> @@ -117,6 +117,8 @@ anv_cmd_state_reset(struct anv_cmd_buffer *cmd_buffer)
>  {
>     struct anv_cmd_state *state = &cmd_buffer->state;
>  
> +   cmd_buffer->batch.status = VK_SUCCESS;
> +
>     memset(&state->descriptors, 0, sizeof(state->descriptors));
>     memset(&state->push_constants, 0, sizeof(state->push_constants));
>     memset(state->binding_tables, 0, sizeof(state->binding_tables));
> @@ -185,6 +187,8 @@ static VkResult anv_create_cmd_buffer(
>     if (cmd_buffer == NULL)
>        return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
>  
> +   cmd_buffer->batch.status = VK_SUCCESS;
> +
>     cmd_buffer->_loader_data.loaderMagic = ICD_LOADER_MAGIC;
>     cmd_buffer->device = device;
>     cmd_buffer->pool = pool;
> @@ -217,6 +221,7 @@ static VkResult anv_create_cmd_buffer(
>     return VK_SUCCESS;
>  
>   fail:
> +   cmd_buffer->batch.status = result;

This looks unnecessary, cmd_buffer gets deallocated in the next line.

>     vk_free(&cmd_buffer->pool->alloc, cmd_buffer);
>  
>     return result;
> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
> index aa2b6d7..f5d7600 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -704,6 +704,15 @@ struct anv_batch {
>      */
>     VkResult (*extend_cb)(struct anv_batch *, void *);
>     void *                                       user_data;
> +
> +   /**
> +    * Current error status of the command buffer. Used to track inconsistent
> +    * or incomplete command buffer states that are the consequence of run-time
> +    * errors such as out of memory scenarios. We want to track this in the
> +    * batch because the command buffer object is not visible to some parts
> +    * of the driver.
> +    */
> +   VkResult                                     status;
>  };
>  
>  void *anv_batch_emit_dwords(struct anv_batch *batch, int num_dwords);
> -- 
> 2.7.4
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list