UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RHIUniformBufferLayoutInitializer.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "RHIDefinitions.h"
6#include "RHIMemoryLayout.h"
7#include "RHIResources.h"
10
13{
15
17 LAYOUT_FIELD(uint16, MemberOffset);
18
21
24 {
25 return A.MemberOffset == B.MemberOffset
26 && A.MemberType == B.MemberType;
27 }
28};
29
31{
32 uint8 Type = (uint8)Ref.MemberType;
33 Ar << Ref.MemberOffset;
34 Ar << Type;
35 Ref.MemberType = (EUniformBufferBaseType)Type;
36 return Ar;
37}
38
41{
43
45
47 : Name(InName)
48 {}
50 : Name(InName)
51 , ConstantBufferSize(InConstantBufferSize)
52 {
54 }
55
56 inline uint32 GetHash() const
57 {
58 checkSlow(Hash != 0);
59 return Hash;
60 }
61
69 {
70 uint32 TmpHash = 0;
71
72 TmpHash |= (ConstantBufferSize << 16);
73 TmpHash |= (static_cast<uint32>(BindingFlags) << 8);
74
75 // Static slot is not stable. Just track whether we have one at all.
76 TmpHash |= (StaticSlot != MAX_UNIFORM_BUFFER_STATIC_SLOTS ? 1 << 0 : 0);
77
78 // These flags aren't based on the resources, so make sure they change the hash
82
83 for (int32 ResourceIndex = 0; ResourceIndex < Resources.Num(); ResourceIndex++)
84 {
85 // Offset and therefore hash must be the same regardless of pointer size
86 checkSlow(Resources[ResourceIndex].MemberOffset == Align(Resources[ResourceIndex].MemberOffset, SHADER_PARAMETER_POINTER_ALIGNMENT));
87 TmpHash ^= Resources[ResourceIndex].MemberOffset;
88 }
89
90 uint32 N = Resources.Num();
91 while (N >= 4)
92 {
93 TmpHash ^= (Resources[--N].MemberType << 0);
94 TmpHash ^= (Resources[--N].MemberType << 8);
95 TmpHash ^= (Resources[--N].MemberType << 16);
96 TmpHash ^= (Resources[--N].MemberType << 24);
97 }
98 while (N >= 2)
99 {
100 TmpHash ^= Resources[--N].MemberType << 0;
101 TmpHash ^= Resources[--N].MemberType << 16;
102 }
103 while (N > 0)
104 {
105 TmpHash ^= Resources[--N].MemberType;
106 }
107
108 // Name is necessary to distinguish different uniform buffer declarations with matching layouts.
109 // Without it FindUniformBufferStructByLayoutHash() is vulnerable to hash collisions.
111
112 Hash = TmpHash;
113 }
114
116 {
117 ConstantBufferSize = Source.ConstantBufferSize;
118 StaticSlot = Source.StaticSlot;
119 BindingFlags = Source.BindingFlags;
120 Flags = Source.Flags;
121 Resources = Source.Resources;
122 Name = Source.Name;
123 Hash = Source.Hash;
124 }
125
127 {
128 return Name;
129 }
130
131 bool HasRenderTargets() const
132 {
133 return RenderTargetsOffset != kUniformBufferInvalidOffset;
134 }
135
136 bool HasStaticSlot() const
137 {
138 return IsUniformBufferStaticSlotValid(StaticSlot);
139 }
140
142 {
143 Ar << Ref.ConstantBufferSize;
144 Ar << Ref.StaticSlot;
145 Ar << Ref.RenderTargetsOffset;
146 Ar << Ref.BindingFlags;
147 Ar << Ref.Flags;
148 Ar << Ref.Resources;
149 Ar << Ref.GraphResources;
150 Ar << Ref.GraphTextures;
151 Ar << Ref.GraphBuffers;
152 Ar << Ref.GraphUniformBuffers;
153 Ar << Ref.UniformBuffers;
154 Ar << Ref.Name;
155 Ar << Ref.Hash;
156 return Ar;
157 }
158
159private:
160 // for debugging / error message
162
163public:
166
169
172
175
178
181
182private:
184
185public:
187 LAYOUT_FIELD_INITIALIZED(uint32, ConstantBufferSize, 0);
188
191
194
197
200
203 {
204 return A.ConstantBufferSize == B.ConstantBufferSize
205 && A.StaticSlot == B.StaticSlot
206 && A.BindingFlags == B.BindingFlags
207 && A.Resources == B.Resources;
208 }
209};
210
constexpr T Align(T Val, uint64 Alignment)
Definition AlignmentTemplates.h:18
#define checkSlow(expr)
Definition AssertionMacros.h:332
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
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
#define LAYOUT_FIELD(T, Name,...)
Definition MemoryLayout.h:471
#define LAYOUT_FIELD_INITIALIZED(T, Name, Value,...)
Definition MemoryLayout.h:473
ERHIUniformBufferFlags
Definition RHIDefinitions.h:704
@ MAX_UNIFORM_BUFFER_STATIC_SLOTS
Definition RHIDefinitions.h:727
uint8 FUniformBufferStaticSlot
Definition RHIDefinitions.h:722
EUniformBufferBaseType
Definition RHIDefinitions.h:634
bool IsUniformBufferStaticSlotValid(const FUniformBufferStaticSlot Slot)
Definition RHIDefinitions.h:731
EUniformBufferBindingFlags
Definition RHIDefinitions.h:686
#define SHADER_PARAMETER_POINTER_ALIGNMENT
Definition RHIDefinitions.h:35
constexpr uint16 kUniformBufferInvalidOffset
Definition RHIResources.h:1144
FArchive & operator<<(FArchive &Ar, FRHIUniformBufferResourceInitializer &Ref)
Definition RHIUniformBufferLayoutInitializer.h:30
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 Archive.h:1208
Definition MemoryImage.h:743
Definition Array.h:670
static uint32 StrCrc32(const CharType *Data, uint32 CRC=0)
Definition Crc.h:45
Definition RHIUniformBufferLayoutInitializer.h:41
bool HasRenderTargets() const
Definition RHIUniformBufferLayoutInitializer.h:131
uint32 GetHash() const
Definition RHIUniformBufferLayoutInitializer.h:56
FRHIUniformBufferLayoutInitializer(const TCHAR *InName, uint32 InConstantBufferSize)
Definition RHIUniformBufferLayoutInitializer.h:49
LAYOUT_FIELD_INITIALIZED(FUniformBufferStaticSlot, StaticSlot, MAX_UNIFORM_BUFFER_STATIC_SLOTS)
LAYOUT_FIELD_INITIALIZED(uint16, RenderTargetsOffset, kUniformBufferInvalidOffset)
LAYOUT_FIELD(TMemoryImageArray< FRHIUniformBufferResourceInitializer >, GraphResources)
LAYOUT_FIELD(TMemoryImageArray< FRHIUniformBufferResourceInitializer >, Resources)
LAYOUT_FIELD(TMemoryImageArray< FRHIUniformBufferResourceInitializer >, UniformBuffers)
void ComputeHash()
Definition RHIUniformBufferLayoutInitializer.h:68
LAYOUT_FIELD(TMemoryImageArray< FRHIUniformBufferResourceInitializer >, GraphTextures)
FRHIUniformBufferLayoutInitializer(const TCHAR *InName)
Definition RHIUniformBufferLayoutInitializer.h:46
void CopyFrom(const FRHIUniformBufferLayoutInitializer &Source)
Definition RHIUniformBufferLayoutInitializer.h:115
const FMemoryImageString & GetDebugName() const
Definition RHIUniformBufferLayoutInitializer.h:126
bool HasStaticSlot() const
Definition RHIUniformBufferLayoutInitializer.h:136
friend bool operator==(const FRHIUniformBufferLayoutInitializer &A, const FRHIUniformBufferLayoutInitializer &B)
Definition RHIUniformBufferLayoutInitializer.h:202
LAYOUT_FIELD(TMemoryImageArray< FRHIUniformBufferResourceInitializer >, GraphBuffers)
friend FArchive & operator<<(FArchive &Ar, FRHIUniformBufferLayoutInitializer &Ref)
Definition RHIUniformBufferLayoutInitializer.h:141
LAYOUT_FIELD_INITIALIZED(ERHIUniformBufferFlags, Flags, ERHIUniformBufferFlags::None)
LAYOUT_FIELD_INITIALIZED(EUniformBufferBindingFlags, BindingFlags, EUniformBufferBindingFlags::Shader)
LAYOUT_FIELD(TMemoryImageArray< FRHIUniformBufferResourceInitializer >, GraphUniformBuffers)
LAYOUT_FIELD_INITIALIZED(uint32, ConstantBufferSize, 0)
DECLARE_EXPORTED_TYPE_LAYOUT(FRHIUniformBufferLayoutInitializer, RHI_API, NonVirtual)
Definition RHIUniformBufferLayoutInitializer.h:13
friend bool operator==(const FRHIUniformBufferResourceInitializer &A, const FRHIUniformBufferResourceInitializer &B)
Definition RHIUniformBufferLayoutInitializer.h:23
LAYOUT_FIELD(uint16, MemberOffset)
LAYOUT_FIELD(EUniformBufferBaseType, MemberType)
DECLARE_EXPORTED_TYPE_LAYOUT(FRHIUniformBufferResourceInitializer, RHI_API, NonVirtual)