Windows(D3D12 / NVIDIA GPU)環境で r.RayTracing を有効にしている場合、UCableComponent のロード時に GPU クラッシュが発生する問題に遭遇しています。
クラッシュログを見ると、内部の BLAS ビルド用シェーダー内でクラッシュしているようです。
以下は、Game ビルドでクラッシュが発生した際の NVIDIA Aftermath ログを
GPUCrash_UCableComponent_NVIDIA_Aftermath_Log.txt
として添付させていただいております。
調査したところ、UCableComponent の未初期化の index buffer(および、おそらく vertex buffer)が BLAS(FRayTracingGeometry)のビルドに使用されていることが原因ではないかと考えています。
UE5.7.4のソースコードを見る限り、FCableSceneProxy の index buffer / vertex Bbuffer は、最初の FSendCableDynamicData コマンドが送信・実行されるまで初期化されません。
一方で、StaticRayTracingGeometry は SceneProxy が生成された直後に作成され、BLAS ビルド対象として GRayTracingGeometryManager に追加されています。
```
class FCableSceneProxy final : public FPrimitiveSceneProxy
{
…
FCableSceneProxy(UCableComponent* Component)
…
{
…
ENQUEUE_RENDER_COMMAND(InitCableResources)(UE::RenderCommandPipe::Cable,
[this] (FRHICommandList& RHICmdList)
{
…
FRayTracingGeometry& RayTracingGeometry = StaticRayTracingGeometry;
CreateRayTracingGeometry_RenderingThread(RayTracingGeometry, RHICmdList);
…
}
}
…
void SetDynamicData_RenderThread(FRHICommandListBase& RHICmdList, FCableDynamicData* NewDynamicData)
{
…
BuildCableMesh(RHICmdList, NewDynamicData);
}
…
};
```
UCableComponent::CreateRenderState_Concurrent では、SceneProxy の生成後に index buffer を初期化するため、SendRenderDynamicData が呼び出されているものと理解しています。
しかし今回のケースでは、CableComponent が bHiddenInGame = true の状態で Spawn されているため、Spawn 時点では CreateRenderState_Concurrent による SceneProxy が生成されず、SendRenderDynamicData もスキップされます。
その後、bHiddenInGame が Flase に変更された原因で、DoDeferredRenderUpdates_Concurrent → SendRenderTransform_Concurrent の経路によって SceneProxy の作成が強制されます。
この経路では SendRenderDynamicData による index buffer の初期化が行われていないまま、CableComponent の StaticRayTracingGeometry が BLAS ビルド対象として追加されるため、無効な index buffer を使用して BLAS がビルドされ、GPU クラッシュにつながっているように見えます。
[Attachment Removed]