Skip to content

Crash because of a collected texture. #11

Description

@Lawendt

Hello. We're having a crash happening on packaged builds after a time of showing textures. In my experience, it helps alt tabbing a lot while the texture is being shown. From my research it seems like it's happening due to the slate resource being released and then it's trying to create it again, but with an invalid object

This is the callstack

[Inlined] FStructBaseChain::IsChildOfUsingStructArray(const FStructBaseChain &) Class.h:365
[Inlined] UStruct::IsChildOf(const UStruct *) Class.h:623
[Inlined] UObjectBaseUtility::IsChildOfWorkaround(const UClass *,const UClass *) UObjectBaseUtility.h:714
[Inlined] UObjectBaseUtility::IsA(UClass *) UObjectBaseUtility.h:736
UObjectBaseUtility::IsA<UMaterialInterface>() UObjectBaseUtility.h:743
FSlateRHIResourceManager::GetShaderResource(const FSlateBrush &,TVector2<float>,float) SlateRHIResourceManager.cpp:675
FSlateShaderResourceManager::GetResourceHandle(const FSlateBrush &,TVector2<float>,float) ShaderResourceManager.cpp:31
FSlateRHIRenderer::GetResourceHandle(const FSlateBrush &,TVector2<float>,float) SlateRHIRenderer.cpp:1851
FSlateRenderer::GetResourceHandle(const FSlateBrush &) SlateRenderer.h:342
FTextureManager::FTextureEntry::GetResourceHandle() TextureManager.cpp:158
SImGuiWidget::OnPaint(const FPaintArgs &,const FGeometry &,const FSlateRect &,FSlateWindowElementList &,int,const FWidgetStyle &,bool) SImGuiWidget.cpp:688
...

And on this screenshot we can see a trash object on the brush. This object is stored on a TObjectPtr with a UPROPERTY macro, so it should update to a null ptr if the resource isn't valid anymore, but because the slatebrush itself isn't stored on a uproperty, this is not recognized by unreal. Causing this crash.
image

It can be for a faulty usage of the texture resource on imgui, but anyway this seems like a good thing to be in mind for fixing.

Our code using this is:

auto icon_handle = FImGuiModule::Get().FindTextureHandle(from_texture->GetFName());
if (!icon_handle.IsValid())
{
   icon_handle = FImGuiModule::Get().RegisterTexture(from_texture->GetFName(), loaded_texture);
}

Changing it to just the following, helps fixing this crash, but it's mixing up texture, one that should be shown on A is being shown on C, B is showing on A and it goes on...

auto icon_handle = FImGuiModule::Get().RegisterTexture(from_texture->GetFName(), loaded_texture);

eventually tho, this also makes another crash happen for basically the same reason

[Inlined] FStructBaseChain::IsChildOfUsingStructArray(const FStructBaseChain &) Class.h:365
[Inlined] UStruct::IsChildOf(const UStruct *) Class.h:623
[Inlined] UObjectBaseUtility::IsChildOfWorkaround(const UClass *,const UClass *) UObjectBaseUtility.h:714
[Inlined] UObjectBaseUtility::IsA(UClass *) UObjectBaseUtility.h:736
[Inlined] UObjectBaseUtility::IsA() UObjectBaseUtility.h:743
[Inlined] Cast(UObject *) Casts.h:123
FSlateRHIResourceManager::ReleaseDynamicResource(const FSlateBrush &) SlateRHIResourceManager.cpp:978
FTextureManager::FTextureEntry::Reset(bool) TextureManager.cpp:170
[Inlined] FTextureManager::FTextureEntry::operator=(FTextureManager::FTextureEntry &&) TextureManager.cpp:139
FTextureManager::AddTextureEntry(const FName &,UTexture *,bool) TextureManager.cpp:104
[Inlined] FTextureManager::CreateTextureResources(const FName &,UTexture *) TextureManager.cpp:36
FImGuiModule::RegisterTexture(const FName &,UTexture *,bool) ImGuiModule.cpp:95
...
image

So right now I don't know what would be the ideal way of using textures on imgui. I would love to get more information on that. By the way, using unreal 5.3.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions