nvk: Store an nvk_buffer_address for each set in the root table.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29276>
This commit is contained in:
Faith Ekstrand 2024-05-17 09:58:00 -05:00 committed by Marge Bot
parent 0e417df499
commit 54ce220f10
5 changed files with 17 additions and 23 deletions

View File

@ -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

View File

@ -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;
};

View File

@ -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);

View File

@ -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 {

View File

@ -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),