mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-07 15:31:18 +12:00
Vulkan: Proper fix for sampler leak in draw_getOrCreateDescriptorSet
This commit is contained in:
parent
44a3c006f6
commit
f01360983f
4 changed files with 22 additions and 10 deletions
|
@ -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 };
|
||||||
};
|
};
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ struct VkSupportedFormatInfo_t
|
||||||
struct VkDescriptorSetInfo
|
struct VkDescriptorSetInfo
|
||||||
{
|
{
|
||||||
VKRObjectDescriptorSet* m_vkObjDescriptorSet{};
|
VKRObjectDescriptorSet* m_vkObjDescriptorSet{};
|
||||||
|
std::vector<VKRObjectSampler*> m_vkObjSamplers{};
|
||||||
|
|
||||||
~VkDescriptorSetInfo();
|
~VkDescriptorSetInfo();
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue