diff options
author | Dave Airlie <airlied@redhat.com> | 2023-03-22 13:14:37 +1000 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2023-08-04 21:32:07 +0000 |
commit | 9a0a5f8561939c0787798cc22e008c9ccc0d5bb6 (patch) | |
tree | 38b9b59794dd40690e61257e8692dfcdca5aa784 | |
parent | 723041a3ed75c78d705e42d3f679ce305b3df8ab (diff) |
nvk: Handle pre-turing indirect buffers with sparse
Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
-rw-r--r-- | src/nouveau/vulkan/nvk_cmd_buffer.c | 35 | ||||
-rw-r--r-- | src/nouveau/vulkan/nvk_cmd_buffer.h | 8 | ||||
-rw-r--r-- | src/nouveau/vulkan/nvk_queue_drm_nouveau.c | 5 |
3 files changed, 36 insertions, 12 deletions
diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.c b/src/nouveau/vulkan/nvk_cmd_buffer.c index 46e53396806..6710e426f6e 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.c +++ b/src/nouveau/vulkan/nvk_cmd_buffer.c @@ -114,10 +114,17 @@ static void nvk_cmd_buffer_flush_push(struct nvk_cmd_buffer *cmd) { if (likely(cmd->push_bo != NULL)) { + const uint32_t bo_offset = + (char *)cmd->push.start - (char *)cmd->push_bo->map; + struct nvk_cmd_push push = { - .bo = cmd->push_bo->bo, .map = cmd->push.start, - .bo_offset = (char *)cmd->push.start - (char *)cmd->push_bo->map, +#if NVK_NEW_UAPI == 1 + .addr = cmd->push_bo->bo->offset + bo_offset, +#else + .bo = cmd->push_bo->bo, + .bo_offset = bo_offset, +#endif .range = nv_push_dw_count(&cmd->push) * 4, }; util_dynarray_append(&cmd->pushes, struct nvk_cmd_push, push); @@ -153,21 +160,25 @@ nvk_cmd_buffer_push_indirect_buffer(struct nvk_cmd_buffer *cmd, { nvk_cmd_buffer_flush_push(cmd); + uint64_t addr = nvk_buffer_address(buffer, offset); + assert(range < NVC0_IB_ENTRY_1_NO_PREFETCH); + #if NVK_NEW_UAPI == 1 - unreachable("Does not yet support sparse"); + struct nvk_cmd_push push = { + .addr = addr, + .range = NVC0_IB_ENTRY_1_NO_PREFETCH | range, + }; #else - /* TODO: The new uAPI should just take addresses */ struct nouveau_ws_bo *bo = buffer->mem->bo; - uint64_t bo_offset = nvk_buffer_address(buffer, offset) - bo->offset; - assert(range < NVC0_IB_ENTRY_1_NO_PREFETCH); - + uint64_t bo_offset = addr - bo->offset; struct nvk_cmd_push push = { .bo = bo, .bo_offset = bo_offset, .range = NVC0_IB_ENTRY_1_NO_PREFETCH | range, }; - util_dynarray_append(&cmd->pushes, struct nvk_cmd_push, push); #endif + + util_dynarray_append(&cmd->pushes, struct nvk_cmd_push, push); } VkResult @@ -493,9 +504,13 @@ nvk_cmd_buffer_dump(struct nvk_cmd_buffer *cmd, FILE *fp) }; vk_push_print(fp, &push, &dev->pdev->info); } else { +#if NVK_NEW_UAPI == 1 + const uint64_t addr = p->addr; +#else + const uint64_t addr = p->bo->offset + p->bo_offset; +#endif fprintf(fp, "<%u B of INDIRECT DATA at 0x%" PRIx64 ">\n", - p->range & ~NVC0_IB_ENTRY_1_NO_PREFETCH, - p->bo->offset + p->bo_offset); + p->range & ~NVC0_IB_ENTRY_1_NO_PREFETCH, addr); } } } diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.h b/src/nouveau/vulkan/nvk_cmd_buffer.h index 82e70edfe54..7b7e7882ece 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.h +++ b/src/nouveau/vulkan/nvk_cmd_buffer.h @@ -103,9 +103,13 @@ struct nvk_compute_state { }; struct nvk_cmd_push { - struct nouveau_ws_bo *bo; void *map; - uint32_t bo_offset; +#if NVK_NEW_UAPI == 1 + uint64_t addr; +#else + struct nouveau_ws_bo *bo; + uint64_t bo_offset; +#endif uint32_t range; }; diff --git a/src/nouveau/vulkan/nvk_queue_drm_nouveau.c b/src/nouveau/vulkan/nvk_queue_drm_nouveau.c index 9ee885789b4..6cca10e3378 100644 --- a/src/nouveau/vulkan/nvk_queue_drm_nouveau.c +++ b/src/nouveau/vulkan/nvk_queue_drm_nouveau.c @@ -479,8 +479,13 @@ nvk_queue_submit_drm_nouveau(struct nvk_queue *queue, list_for_each_entry_safe(struct nvk_cmd_bo, bo, &cmd->bos, link) push_add_bo(&pb, bo->bo, NOUVEAU_WS_BO_RD); +#if NVK_NEW_UAPI == 1 + util_dynarray_foreach(&cmd->pushes, struct nvk_cmd_push, push) + push_add_push(&pb, push->addr, push->range); +#else util_dynarray_foreach(&cmd->pushes, struct nvk_cmd_push, push) push_add_push_bo(&pb, push->bo, push->bo_offset, push->range); +#endif util_dynarray_foreach(&cmd->bo_refs, struct nvk_cmd_bo_ref, ref) push_add_bo(&pb, ref->bo, NOUVEAU_WS_BO_RDWR); |