diff --git a/Source/Engine/Graphics/Async/GPUTask.h b/Source/Engine/Graphics/Async/GPUTask.h index d32b4a10a..261eda6f7 100644 --- a/Source/Engine/Graphics/Async/GPUTask.h +++ b/Source/Engine/Graphics/Async/GPUTask.h @@ -67,6 +67,14 @@ public: return _type; } + /// + /// Gets work synchronization start point + /// + FORCE_INLINE GPUSyncPoint GetSyncStart() const + { + return _syncPoint; + } + /// /// Gets work finish synchronization point /// diff --git a/Source/Engine/Graphics/Async/GPUTasksContext.cpp b/Source/Engine/Graphics/Async/GPUTasksContext.cpp index 887ee54be..4ef85c68a 100644 --- a/Source/Engine/Graphics/Async/GPUTasksContext.cpp +++ b/Source/Engine/Graphics/Async/GPUTasksContext.cpp @@ -36,7 +36,7 @@ GPUTasksContext::~GPUTasksContext() if (task->GetSyncPoint() <= _currentSyncPoint && task->GetState() != TaskState::Finished) { if (!Engine::IsRequestingExit) - LOG(Warning, "{0} has been canceled before a sync", task->ToString()); + LOG(Warning, "'{0}' has been canceled before a sync", task->ToString()); task->CancelSync(); } } @@ -51,18 +51,15 @@ void GPUTasksContext::Run(GPUTask* task) ASSERT(task != nullptr); task->Execute(this); - if (task->IsSyncing()) + if (task->GetSyncStart() != 0) _tasksSyncing.Add(task); } void GPUTasksContext::OnCancelSync(GPUTask* task) { - ASSERT(task != nullptr); - _tasksSyncing.Remove(task); - if (!Engine::IsRequestingExit) - LOG(Warning, "{0} has been canceled before a sync", task->ToString()); + LOG(Warning, "'{0}' has been canceled before a sync", task->ToString()); } void GPUTasksContext::OnFrameBegin() diff --git a/Source/Engine/Graphics/Async/GPUTasksManager.cpp b/Source/Engine/Graphics/Async/GPUTasksManager.cpp index e393d96ef..3c41f9da8 100644 --- a/Source/Engine/Graphics/Async/GPUTasksManager.cpp +++ b/Source/Engine/Graphics/Async/GPUTasksManager.cpp @@ -51,10 +51,9 @@ void GPUTask::Enqueue() void GPUTask::OnCancel() { // Check if task is waiting for sync (very likely situation) - if (IsSyncing()) + if (IsSyncing() && _context) { // Task has been performed but is waiting for a CPU/GPU sync so we have to cancel that - ASSERT(_context != nullptr); _context->OnCancelSync(this); _context = nullptr; }