# UE 5.8 Vulkan: GPU hang with hardware ray tracing because view descriptors are written after their bindless slot is already in use (fix included) 

**URL:** <https://forums.unrealengine.com/t/ue-5-8-vulkan-gpu-hang-with-hardware-ray-tracing-because-view-descriptors-are-written-after-their-bindless-slot-is-already-in-use-fix-included/2855840>\
**Category:** Issues and Bug Reporting (Unreal Engine)\
**Tags:** unreal-engine, bug-report\
**Created:** [November 14, 2026, 3:03pm UTC](https://forums.unrealengine.com/t/ue-5-8-vulkan-gpu-hang-with-hardware-ray-tracing-because-view-descriptors-are-written-after-their-bindless-slot-is-already-in-use-fix-included/2855840 "2026-11-14T15:03:10Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![LifeBandit7575](https://d3kjluh73b9h9o.cloudfront.net/original/4X/2/8/5/28502927f1d97ba1051b3b47ccfe17233bf41ef0.png) [@LifeBandit7575](https://forums.unrealengine.com/u/LifeBandit7575)\
**Post date:** [November 14, 2026, 3:03pm UTC](https://forums.unrealengine.com/t/ue-5-8-vulkan-gpu-hang-with-hardware-ray-tracing-because-view-descriptors-are-written-after-their-bindless-slot-is-already-in-use-fix-included/2855840/1 "2026-11-14T15:03:10Z")

</div>

### Summary

In UE 5.8’s Vulkan RHI (bindless with VK\_EXT\_descriptor\_buffer), FVulkanShaderResourceView and FVulkanUnorderedAccessView get their bindless slot in the constructor. The descriptor itself is only written later, in an RHI-thread EnqueueLambda. Command lists that already use the slot index can reach the GPU before that lambda runs. The GPU then reads the slot’s previous owner.

With hardware ray tracing on, that previous owner is often an acceleration structure or volume texture. A vertex shader fetching through it hangs the GPU; on Intel Arc A750 (Linux, Mesa ANV) this happened within about 13 s of enabling RT shadows or Lumen HWRT. The easiest trigger is UMaterialBillboardComponent, which recreates its vertex buffer SRVs every frame.

Writing the descriptor in the view constructor as well (for buffer views, excluding acceleration structures) fixes it. With the fix: 11 of 11 validation runs clean, no regressions. Without it: over 40 hangs in one night. Full evidence and the patch are below.

### What Type of Bug are you experiencing?

Rendering (Graphics / Niagara)

### Steps to Reproduce

1. Linux, Intel Arc GPU (seen on A750, Mesa ANV 26.2.6 and 26.3.0), Vulkan RHI (SM6), bindless on (5.8 default, VK\_EXT\_descriptor\_buffer).
2. Use a level with many visible UMaterialBillboardComponents (we had ~300, translucent additive material) plus normal scene content.
3. Run -game and enable hardware ray tracing: r.RayTracing.Enable 1 with r.RayTracing.Shadows 1 (or r.Lumen.HardwareRayTracing 1).
4. Move the camera through the level for up to 2 minutes.  
(Reproduced in our project; the steps above are the conditions we isolated. We have not yet built a blank-project repro.)

### Expected Result

Rendering continues normally with hardware ray tracing enabled.

### Observed Result

The GPU hangs and the kernel resets the context, typically 6–74 s after enabling RT (median 13 s, over 40 hangs in one night).  
Captured GPU error states show the hung draw is a material billboard whose vertex factory uniform buffer points at a bindless slot that holds another resource’s descriptor (an acceleration structure in one capture, a 3D texture in another).  
Cause: FVulkanShaderResourceView / FVulkanUnorderedAccessView allocate the slot in the constructor but write the descriptor only in an RHI-thread EnqueueLambda, so the GPU can read the slot before it is written. Writing the descriptor in the constructor too (buffer views, not acceleration structures) fixes it: 11/11 validation runs clean. Patch and details below.

### Affects Versions

5.8

### Platform(s)

Linux

### Additional Notes

Patch (2 files, VulkanRHI) — validated 11/11 clean runs (8 RT shadows, 2 Lumen HWRT, 1 RT off), no regressions:

```diff
--- a/Engine/Source/Runtime/VulkanRHI/Private/VulkanSRV.cpp
+++ b/Engine/Source/Runtime/VulkanRHI/Private/VulkanSRV.cpp
@@ -55,6 +55,13 @@
 	: FRHIShaderResourceView(InResource, InViewDesc)
 	, FVulkanLinkedView(InDevice, GetSRVDescriptorType(InViewDesc))
 {
+	// The bindless slot is allocated above; write its descriptor now so the GPU never sees the slot's previous
+	// contents if a command list using this view is submitted before the RHI-thread lambda below runs.
+	if (IsBuffer() && ViewDesc.Buffer.SRV.BufferType != FRHIViewDesc::EBufferType::AccelerationStructure)
+	{
+ UpdateView({});
+	}
+
 	RHICmdList.EnqueueLambda([this](FRHICommandListBase&)
 	{
 		LinkHead(GetBaseResource()->LinkedViews);
--- a/Engine/Source/Runtime/VulkanRHI/Private/VulkanUAV.cpp
+++ b/Engine/Source/Runtime/VulkanRHI/Private/VulkanUAV.cpp
@@ -54,6 +54,12 @@
 	: FRHIUnorderedAccessView(InResource, InViewDesc)
 	, FVulkanLinkedView(InDevice, GetUAVDescriptorType(InViewDesc))
 {
+	// See FVulkanShaderResourceView: write the descriptor as soon as the slot exists.
+	if (IsBuffer() && ViewDesc.Buffer.UAV.BufferType != FRHIViewDesc::EBufferType::AccelerationStructure)
+	{
+ UpdateView({});
+	}
+
 	RHICmdList.EnqueueLambda([this](FRHICommandListBase&)
 	{
 		LinkHead(GetBaseResource()->LinkedViews);

```

Without the patch: over 40 GPU hangs in one night with the same setup. Evidence: i915 error states captured with Mesa INTEL\_DEBUG=capture-all; the hung billboard draw’s vertex-factory UB references a bindless slot holding an acceleration-structure descriptor (and in a second capture, a 3D texture descriptor). A slot-ownership tracker added to FVulkanBindlessDescriptorManager logged zero illegal writes during a hanging run, so the slot is read before its new descriptor is written rather than being overwritten.
