From 54ce220f1084d0d399ef5036ba27cad66cf7635c Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Fri, 17 May 2024 09:58:00 -0500 Subject: [PATCH] nvk: Store an nvk_buffer_address for each set in the root table. Part-of: --- src/nouveau/vulkan/nvk_cmd_buffer.c | 16 +++++----------- src/nouveau/vulkan/nvk_cmd_buffer.h | 7 +++---- src/nouveau/vulkan/nvk_cmd_meta.c | 4 ---- src/nouveau/vulkan/nvk_descriptor_set.h | 9 +++++++-- src/nouveau/vulkan/nvk_nir_lower_descriptors.c | 4 ++-- 5 files changed, 17 insertions(+), 23 deletions(-) diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.c b/src/nouveau/vulkan/nvk_cmd_buffer.c index 750a66c5b20..d613ea481ae 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.c +++ b/src/nouveau/vulkan/nvk_cmd_buffer.c @@ -632,13 +632,8 @@ nvk_bind_descriptor_sets(UNUSED struct nvk_cmd_buffer *cmd, if (desc->sets[s] != set) { if (set != NULL) { desc->root.sets[s] = nvk_descriptor_set_addr(set); - desc->set_addrs[s] = (struct nvk_buffer_address) { - .base_addr = nvk_descriptor_set_addr(set), - .size = set->size, - }; } else { - desc->root.sets[s] = 0; - desc->set_addrs[s] = (struct nvk_buffer_address) { .size = 0 }; + desc->root.sets[s] = NVK_BUFFER_ADDRESS_NULL; } desc->sets[s] = set; } @@ -796,8 +791,7 @@ nvk_cmd_buffer_flush_push_descriptors(struct nvk_cmd_buffer *cmd, return; } - desc->root.sets[set_idx] = push_set_addr; - desc->set_addrs[set_idx] = (struct nvk_buffer_address) { + desc->root.sets[set_idx] = (struct nvk_buffer_address) { .base_addr = push_set_addr, .size = sizeof(push_set->data), }; @@ -828,7 +822,7 @@ nvk_cmd_buffer_get_cbuf_descriptor(struct nvk_cmd_buffer *cmd, return true; case NVK_CBUF_TYPE_DESC_SET: - *desc_out = desc->set_addrs[cbuf->desc_set]; + *desc_out = desc->root.sets[cbuf->desc_set]; return true; case NVK_CBUF_TYPE_DYNAMIC_UBO: { @@ -864,8 +858,8 @@ nvk_cmd_buffer_get_cbuf_descriptor_addr(struct nvk_cmd_buffer *cmd, { assert(cbuf->type == NVK_CBUF_TYPE_UBO_DESC); - assert(cbuf->desc_offset < desc->set_addrs[cbuf->desc_set].size); - return desc->root.sets[cbuf->desc_set] + cbuf->desc_offset; + assert(cbuf->desc_offset < desc->root.sets[cbuf->desc_set].size); + return desc->root.sets[cbuf->desc_set].base_addr + cbuf->desc_offset; } void diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.h b/src/nouveau/vulkan/nvk_cmd_buffer.h index e9e14af3b15..0ffebd6c4a8 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.h +++ b/src/nouveau/vulkan/nvk_cmd_buffer.h @@ -53,8 +53,8 @@ struct nvk_root_descriptor_table { /* Client push constants */ uint8_t push[NVK_MAX_PUSH_SIZE]; - /* Descriptor set base addresses */ - uint64_t sets[NVK_MAX_SETS]; + /* Descriptor set addresses */ + struct nvk_buffer_address sets[NVK_MAX_SETS]; /* Dynamic buffer bindings */ struct nvk_buffer_address dynamic_buffers[NVK_MAX_DYNAMIC_BUFFERS]; @@ -63,7 +63,7 @@ struct nvk_root_descriptor_table { uint8_t set_dynamic_buffer_start[NVK_MAX_SETS]; /* enfore alignment to 0x100 as needed pre pascal */ - uint8_t __padding[0x18]; + uint8_t __padding[0xd8]; }; /* helper macro for computing root descriptor byte offsets */ @@ -73,7 +73,6 @@ struct nvk_root_descriptor_table { struct nvk_descriptor_state { struct nvk_root_descriptor_table root; struct nvk_descriptor_set *sets[NVK_MAX_SETS]; - struct nvk_buffer_address set_addrs[NVK_MAX_SETS]; struct nvk_push_descriptor_set *push[NVK_MAX_SETS]; uint32_t push_dirty; }; diff --git a/src/nouveau/vulkan/nvk_cmd_meta.c b/src/nouveau/vulkan/nvk_cmd_meta.c index 1af4f261677..03325e98276 100644 --- a/src/nouveau/vulkan/nvk_cmd_meta.c +++ b/src/nouveau/vulkan/nvk_cmd_meta.c @@ -135,10 +135,6 @@ nvk_meta_end(struct nvk_cmd_buffer *cmd, if (save->desc0) { desc->sets[0] = save->desc0; desc->root.sets[0] = nvk_descriptor_set_addr(save->desc0); - desc->set_addrs[0] = (struct nvk_buffer_address) { - .base_addr = nvk_descriptor_set_addr(save->desc0), - .size = save->desc0->size, - }; } else if (save->has_push_desc0) { *desc->push[0] = save->push_desc0; desc->push_dirty |= BITFIELD_BIT(0); diff --git a/src/nouveau/vulkan/nvk_descriptor_set.h b/src/nouveau/vulkan/nvk_descriptor_set.h index 808d5c8a35c..c02c83c71ae 100644 --- a/src/nouveau/vulkan/nvk_descriptor_set.h +++ b/src/nouveau/vulkan/nvk_descriptor_set.h @@ -64,6 +64,8 @@ PRAGMA_DIAGNOSTIC_POP static_assert(sizeof(struct nvk_buffer_address) == 16, "nvk_buffer_address has no holes"); +#define NVK_BUFFER_ADDRESS_NULL ((struct nvk_buffer_address) { .size = 0 }) + struct nvk_descriptor_pool { struct vk_object_base base; @@ -94,10 +96,13 @@ struct nvk_descriptor_set { VK_DEFINE_NONDISP_HANDLE_CASTS(nvk_descriptor_set, base, VkDescriptorSet, VK_OBJECT_TYPE_DESCRIPTOR_SET) -static inline uint64_t +static inline struct nvk_buffer_address nvk_descriptor_set_addr(const struct nvk_descriptor_set *set) { - return set->addr; + return (struct nvk_buffer_address) { + .base_addr = set->addr, + .size = set->size, + }; } struct nvk_push_descriptor_set { diff --git a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c index 74c9760c3bf..a4a5d2d6862 100644 --- a/src/nouveau/vulkan/nvk_nir_lower_descriptors.c +++ b/src/nouveau/vulkan/nvk_nir_lower_descriptors.c @@ -532,8 +532,8 @@ static nir_def * load_descriptor_set_addr(nir_builder *b, uint32_t set, UNUSED const struct lower_descriptors_ctx *ctx) { - uint32_t set_addr_offset = - nvk_root_descriptor_offset(sets) + set * sizeof(uint64_t); + uint32_t set_addr_offset = nvk_root_descriptor_offset(sets) + + set * sizeof(struct nvk_buffer_address); return nir_load_ubo(b, 1, 64, nir_imm_int(b, 0), nir_imm_int(b, set_addr_offset),