diff --git a/include/worldmanager.h b/include/worldmanager.h index 8407c90..2421c21 100644 --- a/include/worldmanager.h +++ b/include/worldmanager.h @@ -4,21 +4,24 @@ #include struct World; +class Renderer; class WorldManager { public: void loadWorld(const std::string& path); - + void switchWorld(const std::string& path); - + + void destructResources(Renderer* renderer); + World* getCurrentWorld() { return currentWorld; } - + World* getWorld(const std::string& path) { return loadedWorlds[path]; } - + private: std::map loadedWorlds; World* currentWorld = nullptr; diff --git a/src/debugpass.cpp b/src/debugpass.cpp index 66eb46b..c2c27bf 100644 --- a/src/debugpass.cpp +++ b/src/debugpass.cpp @@ -13,6 +13,10 @@ DebugPass::DebugPass(Renderer& renderer) : renderer_(renderer) { } 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) { @@ -78,11 +82,11 @@ void DebugPass::createRenderPass() { VkSubpassDependency dependency = {}; dependency.srcSubpass = VK_SUBPASS_EXTERNAL; - dependency.dstSubpass = 0; - dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - dependency.srcAccessMask = 0; + dependency.srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_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.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; VkRenderPassCreateInfo renderPassInfo = {}; renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; diff --git a/src/main.cpp b/src/main.cpp index c1fd4b6..2882e11 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -266,6 +266,8 @@ int main(int argc, char* argv[]) { } } + worldManager.destructResources(renderer); + renderer->destroyRenderTarget(target); vkDestroySurfaceKHR(renderer->getInstance(), surface, nullptr); diff --git a/src/renderer.cpp b/src/renderer.cpp index c6c8e0d..926945c 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -57,6 +57,11 @@ Renderer::~Renderer() { delete worldPass_; delete shadowPass_; + vkDestroySampler(device_, emptySampler_, nullptr); + vkDestroyImageView(device_, emptyImageView_, nullptr); + vkFreeMemory(device_, emptyMemory_, nullptr); + vkDestroyImage(device_, emptyImage_, nullptr); + vkDestroyDescriptorSetLayout(device_, materialSetLayout_, nullptr); vkDestroyDescriptorPool(device_, descriptorPool_, nullptr); @@ -809,12 +814,27 @@ void Renderer::destroyRenderTarget(RenderTarget* target) { vkFreeDescriptorSets(device_, descriptorPool_, target->numImages, target->postSets); for(uint32_t i = 0; i < numFrameResources; i++) { + // imgui vkFreeMemory(device_, target->imguiIndexMemorys[i], nullptr); vkDestroyBuffer(device_, target->imguiIndexBuffers[i], nullptr); vkFreeMemory(device_, target->imguiVertexMemorys[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); vkDestroyImageView(device_, target->nearFieldImageViews[i], nullptr); @@ -827,6 +847,14 @@ void Renderer::destroyRenderTarget(RenderTarget* target) { vkFreeMemory(device_, target->farFieldMemory[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); vkDestroyImageView(device_, target->offscreenDepthImageViews[i], nullptr); diff --git a/src/worldmanager.cpp b/src/worldmanager.cpp index 0375158..ff02709 100644 --- a/src/worldmanager.cpp +++ b/src/worldmanager.cpp @@ -11,6 +11,7 @@ #include "mesh.h" #include "entityparser.h" #include "ecs.h" +#include "renderer.h" void WorldManager::loadWorld(const std::string& path) { std::ifstream file("data/" + path); @@ -37,3 +38,11 @@ void WorldManager::loadWorld(const std::string& path) { void WorldManager::switchWorld(const std::string& path) { currentWorld = loadedWorlds[path]; } + +void WorldManager::destructResources(Renderer* renderer) { + auto meshes = ECS::getWorldComponents(currentWorld); + for(const auto& [id, mesh] : meshes) { + renderer->destroyMeshBuffers(mesh->mesh); + renderer->destroyMaterialBuffers(mesh->material); + } +} diff --git a/src/worldpass.cpp b/src/worldpass.cpp index 16a4f91..93d8a3f 100644 --- a/src/worldpass.cpp +++ b/src/worldpass.cpp @@ -28,6 +28,9 @@ WorldPass::~WorldPass() { vkFreeMemory(renderer_.getDevice(), lightMemory_, 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) {