From 0d45486f2c56130b00598efe1cb9f6722d954c2a Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:12:06 -0600 Subject: [PATCH] nvk: Add a helper for pushing indirect data Part-of: --- src/nouveau/vulkan/nvk_cmd_buffer.c | 40 ++++++++++++++++++++++++++++++++----- src/nouveau/vulkan/nvk_cmd_buffer.h | 7 +++++++ 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.c b/src/nouveau/vulkan/nvk_cmd_buffer.c index 45a6392..df663cd 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.c +++ b/src/nouveau/vulkan/nvk_cmd_buffer.c @@ -1,9 +1,11 @@ #include "nvk_cmd_buffer.h" +#include "nvk_buffer.h" #include "nvk_cmd_pool.h" #include "nvk_descriptor_set.h" #include "nvk_descriptor_set_layout.h" #include "nvk_device.h" +#include "nvk_device_memory.h" #include "nvk_pipeline.h" #include "nvk_physical_device.h" @@ -140,6 +142,28 @@ nvk_cmd_buffer_new_push(struct nvk_cmd_buffer *cmd) } } +#define NVC0_IB_ENTRY_1_NO_PREFETCH (1 << (31 - 8)) + +void +nvk_cmd_buffer_push_indirect_buffer(struct nvk_cmd_buffer *cmd, + struct nvk_buffer *buffer, + uint64_t offset, uint64_t range) +{ + nvk_cmd_buffer_flush_push(cmd); + + /* 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(bo_offset < NVC0_IB_ENTRY_1_NO_PREFETCH); + + 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); +} + VkResult nvk_cmd_buffer_upload_alloc(struct nvk_cmd_buffer *cmd, uint32_t size, uint32_t alignment, @@ -456,11 +480,17 @@ nvk_cmd_buffer_dump(struct nvk_cmd_buffer *cmd, FILE *fp) struct nvk_device *dev = nvk_cmd_buffer_device(cmd); util_dynarray_foreach(&cmd->pushes, struct nvk_cmd_push, p) { - struct nv_push push = { - .start = (uint32_t *)p->map, - .end = (uint32_t *)((char *)p->map + p->range), - }; - vk_push_print(fp, &push, &dev->pdev->info); + if (p->map) { + struct nv_push push = { + .start = (uint32_t *)p->map, + .end = (uint32_t *)((char *)p->map + p->range), + }; + vk_push_print(fp, &push, &dev->pdev->info); + } else { + 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); + } } } diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.h b/src/nouveau/vulkan/nvk_cmd_buffer.h index cc36468..113215d 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.h +++ b/src/nouveau/vulkan/nvk_cmd_buffer.h @@ -13,6 +13,7 @@ #include +struct nvk_buffer; struct nvk_cmd_bo; struct nvk_cmd_pool; struct nvk_image_view; @@ -185,6 +186,12 @@ nvk_cmd_buffer_push(struct nvk_cmd_buffer *cmd, uint32_t dw_count) return &cmd->push; } +void +nvk_cmd_buffer_push_indirect_buffer(struct nvk_cmd_buffer *cmd, + struct nvk_buffer *buffer, + uint64_t offset, + uint64_t dw_count); + static inline void nvk_cmd_buffer_ref_bo(struct nvk_cmd_buffer *cmd, struct nouveau_ws_bo *bo) -- 2.7.4