diff --git a/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp b/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp index c96b5b145f..9b5f288141 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp @@ -430,6 +430,17 @@ namespace vk } } + void descriptor_set::push(const descriptor_set_dynamic_offset_t& offset) + { + ensure(offset.location >= 0 && offset.location <= 16); + while (m_dynamic_offsets.size() < (offset.location + 1)) + { + m_dynamic_offsets.push_back(0); + } + + m_dynamic_offsets[offset.location] = offset.value; + } + void descriptor_set::bind(const vk::command_buffer& cmd, VkPipelineBindPoint bind_point, VkPipelineLayout layout) { if ((m_push_type_mask & ~m_update_after_bind_mask) || (m_pending_writes.size() >= max_cache_size)) @@ -437,7 +448,7 @@ namespace vk flush(); } - vkCmdBindDescriptorSets(cmd, bind_point, layout, 0, 1, &m_handle, 0, nullptr); + vkCmdBindDescriptorSets(cmd, bind_point, layout, 0, 1, &m_handle, ::size32(m_dynamic_offsets), m_dynamic_offsets.data()); } void descriptor_set::flush() diff --git a/rpcs3/Emu/RSX/VK/vkutils/descriptors.h b/rpcs3/Emu/RSX/VK/vkutils/descriptors.h index 37798187b0..6c61488b6e 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/descriptors.h +++ b/rpcs3/Emu/RSX/VK/vkutils/descriptors.h @@ -27,6 +27,12 @@ namespace vk } }; + struct descriptor_set_dynamic_offset_t + { + int location; + u32 value; + }; + class descriptor_pool { public: @@ -95,6 +101,7 @@ namespace vk void push(const VkDescriptorImageInfo& image_info, VkDescriptorType type, u32 binding); void push(const VkDescriptorImageInfo* image_info, u32 count, VkDescriptorType type, u32 binding); void push(rsx::simple_array& copy_cmd, u32 type_mask = umax); + void push(const descriptor_set_dynamic_offset_t& offset); void bind(const vk::command_buffer& cmd, VkPipelineBindPoint bind_point, VkPipelineLayout layout); @@ -109,6 +116,7 @@ namespace vk rsx::simple_array m_buffer_view_pool; rsx::simple_array m_buffer_info_pool; rsx::simple_array m_image_info_pool; + rsx::simple_array m_dynamic_offsets; #ifdef __clang__ // Clang (pre 16.x) does not support LWG 2089, std::construct_at for POD types