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

Iago Toral itoral at igalia.com
Wed Mar 15 08:36:56 UTC 2017


On Wed, 2017-03-15 at 10:33 +0200, Pohjolainen, Topi wrote:
> 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.

Oops, right, I'll remove this. Thanks!

> > 
> >     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);


More information about the mesa-dev mailing list