diff --git a/GPU/Vulkan/VulkanUtil.cpp b/GPU/Vulkan/VulkanUtil.cpp index 91de80234b..770acda915 100644 --- a/GPU/Vulkan/VulkanUtil.cpp +++ b/GPU/Vulkan/VulkanUtil.cpp @@ -48,6 +48,37 @@ void VulkanFBO::Create(VulkanContext *vulkan, VkRenderPass rp_compatible, int wi } Vulkan2D::Vulkan2D(VulkanContext *vulkan) : vulkan_(vulkan) { + InitDeviceObjects(); +} + +Vulkan2D::~Vulkan2D() { + DestroyDeviceObjects(); +} + +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_) { + vulkan_->Delete().QueueDeletePipeline(it.second); + } + pipelines_.clear(); + + VkDevice device = vulkan_->GetDevice(); + if (descriptorSetLayout_ != VK_NULL_HANDLE) { + vkDestroyDescriptorSetLayout(device, descriptorSetLayout_, nullptr); + descriptorSetLayout_ = VK_NULL_HANDLE; + } + if (pipelineLayout_ != VK_NULL_HANDLE) { + vkDestroyPipelineLayout(device, pipelineLayout_, nullptr); + pipelineLayout_ = VK_NULL_HANDLE; + } +} + +void Vulkan2D::InitDeviceObjects() { // All resources we need for PSP drawing. Usually only bindings 0 and 2-4 are populated. VkDescriptorSetLayoutBinding bindings[2] = {}; bindings[0].descriptorCount = 1; @@ -96,13 +127,13 @@ Vulkan2D::Vulkan2D(VulkanContext *vulkan) : vulkan_(vulkan) { assert(VK_SUCCESS == res); } -Vulkan2D::~Vulkan2D() { - VkDevice device = vulkan_->GetDevice(); - for (int i = 0; i < 2; i++) { - vulkan_->Delete().QueueDeleteDescriptorPool(frameData_[i].descPool); - } - vkDestroyDescriptorSetLayout(device, descriptorSetLayout_, nullptr); - vkDestroyPipelineLayout(device, pipelineLayout_, nullptr); +void Vulkan2D::DeviceLost() { + DestroyDeviceObjects(); +} + +void Vulkan2D::DeviceRestore(VulkanContext *vulkan) { + vulkan_ = vulkan; + InitDeviceObjects(); } void Vulkan2D::BeginFrame() { @@ -324,4 +355,4 @@ VkShaderModule CompileShaderModule(VulkanContext *vulkan, VkShaderStageFlagBits return VK_NULL_HANDLE; } } -} \ No newline at end of file +} diff --git a/GPU/Vulkan/VulkanUtil.h b/GPU/Vulkan/VulkanUtil.h index ae302754f4..48e9a09bda 100644 --- a/GPU/Vulkan/VulkanUtil.h +++ b/GPU/Vulkan/VulkanUtil.h @@ -79,6 +79,9 @@ public: Vulkan2D(VulkanContext *vulkan); ~Vulkan2D(); + void DeviceLost(); + void DeviceRestore(VulkanContext *vulkan); + VkPipeline GetPipeline(VkPipelineCache cache, VkRenderPass rp, VkShaderModule vs, VkShaderModule fs); void BeginFrame(); @@ -95,6 +98,9 @@ public: }; private: + void InitDeviceObjects(); + void DestroyDeviceObjects(); + VulkanContext *vulkan_; VkDescriptorSetLayout descriptorSetLayout_; VkPipelineLayout pipelineLayout_; @@ -131,4 +137,4 @@ private: }; -VkShaderModule CompileShaderModule(VulkanContext *vulkan, VkShaderStageFlagBits stage, const char *code, std::string *error); \ No newline at end of file +VkShaderModule CompileShaderModule(VulkanContext *vulkan, VkShaderStageFlagBits stage, const char *code, std::string *error);