anv: track the end of the command buffers
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Wed, 9 Dec 2020 09:56:31 +0000 (11:56 +0200)
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>
Sat, 27 Feb 2021 11:29:07 +0000 (13:29 +0200)
Where MI_BATCH_BUFFER_END is recorded.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/2371>

src/intel/vulkan/anv_batch_chain.c
src/intel/vulkan/anv_private.h

index 5ea24bb..34e0868 100644 (file)
@@ -913,8 +913,12 @@ anv_cmd_buffer_end_batch_buffer(struct anv_cmd_buffer *cmd_buffer)
        * with our BATCH_BUFFER_END in another BO.
        */
       cmd_buffer->batch.end += GEN8_MI_BATCH_BUFFER_START_length * 4;
+      assert(cmd_buffer->batch.start == batch_bo->bo->map);
       assert(cmd_buffer->batch.end == batch_bo->bo->map + batch_bo->bo->size);
 
+      /* Save end instruction location to override it later. */
+      cmd_buffer->batch_end = cmd_buffer->batch.next;
+
       anv_batch_emit(&cmd_buffer->batch, GEN8_MI_BATCH_BUFFER_END, bbe);
 
       /* Round batch up to an even number of dwords. */
index 1183d14..5eb042f 100644 (file)
@@ -2951,6 +2951,12 @@ struct anv_cmd_buffer {
 
    struct anv_batch                             batch;
 
+   /* Pointer to the location in the batch where MI_BATCH_BUFFER_END was
+    * recorded upon calling vkEndCommandBuffer(). This is useful if we need to
+    * rewrite the end to chain multiple batch together at vkQueueSubmit().
+    */
+   void *                                       batch_end;
+
    /* Fields required for the actual chain of anv_batch_bo's.
     *
     * These fields are initialized by anv_cmd_buffer_init_batch_bo_chain().