diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VKRBase.h b/src/Cafe/HW/Latte/Renderer/Vulkan/VKRBase.h index 30ef8375..06b53d08 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VKRBase.h +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VKRBase.h @@ -128,7 +128,6 @@ public: ~VKRObjectTextureView() override; 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 }; @@ -206,4 +205,11 @@ public: ~VKRObjectDescriptorSet() override; VkDescriptorSet descriptorSet{ VK_NULL_HANDLE }; +}; + +class VKRObjectSampler : public VKRDestructibleObject +{ +public: + ~VKRObjectSampler() override; + VkSampler sampler { VK_NULL_HANDLE }; }; \ No newline at end of file diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp index ed33a03f..f5696ea4 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp @@ -3195,7 +3195,10 @@ VkDescriptorSetInfo::~VkDescriptorSetInfo() performanceMonitor.vk.numDescriptorDynUniformBuffers.decrement(statsNumDynUniformBuffers); 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; } @@ -3791,8 +3794,6 @@ VKRObjectTextureView::VKRObjectTextureView(VKRObjectTexture* tex, VkImageView vi VKRObjectTextureView::~VKRObjectTextureView() { auto logicalDevice = VulkanRenderer::GetInstance()->GetLogicalDevice(); - if (m_textureViewSampler != VK_NULL_HANDLE) - vkDestroySampler(logicalDevice, m_textureViewSampler, nullptr); if (m_textureDefaultSampler[0] != VK_NULL_HANDLE) vkDestroySampler(logicalDevice, m_textureDefaultSampler[0], nullptr); if (m_textureDefaultSampler[1] != VK_NULL_HANDLE) @@ -4008,3 +4009,9 @@ VKRObjectDescriptorSet::~VKRObjectDescriptorSet() vkFreeDescriptorSets(vkr->GetLogicalDevice(), vkr->GetDescriptorPool(), 1, &descriptorSet); performanceMonitor.vk.numDescriptorSets.decrement(); } + +VKRObjectSampler::~VKRObjectSampler() +{ + auto vkr = VulkanRenderer::GetInstance(); + vkDestroySampler(vkr->GetLogicalDevice(), sampler, nullptr); +} diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h index fe35a8ad..df47b366 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h @@ -25,6 +25,7 @@ struct VkSupportedFormatInfo_t struct VkDescriptorSetInfo { VKRObjectDescriptorSet* m_vkObjDescriptorSet{}; + std::vector m_vkObjSamplers{}; ~VkDescriptorSetInfo(); diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp index 65fe232d..c42ceb66 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp @@ -899,13 +899,11 @@ VkDescriptorSetInfo* VulkanRenderer::draw_getOrCreateDescriptorSet(PipelineInfo* } } - if(imageViewObj->m_textureViewSampler == VK_NULL_HANDLE) - { - if (vkCreateSampler(m_logicalDevice, &samplerInfo, nullptr, &imageViewObj->m_textureViewSampler) != VK_SUCCESS) - UnrecoverableError("Failed to create texture sampler"); - } + auto vkObjSampler = dsInfo->m_vkObjSamplers.emplace_back(new VKRObjectSampler); - 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); }