UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
D3D12RootSignatureDefinitions.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "D3D12RHI.h"
7#include "Containers/Array.h"
10#include "Misc/StringBuilder.h"
11#include "RayTracingBuiltInResources.h"
12#include "RHIDefinitions.h"
14
15#if !defined(D3D12_MAJOR_VERSION)
16 #include "D3D12ThirdParty.h"
17#endif
18
20{
32
34 {
35 CBV,
36 SRV,
37 UAV,
38 Sampler,
39 };
40
42 {
43 Vertex,
44 Pixel,
46 Mesh,
48 All
49 };
50
65
82
103
105 {
106 switch (Visibility)
107 {
109 return TEXT("SHADER_VISIBILITY_VERTEX");
111 return TEXT("SHADER_VISIBILITY_GEOMETRY");
113 return TEXT("SHADER_VISIBILITY_PIXEL");
114#if !defined(D3D12RHI_TOOLS_MESH_SHADERS_UNSUPPORTED)
116 return TEXT("SHADER_VISIBILITY_MESH");
118 return TEXT("SHADER_VISIBILITY_AMPLIFICATION");
119#endif
120 default:
121 return TEXT("SHADER_VISIBILITY_ALL");
122 }
123 };
124
126 {
127 switch (Type)
128 {
130 return TEXT("SRV(t");
132 return TEXT("UAV(u");
134 return TEXT("Sampler(s");
135 default:
136 return TEXT("CBV(b");
137 }
138 }
139
141 {
142 switch (Flag)
143 {
145 return TEXT("ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT");
147 return TEXT("DENY_VERTEX_SHADER_ROOT_ACCESS");
149 return TEXT("DENY_GEOMETRY_SHADER_ROOT_ACCESS");
151 return TEXT("DENY_PIXEL_SHADER_ROOT_ACCESS");
153 return TEXT("ALLOW_STREAM_OUTPUT");
154
155#if !defined(D3D12RHI_TOOLS_MESH_SHADERS_UNSUPPORTED)
157 return TEXT("DENY_AMPLIFICATION_SHADER_ROOT_ACCESS");
159 return TEXT("DENY_MESH_SHADER_ROOT_ACCESS");
160#endif
161
163 return TEXT("CBV_SRV_UAV_HEAP_DIRECTLY_INDEXED");
165 return TEXT("SAMPLER_HEAP_DIRECTLY_INDEXED");
166
167 default:
168 break;
169 }
170
171 return TEXT("");
172 };
173
174 // Simple base class to help write out a root signature (subclass to generate either to a binary struct or a #define)
176 {
179
180 virtual ~FRootSignatureCreator() = default;
181
188
208
213
218
220 {
221 return RegisterSpace;
222 }
223
225 {
227 {
229 }
230
232 {
234 }
235
236 return false;
237 }
238 };
239
241 {
246
255
260
266
272
278
280 {
282 Parameter.InitAsConstants(Num32BitValues, Register, Space);
283 }
284
286 {
287 if (!ShouldSkipType(Type))
288 {
289 const FPendingTable NewTable{ Visibility, Type, NumDescriptors, FlagsOverride };
290 PendingTables.Emplace(NewTable);
291 }
292 }
293
295 {
296#if !defined(D3D12RHI_TOOLS_RAYTRACING_SHADERS_UNSUPPORTED)
298 {
299 // if set, D3D12_ROOT_SIGNATURE_FLAG_LOCAL_ROOT_SIGNATURE should be the only flag set
301 }
302#endif
303
305
306 for (int32 Index = 0; Index < PendingTables.Num(); Index++)
307 {
309
311
313
315 Parameter.InitAsDescriptorTable(1, &DescriptorRanges[Index], GetD3D12ShaderVisibility(PendingTable.Visibility));
316 }
317
318 RootDesc.Init_1_1(Parameters.Num(), Parameters.GetData(), 0, nullptr, RootFlags);
319
320 return RootDesc;
321 }
322 };
323
324 /* Root signature generator for DXC */
326 {
328 {
329 if (RootFlags.Len() > 0)
330 {
331 RootFlags += "|";
332 }
334 }
335
337 {
338 FString Line = FString::Printf(TEXT("CBV(t%d, space=%d, visibility=%s))"), Register, Space, GetVisibilityFlag(Visibility));
339 if (Table.Len() > 0)
340 {
341 Table += ",";
342 }
343 Table += Line;
344 }
345
347 {
348 FString Line = FString::Printf(TEXT("SRV(t%d, space=%d, visibility=%s))"), Register, Space, GetVisibilityFlag(Visibility));
349 if (Table.Len() > 0)
350 {
351 Table += ",";
352 }
353 Table += Line;
354 }
355
357 {
358 FString Line = FString::Printf(TEXT("UAV(u%d, space=%d, visibility=%s)"), Register, Space, GetVisibilityFlag(Visibility));
359 if (Table.Len() > 0)
360 {
361 Table += ",";
362 }
363 Table += Line;
364 }
365
367 {
368 FString Line = FString::Printf(TEXT("RootConstants(num32BitConstants=%d, b%d, space=%d)"), Num32BitValues, Register, Space);
369 if (Table.Len() > 0)
370 {
371 Table += ",";
372 }
373 Table += Line;
374 }
375
377 {
378 if (!ShouldSkipType(Type))
379 {
380 FString Line = FString::Printf(TEXT("DescriptorTable(visibility=%s, %s0, space=%d, numDescriptors=%d))"),
382 );
383 if (Table.Len() > 0)
384 {
385 Table += ",";
386 }
387 Table += Line;
388 }
389 }
390
391 FString GenerateString() const
392 {
393 FString String = FString::Printf(TEXT("\"RootFlags(%s),%s\""),
394 RootFlags.Len() == 0 ? TEXT("0") : *RootFlags,
395 *Table);
396 return String;
397 }
398
399 FString RootFlags;
400 FString Table;
401 };
402
409
410 // Fat/Static Gfx Root Signature
441
442 // Fat/Static Compute Root Signature
444 {
445 // Ensure the creator starts in a clean state (in cases of creator reuse, etc.).
446 Creator.SetFlags(InFlags);
447
448 Creator.AddUnorderedAccessViewParameter(0, UE_HLSL_SPACE_DIAGNOSTIC);
449
451 {
452 const uint32 NumConstants = 4u;
453 Creator.AddConstantsParameter(NumConstants, 0u, UE_HLSL_SPACE_SHADER_ROOT_CONSTANTS); // UERootConstants
454 }
455
456 // Tables must be added only after other parameters
457
460 }
461
462#if !defined(D3D12RHI_TOOLS_RAYTRACING_SHADERS_UNSUPPORTED)
464 {
465 Creator.SetFlags(InFlags);
466 Creator.AddRootFlag(BaseRootFlags);
468
470 {
472 {
473 // Num constants could be 2 smaller if non-bindless data is removed (24 bytes instead of 32)
474 // (see notes in FD3D12RootSignatureDesc constructor)
475 uint32 NumConstants = sizeof(FD3D12HitGroupSystemParameters) / sizeof(uint32);
477 }
478 else
479 {
480 uint32 NumConstants = sizeof(FHitGroupSystemRootConstants) / sizeof(uint32);
482
485 }
486 }
488 {
490 {
491 Creator.AddConstantBufferViewParameter(Index, UE_HLSL_SPACE_STATIC_SHADER_BINDINGS);
492 }
493 }
494
496 {
497 for (uint32 Index = 0; Index < MAX_CBS; Index++)
498 {
499 Creator.AddConstantBufferViewParameter(Index, Creator.GetRegisterSpace());
500 }
501 }
502 else
503 {
505 }
506
508 }
509
516#endif
517
537}
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define MAX_UAVS
Definition D3D12RHI.h:19
#define MAX_SAMPLERS
Definition D3D12RHI.h:18
#define MAX_CBS
Definition D3D12RHI.h:20
#define MAX_SRVS
Definition D3D12RHI.h:17
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
constexpr bool EnumHasAllFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:28
EShaderFrequency
Definition RHIDefinitions.h:202
@ SF_NumGraphicsFrequencies
Definition RHIDefinitions.h:219
@ SF_Compute
Definition RHIDefinitions.h:208
EShaderBindingLayoutFlags
Definition RHIShaderBindingLayout.h:53
uint32_t uint32
Definition binka_ue_file_header.h:6
@ MaxUniformBufferEntries
Definition RHIShaderBindingLayout.h:77
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT ElementType * GetData() UE_LIFETIMEBOUND
Definition Array.h:1027
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
void Init(const ElementType &Element, SizeType Number)
Definition Array.h:3043
ElementType & AddZeroed_GetRef() UE_LIFETIMEBOUND
Definition Array.h:2779
constexpr D3D12_DESCRIPTOR_RANGE_FLAGS SRVDescriptorRangeFlags
Definition D3D12RootSignatureDefinitions.h:24
constexpr D3D12_DESCRIPTOR_RANGE_FLAGS SamplerDescriptorRangeFlags
Definition D3D12RootSignatureDefinitions.h:27
constexpr D3D12_ROOT_DESCRIPTOR_FLAGS CBVRootDescriptorFlags
Definition D3D12RootSignatureDefinitions.h:30
constexpr D3D12_DESCRIPTOR_RANGE_FLAGS UAVDescriptorRangeFlags
Definition D3D12RootSignatureDefinitions.h:26
constexpr D3D12_DESCRIPTOR_RANGE_FLAGS CBVDescriptorRangeFlags
Definition D3D12RootSignatureDefinitions.h:25
Definition D3D12RootSignatureDefinitions.h:20
void CreateComputeRootSignature(FRootSignatureCreator &Creator, EShaderBindingLayoutFlags InFlags)
Definition D3D12RootSignatureDefinitions.h:443
ERootSignatureRangeType
Definition D3D12RootSignatureDefinitions.h:34
void CreateRayTracingSignature(FRootSignatureCreator &Creator, bool bLocalRootSignature, D3D12_ROOT_SIGNATURE_FLAGS BaseRootFlags, EShaderBindingLayoutFlags InFlags)
Definition D3D12RootSignatureDefinitions.h:463
ERootSignatureVisibility
Definition D3D12RootSignatureDefinitions.h:42
FString GenerateRootSignatureString(EShaderFrequency InFrequency, EShaderBindingLayoutFlags InFlags)
defined(D3D12RHI_TOOLS_RAYTRACING_SHADERS_UNSUPPORTED)
Definition D3D12RootSignatureDefinitions.h:518
const TCHAR * GetFlagName(D3D12_ROOT_SIGNATURE_FLAGS Flag)
Definition D3D12RootSignatureDefinitions.h:140
D3D12_DESCRIPTOR_RANGE_FLAGS GetD3D12DescriptorRangeFlags(ERootSignatureRangeType Type)
Definition D3D12RootSignatureDefinitions.h:66
FString GenerateRayTracingSignatureString(bool bLocalRootSignature, D3D12_ROOT_SIGNATURE_FLAGS BaseRootFlags, EShaderBindingLayoutFlags InFlags)
Definition D3D12RootSignatureDefinitions.h:510
const TCHAR * GetTypePrefix(ERootSignatureRangeType Type)
Definition D3D12RootSignatureDefinitions.h:125
const TCHAR * GetVisibilityFlag(ERootSignatureVisibility Visibility)
Definition D3D12RootSignatureDefinitions.h:104
void CreateGfxRootSignature(FRootSignatureCreator &Creator, EShaderBindingLayoutFlags InFlags)
Definition D3D12RootSignatureDefinitions.h:411
D3D12_DESCRIPTOR_RANGE_TYPE GetD3D12DescriptorRangeType(ERootSignatureRangeType Type)
Definition D3D12RootSignatureDefinitions.h:51
D3D12_SHADER_VISIBILITY GetD3D12ShaderVisibility(ERootSignatureVisibility Visibility)
Definition D3D12RootSignatureDefinitions.h:83
void AddAllStandardTablesForVisibility(FRootSignatureCreator &Creator, ERootSignatureVisibility Visibility)
Definition D3D12RootSignatureDefinitions.h:403
U16 Index
Definition radfft.cpp:71
Definition D3D12RootSignatureDefinitions.h:248
ERootSignatureRangeType Type
Definition D3D12RootSignatureDefinitions.h:250
ERootSignatureVisibility Visibility
Definition D3D12RootSignatureDefinitions.h:249
D3D12_DESCRIPTOR_RANGE_FLAGS FlagsOverride
Definition D3D12RootSignatureDefinitions.h:252
int32 NumDescriptors
Definition D3D12RootSignatureDefinitions.h:251
Definition D3D12RootSignatureDefinitions.h:241
const D3D12_VERSIONED_ROOT_SIGNATURE_DESC & Finalize()
Definition D3D12RootSignatureDefinitions.h:294
void AddTable(ERootSignatureVisibility Visibility, ERootSignatureRangeType Type, int32 NumDescriptors, D3D12_DESCRIPTOR_RANGE_FLAGS FlagsOverride=D3D12_DESCRIPTOR_RANGE_FLAG_NONE) override
Definition D3D12RootSignatureDefinitions.h:285
void AddUnorderedAccessViewParameter(uint32 Register, uint32 Space, ERootSignatureVisibility Visibility=ERootSignatureVisibility::All) override
Definition D3D12RootSignatureDefinitions.h:273
void AddShaderResourceViewParameter(uint32 Register, uint32 Space, ERootSignatureVisibility Visibility=ERootSignatureVisibility::All) override
Definition D3D12RootSignatureDefinitions.h:267
TArray< CD3DX12_ROOT_PARAMETER1 > Parameters
Definition D3D12RootSignatureDefinitions.h:244
TArray< CD3DX12_DESCRIPTOR_RANGE1 > DescriptorRanges
Definition D3D12RootSignatureDefinitions.h:243
void AddRootFlag(D3D12_ROOT_SIGNATURE_FLAGS RootFlag) override
Definition D3D12RootSignatureDefinitions.h:256
void AddConstantBufferViewParameter(uint32 Register, uint32 Space, ERootSignatureVisibility Visibility=ERootSignatureVisibility::All) override
Definition D3D12RootSignatureDefinitions.h:261
CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC RootDesc
Definition D3D12RootSignatureDefinitions.h:245
TArray< FPendingTable > PendingTables
Definition D3D12RootSignatureDefinitions.h:254
void AddConstantsParameter(uint32 Num32BitValues, uint32 Register, uint32 Space) override
Definition D3D12RootSignatureDefinitions.h:279
D3D12_ROOT_SIGNATURE_FLAGS RootFlags
Definition D3D12RootSignatureDefinitions.h:242
Definition D3D12RootSignatureDefinitions.h:176
virtual void AddUnorderedAccessViewParameter(uint32 Register, uint32 Space, ERootSignatureVisibility Visibility=ERootSignatureVisibility::All)=0
bool ShouldSkipType(ERootSignatureRangeType Type) const
Definition D3D12RootSignatureDefinitions.h:224
virtual void AddTable(ERootSignatureVisibility Visibility, ERootSignatureRangeType Type, int32 NumDescriptors, D3D12_DESCRIPTOR_RANGE_FLAGS FlagsOverride=D3D12_DESCRIPTOR_RANGE_FLAG_NONE)=0
virtual void AddConstantsParameter(uint32 Num32BitValues, uint32 Register, uint32 Space)=0
EShaderBindingLayoutFlags Flags
Definition D3D12RootSignatureDefinitions.h:177
void SetRegisterSpace(uint32 InSpace)
Definition D3D12RootSignatureDefinitions.h:214
uint32 RegisterSpace
Definition D3D12RootSignatureDefinitions.h:178
bool HasFlags(EShaderBindingLayoutFlags InFlags) const
Definition D3D12RootSignatureDefinitions.h:209
void SetFlags(EShaderBindingLayoutFlags InFlags)
Definition D3D12RootSignatureDefinitions.h:189
virtual void AddShaderResourceViewParameter(uint32 Register, uint32 Space, ERootSignatureVisibility Visibility=ERootSignatureVisibility::All)=0
virtual void AddRootFlag(D3D12_ROOT_SIGNATURE_FLAGS Flag)=0
uint32 GetRegisterSpace() const
Definition D3D12RootSignatureDefinitions.h:219
virtual void AddConstantBufferViewParameter(uint32 Register, uint32 Space, ERootSignatureVisibility Visibility=ERootSignatureVisibility::All)=0
Definition D3D12RootSignatureDefinitions.h:326
void AddTable(ERootSignatureVisibility Visibility, ERootSignatureRangeType Type, int32 NumDescriptors, D3D12_DESCRIPTOR_RANGE_FLAGS FlagsOverride=D3D12_DESCRIPTOR_RANGE_FLAG_NONE) override
Definition D3D12RootSignatureDefinitions.h:376
void AddConstantsParameter(uint32 Num32BitValues, uint32 Register, uint32 Space) override
Definition D3D12RootSignatureDefinitions.h:366
void AddUnorderedAccessViewParameter(uint32 Register, uint32 Space, ERootSignatureVisibility Visibility=ERootSignatureVisibility::All) override
Definition D3D12RootSignatureDefinitions.h:356
FString RootFlags
Definition D3D12RootSignatureDefinitions.h:399
void AddConstantBufferViewParameter(uint32 Register, uint32 Space, ERootSignatureVisibility Visibility=ERootSignatureVisibility::All) override
Definition D3D12RootSignatureDefinitions.h:336
FString Table
Definition D3D12RootSignatureDefinitions.h:400
void AddRootFlag(D3D12_ROOT_SIGNATURE_FLAGS InFlag) override
Definition D3D12RootSignatureDefinitions.h:327
FString GenerateString() const
Definition D3D12RootSignatureDefinitions.h:391
void AddShaderResourceViewParameter(uint32 Register, uint32 Space, ERootSignatureVisibility Visibility=ERootSignatureVisibility::All) override
Definition D3D12RootSignatureDefinitions.h:346
Definition D3D12RayTracingResources.h:19