From 6cf20d414e4ef38a851da17f404cf18bc06a28c9 Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Wed, 29 Mar 2023 22:20:20 +0800 Subject: [PATCH] "Fixed" crash from ResourceHub on engine exit --- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 53 ++++++++++--------- .../MiddleEnd/Interface/SHGraphicsSystem.h | 2 +- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 21b08829..4738b70c 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -216,13 +216,13 @@ namespace SHADE } // Get render graph from default viewport world renderer - renderGraph = resourceManager.Create(); + renderGraph = resourceManager->Create(); /*-----------------------------------------------------------------------*/ /* WORLD RENDER GRAPH RESOURCES */ /*-----------------------------------------------------------------------*/ // Initialize world render graph - renderGraph->Init("World Render Graph", device, swapchain, &resourceManager, renderContextCmdPools); + renderGraph->Init("World Render Graph", device, swapchain, resourceManager, renderContextCmdPools); renderGraph->AddResource("Position", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); renderGraph->AddResource("Position World Space", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); renderGraph->AddResource("Object VFX", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); @@ -292,7 +292,7 @@ namespace SHADE /*-----------------------------------------------------------------------*/ /* SSAO PASS AND DATA INIT */ /*-----------------------------------------------------------------------*/ - ssaoStorage = resourceManager.Create(); + ssaoStorage = resourceManager->Create(); // command buffer operation to transfer data for ssao ssaoTransferCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY); @@ -475,7 +475,7 @@ namespace SHADE void SHGraphicsSystem::InitSubsystems(void) noexcept { - mousePickSubSystem = resourceManager.Create(); + mousePickSubSystem = resourceManager->Create(); std::vector> cmdPools; cmdPools.reserve(swapchain->GetNumImages()); @@ -486,28 +486,28 @@ namespace SHADE mousePickSubSystem->Init(device, cmdPools, renderGraph->GetRenderGraphResource("Entity ID")); // Register the post offscreen render to the system - postOffscreenRenderSubSystem = resourceManager.Create(); + postOffscreenRenderSubSystem = resourceManager->Create(); postOffscreenRenderSubSystem->Init(device, renderGraph->GetRenderGraphResource("Scene"), descPool); - lightingSubSystem = resourceManager.Create(); - lightingSubSystem->Init(device, descPool, &resourceManager, samplerCache.GetSampler (device, SHVkSamplerParams + lightingSubSystem = resourceManager->Create(); + lightingSubSystem->Init(device, descPool, resourceManager, samplerCache.GetSampler (device, SHVkSamplerParams { .addressMode = vk::SamplerAddressMode::eClampToBorder, }) ); - textRenderingSubSystem = resourceManager.Create(); + textRenderingSubSystem = resourceManager->Create(); // initialize the text renderer auto uiNode = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::SCREEN_SPACE_PASS.data()); textRenderingSubSystem->Init(device, uiNode->GetRenderpass(), uiNode->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::UI_TRANSLUCENT_SUBPASS), descPool, textVS, textFS); - trajectoryRenderingSubSystem = resourceManager.Create(); + trajectoryRenderingSubSystem = resourceManager->Create(); auto vfxPass = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::VFX_PASS.data()); // particle sub system initialization - particleSubSystem = resourceManager.Create(); + particleSubSystem = resourceManager->Create(); particleSubSystem->Init(device, descPool, vfxPass->GetRenderpass(), vfxPass->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::VFX_SUBPASS), particleVS, particleFS, particleEmitCS, particleUpdateCS); auto vfxNode = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::VFX_PASS.data()); @@ -608,6 +608,9 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ void SHGraphicsSystem::Init(void) { + // Create resource manager + resourceManager = new SHResourceHub(); + InitBoilerplate(); InitMiddleEnd(); InitSubsystems(); @@ -867,7 +870,7 @@ namespace SHADE } // Create the renderer - auto renderer = resourceManager.Create(device, swapchain->GetNumImages(), descPool, projectionType); + auto renderer = resourceManager->Create(device, swapchain->GetNumImages(), descPool, projectionType); // Store renderers.emplace_back(renderer); @@ -911,7 +914,7 @@ namespace SHADE // Create new renderer for the light component and give it to the light component - Handle newRenderer = resourceManager.Create(device, swapchain->GetNumImages(), descPool, SHRenderer::PROJECTION_TYPE::ORTHOGRAPHIC); + Handle newRenderer = resourceManager->Create(device, swapchain->GetNumImages(), descPool, SHRenderer::PROJECTION_TYPE::ORTHOGRAPHIC); lightComp->SetRenderer(newRenderer); // Add the shadow map resource to the graph @@ -1058,7 +1061,7 @@ namespace SHADE auto shaderPair = std::make_pair(vertShader, fragShader); // Create material - auto mat = resourceManager.Create(); + auto mat = resourceManager->Create(); auto renderGraphNode = subpass->GetParentNode(); auto pipeline = renderGraphNode->GetOrCreatePipeline(std::make_pair(vertShader, fragShader), subpass); @@ -1072,12 +1075,12 @@ namespace SHADE void SHGraphicsSystem::RemoveMaterial(Handle material) { - resourceManager.Free(material); + resourceManager->Free(material); } Handle SHGraphicsSystem::AddOrGetBaseMaterialInstance(Handle material) { - return materialInstanceCache.CreateOrGet(resourceManager, material); + return materialInstanceCache.CreateOrGet(*resourceManager, material); } SHADE::Handle SHGraphicsSystem::AddOrGetBaseMaterialInstance() @@ -1087,17 +1090,17 @@ namespace SHADE SHADE::Handle SHGraphicsSystem::AddMaterialInstanceCopy(Handle materialInst) { - return resourceManager.Create(materialInst->GetBaseMaterial()); + return resourceManager->Create(materialInst->GetBaseMaterial()); } std::pair, typename SHResourceHub::dense_iterator> SHGraphicsSystem::GetAllMaterialInstances() { - return resourceManager.GetDenseAccess(); + return resourceManager->GetDenseAccess(); } void SHGraphicsSystem::RemoveMaterialInstance(Handle materialInstance) { - resourceManager.Free(materialInstance); + resourceManager->Free(materialInstance); } /*---------------------------------------------------------------------------------*/ @@ -1189,12 +1192,12 @@ namespace SHADE /*---------------------------------------------------------------------------------*/ Handle SHGraphicsSystem::AddFont(SHFontAsset const& fontAsset) noexcept { - return fontLibrary.AddFont(device, resourceManager, fontAsset); + return fontLibrary.AddFont(device, *resourceManager, fontAsset); } void SHGraphicsSystem::BuildFonts(void) noexcept { - fontLibrary.BuildFonts(device, graphicsQueue, graphicsCmdPool, descPool, SHGraphicsPredefinedData::GetPredefinedDescSetLayouts(SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::FONT)[0], resourceManager); + fontLibrary.BuildFonts(device, graphicsQueue, graphicsCmdPool, descPool, SHGraphicsPredefinedData::GetPredefinedDescSetLayouts(SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::FONT)[0], *resourceManager); } #pragma endregion ADD_REMOVE @@ -1238,7 +1241,7 @@ namespace SHADE // Reset all material isDirty auto gfxSystem = reinterpret_cast(system); - auto [matBegin, matEnd] = gfxSystem->resourceManager.GetDenseAccess(); + auto [matBegin, matEnd] = gfxSystem->resourceManager->GetDenseAccess(); for (auto iter = matBegin; iter != matEnd; ++iter) { iter->ClearChangeFlag(); @@ -1256,7 +1259,7 @@ namespace SHADE // Clean up and update all materials auto gfxSystem = reinterpret_cast(system); - auto [matInstBegin, matInstEnd] = gfxSystem->resourceManager.GetDenseAccess(); + auto [matInstBegin, matInstEnd] = gfxSystem->resourceManager->GetDenseAccess(); for (auto iter = matInstBegin; iter != matInstEnd; ++iter) { auto baseMat = iter->GetBaseMaterial(); @@ -1309,7 +1312,7 @@ namespace SHADE // Unset all material old pipeline since we would have finished processing auto gfxSystem = reinterpret_cast(system); - auto [matBegin, matEnd] = gfxSystem->resourceManager.GetDenseAccess(); + auto [matBegin, matEnd] = gfxSystem->resourceManager->GetDenseAccess(); for (auto iter = matBegin; iter != matEnd; ++iter) { iter->ForgetOldPipeline(); @@ -1449,7 +1452,7 @@ namespace SHADE Handle SHGraphicsSystem::createDebugDrawPipeline(Handle renderPass, Handle subpass, bool filled, bool triMesh, bool instanced) { - auto pipelineLayout = resourceManager.Create + auto pipelineLayout = resourceManager->Create ( device, SHPipelineLayoutParams { @@ -1457,7 +1460,7 @@ namespace SHADE .predefinedDescSetLayouts = SHGraphicsPredefinedData::GetSystemData(SHGraphicsPredefinedData::SystemType::BATCHING).descSetLayouts } ); - auto pipeline = resourceManager.Create(device, pipelineLayout, nullptr, renderPass, subpass); + auto pipeline = resourceManager->Create(device, pipelineLayout, nullptr, renderPass, subpass); pipeline->GetPipelineState().SetRasterizationState(SHRasterizationState { .polygonMode = filled ? vk::PolygonMode::eFill : vk::PolygonMode::eLine, diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h index 3d0b3cc6..aff756cd 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h @@ -440,7 +440,7 @@ namespace SHADE SHWindow* window = nullptr; // Middle End Resources - SHResourceHub resourceManager; + SHResourceHub* resourceManager; SHMeshLibrary meshLibrary; SHTextureLibrary texLibrary; SHGraphicsGenericData graphicsGenericData; -- 2.40.1