UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
VulkanUtil.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 VulkanUtil.h: Vulkan Utility definitions.
5=============================================================================*/
6
7#pragma once
8
9#include "HAL/Platform.h"
11#include "Templates/UniquePtr.h"
12#include "VulkanThirdParty.h"
13
14class FVulkanDevice;
15class FVulkanTexture;
16
17namespace VulkanRHI
18{
27 extern VULKANRHI_API void VerifyVulkanResult(VkResult Result, const ANSICHAR* VkFuntion, const ANSICHAR* Filename, uint32 Line);
28
30}
31
32#define VERIFYVULKANRESULT(VkFunction) { const VkResult ScopedResult = VkFunction; if (ScopedResult != VK_SUCCESS) { VulkanRHI::VerifyVulkanResult(ScopedResult, #VkFunction, __FILE__, __LINE__); }}
33#define VERIFYVULKANRESULT_EXPANDED(VkFunction) { const VkResult ScopedResult = VkFunction; if (ScopedResult < VK_SUCCESS) { VulkanRHI::VerifyVulkanResult(ScopedResult, #VkFunction, __FILE__, __LINE__); }}
34
36
37template<typename T>
38inline bool CopyAndReturnNotEqual(T& A, T B)
39{
40 const bool bOut = A != B;
41 A = B;
42 return bOut;
43}
44
45template <int Version>
47
48template <>
50{
51protected:
52 template <class DataReceiver>
54 {
55 TArray<uint8> TempData;
56 ReceiveData(TempData);
57 }
58
59 void SetData(const void* InData, uint32 InSize) {}
60
61 void CopyDataDeep(TDataKeyBase& Result) const {}
62 void CopyDataShallow(TDataKeyBase& Result) const {}
63 bool IsDataEquals(const TDataKeyBase& Other) const { return true; }
64
65protected:
67};
68
69template <>
71{
72protected:
73 template <class DataReceiver>
75 {
76 EnsureDataStorage();
77 ReceiveData(*Data);
78 }
79
80 void SetData(const void* InData, uint32 InSize)
81 {
82 EnsureDataStorage();
83 Data->SetNum(InSize);
84 FMemory::Memcpy(Data->GetData(), InData, InSize);
85 }
86
87 void CopyDataDeep(TDataKeyBase& Result) const
88 {
89 check(Data);
90 Result.DataStorage = MakeUnique<TArray<uint8>>(*Data);
91 Result.Data = Result.DataStorage.Get();
92 }
93
94 void CopyDataShallow(TDataKeyBase& Result) const
95 {
96 check(Data);
97 Result.Data = Data;
98 }
99
100 bool IsDataEquals(const TDataKeyBase& Other) const
101 {
102 check(Data && Other.Data);
103 check(Data->Num() == Other.Data->Num());
104 check(FMemory::Memcmp(Data->GetData(), Other.Data->GetData(), Data->Num()) == 0);
105 return true;
106 }
107public:
109 {
110 return *Data;
111 }
112
113private:
114 void EnsureDataStorage()
115 {
116 if (!DataStorage)
117 {
118 DataStorage = MakeUnique<TArray<uint8>>();
119 Data = DataStorage.Get();
120 }
121 }
122
123protected:
125 TArray<uint8> *Data = nullptr;
126private:
127 TUniquePtr<TArray<uint8>> DataStorage;
128};
129
130template <>
131class TDataKeyBase<2> : public TDataKeyBase<1>
132{
133protected:
134 bool IsDataEquals(const TDataKeyBase& Other) const
135 {
136 check(Data && Other.Data);
137 return ((Data->Num() == Other.Data->Num()) &&
138 (FMemory::Memcmp(Data->GetData(), Other.Data->GetData(), Data->Num()) == 0));
139 }
140};
141
142template <class Derived, bool AlwaysCompareData = false>
143class TDataKey : public TDataKeyBase<AlwaysCompareData ? 2 : (DO_CHECK != 0)>
144{
145public:
146 template <class ArchiveWriter>
148 {
149 this->GetData([&](TArray<uint8>& InData)
150 {
152
153 InData.Reset(DataReserve);
154 WriteToArchive(Ar);
155
156 this->Hash = FCrc::MemCrc32(InData.GetData(), InData.Num());
157 });
158 }
159
160 template <class ObjectType>
161 void GenerateFromObject(const ObjectType& Object)
162 {
163 GenerateFromData(&Object, sizeof(Object));
164 }
165
167 {
168 this->SetData(InData, InSize);
169 this->Hash = FCrc::MemCrc32(InData, InSize);
170 }
171
173 {
174 return this->Hash;
175 }
176
178 {
179 Derived Result;
180 Result.Hash = this->Hash;
181 this->CopyDataDeep(Result);
182 return Result;
183 }
184
186 {
187 Derived Result;
188 Result.Hash = this->Hash;
189 this->CopyDataShallow(Result);
190 return Result;
191 }
192
193 friend uint32 GetTypeHash(const Derived& Key)
194 {
195 return Key.Hash;
196 }
197
198 friend bool operator==(const Derived& A, const Derived& B)
199 {
200 return ((A.Hash == B.Hash) && A.IsDataEquals(B));
201 }
202};
#define check(expr)
Definition AssertionMacros.h:314
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
auto GetData(const TStringConversion< Converter, DefaultConversionSize > &Conversion) -> decltype(Conversion.Get())
Definition StringConv.h:802
uint32 Size
Definition VulkanMemory.cpp:4034
void SetVulkanResourceName(FVulkanDevice *Device, FVulkanTexture *Texture, const TCHAR *Name)
Definition VulkanUtil.cpp:34
bool CopyAndReturnNotEqual(T &A, T B)
Definition VulkanUtil.h:38
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition MemoryWriter.h:101
Definition VulkanDevice.h:279
Definition VulkanResources.h:604
Definition Array.h:670
UE_NODEBUG UE_FORCEINLINE_HINT ElementType * GetData() UE_LIFETIMEBOUND
Definition Array.h:1027
bool IsDataEquals(const TDataKeyBase &Other) const
Definition VulkanUtil.h:63
void CopyDataShallow(TDataKeyBase &Result) const
Definition VulkanUtil.h:62
void SetData(const void *InData, uint32 InSize)
Definition VulkanUtil.h:59
void GetData(DataReceiver &&ReceiveData)
Definition VulkanUtil.h:53
void CopyDataDeep(TDataKeyBase &Result) const
Definition VulkanUtil.h:61
void CopyDataShallow(TDataKeyBase &Result) const
Definition VulkanUtil.h:94
void GetData(DataReceiver &&ReceiveData)
Definition VulkanUtil.h:74
void SetData(const void *InData, uint32 InSize)
Definition VulkanUtil.h:80
bool IsDataEquals(const TDataKeyBase &Other) const
Definition VulkanUtil.h:100
TArray< uint8 > & GetDataRef()
Definition VulkanUtil.h:108
void CopyDataDeep(TDataKeyBase &Result) const
Definition VulkanUtil.h:87
bool IsDataEquals(const TDataKeyBase &Other) const
Definition VulkanUtil.h:134
Definition VulkanUtil.h:46
Definition VulkanUtil.h:144
friend uint32 GetTypeHash(const Derived &Key)
Definition VulkanUtil.h:193
void GenerateFromObject(const ObjectType &Object)
Definition VulkanUtil.h:161
void GenerateFromData(const void *InData, uint32 InSize)
Definition VulkanUtil.h:166
void GenerateFromArchive(ArchiveWriter &&WriteToArchive, int32 DataReserve=0)
Definition VulkanUtil.h:147
Derived CopyDeep() const
Definition VulkanUtil.h:177
uint32 GetHash() const
Definition VulkanUtil.h:172
friend bool operator==(const Derived &A, const Derived &B)
Definition VulkanUtil.h:198
Derived CopyShallow() const
Definition VulkanUtil.h:185
Definition UniquePtr.h:107
Definition VulkanCommandBuffer.h:22
VkBuffer CreateBuffer(FVulkanDevice *InDevice, VkDeviceSize Size, VkBufferUsageFlags BufferUsageFlags, VkMemoryRequirements &OutMemoryRequirements)
Definition VulkanUtil.cpp:725
void VerifyVulkanResult(VkResult Result, const ANSICHAR *VkFunction, const ANSICHAR *Filename, uint32 Line)
Definition VulkanUtil.cpp:749
static UE_FORCEINLINE_HINT uint32 MemCrc32(const void *Data, int32 Length, uint32 CRC=0)
Definition Crc.h:31
static UE_FORCEINLINE_HINT int32 Memcmp(const void *Buf1, const void *Buf2, SIZE_T Count)
Definition UnrealMemory.h:114
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160