From: Lionel Landwerlin Date: Tue, 28 Aug 2018 10:41:42 +0000 (+0100) Subject: intel/decoders: handle decoding MI_BBS from ring X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=acb50d6b1ff1b73a66e88862c99b65d87869e01d;p=mesa.git intel/decoders: handle decoding MI_BBS from ring An MI_BATCH_BUFFER_START in the ring buffer acts as a second level batchbuffer (aka jump back to ring buffer when running into a MI_BATCH_BUFFER_END). Signed-off-by: Lionel Landwerlin Reviewed-by: Rafael Antognolli --- diff --git a/src/intel/common/gen_batch_decoder.c b/src/intel/common/gen_batch_decoder.c index 8eff5d171a5..becb708da65 100644 --- a/src/intel/common/gen_batch_decoder.c +++ b/src/intel/common/gen_batch_decoder.c @@ -805,7 +805,7 @@ struct custom_decoder { void gen_print_batch(struct gen_batch_decode_ctx *ctx, const uint32_t *batch, uint32_t batch_size, - uint64_t batch_addr) + uint64_t batch_addr, bool from_ring) { const uint32_t *p, *end = batch + batch_size / sizeof(uint32_t); int length; @@ -887,7 +887,7 @@ gen_print_batch(struct gen_batch_decode_ctx *ctx, next_batch_addr); } else { gen_print_batch(ctx, next_batch.map, next_batch.size, - next_batch.addr); + next_batch.addr, false); } if (second_level) { /* MI_BATCH_BUFFER_START with "2nd Level Batch Buffer" set acts @@ -896,7 +896,7 @@ gen_print_batch(struct gen_batch_decode_ctx *ctx, * MI_BATCH_BUFFER_END. */ continue; - } else { + } else if (!from_ring) { /* MI_BATCH_BUFFER_START with "2nd Level Batch Buffer" unset acts * like a goto. Nothing after it will ever get processed. In * order to prevent the recursion from growing, we just reset the diff --git a/src/intel/common/gen_decoder.h b/src/intel/common/gen_decoder.h index 6ab0b66aca3..f5f38078442 100644 --- a/src/intel/common/gen_decoder.h +++ b/src/intel/common/gen_decoder.h @@ -254,7 +254,7 @@ void gen_batch_decode_ctx_finish(struct gen_batch_decode_ctx *ctx); void gen_print_batch(struct gen_batch_decode_ctx *ctx, const uint32_t *batch, uint32_t batch_size, - uint64_t batch_addr); + uint64_t batch_addr, bool from_ring); #ifdef __cplusplus } diff --git a/src/intel/tools/aubinator.c b/src/intel/tools/aubinator.c index 1108604fdfe..e8c3db71f0e 100644 --- a/src/intel/tools/aubinator.c +++ b/src/intel/tools/aubinator.c @@ -166,7 +166,7 @@ handle_execlist_write(void *user_data, enum drm_i915_gem_engine_class engine, ui batch_ctx.engine = engine; gen_print_batch(&batch_ctx, commands, MIN2(ring_buffer_tail - ring_buffer_head, ring_buffer_length), - ring_bo.addr + ring_buffer_head); + ring_bo.addr + ring_buffer_head, true); aub_mem_clear_bo_maps(&mem); } @@ -184,7 +184,7 @@ handle_ring_write(void *user_data, enum drm_i915_gem_engine_class engine, batch_ctx.get_bo = get_legacy_bo; batch_ctx.engine = engine; - gen_print_batch(&batch_ctx, data, data_len, 0); + gen_print_batch(&batch_ctx, data, data_len, 0, false); aub_mem_clear_bo_maps(&mem); } diff --git a/src/intel/tools/aubinator_error_decode.c b/src/intel/tools/aubinator_error_decode.c index bd578de48e4..049823ca463 100644 --- a/src/intel/tools/aubinator_error_decode.c +++ b/src/intel/tools/aubinator_error_decode.c @@ -612,7 +612,7 @@ read_data_file(FILE *file) batch_ctx.engine = class; gen_print_batch(&batch_ctx, sections[s].data, sections[s].dword_count * 4, - sections[s].gtt_offset); + sections[s].gtt_offset, false); } } diff --git a/src/intel/tools/aubinator_viewer.cpp b/src/intel/tools/aubinator_viewer.cpp index a0c611350fc..3eed5140ef2 100644 --- a/src/intel/tools/aubinator_viewer.cpp +++ b/src/intel/tools/aubinator_viewer.cpp @@ -702,7 +702,7 @@ display_batch_ring_write(void *user_data, enum drm_i915_gem_engine_class engine, window->uses_ppgtt = false; - aub_viewer_render_batch(&window->decode_ctx, data, data_len, 0); + aub_viewer_render_batch(&window->decode_ctx, data, data_len, 0, false); } static void @@ -737,7 +737,7 @@ display_batch_execlist_write(void *user_data, window->decode_ctx.engine = engine; aub_viewer_render_batch(&window->decode_ctx, commands, MIN2(ring_buffer_tail - ring_buffer_head, ring_buffer_length), - ring_buffer_start + ring_buffer_head); + ring_buffer_start + ring_buffer_head, true); } static void diff --git a/src/intel/tools/aubinator_viewer.h b/src/intel/tools/aubinator_viewer.h index 755df057699..16812925515 100644 --- a/src/intel/tools/aubinator_viewer.h +++ b/src/intel/tools/aubinator_viewer.h @@ -95,6 +95,6 @@ void aub_viewer_decode_ctx_init(struct aub_viewer_decode_ctx *ctx, void aub_viewer_render_batch(struct aub_viewer_decode_ctx *ctx, const void *batch, uint32_t batch_size, - uint64_t batch_addr); + uint64_t batch_addr, bool from_ring); #endif /* AUBINATOR_VIEWER_H */ diff --git a/src/intel/tools/aubinator_viewer_decoder.cpp b/src/intel/tools/aubinator_viewer_decoder.cpp index 8e92ad03dd4..b946fb33e0c 100644 --- a/src/intel/tools/aubinator_viewer_decoder.cpp +++ b/src/intel/tools/aubinator_viewer_decoder.cpp @@ -892,7 +892,7 @@ struct custom_decoder info_decoders[] = { void aub_viewer_render_batch(struct aub_viewer_decode_ctx *ctx, const void *_batch, uint32_t batch_size, - uint64_t batch_addr) + uint64_t batch_addr, bool from_ring) { struct gen_group *inst; const uint32_t *p, *batch = (const uint32_t *) _batch, *end = batch + batch_size / sizeof(uint32_t); @@ -970,7 +970,7 @@ aub_viewer_render_batch(struct aub_viewer_decode_ctx *ctx, next_batch_addr); } else { aub_viewer_render_batch(ctx, next_batch.map, next_batch.size, - next_batch.addr); + next_batch.addr, false); } if (second_level) { /* MI_BATCH_BUFFER_START with "2nd Level Batch Buffer" set acts @@ -979,7 +979,7 @@ aub_viewer_render_batch(struct aub_viewer_decode_ctx *ctx, * MI_BATCH_BUFFER_END. */ continue; - } else { + } else if (!from_ring) { /* MI_BATCH_BUFFER_START with "2nd Level Batch Buffer" unset acts * like a goto. Nothing after it will ever get processed. In * order to prevent the recursion from growing, we just reset the diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c index 9c7f96873a8..cf40d8b7123 100644 --- a/src/intel/vulkan/anv_batch_chain.c +++ b/src/intel/vulkan/anv_batch_chain.c @@ -1735,7 +1735,7 @@ anv_cmd_buffer_execbuf(struct anv_device *device, device->cmd_buffer_being_decoded = cmd_buffer; gen_print_batch(&device->decoder_ctx, (*bo)->bo.map, - (*bo)->bo.size, (*bo)->bo.offset); + (*bo)->bo.size, (*bo)->bo.offset, false); device->cmd_buffer_being_decoded = NULL; } diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index aee795cbdbb..92e8f40278f 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -1795,11 +1795,13 @@ get_bo_from_pool(struct gen_batch_decode_bo *ret, /* Finding a buffer for batch decoding */ static struct gen_batch_decode_bo -decode_get_bo(void *v_batch, uint64_t address) +decode_get_bo(void *v_batch, bool ppgtt, uint64_t address) { struct anv_device *device = v_batch; struct gen_batch_decode_bo ret_bo = {}; + assert(ppgtt); + if (get_bo_from_pool(&ret_bo, &device->dynamic_state_pool.block_pool, address)) return ret_bo; if (get_bo_from_pool(&ret_bo, &device->instruction_state_pool.block_pool, address)) diff --git a/src/intel/vulkan/anv_queue.c b/src/intel/vulkan/anv_queue.c index 54e848fd15c..dcefed9e4dc 100644 --- a/src/intel/vulkan/anv_queue.c +++ b/src/intel/vulkan/anv_queue.c @@ -101,7 +101,7 @@ anv_device_submit_simple_batch(struct anv_device *device, execbuf.rsvd2 = 0; if (unlikely(INTEL_DEBUG & DEBUG_BATCH)) - gen_print_batch(&device->decoder_ctx, bo.map, bo.size, bo.offset); + gen_print_batch(&device->decoder_ctx, bo.map, bo.size, bo.offset, false); result = anv_device_execbuf(device, &execbuf, exec_bos); if (result != VK_SUCCESS) diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c index 0c7f2527218..a701f3bd353 100644 --- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c +++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c @@ -828,7 +828,7 @@ submit_batch(struct brw_context *brw, int in_fence_fd, int *out_fence_fd) if (unlikely(INTEL_DEBUG & DEBUG_BATCH)) { gen_print_batch(&batch->decoder, batch->batch.map, 4 * USED_BATCH(*batch), - batch->batch.bo->gtt_offset); + batch->batch.bo->gtt_offset, false); } if (brw->ctx.Const.ResetStrategy == GL_LOSE_CONTEXT_ON_RESET_ARB)