Module: Mesa Branch: main Commit: 576275907a1a1e20dd2318a00c9d591fb67f9ed1 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=576275907a1a1e20dd2318a00c9d591fb67f9ed1
Author: Paulo Zanoni <paulo.r.zan...@intel.com> Date: Mon Oct 23 17:35:31 2023 -0700 anv/sparse: pass anv_sparse_submission to the backend functions Our ultimate goal is to have the backend functions deal with the wait and signal syncobjs instead of waiting for them on the CPU inside anv_queue_submit_sparse_bind_locked(). For that, we'll need waits and signals parameters to be passed all the way to the backend functions that actually make the submission, and this is what this patch does, through struct anv_sparse_submission. This patch just deals with passing the parameters to the functions, nothing is using the new variables yet. There should be no functional changes here. The goal here is to make code review easier. Reviewed-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> Signed-off-by: Paulo Zanoni <paulo.r.zan...@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25512> --- src/intel/vulkan/anv_batch_chain.c | 7 +++++- src/intel/vulkan/anv_gem_stubs.c | 8 +++---- src/intel/vulkan/anv_kmd_backend.h | 6 ++++-- src/intel/vulkan/anv_private.h | 9 ++++++++ src/intel/vulkan/anv_sparse.c | 14 +++++++++++- src/intel/vulkan/genX_cmd_buffer.c | 3 ++- src/intel/vulkan/i915/anv_batch_chain.c | 5 +++-- src/intel/vulkan/i915/anv_batch_chain.h | 6 ++++-- src/intel/vulkan/i915/anv_kmd_backend.c | 3 +-- src/intel/vulkan/xe/anv_batch_chain.c | 5 +++-- src/intel/vulkan/xe/anv_batch_chain.h | 6 ++++-- src/intel/vulkan/xe/anv_kmd_backend.c | 38 ++++++++++++++++++++++----------- 12 files changed, 79 insertions(+), 31 deletions(-) diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c index 2196050208c..2fbd1cd0e3b 100644 --- a/src/intel/vulkan/anv_batch_chain.c +++ b/src/intel/vulkan/anv_batch_chain.c @@ -1437,6 +1437,10 @@ anv_queue_submit_sparse_bind_locked(struct anv_queue *queue, .binds = NULL, .binds_len = 0, .binds_capacity = 0, + .wait_count = submit->wait_count, + .signal_count = submit->signal_count, + .waits = submit->waits, + .signals = submit->signals, }; /* TODO: make both the syncs and signals be passed as part of the vm_bind @@ -1715,6 +1719,7 @@ anv_queue_submit_simple_batch(struct anv_queue *queue, VkResult anv_queue_submit_trtt_batch(struct anv_queue *queue, + struct anv_sparse_submission *submit, struct anv_batch *batch) { struct anv_device *device = queue->device; @@ -1738,7 +1743,7 @@ anv_queue_submit_trtt_batch(struct anv_queue *queue, batch_bo->offset, false); } - result = device->kmd_backend->execute_trtt_batch(queue, batch_bo, + result = device->kmd_backend->execute_trtt_batch(queue, submit, batch_bo, batch_size); anv_bo_pool_free(&device->batch_bo_pool, batch_bo); diff --git a/src/intel/vulkan/anv_gem_stubs.c b/src/intel/vulkan/anv_gem_stubs.c index 55f7a403ee7..aa592ffc3eb 100644 --- a/src/intel/vulkan/anv_gem_stubs.c +++ b/src/intel/vulkan/anv_gem_stubs.c @@ -66,8 +66,9 @@ stub_execute_simple_batch(struct anv_queue *queue, struct anv_bo *batch_bo, } static VkResult -stub_execute_trtt_batch(struct anv_queue *queue, struct anv_bo *batch_bo, - uint32_t batch_size) +stub_execute_trtt_batch(struct anv_queue *queue, + struct anv_sparse_submission *submit, + struct anv_bo *batch_bo, uint32_t batch_size) { return VK_ERROR_UNKNOWN; } @@ -174,8 +175,7 @@ anv_gem_import_bo_alloc_flags_to_bo_flags(struct anv_device *device, } static int -stub_vm_bind(struct anv_device *device, int num_binds, - struct anv_vm_bind *binds) +stub_vm_bind(struct anv_device *device, struct anv_sparse_submission *submit) { return 0; } diff --git a/src/intel/vulkan/anv_kmd_backend.h b/src/intel/vulkan/anv_kmd_backend.h index 5e3f508e49b..792466120de 100644 --- a/src/intel/vulkan/anv_kmd_backend.h +++ b/src/intel/vulkan/anv_kmd_backend.h @@ -38,6 +38,7 @@ struct anv_device; struct anv_queue; struct anv_query_pool; struct anv_utrace_submit; +struct anv_sparse_submission; enum anv_vm_bind_op { ANV_VM_BIND, @@ -68,8 +69,8 @@ struct anv_kmd_backend { void *(*gem_mmap)(struct anv_device *device, struct anv_bo *bo, uint64_t offset, uint64_t size); /* Bind things however you want. */ - int (*vm_bind)(struct anv_device *device, int num_binds, - struct anv_vm_bind *binds); + int (*vm_bind)(struct anv_device *device, + struct anv_sparse_submission *submit); /* Fully bind or unbind a BO. */ int (*vm_bind_bo)(struct anv_device *device, struct anv_bo *bo); int (*vm_unbind_bo)(struct anv_device *device, struct anv_bo *bo); @@ -78,6 +79,7 @@ struct anv_kmd_backend { uint32_t batch_bo_size, bool is_companion_rcs_batch); VkResult (*execute_trtt_batch)(struct anv_queue *queue, + struct anv_sparse_submission *submit, struct anv_bo *batch_bo, uint32_t batch_size); VkResult (*queue_exec_locked)(struct anv_queue *queue, diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index cef5139ef53..36c6fc686a2 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -715,6 +715,12 @@ struct anv_sparse_submission { struct anv_vm_bind *binds; int binds_len; int binds_capacity; + + uint32_t wait_count; + uint32_t signal_count; + + struct vk_sync_wait *waits; + struct vk_sync_signal *signals; }; struct anv_trtt_bind { @@ -723,6 +729,8 @@ struct anv_trtt_bind { }; struct anv_trtt_submission { + struct anv_sparse_submission *sparse; + struct anv_queue *queue; struct anv_trtt_bind *l3l2_binds; @@ -1934,6 +1942,7 @@ VkResult anv_queue_submit_simple_batch(struct anv_queue *queue, struct anv_batch *batch, bool is_companion_rcs_batch); VkResult anv_queue_submit_trtt_batch(struct anv_queue *queue, + struct anv_sparse_submission *submit, struct anv_batch *batch); void anv_queue_trace(struct anv_queue *queue, const char *label, diff --git a/src/intel/vulkan/anv_sparse.c b/src/intel/vulkan/anv_sparse.c index 74966695107..7bd5f9bffbe 100644 --- a/src/intel/vulkan/anv_sparse.c +++ b/src/intel/vulkan/anv_sparse.c @@ -539,6 +539,7 @@ anv_sparse_bind_trtt(struct anv_device *device, STACK_ARRAY(struct anv_trtt_bind, l3l2_binds, l3l2_binds_capacity); STACK_ARRAY(struct anv_trtt_bind, l1_binds, l1_binds_capacity); struct anv_trtt_submission trtt_submit = { + .sparse = sparse_submit, .queue = trtt->queue, .l3l2_binds = l3l2_binds, .l1_binds = l1_binds, @@ -596,7 +597,14 @@ anv_sparse_bind_vm_bind(struct anv_device *device, * See: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/746 */ for (int b = 0; b < submit->binds_len; b++) { - int rc = device->kmd_backend->vm_bind(device, 1, &submit->binds[b]); + struct anv_sparse_submission s = { + .binds = &submit->binds[b], + .binds_len = 1, + .binds_capacity = 1, + .wait_count = 0, + .signal_count = 0, + }; + int rc = device->kmd_backend->vm_bind(device, &s); if (rc) return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY); } @@ -650,6 +658,8 @@ anv_init_sparse_bindings(struct anv_device *device, .binds = &bind, .binds_len = 1, .binds_capacity = 1, + .wait_count = 0, + .signal_count = 0, }; VkResult res = anv_sparse_bind(device, &submit); if (res != VK_SUCCESS) { @@ -681,6 +691,8 @@ anv_free_sparse_bindings(struct anv_device *device, .binds = &unbind, .binds_len = 1, .binds_capacity = 1, + .wait_count = 0, + .signal_count = 0, }; VkResult res = anv_sparse_bind(device, &submit); if (res != VK_SUCCESS) diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index e04628f0445..aa4f6f3e776 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -8530,7 +8530,8 @@ genX(write_trtt_entries)(struct anv_trtt_submission *submit) assert(batch.next <= batch.end); - VkResult result = anv_queue_submit_trtt_batch(queue, &batch); + VkResult result = anv_queue_submit_trtt_batch(queue, submit->sparse, + &batch); STACK_ARRAY_FINISH(cmds); return result; diff --git a/src/intel/vulkan/i915/anv_batch_chain.c b/src/intel/vulkan/i915/anv_batch_chain.c index 1ea0697f2bd..ff9b8cd5123 100644 --- a/src/intel/vulkan/i915/anv_batch_chain.c +++ b/src/intel/vulkan/i915/anv_batch_chain.c @@ -985,8 +985,9 @@ fail: } VkResult -i915_execute_trtt_batch(struct anv_queue *queue, struct anv_bo *batch_bo, - uint32_t batch_size) +i915_execute_trtt_batch(struct anv_queue *queue, + struct anv_sparse_submission *submit, + struct anv_bo *batch_bo, uint32_t batch_size) { struct anv_device *device = queue->device; struct anv_trtt *trtt = &device->trtt; diff --git a/src/intel/vulkan/i915/anv_batch_chain.h b/src/intel/vulkan/i915/anv_batch_chain.h index eff38ce2ee2..715e27fd426 100644 --- a/src/intel/vulkan/i915/anv_batch_chain.h +++ b/src/intel/vulkan/i915/anv_batch_chain.h @@ -35,6 +35,7 @@ struct anv_bo; struct anv_cmd_buffer; struct anv_query_pool; struct anv_utrace_submit; +struct anv_sparse_submission; VkResult i915_queue_exec_trace(struct anv_queue *queue, @@ -44,8 +45,9 @@ i915_execute_simple_batch(struct anv_queue *queue, struct anv_bo *batch_bo, uint32_t batch_bo_size, bool is_companion_rcs_batch); VkResult -i915_execute_trtt_batch(struct anv_queue *queue, struct anv_bo *batch_bo, - uint32_t batch_size); +i915_execute_trtt_batch(struct anv_queue *queue, + struct anv_sparse_submission *submit, + struct anv_bo *batch_bo, uint32_t batch_size); VkResult i915_queue_exec_locked(struct anv_queue *queue, diff --git a/src/intel/vulkan/i915/anv_kmd_backend.c b/src/intel/vulkan/i915/anv_kmd_backend.c index 887a9dbf6c5..cf403267536 100644 --- a/src/intel/vulkan/i915/anv_kmd_backend.c +++ b/src/intel/vulkan/i915/anv_kmd_backend.c @@ -207,8 +207,7 @@ i915_gem_mmap(struct anv_device *device, struct anv_bo *bo, uint64_t offset, } static int -i915_vm_bind(struct anv_device *device, int num_binds, - struct anv_vm_bind *binds) +i915_vm_bind(struct anv_device *device, struct anv_sparse_submission *submit) { return 0; } diff --git a/src/intel/vulkan/xe/anv_batch_chain.c b/src/intel/vulkan/xe/anv_batch_chain.c index 187be25e5ca..a04dcfef791 100644 --- a/src/intel/vulkan/xe/anv_batch_chain.c +++ b/src/intel/vulkan/xe/anv_batch_chain.c @@ -179,8 +179,9 @@ xe_exec_print_debug(struct anv_queue *queue, uint32_t cmd_buffer_count, } VkResult -xe_execute_trtt_batch(struct anv_queue *queue, struct anv_bo *batch_bo, - uint32_t batch_size) +xe_execute_trtt_batch(struct anv_queue *queue, + struct anv_sparse_submission *submit, + struct anv_bo *batch_bo, uint32_t batch_size) { struct anv_device *device = queue->device; VkResult result = VK_SUCCESS; diff --git a/src/intel/vulkan/xe/anv_batch_chain.h b/src/intel/vulkan/xe/anv_batch_chain.h index d11dd11316a..b1bf6aff55e 100644 --- a/src/intel/vulkan/xe/anv_batch_chain.h +++ b/src/intel/vulkan/xe/anv_batch_chain.h @@ -34,13 +34,15 @@ struct anv_bo; struct anv_cmd_buffer; struct anv_query_pool; struct anv_utrace_submit; +struct anv_sparse_submission; VkResult xe_execute_simple_batch(struct anv_queue *queue, struct anv_bo *batch_bo, uint32_t batch_bo_size, bool is_companion_rcs_batch); VkResult -xe_execute_trtt_batch(struct anv_queue *queue, struct anv_bo *batch_bo, - uint32_t batch_size); +xe_execute_trtt_batch(struct anv_queue *queue, + struct anv_sparse_submission *submit, + struct anv_bo *batch_bo, uint32_t batch_size); VkResult xe_queue_exec_locked(struct anv_queue *queue, diff --git a/src/intel/vulkan/xe/anv_kmd_backend.c b/src/intel/vulkan/xe/anv_kmd_backend.c index a80bfb57c3b..853a4b3118e 100644 --- a/src/intel/vulkan/xe/anv_kmd_backend.c +++ b/src/intel/vulkan/xe/anv_kmd_backend.c @@ -97,20 +97,21 @@ xe_gem_mmap(struct anv_device *device, struct anv_bo *bo, uint64_t offset, } static inline int -xe_vm_bind_op(struct anv_device *device, int num_binds, - struct anv_vm_bind *binds) +xe_vm_bind_op(struct anv_device *device, + struct anv_sparse_submission *submit) { int ret; struct drm_xe_vm_bind args = { .vm_id = device->vm_id, - .num_binds = num_binds, + .num_binds = submit->binds_len, .bind = {}, }; - STACK_ARRAY(struct drm_xe_vm_bind_op, xe_binds_stackarray, num_binds); + STACK_ARRAY(struct drm_xe_vm_bind_op, xe_binds_stackarray, + submit->binds_len); struct drm_xe_vm_bind_op *xe_binds; - if (num_binds > 1) { + if (submit->binds_len > 1) { if (!xe_binds_stackarray) return -ENOMEM; @@ -120,8 +121,8 @@ xe_vm_bind_op(struct anv_device *device, int num_binds, xe_binds = &args.bind; } - for (int i = 0; i < num_binds; i++) { - struct anv_vm_bind *bind = &binds[i]; + for (int i = 0; i < submit->binds_len; i++) { + struct anv_vm_bind *bind = &submit->binds[i]; struct anv_bo *bo = bind->bo; struct drm_xe_vm_bind_op *xe_bind = &xe_binds[i]; @@ -161,10 +162,9 @@ xe_vm_bind_op(struct anv_device *device, int num_binds, } static int -xe_vm_bind(struct anv_device *device, int num_binds, - struct anv_vm_bind *binds) +xe_vm_bind(struct anv_device *device, struct anv_sparse_submission *submit) { - return xe_vm_bind_op(device, num_binds, binds); + return xe_vm_bind_op(device, submit); } static int xe_vm_bind_bo(struct anv_device *device, struct anv_bo *bo) @@ -176,7 +176,14 @@ static int xe_vm_bind_bo(struct anv_device *device, struct anv_bo *bo) .size = bo->actual_size, .op = ANV_VM_BIND, }; - return xe_vm_bind_op(device, 1, &bind); + struct anv_sparse_submission submit = { + .binds = &bind, + .binds_len = 1, + .binds_capacity = 1, + .wait_count = 0, + .signal_count = 0, + }; + return xe_vm_bind_op(device, &submit); } static int xe_vm_unbind_bo(struct anv_device *device, struct anv_bo *bo) @@ -188,7 +195,14 @@ static int xe_vm_unbind_bo(struct anv_device *device, struct anv_bo *bo) .size = bo->actual_size, .op = ANV_VM_UNBIND, }; - return xe_vm_bind_op(device, 1, &bind); + struct anv_sparse_submission submit = { + .binds = &bind, + .binds_len = 1, + .binds_capacity = 1, + .wait_count = 0, + .signal_count = 0, + }; + return xe_vm_bind_op(device, &submit); } static uint32_t