Properly destroy all vulkan resources
This commit is contained in:
parent
1ebc0606f8
commit
40b464935f
6 changed files with 56 additions and 7 deletions
|
@ -4,21 +4,24 @@
|
|||
#include <map>
|
||||
|
||||
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<std::string, World*> loadedWorlds;
|
||||
World* currentWorld = nullptr;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -266,6 +266,8 @@ int main(int argc, char* argv[]) {
|
|||
}
|
||||
}
|
||||
|
||||
worldManager.destructResources(renderer);
|
||||
|
||||
renderer->destroyRenderTarget(target);
|
||||
|
||||
vkDestroySurfaceKHR(renderer->getInstance(), surface, nullptr);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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<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);
|
||||
vkDestroyBuffer(renderer_.getDevice(), lightBuffer_, nullptr);
|
||||
|
||||
vkFreeMemory(renderer_.getDevice(), sceneMemory_, nullptr);
|
||||
vkDestroyBuffer(renderer_.getDevice(), sceneBuffer_, nullptr);
|
||||
}
|
||||
|
||||
void WorldPass::render(VkCommandBuffer commandBuffer, RenderCollection& collection, RenderTarget* target) {
|
||||
|
|
Reference in a new issue