UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ODSCThread.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"
6#include "HAL/Runnable.h"
9#include "Containers/Queue.h"
10#include "ShaderCompiler.h"
11#include "RHIDefinitions.h"
12
13class FEvent;
14class FRunnableThread;
18
19namespace UE
20{
21 namespace Cook
22 {
23 class ICookOnTheFlyServerConnection;
24 class FCookOnTheFlyMessage;
25 }
26}
27
29{
30 Default=0, // The material hasn't been seen by ODSCManager yet
33};
34
36{
37public:
41 const FString& ShaderTypesToLoad,
47 );
48
50 virtual void FillPayload(FArchive& Payload) override;
51
53 virtual void ProcessResponse(FArchive& Response) override;
54
55 void AddPayload(const FODSCRequestPayload& Payload);
56
59 const TArray<uint8>& GetGlobalShaderMap() const;
60 bool ReloadGlobalShaders() const;
61 ODSCRecompileCommand GetRecompileCommandType() const { return RecompileCommandType; };
62 int32 NumPayloads() const { return RequestBatch.Num(); }
63
64private:
66 double RequestStartTime = 0.0;
67
69 TArray<FString> MaterialsToLoad;
70
72 FString ShaderTypesToLoad;
73
75 EShaderPlatform ShaderPlatform;
76
78 ERHIFeatureLevel::Type FeatureLevel;
79
81 EMaterialQualityLevel::Type QualityLevel;
82
85
87 FShaderCompilerFlags ExtraCompilerFlags = FShaderCompilerFlags();
88
90 TArray<FODSCRequestPayload> RequestBatch;
91
93 TArray<uint8> OutMeshMaterialMaps;
94
96 TArray<uint8> OutGlobalShaderMap;
97};
98
105{
106public:
107
108 FODSCThread(const FString& HostIP);
109 virtual ~FODSCThread();
110
114 void StartThread();
115
119 void StopThread();
120
121 //~ Begin FSingleThreadRunnable Interface
122 // Cannot be overriden to ensure identical behavior with the threaded tick
123 virtual void Tick() override final;
124 //~ End FSingleThreadRunnable Interface
125
136 void AddRequest(
138 const FString& ShaderTypesToLoad,
139 EShaderPlatform ShaderPlatform,
140 ERHIFeatureLevel::Type FeatureLevel,
141 EMaterialQualityLevel::Type QualityLevel,
142 ODSCRecompileCommand RecompileCommandType,
143 const FShaderCompilerFlags& ExtraCompilerFlags = FShaderCompilerFlags()
144 );
145
161 EShaderPlatform ShaderPlatform,
162 ERHIFeatureLevel::Type FeatureLevel,
163 EMaterialQualityLevel::Type QualityLevel,
164 const FMaterial* Material,
165 const FPrimitiveSceneInfo* PrimitiveSceneInfo,
166 const FString& VertexFactoryName,
167 const FString& PipelineName,
168 const TArray<FString>& ShaderTypeNames,
169 int32 PermutationId,
171 );
172
179
183 void Wakeup();
184
189
191
193
195 const FString& GetODSCHostIP() const { return ODSCHostIP; };
196
199 FMaterialShaderMap* FindMaterialShaderMap(const FString& MaterialName, const FMaterialShaderMapId& ShaderMapId) const;
200
202
203protected:
204
205 //~ Begin FRunnable Interface
206 virtual bool Init() override;
207 virtual uint32 Run() override final;
208 virtual void Stop() override;
209 virtual void Exit() override;
210 //~ End FRunnable Interface
211
214
215private:
216
221 void Process();
222
223 bool ConnectToODSCHost();
224 bool CheckODSCConnection();
225
230 TQueue<FODSCMessageHandler*, EQueueMode::Mpsc> PendingMaterialThreadedRequests;
231
236 TQueue<FODSCRequestPayload, EQueueMode::Mpsc> PendingMeshMaterialThreadedRequests;
237
242 TQueue<FODSCMessageHandler*, EQueueMode::Spsc> CompletedThreadedRequests;
243
245 mutable FRWLock RequestHashesRWLock;
246 FCriticalSection RequestHashCriticalSection;
247
248 struct FODSCShaderId
249 {
250 public:
251 inline FODSCShaderId() {}
252 FODSCShaderId(const FShaderId& ShaderId);
253
254 FHashedName ShaderTypeHashedName = 0;
255 FHashedName VFTypeHashedName = 0;
256 FHashedName ShaderPipelineName = 0;
257 int32 PermutationId = 0;
259
260 friend inline uint32 GetTypeHash( const FODSCShaderId& Id )
261 {
262 return HashCombine(
263 GetTypeHash(Id.ShaderTypeHashedName),
264 HashCombine(GetTypeHash(Id.VFTypeHashedName),
265 HashCombine(GetTypeHash(Id.ShaderPipelineName),
266 HashCombine(GetTypeHash(Id.PermutationId), GetTypeHash(Id.Platform)))));
267 }
268
269 friend bool operator==(const FODSCShaderId& X, const FODSCShaderId& Y)
270 {
271 return X.ShaderTypeHashedName == Y.ShaderTypeHashedName
272 && X.ShaderPipelineName == Y.ShaderPipelineName
273 && X.VFTypeHashedName == Y.VFTypeHashedName
274 && X.PermutationId == Y.PermutationId
275 && X.Platform == Y.Platform;
276 }
277
278 friend bool operator!=(const FODSCShaderId& X, const FODSCShaderId& Y)
279 {
280 return !(X == Y);
281 }
282 };
283
284
285 struct FODSCShaderMapData
286 {
288 TArray<TRefCountPtr<FMaterialShaderMap>> MaterialShaderMaps;
290 TSet<FODSCShaderId> CurrentRequests;
291
292 FName ActorPath;
293 };
294
297
299 TMap<UPTRINT, FName> ODSCPointerToNames;
300
302 FRunnableThread* Thread = nullptr;
303
305 FEvent* WakeupEvent;
306
308 FEvent* AllRequestsDoneEvent;
309
310 bool SendMessageToServer(IPlatformFile::IFileServerMessageHandler* Handler);
311
312 TArray<FODSCMessageHandler*> PendingRequestsMaterialAndGlobal;
313 TArray<FODSCMessageHandler*> PendingRequestsPipeline;
314
316 TUniquePtr<UE::Cook::ICookOnTheFlyServerConnection> CookOnTheFlyServerConnection;
317
318 FString ODSCHostIP;
319
320 int32 MaxPayloadPerRequests = INT32_MAX;
321
322 std::atomic<bool> bIsConnectedToODSCServer = false;
323 std::atomic<bool> bHasPendingGlobalShaders = false;
324 std::atomic<uint32> NumPendingMaterialsRecompile = 0;
325 std::atomic<uint32> NumPendingMaterialsShaders = 0;
326 bool bHasDefaultConnection = false;
327};
EQueueMode
Definition Queue.h:17
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
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
auto Response
Definition ExternalRpcRegistry.cpp:598
#define X(Name, Desc)
Definition FormatStringSan.h:47
UE_FORCEINLINE_HINT bool operator!=(const FIndexedPointer &Other) const
Definition LockFreeList.h:76
EODSCMetaDataType
Definition ODSCThread.h:29
EShaderPlatform
Definition RHIShaderPlatform.h:11
@ SP_NumBits
Definition RHIShaderPlatform.h:56
@ SP_NumPlatforms
Definition RHIShaderPlatform.h:55
ODSCRecompileCommand
Definition ShaderCompiler.h:1469
constexpr uint32 HashCombine(uint32 A, uint32 C)
Definition TypeHash.h:36
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition Event.h:21
Definition MemoryImage.h:858
Definition MaterialShared.h:1194
Definition MaterialShared.h:1518
Definition MaterialShared.h:2058
Definition NameTypes.h:617
Definition ODSCThread.h:36
bool ReloadGlobalShaders() const
Definition ODSCThread.cpp:146
virtual void FillPayload(FArchive &Payload) override
Definition ODSCThread.cpp:98
ODSCRecompileCommand GetRecompileCommandType() const
Definition ODSCThread.h:61
const TArray< uint8 > & GetMeshMaterialMaps() const
Definition ODSCThread.cpp:136
virtual void ProcessResponse(FArchive &Response) override
Definition ODSCThread.cpp:117
const TArray< uint8 > & GetGlobalShaderMap() const
Definition ODSCThread.cpp:141
void AddPayload(const FODSCRequestPayload &Payload)
Definition ODSCThread.cpp:126
int32 NumPayloads() const
Definition ODSCThread.h:62
const TArray< FString > & GetMaterialsToLoad() const
Definition ODSCThread.cpp:131
Definition ODSCThread.h:105
void StopThread()
Definition ODSCThread.cpp:215
bool GetPendingShaderData(bool &bOutIsConnectedToODSCServer, bool &bOutHasPendingGlobalShaders, uint32 &OutNumPendingMaterialsRecompile, uint32 &OutNumPendingMaterialsShaders) const
Definition ODSCThread.cpp:693
bool CheckIfRequestAlreadySent(const TArray< FShaderId > &RequestShaderIds, const FMaterial *Material) const
Definition ODSCThread.cpp:270
void GetCompletedRequests(TArray< FODSCMessageHandler * > &OutCompletedRequests)
Definition ODSCThread.cpp:479
FThreadSafeCounter ExitRequest
Definition ODSCThread.h:213
virtual void Stop() override
Definition ODSCThread.cpp:517
FMaterialShaderMap * FindMaterialShaderMap(const FString &MaterialName, const FMaterialShaderMapId &ShaderMapId) const
Definition ODSCThread.cpp:326
void Wakeup()
Definition ODSCThread.cpp:489
void ResetMaterialsODSCData(EShaderPlatform InShaderPlatform)
Definition ODSCThread.cpp:230
void StartThread()
Definition ODSCThread.cpp:210
void RegisterMaterialShaderMaps(const FString &MaterialName, const TArray< TRefCountPtr< FMaterialShaderMap > > &LoadedShaderMaps)
Definition ODSCThread.cpp:302
virtual void Tick() override final
Definition ODSCThread.cpp:225
void AddShaderPipelineRequest(EShaderPlatform ShaderPlatform, ERHIFeatureLevel::Type FeatureLevel, EMaterialQualityLevel::Type QualityLevel, const FMaterial *Material, const FPrimitiveSceneInfo *PrimitiveSceneInfo, const FString &VertexFactoryName, const FString &PipelineName, const TArray< FString > &ShaderTypeNames, int32 PermutationId, const TArray< FShaderId > &RequestShaderIds)
Definition ODSCThread.cpp:382
virtual uint32 Run() override final
Definition ODSCThread.cpp:505
virtual void Exit() override
Definition ODSCThread.cpp:523
void AddRequest(const TArray< FString > &MaterialsToCompile, const FString &ShaderTypesToLoad, EShaderPlatform ShaderPlatform, ERHIFeatureLevel::Type FeatureLevel, EMaterialQualityLevel::Type QualityLevel, ODSCRecompileCommand RecompileCommandType, const FShaderCompilerFlags &ExtraCompilerFlags=FShaderCompilerFlags())
Definition ODSCThread.cpp:370
virtual ~FODSCThread()
Definition ODSCThread.cpp:166
virtual bool Init() override
Definition ODSCThread.cpp:500
const FString & GetODSCHostIP() const
Definition ODSCThread.h:195
void RetrieveMissedMaterials(TArray< FString > &OutMaterialPaths) const
Definition ODSCThread.cpp:351
void UnregisterMaterialName(const FMaterial *Material)
Definition ODSCThread.cpp:296
void WaitUntilAllRequestsDone()
Definition ODSCThread.cpp:495
Definition PrimitiveSceneInfo.h:266
Definition RunnableThread.h:20
Definition Runnable.h:20
Definition ShaderCore.h:402
Definition Shader.h:695
Definition SingleThreadRunnable.h:12
Definition ThreadSafeCounter.h:14
Definition GenericPlatformFile.h:925
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
Definition UnrealString.h.inl:34
Definition Queue.h:48
Definition RefCounting.h:454
Definition UniquePtr.h:107
Definition CriticalSection.h:14
Type
Definition SceneTypes.h:132
Type
Definition RHIFeatureLevel.h:20
Definition AdvancedWidgetsModule.cpp:13
Definition ShaderCompiler.h:1417