Properly destroy all vulkan resources
This commit is contained in:
parent
1ebc0606f8
commit
40b464935f
6 changed files with 56 additions and 7 deletions
|
@ -4,6 +4,7 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
struct World;
|
struct World;
|
||||||
|
class Renderer;
|
||||||
|
|
||||||
class WorldManager {
|
class WorldManager {
|
||||||
public:
|
public:
|
||||||
|
@ -11,6 +12,8 @@ public:
|
||||||
|
|
||||||
void switchWorld(const std::string& path);
|
void switchWorld(const std::string& path);
|
||||||
|
|
||||||
|
void destructResources(Renderer* renderer);
|
||||||
|
|
||||||
World* getCurrentWorld() {
|
World* getCurrentWorld() {
|
||||||
return currentWorld;
|
return currentWorld;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,10 @@ DebugPass::DebugPass(Renderer& renderer) : renderer_(renderer) {
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugPass::~DebugPass() {
|
DebugPass::~DebugPass() {
|
||||||
|
vkDestroyPipeline(renderer_.getDevice(), pipeline_, nullptr);
|
||||||
|
vkDestroyPipelineLayout(renderer_.getDevice(), pipelineLayout_, nullptr);
|
||||||
|
|
||||||
|
vkDestroyRenderPass(renderer_.getDevice(), renderPass_, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebugPass::render(VkCommandBuffer commandBuffer, RenderCollection& collection, RenderExtraInfo* extraInfo, RenderTarget* target) {
|
void DebugPass::render(VkCommandBuffer commandBuffer, RenderCollection& collection, RenderExtraInfo* extraInfo, RenderTarget* target) {
|
||||||
|
@ -78,11 +82,11 @@ void DebugPass::createRenderPass() {
|
||||||
|
|
||||||
VkSubpassDependency dependency = {};
|
VkSubpassDependency dependency = {};
|
||||||
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
|
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
|
||||||
dependency.dstSubpass = 0;
|
dependency.srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
|
||||||
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
|
||||||
dependency.srcAccessMask = 0;
|
|
||||||
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
|
||||||
|
dependency.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
||||||
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||||
|
dependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
|
||||||
|
|
||||||
VkRenderPassCreateInfo renderPassInfo = {};
|
VkRenderPassCreateInfo renderPassInfo = {};
|
||||||
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
|
||||||
|
|
|
@ -266,6 +266,8 @@ int main(int argc, char* argv[]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
worldManager.destructResources(renderer);
|
||||||
|
|
||||||
renderer->destroyRenderTarget(target);
|
renderer->destroyRenderTarget(target);
|
||||||
|
|
||||||
vkDestroySurfaceKHR(renderer->getInstance(), surface, nullptr);
|
vkDestroySurfaceKHR(renderer->getInstance(), surface, nullptr);
|
||||||
|
|
|
@ -57,6 +57,11 @@ Renderer::~Renderer() {
|
||||||
delete worldPass_;
|
delete worldPass_;
|
||||||
delete shadowPass_;
|
delete shadowPass_;
|
||||||
|
|
||||||
|
vkDestroySampler(device_, emptySampler_, nullptr);
|
||||||
|
vkDestroyImageView(device_, emptyImageView_, nullptr);
|
||||||
|
vkFreeMemory(device_, emptyMemory_, nullptr);
|
||||||
|
vkDestroyImage(device_, emptyImage_, nullptr);
|
||||||
|
|
||||||
vkDestroyDescriptorSetLayout(device_, materialSetLayout_, nullptr);
|
vkDestroyDescriptorSetLayout(device_, materialSetLayout_, nullptr);
|
||||||
|
|
||||||
vkDestroyDescriptorPool(device_, descriptorPool_, nullptr);
|
vkDestroyDescriptorPool(device_, descriptorPool_, nullptr);
|
||||||
|
@ -809,12 +814,27 @@ void Renderer::destroyRenderTarget(RenderTarget* target) {
|
||||||
vkFreeDescriptorSets(device_, descriptorPool_, target->numImages, target->postSets);
|
vkFreeDescriptorSets(device_, descriptorPool_, target->numImages, target->postSets);
|
||||||
|
|
||||||
for(uint32_t i = 0; i < numFrameResources; i++) {
|
for(uint32_t i = 0; i < numFrameResources; i++) {
|
||||||
|
// imgui
|
||||||
vkFreeMemory(device_, target->imguiIndexMemorys[i], nullptr);
|
vkFreeMemory(device_, target->imguiIndexMemorys[i], nullptr);
|
||||||
vkDestroyBuffer(device_, target->imguiIndexBuffers[i], nullptr);
|
vkDestroyBuffer(device_, target->imguiIndexBuffers[i], nullptr);
|
||||||
|
|
||||||
vkFreeMemory(device_, target->imguiVertexMemorys[i], nullptr);
|
vkFreeMemory(device_, target->imguiVertexMemorys[i], nullptr);
|
||||||
vkDestroyBuffer(device_, target->imguiVertexBuffers[i], nullptr);
|
vkDestroyBuffer(device_, target->imguiVertexBuffers[i], nullptr);
|
||||||
|
|
||||||
|
// smaa
|
||||||
|
vkDestroyFramebuffer(device_, target->blendFramebuffers[i], nullptr);
|
||||||
|
|
||||||
|
vkDestroyImageView(device_, target->blendImageViews[i], nullptr);
|
||||||
|
vkFreeMemory(device_, target->blendMemorys[i], nullptr);
|
||||||
|
vkDestroyImage(device_, target->blendImages[i], nullptr);
|
||||||
|
|
||||||
|
vkDestroyFramebuffer(device_, target->edgeFramebuffers[i], nullptr);
|
||||||
|
|
||||||
|
vkDestroyImageView(device_, target->edgeImageViews[i], nullptr);
|
||||||
|
vkFreeMemory(device_, target->edgeMemorys[i], nullptr);
|
||||||
|
vkDestroyImage(device_, target->edgeImages[i], nullptr);
|
||||||
|
|
||||||
|
// dof
|
||||||
vkDestroyFramebuffer(device_, target->nearFieldFramebuffers[i], nullptr);
|
vkDestroyFramebuffer(device_, target->nearFieldFramebuffers[i], nullptr);
|
||||||
|
|
||||||
vkDestroyImageView(device_, target->nearFieldImageViews[i], nullptr);
|
vkDestroyImageView(device_, target->nearFieldImageViews[i], nullptr);
|
||||||
|
@ -827,6 +847,14 @@ void Renderer::destroyRenderTarget(RenderTarget* target) {
|
||||||
vkFreeMemory(device_, target->farFieldMemory[i], nullptr);
|
vkFreeMemory(device_, target->farFieldMemory[i], nullptr);
|
||||||
vkDestroyImage(device_, target->farFieldImages[i], nullptr);
|
vkDestroyImage(device_, target->farFieldImages[i], nullptr);
|
||||||
|
|
||||||
|
// sobel
|
||||||
|
vkDestroyFramebuffer(device_, target->sobelFramebuffers[i], nullptr);
|
||||||
|
|
||||||
|
vkDestroyImageView(device_, target->sobelImageViews[i], nullptr);
|
||||||
|
vkFreeMemory(device_, target->sobelMemorys[i], nullptr);
|
||||||
|
vkDestroyImage(device_, target->sobelImages[i], nullptr);
|
||||||
|
|
||||||
|
// offscreen
|
||||||
vkDestroyFramebuffer(device_, target->offscreenFramebuffers[i], nullptr);
|
vkDestroyFramebuffer(device_, target->offscreenFramebuffers[i], nullptr);
|
||||||
|
|
||||||
vkDestroyImageView(device_, target->offscreenDepthImageViews[i], nullptr);
|
vkDestroyImageView(device_, target->offscreenDepthImageViews[i], nullptr);
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include "mesh.h"
|
#include "mesh.h"
|
||||||
#include "entityparser.h"
|
#include "entityparser.h"
|
||||||
#include "ecs.h"
|
#include "ecs.h"
|
||||||
|
#include "renderer.h"
|
||||||
|
|
||||||
void WorldManager::loadWorld(const std::string& path) {
|
void WorldManager::loadWorld(const std::string& path) {
|
||||||
std::ifstream file("data/" + path);
|
std::ifstream file("data/" + path);
|
||||||
|
@ -37,3 +38,11 @@ void WorldManager::loadWorld(const std::string& path) {
|
||||||
void WorldManager::switchWorld(const std::string& path) {
|
void WorldManager::switchWorld(const std::string& path) {
|
||||||
currentWorld = loadedWorlds[path];
|
currentWorld = loadedWorlds[path];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorldManager::destructResources(Renderer* renderer) {
|
||||||
|
auto meshes = ECS::getWorldComponents<MeshComponent>(currentWorld);
|
||||||
|
for(const auto& [id, mesh] : meshes) {
|
||||||
|
renderer->destroyMeshBuffers(mesh->mesh);
|
||||||
|
renderer->destroyMaterialBuffers(mesh->material);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -28,6 +28,9 @@ WorldPass::~WorldPass() {
|
||||||
|
|
||||||
vkFreeMemory(renderer_.getDevice(), lightMemory_, nullptr);
|
vkFreeMemory(renderer_.getDevice(), lightMemory_, nullptr);
|
||||||
vkDestroyBuffer(renderer_.getDevice(), lightBuffer_, nullptr);
|
vkDestroyBuffer(renderer_.getDevice(), lightBuffer_, nullptr);
|
||||||
|
|
||||||
|
vkFreeMemory(renderer_.getDevice(), sceneMemory_, nullptr);
|
||||||
|
vkDestroyBuffer(renderer_.getDevice(), sceneBuffer_, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldPass::render(VkCommandBuffer commandBuffer, RenderCollection& collection, RenderTarget* target) {
|
void WorldPass::render(VkCommandBuffer commandBuffer, RenderCollection& collection, RenderTarget* target) {
|
||||||
|
|
Reference in a new issue