diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 06950c814..1ce295768 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -103,9 +103,9 @@ namespace dxvk { m_initBarriers.recordCommands(m_cmd); m_execBarriers.recordCommands(m_cmd); - if (m_type != DxvkContextType::Primary) { + if (m_descriptorPool->shouldSubmit(false)) { m_cmd->trackDescriptorPool(m_descriptorPool, m_descriptorManager); - m_descriptorPool = nullptr; + m_descriptorPool = m_descriptorManager->getDescriptorPool(); } m_cmd->endRecording(); @@ -114,7 +114,7 @@ namespace dxvk { void DxvkContext::endFrame() { - if (m_descriptorPool != nullptr) { + if (m_descriptorPool->shouldSubmit(true)) { m_cmd->trackDescriptorPool(m_descriptorPool, m_descriptorManager); m_descriptorPool = m_descriptorManager->getDescriptorPool(); } diff --git a/src/dxvk/dxvk_descriptor.cpp b/src/dxvk/dxvk_descriptor.cpp index 3e2ab8e14..0516baeeb 100644 --- a/src/dxvk/dxvk_descriptor.cpp +++ b/src/dxvk/dxvk_descriptor.cpp @@ -50,6 +50,24 @@ namespace dxvk { } + bool DxvkDescriptorPool::shouldSubmit(bool endFrame) { + // Never submit empty descriptor pools + if (!m_setsAllocated) + return false; + + // No frame tracking for supplementary contexts, so + // always submit those at the end of a command list + if (endFrame || m_contextType != DxvkContextType::Primary) + return true; + + // Submit very large descriptor pools to prevent extreme + // memory bloat. This may be necessary for off-screen + // rendering applications, or in situations where games + // pre-render a lot of images without presenting in between. + return m_descriptorPools.size() >= 8; + } + + void DxvkDescriptorPool::alloc( const DxvkBindingLayoutObjects* layout, uint32_t setMask, diff --git a/src/dxvk/dxvk_descriptor.h b/src/dxvk/dxvk_descriptor.h index d1fc4a6af..05534f0f2 100644 --- a/src/dxvk/dxvk_descriptor.h +++ b/src/dxvk/dxvk_descriptor.h @@ -88,6 +88,14 @@ namespace dxvk { ~DxvkDescriptorPool(); + /** + * \brief Tests whether the descriptor pool should be replaced + * + * \param [in] endFrame Whether this is the end of the frame + * \returns \c true if the pool should be submitted + */ + bool shouldSubmit(bool endFrame); + /** * \brief Allocates one or multiple descriptor sets *