rsx/vk: Suppress the pool growth signal a bit

- Still allows for growth when needed but avoids creating larger sets unless there really is demand for it
This commit is contained in:
kd-11 2026-06-05 03:53:12 +03:00 committed by Ani
parent 8e370c2cf1
commit bf85a3fdd9
2 changed files with 36 additions and 13 deletions

View File

@ -110,6 +110,31 @@ namespace vk
}
}
u32 descriptor_pool::autoscaling_config_t::get_pool_size()
{
if (current_size < min_pool_size)
{
current_size = min_pool_size;
return min_pool_size;
}
if (current_size >= max_pool_size)
{
current_size = max_pool_size;
return max_pool_size;
}
// Try grow
if ((increment_steps++) < (increment_min_steps - 1u))
{
return current_size;
}
increment_steps = 0u;
current_size = std::min(current_size * 2u, max_pool_size);
return current_size;
}
void descriptor_pool::create(const vk::render_device& dev, const rsx::simple_array<VkDescriptorPoolSize>& pool_sizes, u32 min_sets, u32 max_sets)
{
m_autoscaling_config.min_pool_size = std::max(min_sets, 16u);
@ -276,16 +301,8 @@ namespace vk
std::pair<VkResult, VkDescriptorPool> descriptor_pool::new_subpool()
{
// Try autoscaling
u32 set_count = m_autoscaling_config.current_size;
if (set_count < m_autoscaling_config.min_pool_size)
{
set_count = m_autoscaling_config.min_pool_size;
}
else if (set_count < m_autoscaling_config.max_pool_size)
{
// Scale up
set_count = std::min(m_autoscaling_config.max_pool_size, set_count * 2u);
}
const auto prev_scaling_config = m_autoscaling_config;
const u32 set_count = m_autoscaling_config.get_pool_size();
// Configure request using current pool size
auto descriptor_pool_sizes = m_create_info_pool_sizes.map([set_count](const VkDescriptorPoolSize& pool_size_info)
@ -302,10 +319,10 @@ namespace vk
VkDescriptorPool subpool = VK_NULL_HANDLE;
VkResult result = vkCreateDescriptorPool(*m_owner, &m_create_info, nullptr, &subpool);
if (result == VK_SUCCESS)
if (result != VK_SUCCESS)
{
// Commit autoscaling
m_autoscaling_config.current_size = set_count;
// Roll back autoscaling
m_autoscaling_config = prev_scaling_config;
}
// Cleanup

View File

@ -67,6 +67,12 @@ namespace vk
u32 min_pool_size = 0;
u32 max_pool_size = 0;
u32 current_size = 0;
// Debounce setup.
static constexpr u32 increment_min_steps = 2u;
u32 increment_steps = 0;
u32 get_pool_size();
};
const vk::render_device* m_owner = nullptr;