1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-12 13:08:50 +01:00

[dxvk] Also reset descriptor pool when only one pool is in use

This way we can often avoid allocating additional descriptor pools.
This commit is contained in:
Philip Rebohle 2023-01-20 15:23:25 +01:00
parent eacb8da9f7
commit 0af5ececa6
2 changed files with 25 additions and 18 deletions

View File

@ -106,7 +106,7 @@ namespace dxvk {
size_t poolCount = m_descriptorPools.size(); size_t poolCount = m_descriptorPools.size();
if (poolCount > 1) { if (poolCount > 1 || m_setsAllocated > m_manager->getMaxSetCount() / 2) {
double factor = std::max(11.0 / 3.0 - double(poolCount) / 3.0, 1.0); double factor = std::max(11.0 / 3.0 - double(poolCount) / 3.0, 1.0);
isLowUsageFrame = double(m_setsUsed) * factor < double(m_setsAllocated); isLowUsageFrame = double(m_setsUsed) * factor < double(m_setsAllocated);
} }
@ -244,7 +244,12 @@ namespace dxvk {
DxvkDevice* device, DxvkDevice* device,
DxvkContextType contextType) DxvkContextType contextType)
: m_device(device), m_contextType(contextType) { : m_device(device), m_contextType(contextType) {
// Deliberately pick a very high number of descriptor sets so that
// we will typically end up using all available pool memory before
// the descriptor set limit becomes the limiting factor.
m_maxSets = m_contextType == DxvkContextType::Primary
? (env::is32BitHostPlatform() ? 24576u : 49152u)
: (512u);
} }
@ -288,29 +293,22 @@ namespace dxvk {
return m_vkPools[--m_vkPoolCount]; return m_vkPools[--m_vkPoolCount];
} }
// Deliberately pick a very high number of descriptor sets so that
// we will typically end up using all available pool memory before
// the descriptor set limit becomes the limiting factor.
uint32_t maxSets = m_contextType == DxvkContextType::Primary
? (env::is32BitHostPlatform() ? 24576u : 49152u)
: (512u);
// Samplers and uniform buffers may be special on some implementations // Samplers and uniform buffers may be special on some implementations
// so we should allocate space for a reasonable number of both, but // so we should allocate space for a reasonable number of both, but
// assume that all other descriptor types share pool memory. // assume that all other descriptor types share pool memory.
std::array<VkDescriptorPoolSize, 8> pools = {{ std::array<VkDescriptorPoolSize, 8> pools = {{
{ VK_DESCRIPTOR_TYPE_SAMPLER, maxSets * 1 }, { VK_DESCRIPTOR_TYPE_SAMPLER, m_maxSets * 1 },
{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, maxSets / 4 }, { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, m_maxSets / 4 },
{ VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, maxSets / 2 }, { VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, m_maxSets / 2 },
{ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, maxSets / 64 }, { VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, m_maxSets / 64 },
{ VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, maxSets / 2 }, { VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, m_maxSets / 2 },
{ VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, maxSets / 64 }, { VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, m_maxSets / 64 },
{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, maxSets * 2 }, { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, m_maxSets * 2 },
{ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, maxSets / 2 }, { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, m_maxSets / 2 },
}}; }};
VkDescriptorPoolCreateInfo info = { VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO }; VkDescriptorPoolCreateInfo info = { VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO };
info.maxSets = maxSets; info.maxSets = m_maxSets;
info.poolSizeCount = pools.size(); info.poolSizeCount = pools.size();
info.pPoolSizes = pools.data(); info.pPoolSizes = pools.data();

View File

@ -191,6 +191,14 @@ namespace dxvk {
~DxvkDescriptorManager(); ~DxvkDescriptorManager();
/**
* \brief Queries maximum number of descriptor sets per pool
* \returns Maximum set count
*/
uint32_t getMaxSetCount() const {
return m_maxSets;
}
/** /**
* \brief Retrieves or creates a descriptor type * \brief Retrieves or creates a descriptor type
* \returns The descriptor pool * \returns The descriptor pool
@ -229,6 +237,7 @@ namespace dxvk {
DxvkDevice* m_device; DxvkDevice* m_device;
DxvkContextType m_contextType; DxvkContextType m_contextType;
uint32_t m_maxSets = 0;
DxvkRecycler<DxvkDescriptorPool, 8> m_pools; DxvkRecycler<DxvkDescriptorPool, 8> m_pools;
dxvk::mutex m_mutex; dxvk::mutex m_mutex;