From 108678d94f10ba1dc48d22572b9fda7700bbc6c8 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Sun, 9 Nov 2025 22:16:44 +0100 Subject: [PATCH] Fix crash when texture streaming mip task gets deleted after texture object on GC --- .../Engine/Graphics/Textures/StreamingTexture.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Source/Engine/Graphics/Textures/StreamingTexture.cpp b/Source/Engine/Graphics/Textures/StreamingTexture.cpp index 735bc162e..71d209301 100644 --- a/Source/Engine/Graphics/Textures/StreamingTexture.cpp +++ b/Source/Engine/Graphics/Textures/StreamingTexture.cpp @@ -338,10 +338,10 @@ public: StreamTextureMipTask(StreamingTexture* texture, int32 mipIndex, Task* rootTask) : GPUUploadTextureMipTask(texture->GetTexture(), mipIndex, Span(nullptr, 0), 0, 0, false) , _streamingTexture(texture) - , _rootTask(rootTask ? rootTask : this) + , _rootTask(rootTask) , _dataLock(_streamingTexture->GetOwner()->LockData()) { - _streamingTexture->_streamingTasks.Add(_rootTask); + _streamingTexture->_streamingTasks.Add(this); _texture.Released.Bind(this); } @@ -357,7 +357,7 @@ private: if (_streamingTexture) { ScopeLock lock(_streamingTexture->GetOwner()->GetOwnerLocker()); - _streamingTexture->_streamingTasks.Remove(_rootTask); + _streamingTexture->_streamingTasks.Remove(this); _streamingTexture = nullptr; } } @@ -422,6 +422,15 @@ protected: GPUUploadTextureMipTask::OnFail(); } + + void OnCancel() override + { + GPUUploadTextureMipTask::OnCancel(); + + // Cancel the root task too (eg. mip loading from asset) + if (_rootTask != nullptr) + _rootTask->Cancel(); + } }; Task* StreamingTexture::CreateStreamingTask(int32 residency)