UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ShaderParameterMetadata.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 ShaderParameterMetadata.h: Meta data about shader parameter structures
5=============================================================================*/
6
7#pragma once
8
9#include "Containers/Array.h"
10#include "Containers/List.h"
11#include "Containers/Map.h"
15#include "CoreMinimal.h"
16#include "HAL/Platform.h"
18#include "Misc/CString.h"
19#include "Misc/StringBuilder.h"
20#include "RHI.h"
21#include "RHIDefinitions.h"
26#include "UObject/NameTypes.h"
28
34
45
48
63
82
85
92
95{
96public:
98
99 RENDERCORE_API void RegisterSlot(FName SlotName);
100
101 inline int32 GetSlotCount() const
102 {
103 return SlotNames.Num();
104 }
105
107 {
108 return FString::Printf(TEXT("[Name: %s, Slot: %u]"), *GetSlotName(Slot).ToString(), Slot);
109 }
110
112 {
113 checkf(Slot < SlotNames.Num(), TEXT("Requesting name for an invalid slot: %u."), Slot);
114 return SlotNames[Slot];
115 }
116
118 {
119 // Brute force linear search. The search space is small and the find operation should not be critical path.
120 for (int32 Index = 0; Index < SlotNames.Num(); ++Index)
121 {
122 if (SlotNames[Index] == SlotName)
123 {
125 }
126 }
128 }
129
130private:
131 TArray<FName> SlotNames;
132};
133
136{
137public:
139 enum class EUseCase : uint8
140 {
143
146
149 };
150
152 enum class EUsageFlags : uint8
153 {
154 None = 0,
155
158
160 UniformView = 1 << 1,
161
163 NeedsReflectedMembers = 1 << 2,
164
166 ManuallyBoundByPass = 1 << 3,
167 };
168
170 static constexpr const TCHAR* kRootUniformBufferBindingName = TEXT("_RootShaderParameters");
171
173 static constexpr int32 kRootCBufferBindingIndex = 0;
174
177 {
178 public:
179
182 const TCHAR* InName,
183 const TCHAR* InShaderType,
185 uint32 InOffset,
192 )
193 : Name(InName)
194 , ShaderType(InShaderType)
195 , FileLine(InFileLine)
196 , Offset(InOffset)
197 , BaseType(InBaseType)
198 , Precision(InPrecision)
199 , NumRows(InNumRows)
200 , NumColumns(InNumColumns)
201 , NumElements(InNumElements)
202 , Struct(InStruct)
203 {
205 }
206
208 const TCHAR* GetName() const { return Name; }
209
211 const TCHAR* GetShaderType() const { return ShaderType; }
212
214 int32 GetFileLine() const { return int32(FileLine); }
215
217 uint32 GetOffset() const { return Offset; }
218
220 EUniformBufferBaseType GetBaseType() const { return BaseType; }
221
223 EShaderPrecisionModifier::Type GetPrecision() const { return Precision; }
224
226 uint32 GetNumRows() const { return NumRows; }
227
229 uint32 GetNumColumns() const { return NumColumns; }
230
232 uint32 GetNumElements() const { return NumElements; }
233
235 const FShaderParametersMetadata* GetStructMetadata() const { return Struct; }
236
237 inline bool IsVariableNativeType() const
238 {
239 return
240 BaseType == UBMT_INT32 ||
241 BaseType == UBMT_UINT32 ||
242 BaseType == UBMT_FLOAT32;
243 }
244
246 inline uint32 GetMemberSize() const
247 {
249 uint32 ElementSize = sizeof(uint32) * NumRows * NumColumns;
250
252 if (NumElements > 0)
253 {
254 return Align(ElementSize, SHADER_PARAMETER_ARRAY_ELEMENT_ALIGNMENT) * NumElements;
255 }
256 return ElementSize;
257 }
258
260 FString& Result,
262 EUniformBufferBaseType BaseType,
263 EShaderPrecisionModifier::Type PrecisionModifier,
264 uint32 NumRows,
265 uint32 NumColumns
266 );
268 RENDERCORE_API void GenerateShaderParameterType(FString& Result, EShaderPlatform ShaderPlatform) const;
269
270 private:
272
273 template<typename FHasherType, typename FHashType>
274 void HashLayout(TMemoryHasher<FHasherType, FHashType>& Hasher)
275 {
276 Hasher << Offset;
278
279 Hasher.Serialize(const_cast<TCHAR*>(Name), FCString::Strlen(Name));
280 Hasher << NumElements;
281
284
285 if (BaseType == UBMT_INT32 ||
286 BaseType == UBMT_UINT32 ||
287 BaseType == UBMT_FLOAT32)
288 {
290 Hasher << NumRows;
291 Hasher << NumColumns;
292 }
293 else if (BaseType == UBMT_INCLUDED_STRUCT || BaseType == UBMT_NESTED_STRUCT)
294 {
295 const_cast<FShaderParametersMetadata*>(Struct)->HashLayout(Hasher);
296 }
297 else if (bIsRHIResource || bIsRDGResource)
298 {
299 Hasher.Serialize(const_cast<TCHAR*>(ShaderType), FCString::Strlen(ShaderType));
300 }
301 }
302
303 const TCHAR* Name;
304 const TCHAR* ShaderType;
305 int32 FileLine;
307 EUniformBufferBaseType BaseType;
309 uint32 NumRows;
310 uint32 NumColumns;
311 uint32 NumElements;
313 };
314
323 EUseCase UseCase,
325 const TCHAR* InLayoutName,
326 const TCHAR* InStructTypeName,
328 const TCHAR* InStaticSlotName,
329 const ANSICHAR* InFileName,
330 const int32 InFileLine,
333 bool bForceCompleteInitialization = false,
336
338
340
341#if WITH_EDITOR
343#endif
344
345 const TCHAR* GetStructTypeName() const { return StructTypeName; }
346 const TCHAR* GetShaderVariableName() const { return ShaderVariableName; }
347 const FHashedName& GetShaderVariableHashedName() const { return ShaderVariableHashedName; }
348 const TCHAR* GetStaticSlotName() const { return StaticSlotName; }
349
350 bool HasStaticSlot() const { return StaticSlotName != nullptr; }
351
352 EUniformBufferBindingFlags GetBindingFlags() const { return BindingFlags; }
353
355 {
356 // Decay to static when both binding flags are specified.
358 ? BindingFlags
360 }
361
363 const ANSICHAR* GetFileName() const { return FileName; }
364
366 const int32 GetFileLine() const { return FileLine; }
367
368 uint32 GetSize() const { return Size; }
369 EUseCase GetUseCase() const { return UseCase; }
370 inline bool IsLayoutInitialized() const { return Layout != nullptr; }
371 EUsageFlags GetUsageFlags() const { return UsageFlags; }
372
374 {
376 return *Layout;
377 }
379 {
381 return Layout;
382 }
383 const TArray<FMember>& GetMembers() const { return Members; }
384
385#if WITH_EDITOR
386 inline bool IsUniformBufferDeclarationInitialized() const { return UniformBufferDeclaration.IsValid(); }
389 const FString& GetUniformBufferDeclaration() const { return *UniformBufferDeclaration; }
390 inline const FString& GetUniformBufferPath() const { return UniformBufferPath; }
391 inline const FString& GetUniformBufferInclude() const { return UniformBufferInclude; }
392 inline uint32 GetUniformBufferPathHash() const { return UniformBufferPathHash; }
393#endif // WITH_EDITOR
394
397 uint16 MemberOffset,
400 int32* ArrayElementId, FString* NamePrefix) const;
401
403 RENDERCORE_API FString GetFullMemberCodeName(uint16 MemberOffset) const;
404
408#if WITH_EDITOR
410#endif // WITH_EDITOR
411
414
417 {
420 return LayoutHash;
421 }
422
423#if WITH_EDITOR
424 RENDERCORE_API void AppendKeyString(FString& OutKeyString) const;
425 RENDERCORE_API void Append(FShaderKeyGenerator& KeyGen) const;
426#endif
427
428 inline const FBlake3Hash& GetLayoutSignature() const
429 {
430#if WITH_EDITOR
432 return LayoutSignature;
433#else
434 // shader compilation types & WITH_EDITOR is a massive mess upstream; this should never actually be called outside of the editor
435 // but actually compiling the function out is a headache, so we instead just assert if it's called
436 checkNoEntry();
437 static FBlake3Hash Dummy;
438 return Dummy;
439#endif
440 }
441
442
444 template<typename TParameterFunction>
446 {
447 for (const FShaderParametersMetadata::FMember& Member : Members)
448 {
449 const FShaderParametersMetadata* NewParametersMetadata = Member.GetStructMetadata();
450
452 {
453 NewParametersMetadata->IterateStructureMetadataDependencies(Lambda);
454 }
455 }
456
457 Lambda(this);
458 }
459
460private:
461 const TCHAR* const LayoutName;
462
464 const TCHAR* const StructTypeName;
465
467 const TCHAR* const ShaderVariableName;
468
470 const TCHAR* const StaticSlotName;
471
472 FHashedName ShaderVariableHashedName;
473
475 const ANSICHAR* const FileName;
476
478 const int32 FileLine;
479
481 const uint32 Size;
482
484 const EUseCase UseCase;
485
487 const EUniformBufferBindingFlags BindingFlags;
488
490 const EUsageFlags UsageFlags;
491
494
496 TArray<FMember> Members;
497
498#if WITH_EDITOR
502
505 FThreadSafeNameBufferPtr MemberNameBuffer;
506
508 FString UniformBufferPath; // Format: "/Engine/Generated/UniformBuffers/%s.ush"
509 FString UniformBufferInclude; // Format: "#include \"/Engine/Generated/UniformBuffers/%s.ush\"" HLSL_LINE_TERMINATOR
510
514#endif
515
518
520 uint32 LayoutHash = 0;
521
522 template<typename FHasherType, typename FHashType>
523 void HashLayout(TMemoryHasher<FHasherType, FHashType>& Hasher)
524 {
525 for (FMember& CurrentMember : Members)
526 {
527 CurrentMember.HashLayout(Hasher);
528 }
529 }
530
531#if WITH_EDITOR
532
535#endif
536
538
539#if WITH_EDITOR
541#endif
542};
543
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
#define check(expr)
Definition AssertionMacros.h:314
#define checkNoEntry()
Definition AssertionMacros.h:316
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#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
FPlatformTypes::ANSICHAR ANSICHAR
An ANSI character. Normally a signed type.
Definition Platform.h:1131
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
ERHIUniformBufferFlags
Definition RHIDefinitions.h:704
@ MAX_UNIFORM_BUFFER_STATIC_SLOTS
Definition RHIDefinitions.h:727
#define SHADER_PARAMETER_ARRAY_ELEMENT_ALIGNMENT
Definition RHIDefinitions.h:28
uint8 FUniformBufferStaticSlot
Definition RHIDefinitions.h:722
EUniformBufferBaseType
Definition RHIDefinitions.h:634
@ UBMT_FLOAT32
Definition RHIDefinitions.h:644
@ UBMT_NESTED_STRUCT
Definition RHIDefinitions.h:666
@ UBMT_UINT32
Definition RHIDefinitions.h:643
@ UBMT_INT32
Definition RHIDefinitions.h:642
@ UBMT_INCLUDED_STRUCT
Definition RHIDefinitions.h:669
EUniformBufferBindingFlags
Definition RHIDefinitions.h:686
EShaderCodeResourceBindingType
Definition RHIDefinitions.h:553
bool IsRDGResourceReferenceShaderParameterType(EUniformBufferBaseType BaseType)
Definition RHIDefinitions.h:1575
bool IsShaderParameterTypeReadOnlyRHIResource(EUniformBufferBaseType BaseType)
Definition RHIDefinitions.h:1580
EShaderPlatform
Definition RHIShaderPlatform.h:11
bool SupportShaderPrecisionModifier(EShaderPlatform Platform)
Definition ShaderParameterMetadata.cpp:23
EShaderCodeResourceBindingType ParseShaderResourceBindingType(const TCHAR *ShaderType)
Definition ShaderParameterMetadata.cpp:311
TStringView< TCHAR > FStringView
Definition StringFwd.h:45
uint32 Offset
Definition VulkanMemory.cpp:4033
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition MemoryImage.h:858
Definition NameTypes.h:617
Definition ShaderKeyGenerator.h:29
Definition ShaderParameterMetadata.h:177
bool IsVariableNativeType() const
Definition ShaderParameterMetadata.h:237
EUniformBufferBaseType GetBaseType() const
Definition ShaderParameterMetadata.h:220
const TCHAR * GetShaderType() const
Definition ShaderParameterMetadata.h:211
static RENDERCORE_API void GenerateShaderParameterType(FString &Result, bool bSupportsPrecisionModifier, EUniformBufferBaseType BaseType, EShaderPrecisionModifier::Type PrecisionModifier, uint32 NumRows, uint32 NumColumns)
Definition ShaderParameterMetadata.cpp:86
uint32 GetNumColumns() const
Definition ShaderParameterMetadata.h:229
const TCHAR * GetName() const
Definition ShaderParameterMetadata.h:208
uint32 GetMemberSize() const
Definition ShaderParameterMetadata.h:246
uint32 GetNumElements() const
Definition ShaderParameterMetadata.h:232
uint32 GetNumRows() const
Definition ShaderParameterMetadata.h:226
uint32 GetOffset() const
Definition ShaderParameterMetadata.h:217
int32 GetFileLine() const
Definition ShaderParameterMetadata.h:214
const FShaderParametersMetadata * GetStructMetadata() const
Definition ShaderParameterMetadata.h:235
FMember(const TCHAR *InName, const TCHAR *InShaderType, int32 InFileLine, uint32 InOffset, EUniformBufferBaseType InBaseType, EShaderPrecisionModifier::Type InPrecision, uint32 InNumRows, uint32 InNumColumns, uint32 InNumElements, const FShaderParametersMetadata *InStruct)
Definition ShaderParameterMetadata.h:181
EShaderPrecisionModifier::Type GetPrecision() const
Definition ShaderParameterMetadata.h:223
Definition ShaderParameterMetadata.h:136
EUniformBufferBindingFlags GetBindingFlags() const
Definition ShaderParameterMetadata.h:352
const FBlake3Hash & GetLayoutSignature() const
Definition ShaderParameterMetadata.h:428
const int32 GetFileLine() const
Definition ShaderParameterMetadata.h:366
bool IsLayoutInitialized() const
Definition ShaderParameterMetadata.h:370
const TCHAR * GetStructTypeName() const
Definition ShaderParameterMetadata.h:345
const FRHIUniformBufferLayout & GetLayout() const
Definition ShaderParameterMetadata.h:373
const FHashedName & GetShaderVariableHashedName() const
Definition ShaderParameterMetadata.h:347
EUseCase
Definition ShaderParameterMetadata.h:140
const ANSICHAR * GetFileName() const
Definition ShaderParameterMetadata.h:363
RENDERCORE_API void GetNestedStructs(TArray< const FShaderParametersMetadata * > &OutNestedStructs) const
Definition ShaderParameterMetadata.cpp:911
static RENDERCORE_API TMap< FHashedName, FShaderParametersMetadata * > & GetNameStructMap()
Definition ShaderParameterMetadata.cpp:72
const TCHAR * GetShaderVariableName() const
Definition ShaderParameterMetadata.h:346
EUniformBufferBindingFlags GetPreferredBindingFlag() const
Definition ShaderParameterMetadata.h:354
EUseCase GetUseCase() const
Definition ShaderParameterMetadata.h:369
bool HasStaticSlot() const
Definition ShaderParameterMetadata.h:350
static constexpr const TCHAR * kRootUniformBufferBindingName
Definition ShaderParameterMetadata.h:170
uint32 GetLayoutHash() const
Definition ShaderParameterMetadata.h:416
static RENDERCORE_API TLinkedList< FShaderParametersMetadata * > *& GetStructList()
Definition ShaderParameterMetadata.cpp:66
void IterateStructureMetadataDependencies(TParameterFunction Lambda) const
Definition ShaderParameterMetadata.h:445
EUsageFlags GetUsageFlags() const
Definition ShaderParameterMetadata.h:371
RENDERCORE_API FString GetFullMemberCodeName(uint16 MemberOffset) const
Definition ShaderParameterMetadata.cpp:1154
static RENDERCORE_API void InitializeAllUniformBufferStructs()
Definition ShaderParameterMetadata.cpp:530
virtual RENDERCORE_API ~FShaderParametersMetadata()
Definition ShaderParameterMetadata.cpp:505
RENDERCORE_API void FindMemberFromOffset(uint16 MemberOffset, const FShaderParametersMetadata **OutContainingStruct, const FShaderParametersMetadata::FMember **OutMember, int32 *ArrayElementId, FString *NamePrefix) const
Definition ShaderParameterMetadata.cpp:1080
static constexpr int32 kRootCBufferBindingIndex
Definition ShaderParameterMetadata.h:173
const TCHAR * GetStaticSlotName() const
Definition ShaderParameterMetadata.h:348
const TArray< FMember > & GetMembers() const
Definition ShaderParameterMetadata.h:383
const FRHIUniformBufferLayout * GetLayoutPtr() const
Definition ShaderParameterMetadata.h:378
EUsageFlags
Definition ShaderParameterMetadata.h:153
uint32 GetSize() const
Definition ShaderParameterMetadata.h:368
Definition ShaderParameterMetadata.h:88
Definition ShaderParameterMetadata.h:95
RENDERCORE_API void RegisterSlot(FName SlotName)
Definition ShaderParameterMetadata.cpp:39
FString GetDebugDescription(FUniformBufferStaticSlot Slot) const
Definition ShaderParameterMetadata.h:106
static RENDERCORE_API FUniformBufferStaticSlotRegistry & Get()
Definition ShaderParameterMetadata.cpp:33
FUniformBufferStaticSlot FindSlotByName(FName SlotName) const
Definition ShaderParameterMetadata.h:117
int32 GetSlotCount() const
Definition ShaderParameterMetadata.h:101
FName GetSlotName(FUniformBufferStaticSlot Slot) const
Definition ShaderParameterMetadata.h:111
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
Definition List.h:285
Definition UnrealString.h.inl:34
Definition MemoryHasher.h:22
virtual void Serialize(void *Data, int64 Num) override
Definition MemoryHasher.h:31
Definition ShaderParameterMetadata.h:36
Type
Definition ShaderParameterMetadata.h:38
@ Fixed
Definition ShaderParameterMetadata.h:41
@ Float
Definition ShaderParameterMetadata.h:39
@ Invalid
Definition ShaderParameterMetadata.h:42
@ Half
Definition ShaderParameterMetadata.h:40
U16 Index
Definition radfft.cpp:71
Definition Blake3.h:27
Definition RHIUniformBufferLayoutInitializer.h:41
Definition RHIResources.h:1150
Definition ShaderCore.h:511
Definition ShaderParameterMetadata.h:66
EUniformBufferBindingFlags BindingFlags
Definition ShaderParameterMetadata.h:77
ERHIUniformBufferFlags Flags
Definition ShaderParameterMetadata.h:80
FString StaticSlotName
Definition ShaderParameterMetadata.h:68
uint32 LayoutHash
Definition ShaderParameterMetadata.h:74
FThreadSafeNameBufferPtr MemberNameBuffer
Definition ShaderParameterMetadata.h:71
Definition ShaderParameterMetadata.h:51
const TCHAR * UniformBufferMemberName
Definition ShaderParameterMetadata.h:53
uint8 Type
Definition ShaderParameterMetadata.h:57
uint16 ResourceIndex
Definition ShaderParameterMetadata.h:59
FStringView GetUniformBufferName() const
Definition ShaderParameterMetadata.h:61
uint8 UniformBufferNameLength
Definition ShaderParameterMetadata.h:55
static int32 Strlen(const CharType *String)
Definition CString.h:1047