UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
VirtualTextureProducer.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"
7#include "RendererInterface.h"
8#include "VirtualTexturing.h"
10
13
15{
16public:
18
20
21 inline const FVTProducerDescription& GetDescription() const { return Description; }
23 inline const FName& GetName() const { return Description.Name; }
24 inline uint32 GetWidthInTiles() const { return Description.BlockWidthInTiles * Description.WidthInBlocks; }
25 inline uint32 GetHeightInTiles() const { return Description.BlockHeightInTiles * Description.HeightInBlocks; }
26 inline uint32 GetDepthInTiles() const { return Description.DepthInTiles; }
27 inline uint32 GetMaxLevel() const { return Description.MaxLevel; }
28
29 inline uint32 GetNumTextureLayers() const { return Description.NumTextureLayers; }
30 inline EPixelFormat GetLayerFormat(uint32 LayerIndex) const { check(LayerIndex < Description.NumTextureLayers); return Description.LayerFormat[LayerIndex]; }
31 inline uint32 GetPhysicalGroupIndexForTextureLayer(uint32 LayerIndex) const { check(LayerIndex < Description.NumTextureLayers); return Description.PhysicalGroupIndex[LayerIndex]; }
32
33 inline uint32 GetNumPhysicalGroups() const { return Description.NumPhysicalGroups; }
34 inline FVirtualTexturePhysicalSpace* GetPhysicalSpaceForPhysicalGroup(uint32 GroupIndex) const { check(GroupIndex < Description.NumPhysicalGroups); return PhysicalGroups[GroupIndex].PhysicalSpace; }
35
36 inline void SetLockedMipCount(uint8 InLockedMipCount) { LockedMipCount = InLockedMipCount; }
37 inline uint8 GetLockedMipCount() const { return LockedMipCount; }
38
39private:
42
43 FVTProducerDescription Description;
44
45 // Number of mips that we have requested to keep locked.
46 uint8 LockedMipCount = 0;
47
48 // A physical group is a physical space which multiple texture layers map to
49 // Texture layers that share a physical group will always be sampled via the same page table channel (they will have the same physical UV coordinates)
50 // More than one physical group can share the same FVirtualTexturePhysicalSpace
51 struct FPhysicalGroupDesc
52 {
54 };
55 TArray<FPhysicalGroupDesc> PhysicalGroups;
56
57 // The virtual texture provider implementation
59};
60
62{
63public:
68
70 uint32 RemoveAllCallbacks(const void* Baton);
72 bool HasPendingCallbacks() const;
73
76
82
85
86private:
87 struct FProducerEntry
88 {
90 uint32 DestroyedCallbacksIndex = 0u;
91 uint32 NextIndex = 0u;
92 uint32 PrevIndex = 0u;
93 uint16 Magic = 0u;
94 };
95
96 struct FCallbackEntry
97 {
98 FVTProducerDestroyedFunction* DestroyedFunction = nullptr;
99 void* Baton = nullptr;
101 uint32 NextIndex = 0u;
102 uint32 PrevIndex = 0u;
103 union
104 {
105 uint32 PackedFlags = 0u;
106 struct
107 {
108 uint32 bPending : 1;
109 uint32 Pad : 31;
110 };
111 };
112 };
113
114 enum ECallbackListType
115 {
116 CallbackList_Free,
117 CallbackList_Pending,
118 CallbackList_Count,
119 };
120
121 FProducerEntry* GetEntry(const FVirtualTextureProducerHandle& Handle);
122
123 void RemoveEntryFromList(uint32 Index)
124 {
125 FProducerEntry& Entry = Producers[Index];
126 Producers[Entry.PrevIndex].NextIndex = Entry.NextIndex;
127 Producers[Entry.NextIndex].PrevIndex = Entry.PrevIndex;
128 Entry.NextIndex = Entry.PrevIndex = Index;
129 }
130
131 void AddEntryToList(uint32 HeadIndex, uint32 Index)
132 {
133 FProducerEntry& Head = Producers[HeadIndex];
134 FProducerEntry& Entry = Producers[Index];
135 check(Index > 0u); // make sure we're not trying to add a list head to another list
136
137 // make sure we're not currently in any list
138 check(Entry.NextIndex == Index);
139 check(Entry.PrevIndex == Index);
140
141 Entry.NextIndex = HeadIndex;
142 Entry.PrevIndex = Head.PrevIndex;
143 Producers[Head.PrevIndex].NextIndex = Index;
144 Head.PrevIndex = Index;
145 }
146
147 uint32 AcquireEntry()
148 {
149 FProducerEntry& FreeHead = Producers[0u];
150 uint32 Index = FreeHead.NextIndex;
151 if (Index != 0u)
152 {
153 RemoveEntryFromList(Index);
154 return Index;
155 }
156
157 Index = Producers.AddDefaulted();
158 FProducerEntry& Entry = Producers[Index];
159 Entry.NextIndex = Entry.PrevIndex = Index;
160 return Index;
161 }
162
163 void ReleaseEntry(uint32 Index)
164 {
165 RemoveEntryFromList(Index);
166 AddEntryToList(0u, Index);
167 }
168
169 void RemoveCallbackFromList(uint32 Index)
170 {
171 FCallbackEntry& Entry = Callbacks[Index];
172 Callbacks[Entry.PrevIndex].NextIndex = Entry.NextIndex;
173 Callbacks[Entry.NextIndex].PrevIndex = Entry.PrevIndex;
174 Entry.NextIndex = Entry.PrevIndex = Index;
175 }
176
177 void AddCallbackToList(uint32 HeadIndex, uint32 Index)
178 {
179 FCallbackEntry& Head = Callbacks[HeadIndex];
180 FCallbackEntry& Entry = Callbacks[Index];
181 check(Index >= CallbackList_Count); // make sure we're not trying to add a list head to another list
182
183 // make sure we're not currently in any list
184 check(Entry.NextIndex == Index);
185 check(Entry.PrevIndex == Index);
186
187 Entry.NextIndex = HeadIndex;
188 Entry.PrevIndex = Head.PrevIndex;
189 Callbacks[Head.PrevIndex].NextIndex = Index;
190 Head.PrevIndex = Index;
191 }
192
193 uint32 AcquireCallback()
194 {
195 FCallbackEntry& FreeHead = Callbacks[CallbackList_Free];
196 uint32 Index = FreeHead.NextIndex;
197 if (Index != CallbackList_Free)
198 {
199 RemoveCallbackFromList(Index);
200 return Index;
201 }
202
203 Index = Callbacks.AddDefaulted();
204 FCallbackEntry& Entry = Callbacks[Index];
205 Entry.NextIndex = Entry.PrevIndex = Index;
206 return Index;
207 }
208
209 void ReleaseCallback(uint32 Index)
210 {
211 RemoveCallbackFromList(Index);
212 AddCallbackToList(CallbackList_Free, Index);
213 }
214
215 TArray<FProducerEntry> Producers;
216 TArray<FCallbackEntry> Callbacks;
217 TMap<void*, TArray<uint32>> CallbacksMap;
218 uint32 NumPendingCallbacks;
219};
#define check(expr)
Definition AssertionMacros.h:314
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
EPixelFormat
Definition PixelFormat.h:16
void() FVTProducerDestroyedFunction(const FVirtualTextureProducerHandle &InHandle, void *Baton)
Definition VirtualTexturing.h:194
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 NameTypes.h:617
Definition RHICommandList.h:455
Definition VirtualTexturePhysicalSpace.h:86
Definition VirtualTextureProducer.h:62
FVirtualTextureProducer & GetProducer(const FVirtualTextureProducerHandle &Handle)
Definition VirtualTextureProducer.cpp:268
bool TryReleaseProducer(FVirtualTextureSystem *System, const FVirtualTextureProducerHandle &Handle)
Definition VirtualTextureProducer.cpp:132
FVirtualTextureProducerHandle RegisterProducer(FRHICommandListBase &RHICmdList, FVirtualTextureSystem *System, const FVTProducerDescription &InDesc, IVirtualTexture *InProducer)
Definition VirtualTextureProducer.cpp:57
void CallPendingCallbacks()
Definition VirtualTextureProducer.cpp:150
uint32 RemoveAllCallbacks(const void *Baton)
Definition VirtualTextureProducer.cpp:218
void ReleaseProducer(FVirtualTextureSystem *System, const FVirtualTextureProducerHandle &Handle)
Definition VirtualTextureProducer.cpp:101
void NotifyRequestsCompleted()
Definition VirtualTextureProducer.cpp:249
void AddDestroyedCallback(const FVirtualTextureProducerHandle &Handle, FVTProducerDestroyedFunction *Function, void *Baton)
Definition VirtualTextureProducer.cpp:199
FVirtualTextureProducer * FindProducer(const FVirtualTextureProducerHandle &Handle)
Definition VirtualTextureProducer.cpp:262
bool HasPendingCallbacks() const
Definition VirtualTextureProducer.cpp:194
FVirtualTextureProducerCollection()
Definition VirtualTextureProducer.cpp:44
Definition VirtualTextureProducer.h:15
uint32 GetHeightInTiles() const
Definition VirtualTextureProducer.h:25
void SetLockedMipCount(uint8 InLockedMipCount)
Definition VirtualTextureProducer.h:36
uint32 GetWidthInTiles() const
Definition VirtualTextureProducer.h:24
EPixelFormat GetLayerFormat(uint32 LayerIndex) const
Definition VirtualTextureProducer.h:30
const FName & GetName() const
Definition VirtualTextureProducer.h:23
uint32 GetNumTextureLayers() const
Definition VirtualTextureProducer.h:29
uint32 GetPhysicalGroupIndexForTextureLayer(uint32 LayerIndex) const
Definition VirtualTextureProducer.h:31
FVirtualTextureProducer()
Definition VirtualTextureProducer.h:17
uint32 GetDepthInTiles() const
Definition VirtualTextureProducer.h:26
uint32 GetNumPhysicalGroups() const
Definition VirtualTextureProducer.h:33
uint32 GetMaxLevel() const
Definition VirtualTextureProducer.h:27
IVirtualTexture * GetVirtualTexture() const
Definition VirtualTextureProducer.h:22
uint8 GetLockedMipCount() const
Definition VirtualTextureProducer.h:37
const FVTProducerDescription & GetDescription() const
Definition VirtualTextureProducer.h:21
FVirtualTexturePhysicalSpace * GetPhysicalSpaceForPhysicalGroup(uint32 GroupIndex) const
Definition VirtualTextureProducer.h:34
Definition VirtualTextureSystem.h:108
Definition VirtualTexturing.h:289
Definition Array.h:670
SizeType AddDefaulted()
Definition Array.h:2795
Definition UnrealString.h.inl:34
Definition RefCounting.h:454
Definition VirtualTextureRecreate.cpp:16
U16 Index
Definition radfft.cpp:71
Definition VirtualTexturing.h:148
FName Name
Definition VirtualTexturing.h:151
uint8 NumPhysicalGroups
Definition VirtualTexturing.h:187
uint32 BlockHeightInTiles
Definition VirtualTexturing.h:169
uint32 DepthInTiles
Definition VirtualTexturing.h:170
uint32 BlockWidthInTiles
Definition VirtualTexturing.h:168
uint8 NumTextureLayers
Definition VirtualTexturing.h:182
uint16 WidthInBlocks
Definition VirtualTexturing.h:171
uint16 HeightInBlocks
Definition VirtualTexturing.h:172
uint8 PhysicalGroupIndex[VIRTUALTEXTURE_SPACE_MAXLAYERS]
Definition VirtualTexturing.h:188
uint8 MaxLevel
Definition VirtualTexturing.h:174
TEnumAsByte< EPixelFormat > LayerFormat[VIRTUALTEXTURE_SPACE_MAXLAYERS]
Definition VirtualTexturing.h:183
Definition VirtualTexturing.h:33