From 721d0cebadd555f519b0ccb2b076b6e5b74a1b55 Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Mon, 4 Nov 2024 19:54:04 +0100 Subject: [PATCH] Vulkan: Fix sampler object leak --- src/Cafe/HW/Latte/Renderer/Vulkan/VKRBase.h | 1 + src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp | 2 ++ .../HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp | 11 +++++++---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VKRBase.h b/src/Cafe/HW/Latte/Renderer/Vulkan/VKRBase.h index f79bd2dc..30ef8375 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VKRBase.h +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VKRBase.h @@ -128,6 +128,7 @@ 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 }; diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp index 4c871650..6e67f574 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp @@ -3773,6 +3773,8 @@ 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) diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp index 3a684072..65fe232d 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRendererCore.cpp @@ -727,7 +727,6 @@ VkDescriptorSetInfo* VulkanRenderer::draw_getOrCreateDescriptorSet(PipelineInfo* VkSamplerCustomBorderColorCreateInfoEXT samplerCustomBorderColor{}; - VkSampler sampler; VkSamplerCreateInfo samplerInfo{}; samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; @@ -900,9 +899,13 @@ VkDescriptorSetInfo* VulkanRenderer::draw_getOrCreateDescriptorSet(PipelineInfo* } } - if (vkCreateSampler(m_logicalDevice, &samplerInfo, nullptr, &sampler) != VK_SUCCESS) - UnrecoverableError("Failed to create texture sampler"); - info.sampler = sampler; + if(imageViewObj->m_textureViewSampler == VK_NULL_HANDLE) + { + if (vkCreateSampler(m_logicalDevice, &samplerInfo, nullptr, &imageViewObj->m_textureViewSampler) != VK_SUCCESS) + UnrecoverableError("Failed to create texture sampler"); + } + + info.sampler = imageViewObj->m_textureViewSampler; textureArray.emplace_back(info); }