From 30b71b9d65ca1655217d8c8cfbcbed60f7e4c3f6 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Mon, 8 Mar 2021 11:32:47 +0100 Subject: [PATCH] Fix crash on close when using Vulkan/D3D12 rendering backend with async task being canceled --- .../Engine/Graphics/Async/GPUTasksManager.cpp | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/Source/Engine/Graphics/Async/GPUTasksManager.cpp b/Source/Engine/Graphics/Async/GPUTasksManager.cpp index b2f361428..b410a16bf 100644 --- a/Source/Engine/Graphics/Async/GPUTasksManager.cpp +++ b/Source/Engine/Graphics/Async/GPUTasksManager.cpp @@ -72,6 +72,7 @@ int32 GPUTasksManager::RequestWork(GPUTask** buffer, int32 maxCount) auto& b2 = _buffers[b2Index]; // Take maximum amount of tasks to the buffer at once + ASSERT(b1.IsEmpty()); const int32 takenTasksCount = (int32)_tasks.try_dequeue_bulk(b1.Get(), maxCount); b2.Add(b1.Get(), takenTasksCount); @@ -83,15 +84,24 @@ int32 GPUTasksManager::RequestWork(GPUTask** buffer, int32 maxCount) for (; i < b2.Count() && count < maxCount; i++) { auto task = b2[i]; - if (task->IsQueued()) + const auto state = task->GetState(); + switch (state) { - // Enqueue task + case TaskState::Failed: + case TaskState::Canceled: + case TaskState::Finished: + // Skip task + break; + case TaskState::Queued: + // Run queued task buffer[count++] = task; - } - else - { + break; + case TaskState::Created: + case TaskState::Running: + default: // Keep task for the next RequestWork b1.Add(task); + break; } } const int32 itemsLeft = b2.Count() - i;