Archived
1
Fork 0

Properly destroy all vulkan resources

This commit is contained in:
Joshua Goins 2018-12-27 06:21:29 -05:00
parent 1ebc0606f8
commit 40b464935f
6 changed files with 56 additions and 7 deletions

View file

@ -4,6 +4,7 @@
#include <map>
struct World;
class Renderer;
class WorldManager {
public:
@ -11,6 +12,8 @@ public:
void switchWorld(const std::string& path);
void destructResources(Renderer* renderer);
World* getCurrentWorld() {
return currentWorld;
}

View file

@ -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;

View file

@ -266,6 +266,8 @@ int main(int argc, char* argv[]) {
}
}
worldManager.destructResources(renderer);
renderer->destroyRenderTarget(target);
vkDestroySurfaceKHR(renderer->getInstance(), surface, nullptr);

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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) {