diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.c b/src/nouveau/vulkan/nvk_cmd_buffer.c index 2ce759656f7..c3f26df89f0 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.c +++ b/src/nouveau/vulkan/nvk_cmd_buffer.c @@ -264,6 +264,8 @@ nvk_CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VK_FROM_HANDLE(nvk_descriptor_set, set, pDescriptorSets[i]); if (desc->sets[set_idx] != set) { + nvk_push_descriptor_set_ref(cmd->push, set); + desc->root.sets[set_idx] = nvk_descriptor_set_addr(set); desc->sets[set_idx] = set; desc->sets_dirty |= BITFIELD_BIT(set_idx); } diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.h b/src/nouveau/vulkan/nvk_cmd_buffer.h index 7dd34ed2dd5..3145ee210b9 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.h +++ b/src/nouveau/vulkan/nvk_cmd_buffer.h @@ -19,7 +19,19 @@ struct nvk_cmd_pool { VK_DEFINE_NONDISP_HANDLE_CASTS(nvk_cmd_pool, vk.base, VkCommandPool, VK_OBJECT_TYPE_COMMAND_POOL) +/** Root descriptor table. This gets pushed to the GPU directly */ +struct nvk_root_descriptor_table { + /* Client push constants */ + uint8_t push[128]; + + /* Descriptor set base addresses */ + uint64_t sets[NVK_MAX_SETS]; + + /* TODO: Dynamic buffer bindings */ +}; + struct nvk_descriptor_state { + struct nvk_root_descriptor_table root; struct nvk_descriptor_set *sets[NVK_MAX_SETS]; uint32_t sets_dirty; };