UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
OpenGLProgramBinaryFileCache.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 OpenGLProgramBinaryFileCache.h: OpenGL program binary file cache stores/loads a set of binary ogl programs.
5=============================================================================*/
6
7#pragma once
8
10#include "ShaderPipelineCache.h"
11
16
18{
19public:
20 static void Initialize();
21 static void Shutdown();
22
23 static bool IsEnabled();
24
26 static bool RequiresCaching(const FOpenGLProgramKey& ProgramKey);
27
30 static void CacheProgramBinary(const FOpenGLProgramKey& ProgramKey, TUniqueObj<FOpenGLProgramBinary>&& ProgramBinary);
31
33 static void TickBinaryCache();
34
37
39 static bool IsBuildingCache();
40
43
44private:
47
48 FString GetProgramBinaryCacheFilePath() const;
49
50 struct FPendingShaderCode
51 {
52 TArray<ANSICHAR> GlslCode;
54 bool bCompressed;
55 };
56
57private:
58 static TAutoConsoleVariable<int32> CVarPBCEnable;
59 static TAutoConsoleVariable<int32> CVarRestartAndroidAfterPrecompile;
60 static FOpenGLProgramBinaryCache* CachePtr;
61
62 // Binary program file layout is <osfilelocation>/CachePathRoot/CacheSubDir/CurrentShaderPipelineCacheName
63
64 /* Path to root directory where the binary program subdir will be created */
65 FString CachePathRoot;
66 /* Subdir is a hash of the device's version info, anything within CachePathRoot that does not == CacheSubDir is deleted. */
67 FString CacheSubDir;
68
69 struct FCurrentShaderPipelineProperties
70 {
71 // Guid of the PSO cache being procesed.
72 FGuid CacheVersionGuid;
73 // String name of the current cache.
74 FString PipelineCacheName;
75
76 // contains the count of programs when the write cache was last flushed.
77 int32 NumProgramsFlushed = 0;
78 // Last mmapped position
79 int64 LastMappedPosition = 0;
80 // Last number of programs mapped
81 int32 MappedPrograms = 0;
82 };
83 FCurrentShaderPipelineProperties CurrentShaderPipelineProperties;
84
89 TMap<GLuint, FPendingShaderCode> ShadersPendingCompilation;
90
91 void Reset();
92
93 void ScanProgramCacheFile();
94
95 bool OpenCacheWriteHandle(const FString& ProgramCacheFilenameToWrite, bool bAppendToExisting);
96
97 // set the file header to the current write position and program count, then flush the cache to storage.
98 bool MarkValidContent(int32 NumPrograms);
99
100 // finalize the current cache file, returns true if a valid file was created.
101 bool CloseCacheWriteHandle(int32 NumProgramsAdded);
102
103 bool RequiresCaching_Internal(const FOpenGLProgramKey& ProgramKey);
104
105 void AddProgramBinaryDataToBinaryCache(const FOpenGLProgramKey& ProgramKey, const FOpenGLProgramBinary& BinaryProgramData);
106
107 void CheckPendingGLProgramCreateRequests_internal();
108 bool CheckSinglePendingGLProgramCreateRequest_internal(const FOpenGLProgramKey& ProgramKey);
109
111 void OnShaderPipelineCacheOpened(FString const& Name, EShaderPlatform Platform, uint32 Count, const FGuid& VersionGuid, FShaderPipelineCache::FShaderCachePrecompileContext& ShaderCachePrecompileContext);
112 void OnShaderPipelineCachePrecompilationComplete(uint32 Count, double Seconds, const FShaderPipelineCache::FShaderCachePrecompileContext& ShaderCachePrecompileContext);
113
114 void InitPrecaching();
115 void UpdatePrecacheMapping();
116
117private:
118 TRefCountPtr<FOpenGLProgramBinaryMapping> GetOrAddFileMapping(const FString& ProgramCacheFilename, int32 ProgramCount, int64 Offset, int64 Size);
119
120 FString GetProgramBinaryCacheDir() const { return (CachePathRoot / CacheSubDir); }
121 bool ReadProgramFile_Internal(uint32 ProgramsToRead, int64 EndOffset, const FString& ProgramCacheFilename, FArchive& Ar);
122
123 FDelegateHandle OnShaderPipelineCacheOpenedDelegate;
124 FDelegateHandle OnShaderPipelineCachePrecompilationCompleteDelegate;
125
126 TSet<FOpenGLProgramKey> ProgramsInCurrentCache; // Only populated during PSO precompile delegates.
127
128 // All of the binary programs encountered during PSO cache processing.
129 // The contents are moved to OpenGL's program cache during RHI's end of frame tick.
131
132 FArchive* BinaryCacheWriteFileHandle;
133 bool bShownLoadingScreen;
134
135 enum class EBinaryFileState : uint8
136 {
137 Uninitialized, // No binary file is yet established and we should not read or write to it.
138 BuildingCacheFile, // We are precompiling shaders from the PSO and storing them in a new binary cache. Do not attempt to read.
139 ValidCacheFile, // We have a valid cache file we can use for reading.
140 };
141
142 bool IsBuildingCache_internal() const { return CurrentBinaryFileState == EBinaryFileState::BuildingCacheFile; }
143
144 EBinaryFileState CurrentBinaryFileState;
145
146 // Container of all currently open program cache files.
148};
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
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
EShaderPlatform
Definition RHIShaderPlatform.h:11
uint32 Offset
Definition VulkanMemory.cpp:4033
uint32 Size
Definition VulkanMemory.cpp:4034
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition IDelegateInstance.h:14
Definition OpenGLShaders.cpp:1262
Definition OpenGLProgramBinaryFileCache.h:18
static void Shutdown()
Definition OpenGLProgramBinaryFileCache.cpp:990
static void Initialize()
Definition OpenGLProgramBinaryFileCache.cpp:319
static void TickBinaryCache()
Definition OpenGLProgramBinaryFileCache.cpp:1021
static bool CheckSinglePendingGLProgramCreateRequest(const FOpenGLProgramKey &ProgramKey)
Definition OpenGLProgramBinaryFileCache.cpp:1063
static void EnqueueBinaryForGLProgramContainer(const FOpenGLProgramKey &ProgramKey, TUniqueObj< FOpenGLProgramBinary > &&ProgramBinary)
Definition OpenGLProgramBinaryFileCache.cpp:981
static void CacheProgramBinary(const FOpenGLProgramKey &ProgramKey, TUniqueObj< FOpenGLProgramBinary > &&ProgramBinary)
Definition OpenGLProgramBinaryFileCache.cpp:913
static bool RequiresCaching(const FOpenGLProgramKey &ProgramKey)
Definition OpenGLProgramBinaryFileCache.cpp:999
static bool IsBuildingCache()
Definition OpenGLProgramBinaryFileCache.cpp:308
static bool IsEnabled()
Definition OpenGLProgramBinaryFileCache.cpp:303
Definition OpenGLProgramBinaryFileCache.cpp:169
Definition OpenGLBinaryProgramUtils.h:11
Definition OpenGLShaderResources.h:335
Definition ShaderPipelineCache.h:162
Definition Array.h:670
Definition IConsoleManager.h:1792
Definition UnrealString.h.inl:34
Definition RefCounting.h:454
Definition UniqueObj.h:13
Definition Guid.h:109