UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
IoStore.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
6#include "Containers/Array.h"
8#include "HAL/Platform.h"
9#include "HAL/UnrealMemory.h"
10#include "IO/IoContainerId.h"
11#include "IO/IoDispatcher.h"
12#include "IO/IoOffsetLength.h"
13#include "Logging/LogMacros.h"
14#include "Misc/EnumClassFlags.h"
15#include "Misc/Guid.h"
16#include "Misc/SecureHash.h"
17#include "Misc/TVariant.h"
18#include "UObject/NameTypes.h"
19
21
39
81
83{
84 None,
85 Compressed = (1 << 0),
86 MemoryMapped = (1 << 1)
87};
88
90
95{
96 // Source data hash (i.e. not the on disk data)
99 uint8 Pad[3] = { 0 };
100};
101
106{
107 static constexpr uint32 OffsetBits = 40;
108 static constexpr uint64 OffsetMask = (1ull << OffsetBits) - 1ull;
109 static constexpr uint32 SizeBits = 24;
110 static constexpr uint32 SizeMask = (1 << SizeBits) - 1;
111 static constexpr uint32 SizeShift = 8;
112
113 inline uint64 GetOffset() const
114 {
115 const uint64* Offset = reinterpret_cast<const uint64*>(Data);
116 return *Offset & OffsetMask;
117 }
118
119 inline void SetOffset(uint64 InOffset)
120 {
121 uint64* Offset = reinterpret_cast<uint64*>(Data);
122 *Offset = InOffset & OffsetMask;
123 }
124
126 {
127 const uint32* Size = reinterpret_cast<const uint32*>(Data) + 1;
128 return (*Size >> SizeShift) & SizeMask;
129 }
130
132 {
133 uint32* Size = reinterpret_cast<uint32*>(Data) + 1;
134 *Size |= (uint32(InSize) << SizeShift);
135 }
136
138 {
139 const uint32* UncompressedSize = reinterpret_cast<const uint32*>(Data) + 2;
140 return *UncompressedSize & SizeMask;
141 }
142
144 {
145 uint32* UncompressedSize = reinterpret_cast<uint32*>(Data) + 2;
147 }
148
150 {
151 const uint32* Index = reinterpret_cast<const uint32*>(Data) + 2;
152 return static_cast<uint8>(*Index >> SizeBits);
153 }
154
156 {
157 uint32* Index = reinterpret_cast<uint32*>(Data) + 2;
159 }
160
161private:
162 /* 5 bytes offset, 3 bytes for size / uncompressed size and 1 byte for compresseion method. */
163 uint8 Data[5 + 3 + 3 + 1];
164};
165
170{
171 Default,
172 ReadDirectoryIndex = (1 << 0),
173 ReadTocMeta = (1 << 1),
175};
177
178
180{
182 CORE_API explicit FIoStoreTocResourceStorage(const TCHAR* TocFilePath);
183
184 bool IsLoaded() const { return !Data.IsType<FEmptyVariantState>(); }
186
187 template<typename T>
189 {
190 const int32 RequestedSize = Num * static_cast<int32>(sizeof(T));
191 TConstArrayView<uint8> Bytes = ChopBytes(RequestedSize);
192 check(RequestedSize == Bytes.Num());
193 return TConstArrayView<T>(reinterpret_cast<const T*>(Bytes.GetData()), Num);
194 }
195
196 template<typename T>
198 {
199 TArray<T> Result(ChopView<T>(Num));
200 if (!Result.IsEmpty())
201 {
202 ReleaseOwnershipOfLastBlock();
203 }
204 return Result;
205 }
206
207 CORE_API void FinalizeRead();
208
209private:
210 CORE_API void ReleaseOwnershipOfLastBlock();
211
212 struct FIOStoreAllocationTag
213 {
214 static constexpr uint32 BlockSize = 64 * 1024;
215 static constexpr bool AllowOversizedBlocks = true;
216 static constexpr bool RequiresAccurateSize = true;
217 static constexpr bool InlineBlockAllocation = false;
218 static constexpr const char* TagName = "IOStoreLinear";
219
221 };
223 using FLocalAllocator = TInlineAllocator<10>;
224 struct FMappedFile
225 {
227 TArray<TUniquePtr<IMappedFileRegion>, FLocalAllocator> MappedRegions;
228 TArray<TArray<uint8, FDataAllocator>, FLocalAllocator> OwnedRegions;
229 int32 Cursor = 0;
230 bool bLastReadBlockWasOwned = false;
231 };
232 struct FReadBlocks
233 {
235 TArray<TArray<uint8, FDataAllocator>, FLocalAllocator> Blocks;
236 };
237
238 static CORE_API TConstArrayView<uint8> ChopBytes(FMappedFile& File, int32 Size);
239 static CORE_API TConstArrayView<uint8> ChopBytes(FReadBlocks& File, int32 Size);
240
242 {
243 return {};
244 }
245
247 {
248 return Visit([this, Size](auto&& Value) { return ChopBytes(Value, Size); }, Data);
249 }
250
252};
253
273
#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::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
#define ENUM_CLASS_FLAGS(Enum)
Definition EnumClassFlags.h:6
EIoContainerFlags
Definition IoDispatcher.h:480
FIoStoreTocEntryMetaFlags
Definition IoStore.h:83
EIoStoreTocReadOptions
Definition IoStore.h:170
EIoStoreTocVersion
Definition IoStore.h:26
#define DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:361
@ Num
Definition MetalRHIPrivate.h:234
decltype(auto) Visit(Func &&Callable, Variants &&... Args)
Definition TVariant.h:271
uint32 Offset
Definition VulkanMemory.cpp:4033
uint32 Size
Definition VulkanMemory.cpp:4034
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 IoChunkId.h:64
Definition IoContainerId.h:18
Definition IoStatus.h:60
Definition SecureHash.h:226
Definition Array.h:670
Definition ConcurrentLinearAllocator.h:121
Definition IoStatus.h:101
Definition ConcurrentLinearAllocator.h:624
Definition ContainerAllocationPolicies.h:894
Definition UniquePtr.h:107
Definition TVariant.h:48
bool IsType() const
Definition TVariant.h:138
UE_FORCEINLINE_HINT bool IsEmpty() const
Definition UnrealString.h.inl:339
result< typename gen_t::syntax_t, typename gen_t::error_t > File(gen_t &Gen, nat n, const char8 *s, nat Line=1)
Definition VerseGrammar.h:2834
U16 Index
Definition radfft.cpp:71
Definition TVariant.h:29
Definition Guid.h:109
Definition IoDispatcher.h:491
Definition IoHash.h:33
Definition IoDispatcher.h:526
Definition IoStore.h:106
static constexpr uint32 SizeShift
Definition IoStore.h:111
void SetUncompressedSize(uint32 InSize)
Definition IoStore.h:143
static constexpr uint32 OffsetBits
Definition IoStore.h:107
void SetCompressedSize(uint32 InSize)
Definition IoStore.h:131
uint64 GetOffset() const
Definition IoStore.h:113
uint32 GetUncompressedSize() const
Definition IoStore.h:137
uint8 GetCompressionMethodIndex() const
Definition IoStore.h:149
void SetCompressionMethodIndex(uint8 InIndex)
Definition IoStore.h:155
void SetOffset(uint64 InOffset)
Definition IoStore.h:119
static constexpr uint32 SizeBits
Definition IoStore.h:109
static constexpr uint32 SizeMask
Definition IoStore.h:110
static constexpr uint64 OffsetMask
Definition IoStore.h:108
uint32 GetCompressedSize() const
Definition IoStore.h:125
Definition IoStore.h:95
FIoHash ChunkHash
Definition IoStore.h:97
FIoStoreTocEntryMetaFlags Flags
Definition IoStore.h:98
uint8 Pad[3]
Definition IoStore.h:99
Definition IoStore.h:44
uint32 PartitionCount
Definition IoStore.h:59
uint32 TocEntryCount
Definition IoStore.h:52
uint16 Reserved4
Definition IoStore.h:64
uint64 PartitionSize
Definition IoStore.h:66
uint32 CompressionBlockSize
Definition IoStore.h:57
uint32 TocChunkPerfectHashSeedsCount
Definition IoStore.h:65
FGuid EncryptionKeyGuid
Definition IoStore.h:61
uint32 CompressionMethodNameCount
Definition IoStore.h:55
uint32 TocChunksWithoutPerfectHashCount
Definition IoStore.h:67
uint32 DirectoryIndexSize
Definition IoStore.h:58
bool CheckMagic() const
Definition IoStore.h:76
uint32 TocHeaderSize
Definition IoStore.h:51
void MakeMagic()
Definition IoStore.h:71
uint32 TocCompressedBlockEntrySize
Definition IoStore.h:54
uint16 Reserved1
Definition IoStore.h:50
static constexpr char TocMagicImg[]
Definition IoStore.h:45
uint64 Reserved8[5]
Definition IoStore.h:69
uint32 Reserved7
Definition IoStore.h:68
FIoContainerId ContainerId
Definition IoStore.h:60
uint8 Reserved3
Definition IoStore.h:63
uint8 Reserved0
Definition IoStore.h:49
uint8 TocMagic[16]
Definition IoStore.h:47
EIoContainerFlags ContainerFlags
Definition IoStore.h:62
uint32 TocCompressedBlockEntryCount
Definition IoStore.h:53
uint32 CompressionMethodNameLength
Definition IoStore.h:56
uint8 Version
Definition IoStore.h:48
Definition IoStore.h:180
CORE_API void FinalizeRead()
Definition IoStore.cpp:1234
TConstArrayView< T > ChopView(int32 Num)
Definition IoStore.h:188
FIoStoreTocResourceStorage()=default
bool IsLoaded() const
Definition IoStore.h:184
TArray< T > ChopArray(int32 Num)
Definition IoStore.h:197
CORE_API uint64 GetAllocatedSize() const
Definition IoStore.cpp:1144
Definition IoStore.h:255
TConstArrayView< FIoOffsetAndLength > ChunkOffsetLengths
Definition IoStore.h:258
TConstArrayView< FIoStoreTocEntryMeta > ChunkMetas
Definition IoStore.h:267
TArray< FIoStoreTocEntryMeta > LegacyChunkMetas
Definition IoStore.h:268
TConstArrayView< FSHAHash > ChunkBlockSignatures
Definition IoStore.h:265
TConstArrayView< int32 > ChunkIndicesWithoutPerfectHash
Definition IoStore.h:260
TArray< FName > CompressionMethods
Definition IoStore.h:263
TConstArrayView< int32 > ChunkPerfectHashSeeds
Definition IoStore.h:259
TConstArrayView< uint8 > DirectoryIndexBuffer
Definition IoStore.h:266
TConstArrayView< FIoChunkId > ChunkIds
Definition IoStore.h:257
CORE_API FIoStoreTocChunkInfo GetTocChunkInfo(int32 TocEntryIndex) const
Definition IoStore.cpp:310
FIoStoreTocHeader Header
Definition IoStore.h:256
TConstArrayView< FIoStoreTocCompressedBlockEntry > CompressionBlocks
Definition IoStore.h:261
FSHAHash SignatureHash
Definition IoStore.h:264
Definition IoStore.h:278
TArray< int32 > ChunkIndicesWithoutPerfectHash
Definition IoStore.h:289
CORE_API FIoStoreTocChunkInfo GetTocChunkInfo(int32 TocEntryIndex) const
Definition IoStore.cpp:1420
TArray< FIoStoreTocCompressedBlockEntry > CompressionBlocks
Definition IoStore.h:291
TArray< FSHAHash > ChunkBlockSignatures
Definition IoStore.h:297
TArray< FIoStoreTocEntryMeta > ChunkMetas
Definition IoStore.h:301
TArray< FIoOffsetAndLength > ChunkOffsetLengths
Definition IoStore.h:285
TArray< FName > CompressionMethods
Definition IoStore.h:293
static CORE_API uint64 HashChunkIdWithSeed(int32 Seed, const FIoChunkId &ChunkId)
Definition IoStore.cpp:1649
FIoStoreTocHeader Header
Definition IoStore.h:281
TArray< int32 > ChunkPerfectHashSeeds
Definition IoStore.h:287
static CORE_API FIoStoreTocResource BuildResourceFromMappedView(const FIoStoreTocResourceView &View)
Definition IoStore.cpp:1425
TArray< FIoChunkId > ChunkIds
Definition IoStore.h:283
TArray< uint8 > DirectoryIndexBuffer
Definition IoStore.h:299
@ CompressionMethodNameLen
Definition IoStore.h:279
FSHAHash SignatureHash
Definition IoStore.h:295
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