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:
parent
eacb8da9f7
commit
0af5ececa6
@ -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();
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user