UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
TexturePageMap.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
8#include "Containers/HashTable.h"
9
13
14// 4k x 4k virtual pages
15// 256 x 256 physical pages
17{
18 FTexturePage() : Packed(~0u) {}
20
22 struct
23 {
24 // Address is Morton order, relative to mip 0
27 };
28};
29static_assert(sizeof(FTexturePage) == sizeof(uint32), "Bad packing");
30FORCEINLINE bool operator==(const FTexturePage& Lhs, const FTexturePage& Rhs) { return Lhs.Packed == Rhs.Packed; }
31FORCEINLINE bool operator!=(const FTexturePage& Lhs, const FTexturePage& Rhs) { return Lhs.Packed != Rhs.Packed; }
32
44FORCEINLINE bool operator==(const FPhysicalSpaceIDAndAddress& Lhs, const FPhysicalSpaceIDAndAddress& Rhs) { return Lhs.Packed == Rhs.Packed; }
45FORCEINLINE bool operator!=(const FPhysicalSpaceIDAndAddress& Lhs, const FPhysicalSpaceIDAndAddress& Rhs) { return Lhs.Packed != Rhs.Packed; }
46
54
66{
67public:
70
72
73 uint32 GetSize() const { return Pages.Num(); }
74
79 uint32 FindPageAddress(uint8 vLogSize, uint32 vAddress) const;
80
82
84
89 uint32 FindNearestPageAddress(uint8 vLogSize, uint32 vAddress) const;
90
91 uint32 FindNearestPageLevel(uint8 vLogSize, uint32 vAddress) const;
92
96 void UnmapPage(FVirtualTextureSystem* System, FVirtualTextureSpace* Space, uint8 vLogSize, uint32 vAddress, bool bMapAncestorPage);
97
101 void MapPage(FVirtualTextureSpace* Space, FVirtualTexturePhysicalSpace* PhysicalSpace, uint32 PackedProducerHandle, uint8 MaxLevel, uint8 vLogSize, uint32 vAddress, uint8 Local_vLevel, uint16 pAddress);
102
104
108
109 void InvalidateUnmappedRootPage(FVirtualTextureSpace* Space, FVirtualTexturePhysicalSpace* PhysicalSpace, uint32 PackedProducerHandle, uint8 MaxLevel, uint8 vLogSize, uint32 vAddress, uint8 Local_vLevel);
110
111private:
112 void BuildSortedKeys();
113 void ReleaseUnmappedPages();
114
115 uint32 LowerBound(uint32 Min, uint32 Max, uint32 SearchKey, uint32 Mask) const;
116 uint32 UpperBound(uint32 Min, uint32 Max, uint32 SearchKey, uint32 Mask) const;
117 uint64 EqualRange(uint32 Min, uint32 Max, uint32 SearchKey, uint32 Mask) const;
118
119 uint32 FindPageIndex(uint8 vLogSize, uint32 vAddress) const;
120 uint32 FindNearestPageIndex(uint8 vLogSize, uint32 vAddress, uint8 MaxLevel) const;
121
122 uint32 LayerIndex;
123 uint32 vDimensions;
124
125 enum EPageListHead
126 {
127 PageListHead_Free,
128 PageListHead_Mapped,
129 PageListHead_Unmapped,
130
131 PageListHead_Count,
132 };
133
134 struct FPageEntry
135 {
137 uint32 NextIndex;
138 uint32 PrevIndex;
139 union
140 {
141 uint64 Packed;
142 struct
143 {
144 uint32 PackedProducerHandle;
145 uint32 pAddress : 16;
146 uint32 PhysicalSpaceID : 8;
147 uint32 MaxLevel : 4;
148 uint32 Local_vLevel : 4;
149 };
150 };
151 };
152
153 void RemovePageFromList(uint32 Index)
154 {
155 FPageEntry& Page = Pages[Index];
156 Pages[Page.PrevIndex].NextIndex = Page.NextIndex;
157 Pages[Page.NextIndex].PrevIndex = Page.PrevIndex;
158 Page.NextIndex = Page.PrevIndex = Index;
159 }
160
161 void AddPageToList(uint32 HeadIndex, uint32 Index)
162 {
163 FPageEntry& Head = Pages[HeadIndex];
164 FPageEntry& Page = Pages[Index];
165 check(Index >= PageListHead_Count); // make sure we're not trying to add a list head to another list
166
167 // make sure we're not currently in any list
168 check(Page.NextIndex == Index);
169 check(Page.PrevIndex == Index);
170
171 Page.NextIndex = HeadIndex;
172 Page.PrevIndex = Head.PrevIndex;
173 Pages[Head.PrevIndex].NextIndex = Index;
174 Head.PrevIndex = Index;
175 }
176
177 uint32 AcquirePage()
178 {
179 FPageEntry& FreeHead = Pages[PageListHead_Free];
180 uint32 Index = FreeHead.NextIndex;
181 if (Index != 0u)
182 {
183 RemovePageFromList(Index);
184 return Index;
185 }
186
187 Index = Pages.AddDefaulted();
188 FPageEntry& Page = Pages[Index];
189 Page.NextIndex = Page.PrevIndex = Index;
190 return Index;
191 }
192
193 TArray<FPageEntry> Pages;
194 FHashTable HashTable;
195 uint32 MappedPageCount;
196
197 TArray< uint32 > UnsortedKeys;
198 TArray< FPhysicalSpaceIDAndAddress > UnsortedAddresses;
199 TArray< uint32 > SortedKeys;
201 bool SortedKeysDirty;
202
203 TArray< uint32 > SortedSubIndexes;
204 TArray< uint64 > SortedAddIndexes;
205};
206
208{
209 for (uint32 PageIndex = HashTable.First(Hash); HashTable.IsValid(PageIndex); PageIndex = HashTable.Next(PageIndex))
210 {
211 const FPageEntry& Entry = Pages[PageIndex];
212 if (Entry.Page == CheckPage)
213 {
214 return FPhysicalSpaceIDAndAddress(Entry.PhysicalSpaceID, Entry.pAddress);
215 }
216 }
218}
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
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
FORCEINLINE bool operator==(const FTexturePage &Lhs, const FTexturePage &Rhs)
Definition TexturePageMap.h:30
FORCEINLINE bool operator!=(const FTexturePage &Lhs, const FTexturePage &Rhs)
Definition TexturePageMap.h:31
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 HashTable.h:210
bool IsValid(uint32 Index) const
Definition HashTable.h:409
uint32 First(uint32 Key) const
Definition HashTable.h:395
uint32 Next(uint32 Index) const
Definition HashTable.h:402
Definition TexturePageMap.h:66
uint32 FindPageAddress(uint8 vLogSize, uint32 vAddress) const
Definition TexturePageMap.cpp:67
void ExpandPageTableUpdateMasked(FVirtualTextureSystem *System, FPageTableUpdate Update, TArray< FPageTableUpdate > *Output)
Definition TexturePageMap.cpp:545
uint32 GetSize() const
Definition TexturePageMap.h:73
void RefreshEntirePageTable(FVirtualTextureSystem *System, TArray< FPageTableUpdate > *Output)
Definition TexturePageMap.cpp:437
void ExpandPageTableUpdatePainters(FVirtualTextureSystem *System, FPageTableUpdate Update, TArray< FPageTableUpdate > *Output)
Definition TexturePageMap.cpp:471
void MapPage(FVirtualTextureSpace *Space, FVirtualTexturePhysicalSpace *PhysicalSpace, uint32 PackedProducerHandle, uint8 MaxLevel, uint8 vLogSize, uint32 vAddress, uint8 Local_vLevel, uint16 pAddress)
Definition TexturePageMap.cpp:177
uint32 FindNearestPageLevel(uint8 vLogSize, uint32 vAddress) const
Definition TexturePageMap.cpp:103
void GetMappedPagesInRange(uint32 vAddress, uint32 Width, uint32 Height, TArray< FMappedTexturePage > &OutMappedPages) const
Definition TexturePageMap.cpp:236
FPhysicalSpaceIDAndAddress FindPagePhysicalSpaceIDAndAddress(const FTexturePage &CheckPage, uint16 Hash) const
Definition TexturePageMap.h:207
void UnmapPage(FVirtualTextureSystem *System, FVirtualTextureSpace *Space, uint8 vLogSize, uint32 vAddress, bool bMapAncestorPage)
Definition TexturePageMap.cpp:113
uint32 FindNearestPageAddress(uint8 vLogSize, uint32 vAddress) const
Definition TexturePageMap.cpp:97
FTexturePageMap()
Definition TexturePageMap.cpp:23
~FTexturePageMap()
Definition TexturePageMap.cpp:32
void InvalidateUnmappedRootPage(FVirtualTextureSpace *Space, FVirtualTexturePhysicalSpace *PhysicalSpace, uint32 PackedProducerHandle, uint8 MaxLevel, uint8 vLogSize, uint32 vAddress, uint8 Local_vLevel)
Definition TexturePageMap.cpp:228
Definition VirtualTexturePhysicalSpace.h:86
Definition VirtualTextureSpace.h:48
Definition VirtualTextureSystem.h:108
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
SizeType AddDefaulted()
Definition Array.h:2795
U16 Index
Definition radfft.cpp:71
Definition TexturePageMap.h:48
uint32 Local_vLevel
Definition TexturePageMap.h:52
uint32 pAddress
Definition TexturePageMap.h:50
FTexturePage Page
Definition TexturePageMap.h:49
uint32 PhysicalSpaceID
Definition TexturePageMap.h:51
Definition VirtualTextureShared.h:30
Definition TexturePageMap.h:34
FPhysicalSpaceIDAndAddress()
Definition TexturePageMap.h:35
uint32 Packed
Definition TexturePageMap.h:37
FPhysicalSpaceIDAndAddress(uint16 InPhysicalSpaceID, uint16 InAddress)
Definition TexturePageMap.h:36
uint16 pAddress
Definition TexturePageMap.h:41
uint16 PhysicalSpaceID
Definition TexturePageMap.h:40
Definition TexturePageMap.h:17
uint32 vLogSize
Definition TexturePageMap.h:26
FTexturePage(uint8 InLogSize, uint32 InAddress)
Definition TexturePageMap.h:19
uint32 vAddress
Definition TexturePageMap.h:25
uint32 Packed
Definition TexturePageMap.h:21
FTexturePage()
Definition TexturePageMap.h:18