diff --git a/Common/Vulkan/VulkanContext.h b/Common/Vulkan/VulkanContext.h index befe805900..ba10674760 100644 --- a/Common/Vulkan/VulkanContext.h +++ b/Common/Vulkan/VulkanContext.h @@ -66,18 +66,18 @@ class VulkanDeleteList { }; public: - void QueueDeleteDescriptorPool(VkDescriptorPool pool) { descPools_.push_back(pool); } - void QueueDeleteShaderModule(VkShaderModule module) { modules_.push_back(module); } - void QueueDeleteBuffer(VkBuffer buffer) { buffers_.push_back(buffer); } - void QueueDeleteBufferView(VkBufferView bufferView) { bufferViews_.push_back(bufferView); } - void QueueDeleteImage(VkImage image) { images_.push_back(image); } - void QueueDeleteImageView(VkImageView imageView) { imageViews_.push_back(imageView); } - void QueueDeleteDeviceMemory(VkDeviceMemory deviceMemory) { deviceMemory_.push_back(deviceMemory); } - void QueueDeleteSampler(VkSampler sampler) { samplers_.push_back(sampler); } - void QueueDeletePipeline(VkPipeline pipeline) { pipelines_.push_back(pipeline); } - void QueueDeletePipelineCache(VkPipelineCache pipelineCache) { pipelineCaches_.push_back(pipelineCache); } - void QueueDeleteRenderPass(VkRenderPass renderPass) { renderPasses_.push_back(renderPass); } - void QueueDeleteFramebuffer(VkFramebuffer framebuffer) { framebuffers_.push_back(framebuffer); } + void QueueDeleteDescriptorPool(VkDescriptorPool &pool) { descPools_.push_back(pool); pool = VK_NULL_HANDLE; } + void QueueDeleteShaderModule(VkShaderModule &module) { modules_.push_back(module); module = VK_NULL_HANDLE; } + void QueueDeleteBuffer(VkBuffer &buffer) { buffers_.push_back(buffer); buffer = VK_NULL_HANDLE; } + void QueueDeleteBufferView(VkBufferView &bufferView) { bufferViews_.push_back(bufferView); bufferView = VK_NULL_HANDLE; } + void QueueDeleteImage(VkImage &image) { images_.push_back(image); image = VK_NULL_HANDLE; } + void QueueDeleteImageView(VkImageView &imageView) { imageViews_.push_back(imageView); imageView = VK_NULL_HANDLE; } + void QueueDeleteDeviceMemory(VkDeviceMemory &deviceMemory) { deviceMemory_.push_back(deviceMemory); deviceMemory = VK_NULL_HANDLE; } + void QueueDeleteSampler(VkSampler &sampler) { samplers_.push_back(sampler); sampler = VK_NULL_HANDLE; } + void QueueDeletePipeline(VkPipeline &pipeline) { pipelines_.push_back(pipeline); pipeline = VK_NULL_HANDLE; } + void QueueDeletePipelineCache(VkPipelineCache &pipelineCache) { pipelineCaches_.push_back(pipelineCache); pipelineCache = VK_NULL_HANDLE; } + void QueueDeleteRenderPass(VkRenderPass &renderPass) { renderPasses_.push_back(renderPass); renderPass = VK_NULL_HANDLE; } + void QueueDeleteFramebuffer(VkFramebuffer &framebuffer) { framebuffers_.push_back(framebuffer); framebuffer = VK_NULL_HANDLE; } void QueueCallback(void(*func)(void *userdata), void *userdata) { callbacks_.push_back(Callback(func, userdata)); } void Take(VulkanDeleteList &del) { diff --git a/Common/Vulkan/VulkanImage.cpp b/Common/Vulkan/VulkanImage.cpp index 876da2cad3..fe5f5e8f08 100644 --- a/Common/Vulkan/VulkanImage.cpp +++ b/Common/Vulkan/VulkanImage.cpp @@ -22,11 +22,9 @@ void VulkanTexture::CreateMappableImage() { // If we already have a mappableImage, forget it. if (mappableImage) { vulkan_->Delete().QueueDeleteImage(mappableImage); - mappableImage = VK_NULL_HANDLE; } if (mappableMemory) { vulkan_->Delete().QueueDeleteDeviceMemory(mappableMemory); - mappableMemory = VK_NULL_HANDLE; } bool U_ASSERT_ONLY pass; @@ -193,9 +191,6 @@ void VulkanTexture::Unlock() { // Then drop the temporary mappable image - although should not be necessary... vulkan_->Delete().QueueDeleteImage(mappableImage); vulkan_->Delete().QueueDeleteDeviceMemory(mappableMemory); - - mappableImage = VK_NULL_HANDLE; - mappableMemory = VK_NULL_HANDLE; } VkImageViewCreateInfo view_info = { VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO }; @@ -218,15 +213,12 @@ void VulkanTexture::Unlock() { void VulkanTexture::Wipe() { if (image) { vulkan_->Delete().QueueDeleteImage(image); - image = VK_NULL_HANDLE; } if (view) { vulkan_->Delete().QueueDeleteImageView(view); - view = VK_NULL_HANDLE; } if (mem && !allocator_) { vulkan_->Delete().QueueDeleteDeviceMemory(mem); - mem = VK_NULL_HANDLE; } else if (mem) { allocator_->Free(mem, offset_); mem = VK_NULL_HANDLE; @@ -371,25 +363,22 @@ void VulkanTexture::EndCreate() { } void VulkanTexture::Destroy() { - if (view) { + if (view != VK_NULL_HANDLE) { vulkan_->Delete().QueueDeleteImageView(view); } - if (image) { - vulkan_->Delete().QueueDeleteImage(image); + if (image != VK_NULL_HANDLE) { if (mappableImage == image) { mappableImage = VK_NULL_HANDLE; } + vulkan_->Delete().QueueDeleteImage(image); } - if (mem && !allocator_) { - vulkan_->Delete().QueueDeleteDeviceMemory(mem); + if (mem != VK_NULL_HANDLE && !allocator_) { if (mappableMemory == mem) { mappableMemory = VK_NULL_HANDLE; } - } else if (mem) { + vulkan_->Delete().QueueDeleteDeviceMemory(mem); + } else if (mem != VK_NULL_HANDLE) { allocator_->Free(mem, offset_); + mem = VK_NULL_HANDLE; } - - view = VK_NULL_HANDLE; - image = VK_NULL_HANDLE; - mem = VK_NULL_HANDLE; } diff --git a/Common/Vulkan/VulkanMemory.h b/Common/Vulkan/VulkanMemory.h index 8b518bf90e..a11be58f93 100644 --- a/Common/Vulkan/VulkanMemory.h +++ b/Common/Vulkan/VulkanMemory.h @@ -29,7 +29,7 @@ public: } void Destroy(VulkanContext *vulkan) { - for (const BufInfo &info : buffers_) { + for (BufInfo &info : buffers_) { vulkan->Delete().QueueDeleteBuffer(info.buffer); vulkan->Delete().QueueDeleteDeviceMemory(info.deviceMemory); } diff --git a/GPU/Vulkan/DrawEngineVulkan.cpp b/GPU/Vulkan/DrawEngineVulkan.cpp index 9790cc66d8..cbfe46af4e 100644 --- a/GPU/Vulkan/DrawEngineVulkan.cpp +++ b/GPU/Vulkan/DrawEngineVulkan.cpp @@ -208,7 +208,6 @@ DrawEngineVulkan::~DrawEngineVulkan() { void DrawEngineVulkan::FrameData::Destroy(VulkanContext *vulkan) { if (descPool != VK_NULL_HANDLE) { vulkan->Delete().QueueDeleteDescriptorPool(descPool); - descPool = VK_NULL_HANDLE; } if (pushUBO) { @@ -234,10 +233,8 @@ void DrawEngineVulkan::DestroyDeviceObjects() { } if (depalSampler_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeleteSampler(depalSampler_); - depalSampler_ = VK_NULL_HANDLE; if (nullSampler_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeleteSampler(nullSampler_); - nullSampler_ = VK_NULL_HANDLE; if (pipelineLayout_ != VK_NULL_HANDLE) vkDestroyPipelineLayout(vulkan_->GetDevice(), pipelineLayout_, nullptr); pipelineLayout_ = VK_NULL_HANDLE; diff --git a/GPU/Vulkan/FramebufferVulkan.cpp b/GPU/Vulkan/FramebufferVulkan.cpp index daca192184..dd5939a58c 100644 --- a/GPU/Vulkan/FramebufferVulkan.cpp +++ b/GPU/Vulkan/FramebufferVulkan.cpp @@ -202,16 +202,12 @@ void FramebufferManagerVulkan::InitDeviceObjects() { void FramebufferManagerVulkan::DestroyDeviceObjects() { if (rpLoadColorLoadDepth_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeleteRenderPass(rpLoadColorLoadDepth_); - rpLoadColorLoadDepth_ = VK_NULL_HANDLE; if (rpClearColorLoadDepth_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeleteRenderPass(rpClearColorLoadDepth_); - rpClearColorLoadDepth_ = VK_NULL_HANDLE; if (rpClearColorClearDepth_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeleteRenderPass(rpClearColorClearDepth_); - rpClearColorClearDepth_ = VK_NULL_HANDLE; if (rpLoadColorClearDepth_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeleteRenderPass(rpLoadColorClearDepth_); - rpLoadColorClearDepth_ = VK_NULL_HANDLE; for (int i = 0; i < 2; i++) { if (frameData_[i].numCommandBuffers_ > 0) { @@ -234,26 +230,19 @@ void FramebufferManagerVulkan::DestroyDeviceObjects() { if (fsBasicTex_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeleteShaderModule(fsBasicTex_); - fsBasicTex_ = VK_NULL_HANDLE; if (vsBasicTex_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeleteShaderModule(vsBasicTex_); - vsBasicTex_ = VK_NULL_HANDLE; if (linearSampler_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeleteSampler(linearSampler_); - linearSampler_ = VK_NULL_HANDLE; if (nearestSampler_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeleteSampler(nearestSampler_); - nearestSampler_ = VK_NULL_HANDLE; if (pipelineBasicTex_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeletePipeline(pipelineBasicTex_); - pipelineBasicTex_ = VK_NULL_HANDLE; if (pipelinePostShader_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeletePipeline(pipelinePostShader_); - pipelinePostShader_ = VK_NULL_HANDLE; if (pipelineCache2D_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeletePipelineCache(pipelineCache2D_); - pipelineCache2D_ = VK_NULL_HANDLE; } void FramebufferManagerVulkan::NotifyClear(bool clearColor, bool clearAlpha, bool clearDepth, uint32_t color, float depth) { diff --git a/GPU/Vulkan/PipelineManagerVulkan.cpp b/GPU/Vulkan/PipelineManagerVulkan.cpp index e5b04eb446..3aa802cb85 100644 --- a/GPU/Vulkan/PipelineManagerVulkan.cpp +++ b/GPU/Vulkan/PipelineManagerVulkan.cpp @@ -13,7 +13,8 @@ PipelineManagerVulkan::PipelineManagerVulkan(VulkanContext *vulkan) : vulkan_(vu PipelineManagerVulkan::~PipelineManagerVulkan() { Clear(); - vulkan_->Delete().QueueDeletePipelineCache(pipelineCache_); + if (pipelineCache_ != VK_NULL_HANDLE) + vulkan_->Delete().QueueDeletePipelineCache(pipelineCache_); } void PipelineManagerVulkan::Clear() { @@ -31,7 +32,6 @@ void PipelineManagerVulkan::DeviceLost() { Clear(); if (pipelineCache_ != VK_NULL_HANDLE) vulkan_->Delete().QueueDeletePipelineCache(pipelineCache_); - pipelineCache_ = VK_NULL_HANDLE; } void PipelineManagerVulkan::DeviceRestore(VulkanContext *vulkan) { diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index 0f459d2e76..18b44cb3e7 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -81,7 +81,7 @@ VulkanFragmentShader::VulkanFragmentShader(VulkanContext *vulkan, ShaderID id, c } VulkanFragmentShader::~VulkanFragmentShader() { - if (module_) { + if (module_ != VK_NULL_HANDLE) { vulkan_->Delete().QueueDeleteShaderModule(module_); } } @@ -134,7 +134,7 @@ VulkanVertexShader::VulkanVertexShader(VulkanContext *vulkan, ShaderID id, const } VulkanVertexShader::~VulkanVertexShader() { - if (module_) { + if (module_ != VK_NULL_HANDLE) { vulkan_->Delete().QueueDeleteShaderModule(module_); } } diff --git a/GPU/Vulkan/VulkanUtil.cpp b/GPU/Vulkan/VulkanUtil.cpp index 770acda915..879bd90ff8 100644 --- a/GPU/Vulkan/VulkanUtil.cpp +++ b/GPU/Vulkan/VulkanUtil.cpp @@ -59,7 +59,6 @@ void Vulkan2D::DestroyDeviceObjects() { for (int i = 0; i < 2; i++) { if (frameData_[i].descPool != VK_NULL_HANDLE) { vulkan_->Delete().QueueDeleteDescriptorPool(frameData_[i].descPool); - frameData_[i].descPool = VK_NULL_HANDLE; } } for (auto it : pipelines_) {