Vulkan: Proper fix for sampler leak in draw_getOrCreateDescriptorSet

This commit is contained in:
goeiecool9999 2024-11-04 23:46:16 +01:00
parent 44a3c006f6
commit f01360983f
4 changed files with 22 additions and 10 deletions

View file

@ -128,7 +128,6 @@ public:
~VKRObjectTextureView() override; ~VKRObjectTextureView() override;
VkImageView m_textureImageView{ VK_NULL_HANDLE }; VkImageView m_textureImageView{ VK_NULL_HANDLE };
VkSampler m_textureViewSampler{ VK_NULL_HANDLE };
VkSampler m_textureDefaultSampler[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE }; // relict from LatteTextureViewVk, get rid of it eventually VkSampler m_textureDefaultSampler[2] = { VK_NULL_HANDLE, VK_NULL_HANDLE }; // relict from LatteTextureViewVk, get rid of it eventually
}; };
@ -206,4 +205,11 @@ public:
~VKRObjectDescriptorSet() override; ~VKRObjectDescriptorSet() override;
VkDescriptorSet descriptorSet{ VK_NULL_HANDLE }; VkDescriptorSet descriptorSet{ VK_NULL_HANDLE };
};
class VKRObjectSampler : public VKRDestructibleObject
{
public:
~VKRObjectSampler() override;
VkSampler sampler { VK_NULL_HANDLE };
}; };

View file

@ -3195,7 +3195,10 @@ VkDescriptorSetInfo::~VkDescriptorSetInfo()
performanceMonitor.vk.numDescriptorDynUniformBuffers.decrement(statsNumDynUniformBuffers); performanceMonitor.vk.numDescriptorDynUniformBuffers.decrement(statsNumDynUniformBuffers);
performanceMonitor.vk.numDescriptorStorageBuffers.decrement(statsNumStorageBuffers); performanceMonitor.vk.numDescriptorStorageBuffers.decrement(statsNumStorageBuffers);
VulkanRenderer::GetInstance()->ReleaseDestructibleObject(m_vkObjDescriptorSet); auto renderer = VulkanRenderer::GetInstance();
renderer->ReleaseDestructibleObject(m_vkObjDescriptorSet);
for(auto& sampler : m_vkObjSamplers)
renderer->ReleaseDestructibleObject(sampler);
m_vkObjDescriptorSet = nullptr; m_vkObjDescriptorSet = nullptr;
} }
@ -3791,8 +3794,6 @@ VKRObjectTextureView::VKRObjectTextureView(VKRObjectTexture* tex, VkImageView vi
VKRObjectTextureView::~VKRObjectTextureView() VKRObjectTextureView::~VKRObjectTextureView()
{ {
auto logicalDevice = VulkanRenderer::GetInstance()->GetLogicalDevice(); auto logicalDevice = VulkanRenderer::GetInstance()->GetLogicalDevice();
if (m_textureViewSampler != VK_NULL_HANDLE)
vkDestroySampler(logicalDevice, m_textureViewSampler, nullptr);
if (m_textureDefaultSampler[0] != VK_NULL_HANDLE) if (m_textureDefaultSampler[0] != VK_NULL_HANDLE)
vkDestroySampler(logicalDevice, m_textureDefaultSampler[0], nullptr); vkDestroySampler(logicalDevice, m_textureDefaultSampler[0], nullptr);
if (m_textureDefaultSampler[1] != VK_NULL_HANDLE) if (m_textureDefaultSampler[1] != VK_NULL_HANDLE)
@ -4008,3 +4009,9 @@ VKRObjectDescriptorSet::~VKRObjectDescriptorSet()
vkFreeDescriptorSets(vkr->GetLogicalDevice(), vkr->GetDescriptorPool(), 1, &descriptorSet); vkFreeDescriptorSets(vkr->GetLogicalDevice(), vkr->GetDescriptorPool(), 1, &descriptorSet);
performanceMonitor.vk.numDescriptorSets.decrement(); performanceMonitor.vk.numDescriptorSets.decrement();
} }
VKRObjectSampler::~VKRObjectSampler()
{
auto vkr = VulkanRenderer::GetInstance();
vkDestroySampler(vkr->GetLogicalDevice(), sampler, nullptr);
}

View file

@ -25,6 +25,7 @@ struct VkSupportedFormatInfo_t
struct VkDescriptorSetInfo struct VkDescriptorSetInfo
{ {
VKRObjectDescriptorSet* m_vkObjDescriptorSet{}; VKRObjectDescriptorSet* m_vkObjDescriptorSet{};
std::vector<VKRObjectSampler*> m_vkObjSamplers{};
~VkDescriptorSetInfo(); ~VkDescriptorSetInfo();

View file

@ -899,13 +899,11 @@ VkDescriptorSetInfo* VulkanRenderer::draw_getOrCreateDescriptorSet(PipelineInfo*
} }
} }
if(imageViewObj->m_textureViewSampler == VK_NULL_HANDLE) auto vkObjSampler = dsInfo->m_vkObjSamplers.emplace_back(new VKRObjectSampler);
{
if (vkCreateSampler(m_logicalDevice, &samplerInfo, nullptr, &imageViewObj->m_textureViewSampler) != VK_SUCCESS)
UnrecoverableError("Failed to create texture sampler");
}
info.sampler = imageViewObj->m_textureViewSampler; if (vkCreateSampler(m_logicalDevice, &samplerInfo, nullptr, &vkObjSampler->sampler) != VK_SUCCESS)
UnrecoverableError("Failed to create texture sampler");
info.sampler = vkObjSampler->sampler;
textureArray.emplace_back(info); textureArray.emplace_back(info);
} }