anv: refresh cached current batch bo after emitting some commands
authorMarcin Ślusarz <marcin.slusarz@intel.com>
Tue, 1 Sep 2020 20:02:10 +0000 (22:02 +0200)
committerMarge Bot <eric+marge@anholt.net>
Wed, 2 Sep 2020 10:16:57 +0000 (10:16 +0000)
Fixes crashes in:
- Rise of the Tomb Rider (on benchmark start)
- Total War: Three Kingdoms (on game start)
- Total War: Warhammer II (on game start)

Fixes: 34a0ce58c7f ("anv: add a new execution mode for secondary command buffers")
Signed-off-by: Marcin Ślusarz <marcin.slusarz@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6546>

src/intel/vulkan/anv_batch_chain.c

index 4aefa58ea1eaa45605cc5f5712265a4edeb45d8e..ce429ff2d85536da878066f01b1552779f70087e 100644 (file)
@@ -951,6 +951,11 @@ anv_cmd_buffer_end_batch_buffer(struct anv_cmd_buffer *cmd_buffer)
                             .SecondLevelBatchBuffer = Firstlevelbatch) +
             (GEN8_MI_BATCH_BUFFER_START_BatchBufferStartAddress_start / 8);
          cmd_buffer->return_addr = anv_batch_address(&cmd_buffer->batch, jump_addr);
                             .SecondLevelBatchBuffer = Firstlevelbatch) +
             (GEN8_MI_BATCH_BUFFER_START_BatchBufferStartAddress_start / 8);
          cmd_buffer->return_addr = anv_batch_address(&cmd_buffer->batch, jump_addr);
+
+         /* The emit above may have caused us to chain batch buffers which
+          * would mean that batch_bo is no longer valid.
+          */
+         batch_bo = anv_cmd_buffer_current_batch_bo(cmd_buffer);
       } else if ((cmd_buffer->batch_bos.next == cmd_buffer->batch_bos.prev) &&
                  (length < ANV_CMD_BUFFER_BATCH_SIZE / 2)) {
          /* If the secondary has exactly one batch buffer in its list *and*
       } else if ((cmd_buffer->batch_bos.next == cmd_buffer->batch_bos.prev) &&
                  (length < ANV_CMD_BUFFER_BATCH_SIZE / 2)) {
          /* If the secondary has exactly one batch buffer in its list *and*