Added per frame in flight deletion queue

This commit is contained in:
antopilo
2025-01-31 23:30:40 -05:00
parent b51a6b1ccb
commit 9d30f160ba
5 changed files with 24 additions and 13 deletions

View File

@@ -2499,8 +2499,7 @@ namespace Nuake {
void EditorInterface::OnSceneLoaded(Ref<Scene> scene)
{
Logger::Log("On Scene loaded");
Window::Get()->SetDecorated(true);
VkRenderer::Get().SceneRenderer->sceneRenderPipeline->OnDebugDraw().AddRaw(this, &EditorInterface::OnDebugDraw);
}
@@ -2536,7 +2535,6 @@ namespace Nuake {
isLoadingProjectQueue = false;
auto window = Window::Get();
window->SetDecorated(true);
window->ShowTitleBar(false);
window->SetSize({ 1600, 900 });
window->Center();

View File

@@ -124,7 +124,7 @@ namespace Nuake
VkSampler SamplerLinear;
VkSampler SamplerNearest;
std::stack<std::function<void()>> DeletionQueue;
std::vector<CleanUpStack> DeletionQueue;
public:
ModelData ModelTransforms;
@@ -187,8 +187,9 @@ namespace Nuake
void UpdateBuffers();
void QueueDeletion(CleanUpStack func);
void CleanUp();
void CleanUp(uint32_t frame);
private:
void CreateBindlessLayout();
CleanUpStack& GetFrameCleanUpStack(uint32_t frame);
};
}

View File

@@ -773,7 +773,7 @@ void VkRenderer::EndDraw()
ImGui::RenderPlatformWindowsDefault();
}
GPUResources::Get().CleanUp();
GPUResources::Get().CleanUp(FrameNumber);
// Increase the number of frames drawn
FrameNumber++;

View File

@@ -159,7 +159,6 @@ namespace Nuake
std::vector<VkImageView> SwapchainImageViews;
// Frame data
uint32_t FrameNumber = 0;
FrameData Frames[FRAME_OVERLAP];
uint32_t GPUQueueFamily;
@@ -168,6 +167,7 @@ namespace Nuake
DescriptorAllocator GlobalDescriptorAllocator;
public:
uint32_t FrameNumber = 0;
VkDescriptorSet DrawImageDescriptors;
VkDescriptorSetLayout DrawImageDescriptorLayout;

View File

@@ -9,6 +9,11 @@ using namespace Nuake;
GPUResources::GPUResources()
{
Init();
for (int i = 0; i < FRAME_OVERLAP; i++)
{
DeletionQueue.push_back(CleanUpStack());
}
}
void GPUResources::Init()
@@ -507,25 +512,32 @@ uint32_t GPUResources::GetBindlessMaterialID(const UUID& id)
void GPUResources::QueueDeletion(CleanUpStack cleanUpStack)
{
CleanUpStack& deletionQueue = GetFrameCleanUpStack(VkRenderer::Get().FrameNumber);
// Push content of cleanUpStack into deletionQueue
while (!cleanUpStack.empty())
{
DeletionQueue.push(cleanUpStack.top());
deletionQueue.push(cleanUpStack.top());
cleanUpStack.pop();
}
}
void GPUResources::CleanUp()
void GPUResources::CleanUp(uint32_t frame)
{
if (!DeletionQueue.empty())
auto& deletionQueue = GetFrameCleanUpStack(frame);
if (!deletionQueue.empty())
{
vkQueueWaitIdle(VkRenderer::Get().GPUQueue);
}
while (!DeletionQueue.empty())
while (!deletionQueue.empty())
{
DeletionQueue.top()();
DeletionQueue.pop();
deletionQueue.top()();
deletionQueue.pop();
Logger::Log("Deleted GPU resource", "vulkan", VERBOSE);
}
}
CleanUpStack& GPUResources::GetFrameCleanUpStack(uint32_t frame)
{
return DeletionQueue[frame % FRAME_OVERLAP];
}