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;
}