nvk: Store descriptor set addresses in descriptor state

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29276>
This commit is contained in:
Faith Ekstrand 2024-05-13 20:20:59 -05:00 committed by Marge Bot
parent f55c51a343
commit 6fcfcd2625
3 changed files with 23 additions and 15 deletions

View file

@ -632,10 +632,13 @@ 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_sizes[s] = set->size;
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_sizes[s] = 0;
desc->set_addrs[s] = (struct nvk_buffer_address) { .size = 0 };
}
desc->sets[s] = set;
}
@ -794,7 +797,10 @@ nvk_cmd_buffer_flush_push_descriptors(struct nvk_cmd_buffer *cmd,
}
desc->root.sets[set_idx] = push_set_addr;
desc->set_sizes[set_idx] = sizeof(push_set->data);
desc->set_addrs[set_idx] = (struct nvk_buffer_address) {
.base_addr = push_set_addr,
.size = sizeof(push_set->data),
};
}
}
@ -822,10 +828,7 @@ nvk_cmd_buffer_get_cbuf_descriptor(struct nvk_cmd_buffer *cmd,
return true;
case NVK_CBUF_TYPE_DESC_SET:
*desc_out = (struct nvk_buffer_address) {
.base_addr = desc->root.sets[cbuf->desc_set],
.size = desc->set_sizes[cbuf->desc_set],
};
*desc_out = desc->set_addrs[cbuf->desc_set];
return true;
case NVK_CBUF_TYPE_DYNAMIC_UBO: {
@ -861,7 +864,7 @@ 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_sizes[cbuf->desc_set]);
assert(cbuf->desc_offset < desc->set_addrs[cbuf->desc_set].size);
return desc->root.sets[cbuf->desc_set] + cbuf->desc_offset;
}

View file

@ -72,8 +72,8 @@ struct nvk_root_descriptor_table {
struct nvk_descriptor_state {
struct nvk_root_descriptor_table root;
uint32_t set_sizes[NVK_MAX_SETS];
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

@ -130,13 +130,18 @@ static void
nvk_meta_end(struct nvk_cmd_buffer *cmd,
struct nvk_meta_save *save)
{
struct nvk_descriptor_state *desc = &cmd->state.gfx.descriptors;
if (save->desc0) {
cmd->state.gfx.descriptors.sets[0] = save->desc0;
cmd->state.gfx.descriptors.set_sizes[0] = save->desc0->size;
cmd->state.gfx.descriptors.root.sets[0] = nvk_descriptor_set_addr(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) {
*cmd->state.gfx.descriptors.push[0] = save->push_desc0;
cmd->state.gfx.descriptors.push_dirty |= BITFIELD_BIT(0);
*desc->push[0] = save->push_desc0;
desc->push_dirty |= BITFIELD_BIT(0);
}
/* Restore the dynamic state */
@ -158,7 +163,7 @@ nvk_meta_end(struct nvk_cmd_buffer *cmd,
nvk_cmd_bind_vertex_buffer(cmd, 0, save->vb0);
memcpy(cmd->state.gfx.descriptors.root.push, save->push, sizeof(save->push));
memcpy(desc->root.push, save->push, sizeof(save->push));
struct nv_push *p = nvk_cmd_buffer_push(cmd, 2);
P_IMMD(p, NV9097, SET_STATISTICS_COUNTER, {