mirror of
https://github.com/antopilo/Nuake.git
synced 2026-01-06 06:09:52 +03:00
Added per frame in flight deletion queue
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
}
|
||||
@@ -773,7 +773,7 @@ void VkRenderer::EndDraw()
|
||||
ImGui::RenderPlatformWindowsDefault();
|
||||
}
|
||||
|
||||
GPUResources::Get().CleanUp();
|
||||
GPUResources::Get().CleanUp(FrameNumber);
|
||||
|
||||
// Increase the number of frames drawn
|
||||
FrameNumber++;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
Reference in New Issue
Block a user