UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
VulkanRayTracing.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved..
2
3#pragma once
4
5#include "VulkanRHIPrivate.h"
6
7#include "RayTracingBuiltInResources.h"
8#include "VulkanPipeline.h"
9#include "VulkanQuery.h"
10
12class FVulkanBuffer;
14
17
23
24
25// Built-in local root parameters that are always bound to all hit shaders
26// :todo-jn: NOTE: Keep in sync with VulkanCommon.ush decl until it's put in a common header
38
39
53
67
69{
70public:
73
75
77
79
81
82 template <typename T>
84 {
85 SetLocalShaderParameters(Frequency, RecordIndex, InOffsetWithinRootSignature, &Parameters, sizeof(Parameters));
86 }
87
89
91 {
92 if (InData && InDataSize)
93 {
94 // Place the loose parameter data after the FVulkanHitGroupSystemParameters in the shader record
97 }
98 }
99
100 void SetInlineGeometryParameters(uint32 SegmentIndex, const void* InData, uint32 InDataSize);
101
103
105
107 {
108 ReferencedUniformBuffers.AddUnique(UB);
109 }
110
112 {
113 return ReferencedUniformBuffers;
114 }
115
117 {
118 return HitGroupIndexingMode;
119 }
120
122 {
123 return ShaderBindingMode;
124 }
125
127 {
128 return Device;
129 }
130
131 // Ray tracing shader bindings can be processed in parallel.
132 // Each concurrent worker gets its own dedicated descriptor cache instance to avoid contention or locking.
133 // Scaling beyond 5 total threads does not yield any speedup in practice (RHI thread + 4 parallel workers).
134 static constexpr uint32 MaxBindingWorkers = 1; // :todo-jn:
135
136private:
137
138 struct FVulkanShaderTableAllocation
139 {
140 FVulkanShaderTableAllocation()
141 {
142 FMemory::Memzero(Region);
143 }
144
145 uint32 HandleCount = 0;
146 bool bUseLocalRecord = false;
147
148 // Host memory copy
149 TArray<uint8> HostBuffer;
150
151 // GPU Local memory copy
152 VkBuffer LocalBuffer = VK_NULL_HANDLE;
153 VulkanRHI::FVulkanAllocation LocalAllocation;
155
156 bool bIsDirty = true;
157 };
158
159 FVulkanShaderTableAllocation& GetAlloc(EShaderFrequency Frequency);
160 static void ReleaseLocalBuffer(FVulkanDevice& Device, FVulkanShaderTableAllocation& Alloc);
161
162 FVulkanDevice& Device;
163
166
167 FVulkanShaderTableAllocation Miss;
168 FVulkanShaderTableAllocation HitGroup;
169 FVulkanShaderTableAllocation Callable;
170
171 // Buffer that contains per-hitrecord index and vertex buffer binding data
172 TArray<uint8> InlineGeometryParameterData;
173
174 TArray<TRefCountPtr<FRHIUniformBuffer>> ReferencedUniformBuffers;
175
176 // Convenience
177 const uint32 HandleSize;
178 const uint32 HandleSizeAligned;
179};
180
182{
183public:
184 static constexpr uint32 IndicesPerPrimitive = 3; // Only triangle meshes are supported
185
189
191
193
196
199
202
203 void SetupInlineGeometryParameters(uint32 GeometrySegmentIndex, FVulkanRayTracingGeometryParameters& Parameters) const;
204
210
211 FVulkanDevice* const Device = nullptr;
212
216
218 FName OwnerName; // Store the path name of the owner object for resource tracking
219};
220
222{
224
225public:
228
230
232
233 inline bool IsBuilt() const
234 {
235 return bBuilt;
236 }
237
239
241
243
244 // Unique list of geometries referenced by all instances in this scene.
245 // Any referenced geometry is kept alive while the scene is alive.
247
248 // Native TLAS handles are owned by SRV objects in Vulkan RHI.
249 // D3D12 and other RHIs allow creating TLAS SRVs from any GPU address at any point
250 // and do not require them for operations such as build or update.
251 // FVulkanRayTracingScene can't own the VkAccelerationStructureKHR directly because
252 // we allow TLAS memory to be allocated using transient resource allocator and
253 // the lifetime of the scene object may be different from the lifetime of the buffer.
254 // Many VkAccelerationStructureKHR-s may be created, pointing at the same buffer.
255
257
259
261
262 bool bBuilt = false;
263
264private:
265 UE::FMutex Mutex;
266};
267
268
270{
271public:
272
276
278 {
279 return Pipeline;
280 }
281
282 bool IsPartialPipeline() const
283 {
284 return bIsPartialPipeline;
285 }
286
291
292private:
293 FVulkanDevice& Device;
294
295 struct ShaderData
296 {
298 TArray<uint8> ShaderHandles;
299 };
300
301 const ShaderData& GetShaderData(EShaderFrequency Frequency) const;
302
303 ShaderData RayGen;
304 ShaderData Miss;
305 ShaderData HitGroup;
306 ShaderData Callable;
307
308 VkPipeline Pipeline = VK_NULL_HANDLE;
309
310 const bool bIsPartialPipeline;
311
312public:
314
317};
318
331
332// Manages all the pending BLAS compaction requests
334{
335public:
337
340
343
345
346private:
347 FVulkanDevice& Device;
348
352
353 // Keep references on FVulkanRayTracingGeometry until lifetime issue is found (this prevents cancellation)
355 FVulkanSyncPointRef ActiveRequestsSyncPoint;
356
357 FVulkanRayTracingCompactedSizeQueryPool* QueryPool = nullptr;
358};
359
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
ENoInit
Definition CoreMiscDefines.h:158
#define UE_NONCOPYABLE(TypeName)
Definition CoreMiscDefines.h:457
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
EShaderFrequency
Definition RHIDefinitions.h:202
ERayTracingHitGroupIndexingMode
Definition RHIResources.h:3628
uint64 FRayTracingAccelerationStructureAddress
Definition RHIResources.h:3725
ERayTracingShaderBindingMode
Definition RHIResources.h:3620
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition RHIDefinitions.h:95
Definition NameTypes.h:617
Definition RHIResources.h:1581
Definition RHICommandList.h:455
FRayTracingAccelerationStructureSize SizeInfo
Definition RHIResources.h:3722
Definition RHIResources.h:3729
FRayTracingGeometryInitializer Initializer
Definition RHIResources.h:3749
Definition RHIResources.h:1115
Definition RHIResources.h:3755
Definition RHIResources.h:3863
Definition RHIResources.h:1232
Definition RHIResources.h:5023
Definition VulkanResources.h:837
Definition VulkanCommandBuffer.h:43
Definition VulkanContext.h:241
Definition VulkanDevice.h:279
Definition VulkanQuery.h:49
Definition VulkanRayTracing.h:320
bool TryGetResults(uint32 NumResults)
Definition VulkanRayTracing.cpp:1759
TArray< uint64 > QueryOutput
Definition VulkanRayTracing.h:328
void EndBatch(FVulkanCommandListContext &CommandContext)
Definition VulkanRayTracing.cpp:1746
FVulkanSyncPointRef SyncPoint
Definition VulkanRayTracing.h:329
Definition VulkanRayTracing.h:334
void RequestCompact(FVulkanRayTracingGeometry *InRTGeometry)
Definition VulkanRayTracing.cpp:1789
bool ReleaseRequest(FVulkanRayTracingGeometry *InRTGeometry)
Definition VulkanRayTracing.cpp:1801
~FVulkanRayTracingCompactionRequestHandler()
Definition VulkanRayTracing.cpp:1783
Definition VulkanRayTracing.h:182
TRefCountPtr< FVulkanBuffer > AccelerationStructureBuffer
Definition VulkanRayTracing.h:207
VkDeviceAddress Address
Definition VulkanRayTracing.h:206
void SetupInlineGeometryParameters(uint32 GeometrySegmentIndex, FVulkanRayTracingGeometryParameters &Parameters) const
Definition VulkanRayTracing.cpp:609
static constexpr uint32 IndicesPerPrimitive
Definition VulkanRayTracing.h:184
void RemoveCompactionRequest()
Definition VulkanRayTracing.cpp:478
bool bHasPendingCompactionRequests
Definition VulkanRayTracing.h:208
FRHIDescriptorHandle HitGroupSystemIndexView
Definition VulkanRayTracing.h:215
TArray< FRHIDescriptorHandle > HitGroupSystemVertexViews
Definition VulkanRayTracing.h:214
FName OwnerName
Definition VulkanRayTracing.h:218
~FVulkanRayTracingGeometry()
Definition VulkanRayTracing.cpp:438
void ReleaseBindlessHandles()
Definition VulkanRayTracing.cpp:592
virtual FRayTracingAccelerationStructureAddress GetAccelerationStructureAddress(uint64 GPUIndex) const final override
Definition VulkanRayTracing.h:190
VkAccelerationStructureKHR Handle
Definition VulkanRayTracing.h:205
uint64 AccelerationStructureCompactedSize
Definition VulkanRayTracing.h:209
TArray< FVulkanHitGroupSystemParameters > HitGroupSystemParameters
Definition VulkanRayTracing.h:213
void CompactAccelerationStructure(FVulkanCommandBuffer &CmdBuffer, uint64 InSizeAfterCompaction)
Definition VulkanRayTracing.cpp:489
FDebugName DebugName
Definition VulkanRayTracing.h:217
FVulkanDevice *const Device
Definition VulkanRayTracing.h:211
FRayTracingGeometryInitializer Initializer
Definition RHIResources.h:3749
void SetupHitGroupSystemParameters()
Definition VulkanRayTracing.cpp:550
Definition VulkanRayTracing.h:270
VkPipeline GetPipeline() const
Definition VulkanRayTracing.h:277
const FVulkanRayTracingShader * GetVulkanShader(EShaderFrequency Frequency, int32 ShaderIndex) const
Definition VulkanRayTracing.cpp:1724
bool IsPartialPipeline() const
Definition VulkanRayTracing.h:282
~FVulkanRayTracingPipelineState()
Definition VulkanRayTracing.cpp:1677
const TArray< uint8 > & GetShaderHandles(EShaderFrequency Frequency) const
Definition VulkanRayTracing.cpp:1734
friend FVulkanRayTracingScene
Definition VulkanRayTracing.h:316
int32 GetVulkanShaderNum(EShaderFrequency Frequency) const
Definition VulkanRayTracing.cpp:1729
VulkanResourceFrameCounter FrameCounter
Definition VulkanRayTracing.h:313
UE_NONCOPYABLE(FVulkanRayTracingPipelineState)
int32 GetShaderIndex(const FVulkanRayTracingShader *Shader) const
Definition VulkanRayTracing.cpp:1707
friend FVulkanCommandListContext
Definition VulkanRayTracing.h:315
Definition VulkanRayTracing.h:19
static bool CheckVulkanInstanceFunctions(VkInstance inInstance)
Definition VulkanRayTracing.cpp:75
Definition VulkanRayTracing.h:222
~FVulkanRayTracingScene()
Definition VulkanRayTracing.cpp:705
TRefCountPtr< FVulkanBuffer > AccelerationStructureBuffer
Definition VulkanRayTracing.h:260
void BindBuffer(FRHIBuffer *InBuffer, uint32 InBufferOffset)
Definition VulkanRayTracing.cpp:715
TUniquePtr< FVulkanView > View
Definition VulkanRayTracing.h:256
bool IsBuilt() const
Definition VulkanRayTracing.h:233
const FRayTracingSceneInitializer Initializer
Definition VulkanRayTracing.h:242
TArray< TRefCountPtr< FRHIRayTracingGeometry > > ReferencedGeometries
Definition VulkanRayTracing.h:246
bool bBuilt
Definition VulkanRayTracing.h:262
uint32 NumInstances
Definition VulkanRayTracing.h:258
const FRayTracingSceneInitializer & GetInitializer() const override final
Definition VulkanRayTracing.h:229
FVulkanDevice & Device
Definition VulkanRayTracing.h:240
Definition VulkanRayTracing.h:69
ERayTracingShaderBindingMode GetShaderBindingMode() const
Definition VulkanRayTracing.h:121
void SetInlineGeometryParameters(uint32 SegmentIndex, const void *InData, uint32 InDataSize)
Definition VulkanRayTracing.cpp:991
virtual FRHISizeAndStride GetInlineBindingDataSizeAndStride() const override final
Definition VulkanRayTracing.cpp:1008
void Commit(FVulkanCommandListContext &Context, FRHIBuffer *InlineBindingDataBuffer)
Definition VulkanRayTracing.cpp:1015
ERayTracingHitGroupIndexingMode GetHitGroupIndexingMode() const
Definition VulkanRayTracing.h:116
~FVulkanRayTracingShaderTable()
Definition VulkanRayTracing.cpp:898
const VkStridedDeviceAddressRegionKHR * GetRegion(EShaderFrequency Frequency)
Definition VulkanRayTracing.cpp:947
void AddUBRef(FRHIUniformBuffer *UB)
Definition VulkanRayTracing.h:106
VkStridedDeviceAddressRegionKHR CommitRayGenShader(FVulkanCommandListContext &Context, uint32 SrcHandleIndex, TConstArrayView< uint8 > SrcHandleData)
Definition VulkanRayTracing.cpp:962
void SetLocalShaderParameters(EShaderFrequency Frequency, uint32 RecordIndex, uint32 InOffsetWithinRootSignature, const T &Parameters)
Definition VulkanRayTracing.h:83
void SetSlot(EShaderFrequency Frequency, uint32 DstSlot, uint32 SrcHandleIndex, TConstArrayView< uint8 > SrcHandleData)
Definition VulkanRayTracing.cpp:954
FVulkanDevice & GetDevice()
Definition VulkanRayTracing.h:126
void ReleaseLocalBuffers()
Definition VulkanRayTracing.cpp:903
TArrayView< TRefCountPtr< FRHIUniformBuffer > > GetUBRefs()
Definition VulkanRayTracing.h:111
static constexpr uint32 MaxBindingWorkers
Definition VulkanRayTracing.h:134
void SetLooseParameterData(EShaderFrequency Frequency, uint32 RecordIndex, const void *InData, uint32 InDataSize)
Definition VulkanRayTracing.h:90
Definition VulkanResources.h:292
Definition VulkanSubmission.h:54
Definition ArrayView.h:139
Definition Array.h:670
UE_FORCEINLINE_HINT SizeType AddUnique(ElementType &&Item)
Definition Array.h:2993
Definition UniquePtr.h:107
Definition Mutex.h:18
Definition VulkanMemory.h:418
static UE_FORCEINLINE_HINT void * Memzero(void *Dest, SIZE_T Count)
Definition UnrealMemory.h:131
Definition RHIDefinitions.h:1401
Definition RHIResources.h:47
Definition RHIResources.h:3496
Definition RHIResources.h:3669
Definition RHIResources.h:3635
Definition VulkanRayTracing.h:55
VkAccelerationStructureBuildGeometryInfoKHR GeometryInfo
Definition VulkanRayTracing.h:64
FVkRtBLASBuildData()
Definition VulkanRayTracing.h:56
VkAccelerationStructureBuildSizesInfoKHR SizesInfo
Definition VulkanRayTracing.h:65
TArray< VkAccelerationStructureBuildRangeInfoKHR, TInlineAllocator< 1 > > Ranges
Definition VulkanRayTracing.h:63
TArray< VkAccelerationStructureGeometryKHR, TInlineAllocator< 1 > > Segments
Definition VulkanRayTracing.h:62
Definition VulkanRayTracing.h:41
VkAccelerationStructureBuildGeometryInfoKHR GeometryInfo
Definition VulkanRayTracing.h:50
FVkRtTLASBuildData()
Definition VulkanRayTracing.h:42
VkAccelerationStructureGeometryKHR Geometry
Definition VulkanRayTracing.h:49
VkAccelerationStructureBuildSizesInfoKHR SizesInfo
Definition VulkanRayTracing.h:51
Definition VulkanRayTracing.h:28
uint32 BindlessHitGroupSystemVertexBuffer
Definition VulkanRayTracing.h:32
uint32 BindlessUniformBuffers[32]
Definition VulkanRayTracing.h:34
FHitGroupSystemRootConstants RootConstants
Definition VulkanRayTracing.h:29
uint32 BindlessHitGroupSystemIndexBuffer
Definition VulkanRayTracing.h:31
Definition VulkanRayTracing.cpp:352
Definition VulkanPipeline.h:643