15#define VULKAN_PSO_CACHE_DEBUG 0
16#define VULKAN_USE_SHADERKEYS 1
27template <
typename TVulkanShader>
272#if VULKAN_USE_SHADERKEYS
447#if 0 == VULKAN_USE_SHADERKEYS
448 if (!(ShaderHashes == In.ShaderHashes))
510 class FPipelineCache;
518 void SavePSOCache(
const FString&
CacheFilename, FPipelineCache& Cache);
527 void CreateVertexInputLibraries();
531 void CreateEmptyFragmentStageLibrary();
545 bool LRUEvictImmediately();
549 bool LRUEvictOne(
bool bOnlyOld =
false);
552 void LRUDebugEvictAll();
558 bool bEvictImmediately;
559 FString CompiledPSOCacheTopFolderPath;
560 FString CompiledPSOCacheFolderName;
568 template<
typename TType>
569 class FScopedRWAccessor
577 TType& Get() {
return ProtectedObj; }
582 enum class EPipelineCacheAccess :
uint8
592 FScopedPipelineCache Get(EPipelineCacheAccess
PipelineAccessType) {
return FScopedPipelineCache(
PipelineAccessType == EPipelineCacheAccess::Exclusive, PipelineCache, PipelineCacheLock); }
594 FPipelineCache GlobalPSOCache;
596 FPipelineCache CurrentPrecompilingPSOCache;
598 bool bPrecompilingCacheLoadedFromFile;
599 FGuid CurrentPrecompilingPSOCacheGuid;
614 uint32 LRUUsedPipelineSize = 0;
615 uint32 LRUUsedPipelineCount = 0;
616 uint32 LRUUsedPipelineMax = 0;
623 struct FVulkanLRUCacheFile
627 LRU_CACHE_VERSION = 2,
674#if VULKAN_ENABLE_LRU_CACHE
778#if PLATFORM_SUPPORTS_MESH_SHADERS
782#if VULKAN_SUPPORTS_GEOMETRY_SHADERS
785 default:
return nullptr;
825#if VULKAN_PSO_CACHE_DEBUG
830#if PLATFORM_SUPPORTS_GEOMETRY_SHADERS
#define check(expr)
Definition AssertionMacros.h:314
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
FComputePipelineStateRHIRef RHICreateComputePipelineState(FRHIComputeShader *ComputeShader)
Definition DynamicRHI.h:1197
FGraphicsPipelineStateRHIRef RHICreateGraphicsPipelineState(const FGraphicsPipelineStateInitializer &Initializer)
Definition DynamicRHI.h:1184
EShaderFrequency
Definition RHIDefinitions.h:202
@ SF_Amplification
Definition RHIDefinitions.h:205
@ SF_Vertex
Definition RHIDefinitions.h:203
@ SF_Mesh
Definition RHIDefinitions.h:204
@ SF_Geometry
Definition RHIDefinitions.h:207
@ SF_Pixel
Definition RHIDefinitions.h:206
EVRSRateCombiner
Definition RHIDefinitions.h:873
@ VRSRB_Passthrough
Definition RHIDefinitions.h:874
EVRSShadingRate
Definition RHIDefinitions.h:860
@ VRSSR_1x1
Definition RHIDefinitions.h:861
#define VULKAN_CPU_ALLOCATOR
Definition VulkanConfiguration.h:232
uint64 GetShaderKeyForGfxStage(const FBoundShaderStateInput &BSI, ShaderStage::EStage Stage)
Definition VulkanPipeline.h:35
void GetVulkanGfxShaders(const FBoundShaderStateInput &BSI, FVulkanShader *OutShaders[ShaderStage::NumGraphicsStages])
Definition VulkanPipeline.cpp:2889
Definition Archive.h:1208
Definition IDelegateInstance.h:14
Definition RHIResources.h:4572
EPSOPrecacheCompileType
Definition RHIResources.h:4798
Definition RHIResources.h:1078
FRHIComputeShader * GetComputeShader() const
Definition RHIResources.h:1092
Definition RHIResources.h:1018
Definition RHIResources.h:1058
Definition RHIResources.h:947
Definition SecureHash.h:226
Definition ShaderPipelineCache.h:162
Definition VulkanContext.h:241
Definition VulkanPipelineState.h:182
Definition VulkanPipeline.h:705
void Bind(VkCommandBuffer CmdBuffer)
Definition VulkanPipeline.h:720
const FVulkanShaderHeader & GetShaderCodeHeader() const
Definition VulkanPipeline.h:710
virtual ~FVulkanComputePipeline()
Definition VulkanPipeline.cpp:247
const bool bUsesBindless
Definition VulkanPipeline.h:731
const FVulkanLayout & GetLayout() const
Definition VulkanPipeline.h:715
bool UsesBindless() const
Definition VulkanPipeline.h:725
Definition VulkanDescriptorSets.h:33
Definition VulkanDevice.h:279
VkDevice GetHandle() const
Definition VulkanDevice.h:425
VulkanRHI::FDeferredDeletionQueue2 & GetDeferredDeletionQueue()
Definition VulkanDevice.h:452
Definition VulkanDynamicRHI.h:69
Definition VulkanPipeline.h:735
FVulkanLayout * Layout
Definition VulkanPipeline.h:810
uint64 PrecacheKey
Definition VulkanPipeline.h:820
uint64 ShaderKeys[ShaderStage::NumGraphicsStages]
Definition VulkanPipeline.h:804
FVulkanDevice * Device
Definition VulkanPipeline.h:811
FRHIGraphicsShader * GetShader(EShaderFrequency Frequency) const override
Definition VulkanPipeline.h:772
VulkanResourceFrameCounter FrameCounter
Definition VulkanPipeline.h:823
TEnumAsByte< EPrimitiveType > PrimitiveType
Definition VulkanPipeline.h:805
const FVulkanRenderPass * RenderPass
Definition VulkanPipeline.h:814
bool bHasInputAttachments
Definition VulkanPipeline.h:800
bool bUsesBindless
Definition VulkanPipeline.h:802
void GetOrCreateShaderModules(TRefCountPtr< FVulkanShaderModule >(&ShaderModulesOUT)[ShaderStage::NumGraphicsStages], FVulkanShader *const *Shaders)
Definition VulkanPipeline.cpp:271
VkPipeline GetVulkanPipeline() const
Definition VulkanPipeline.h:767
void DeleteVkPipeline(bool bImmediate)
Definition VulkanPipeline.cpp:3100
FVulkanShader::FSpirvCode GetPatchedSpirvCode(FVulkanShader *Shader)
Definition VulkanPipeline.cpp:284
FVulkanGraphicsPipelineStateLRUNode * LRUNode
Definition VulkanPipeline.h:817
uint32 LRUFrame
Definition VulkanPipeline.h:818
const FVulkanVertexInputStateInfo & GetVertexInputState() const
Definition VulkanPipeline.h:740
const FVulkanShader * GetVulkanShader(EShaderFrequency Frequency) const
Definition VulkanPipeline.h:761
FVulkanVertexInputStateInfo VertexInputState
Definition VulkanPipeline.h:809
~FVulkanGraphicsPipelineState()
Definition VulkanPipeline.cpp:253
FVulkanShader * VulkanShaders[ShaderStage::NumGraphicsStages]
Definition VulkanPipeline.h:813
const FVulkanLayout & GetLayout() const
Definition VulkanPipeline.h:745
void PurgeShaderModules(FVulkanShader *const *Shaders)
Definition VulkanPipeline.cpp:290
VkPipeline VulkanPipeline
Definition VulkanPipeline.h:808
const uint64 GetShaderKey(EShaderFrequency Frequency) const
Definition VulkanPipeline.h:755
uint32 PipelineCacheSize
Definition VulkanPipeline.h:819
void Bind(VkCommandBuffer CmdBuffer)
Definition VulkanPipeline.h:750
bool bIsRegistered
Definition VulkanPipeline.h:801
const FGfxPipelineDesc Desc
Definition VulkanPipeline.h:812
bool UsesBindless() const
Definition VulkanPipeline.h:794
FVulkanPSOKey VulkanKey
Definition VulkanPipeline.h:821
Definition VulkanLayout.h:10
Definition VulkanPipeline.h:25
Definition VulkanPipeline.h:492
VkResult CreateRayTracingPipeline(const VkRayTracingPipelineCreateInfoKHR &CreateInfo, bool bIsPartial, VkPipeline &OutPipeline)
Definition VulkanPipeline.cpp:2116
~FVulkanPipelineStateCacheManager()
Definition VulkanPipeline.cpp:318
void NotifyDeletedComputePipeline(FVulkanComputePipeline *Pipeline)
Definition VulkanPipeline.cpp:2810
void InitAndLoad(const TArray< FString > &CacheFilenames)
Definition VulkanPipeline.cpp:477
void RebuildCache()
Definition VulkanPipeline.cpp:2167
FVulkanComputePipeline * GetOrCreateComputePipeline(FVulkanComputeShader *ComputeShader)
Definition VulkanPipeline.cpp:2706
Definition VulkanPipeline.h:660
FVulkanDevice * Device
Definition VulkanPipeline.h:695
virtual ~FVulkanPipeline()
Definition VulkanPipeline.cpp:226
const FVulkanLayout & GetLayout() const
Definition VulkanPipeline.h:670
FVulkanLayout * Layout
Definition VulkanPipeline.h:697
VkPipeline GetHandle() const
Definition VulkanPipeline.h:665
VulkanResourceFrameCounter FrameCounter
Definition VulkanPipeline.h:692
VkPipeline Pipeline
Definition VulkanPipeline.h:696
Definition VulkanRenderpass.h:453
Definition VulkanRenderTargetLayout.h:8
Definition VulkanResources.h:173
Definition VulkanResources.h:108
uint64 GetShaderKey() const
Definition VulkanResources.h:165
Definition VulkanUtil.h:144
Definition EnumAsByte.h:22
Definition UnrealString.h.inl:34
Definition VulkanResources.h:257
EStage
Definition VulkanCommon.h:35
@ Geometry
Definition VulkanCommon.h:38
@ NumGraphicsStages
Definition VulkanCommon.h:42
@ Mesh
Definition VulkanCommon.h:39
@ Pixel
Definition VulkanCommon.h:37
@ Vertex
Definition VulkanCommon.h:36
@ MaxNumStages
Definition VulkanCommon.h:55
@ Task
Definition VulkanCommon.h:40
EStage GetStageForFrequency(EShaderFrequency Stage)
Definition VulkanCommon.h:62
U16 Index
Definition radfft.cpp:71
static UE_FORCEINLINE_HINT uint32 MemCrc32(const void *Data, int32 Length, uint32 CRC=0)
Definition Crc.h:31
Definition VulkanPipeline.h:107
uint8 StageFlags
Definition VulkanPipeline.h:110
void ReadFrom(const VkDescriptorSetLayoutBinding &InState)
Definition VulkanPipeline.cpp:758
uint8 DescriptorType
Definition VulkanPipeline.h:109
void WriteInto(VkDescriptorSetLayoutBinding &OutState) const
Definition VulkanPipeline.cpp:767
uint32 Binding
Definition VulkanPipeline.h:108
bool operator==(const FDescriptorSetLayoutBinding &In) const
Definition VulkanPipeline.h:115
Definition VulkanPipeline.h:134
void ReadFrom(const VkPipelineColorBlendAttachmentState &InState)
Definition VulkanPipeline.cpp:733
bool bBlend
Definition VulkanPipeline.h:135
uint8 DstColorBlendFactor
Definition VulkanPipeline.h:138
uint8 DstAlphaBlendFactor
Definition VulkanPipeline.h:141
uint8 SrcAlphaBlendFactor
Definition VulkanPipeline.h:140
uint8 SrcColorBlendFactor
Definition VulkanPipeline.h:137
bool operator==(const FBlendAttachment &In) const
Definition VulkanPipeline.h:147
uint8 ColorBlendOp
Definition VulkanPipeline.h:136
uint8 ColorWriteMask
Definition VulkanPipeline.h:142
uint8 AlphaBlendOp
Definition VulkanPipeline.h:139
void WriteInto(VkPipelineColorBlendAttachmentState &OutState) const
Definition VulkanPipeline.cpp:745
Definition VulkanPipeline.h:223
uint8 BackDepthFailOp
Definition VulkanPipeline.h:238
uint32 BackWriteMask
Definition VulkanPipeline.h:241
uint8 FrontFailOp
Definition VulkanPipeline.h:229
uint8 FrontDepthFailOp
Definition VulkanPipeline.h:231
bool bDepthBoundsTestEnable
Definition VulkanPipeline.h:228
uint32 FrontReference
Definition VulkanPipeline.h:235
bool bDepthWriteEnable
Definition VulkanPipeline.h:226
uint8 BackCompareOp
Definition VulkanPipeline.h:239
uint8 FrontPassOp
Definition VulkanPipeline.h:230
uint8 DepthCompareOp
Definition VulkanPipeline.h:224
uint32 BackReference
Definition VulkanPipeline.h:242
uint32 FrontCompareMask
Definition VulkanPipeline.h:233
bool bDepthTestEnable
Definition VulkanPipeline.h:225
void ReadFrom(const VkPipelineDepthStencilStateCreateInfo &InState)
Definition VulkanPipeline.cpp:880
bool operator==(const FDepthStencil &In) const
Definition VulkanPipeline.h:247
uint8 BackFailOp
Definition VulkanPipeline.h:236
void WriteInto(VkPipelineDepthStencilStateCreateInfo &OutState) const
Definition VulkanPipeline.cpp:903
uint32 BackCompareMask
Definition VulkanPipeline.h:240
uint8 BackPassOp
Definition VulkanPipeline.h:237
uint8 FrontCompareOp
Definition VulkanPipeline.h:232
bool bStencilTestEnable
Definition VulkanPipeline.h:227
uint32 FrontWriteMask
Definition VulkanPipeline.h:234
Definition VulkanPipeline.h:203
void WriteInto(VkPipelineRasterizationStateCreateInfo &OutState) const
Definition VulkanPipeline.cpp:858
uint8 PolygonMode
Definition VulkanPipeline.h:204
float DepthBiasSlopeScale
Definition VulkanPipeline.h:206
uint8 CullMode
Definition VulkanPipeline.h:205
float DepthBiasConstantFactor
Definition VulkanPipeline.h:207
void ReadFrom(const VkPipelineRasterizationStateCreateInfo &InState)
Definition VulkanPipeline.cpp:850
bool operator==(const FRasterizer &In) const
Definition VulkanPipeline.h:212
Definition VulkanPipeline.h:313
void WriteInto(VkAttachmentDescription &OutState) const
Definition VulkanPipeline.cpp:1001
uint64 FinalLayout
Definition VulkanPipeline.h:322
uint8 Flags
Definition VulkanPipeline.h:315
uint8 StoreOp
Definition VulkanPipeline.h:318
uint64 InitialLayout
Definition VulkanPipeline.h:321
void ReadFrom(const VkAttachmentDescription &InState)
Definition VulkanPipeline.cpp:988
uint8 StencilLoadOp
Definition VulkanPipeline.h:319
uint8 Samples
Definition VulkanPipeline.h:316
bool operator==(const FAttachmentDesc &In) const
Definition VulkanPipeline.h:324
uint8 LoadOp
Definition VulkanPipeline.h:317
uint32 Format
Definition VulkanPipeline.h:314
uint8 StencilStoreOp
Definition VulkanPipeline.h:320
Definition VulkanPipeline.h:282
void WriteInto(VkAttachmentReference &OutState) const
Definition VulkanPipeline.cpp:957
void ReadFrom(const VkAttachmentReference &InState)
Definition VulkanPipeline.cpp:951
bool operator==(const FAttachmentRef &In) const
Definition VulkanPipeline.h:288
uint32 Attachment
Definition VulkanPipeline.h:283
uint64 Layout
Definition VulkanPipeline.h:284
Definition VulkanPipeline.h:342
void ReadFrom(const VkAttachmentDescriptionStencilLayout &InState)
Definition VulkanPipeline.cpp:1030
uint64 FinalLayout
Definition VulkanPipeline.h:344
void WriteInto(VkAttachmentDescriptionStencilLayout &OutState) const
Definition VulkanPipeline.cpp:1036
bool operator==(const FStencilAttachmentDesc &In) const
Definition VulkanPipeline.h:346
uint64 InitialLayout
Definition VulkanPipeline.h:343
Definition VulkanPipeline.h:295
void ReadFrom(const VkAttachmentReferenceStencilLayout &InState)
Definition VulkanPipeline.cpp:971
bool operator==(const FStencilAttachmentRef &In) const
Definition VulkanPipeline.h:300
void WriteInto(VkAttachmentReferenceStencilLayout &OutState) const
Definition VulkanPipeline.cpp:976
uint64 Layout
Definition VulkanPipeline.h:296
Definition VulkanPipeline.h:280
FAttachmentRef Depth
Definition VulkanPipeline.h:308
uint8 bHasResolveAttachments
Definition VulkanPipeline.h:362
void ReadFrom(const FVulkanRenderTargetLayout &InState)
Definition VulkanPipeline.cpp:1051
bool operator==(const FRenderTargets &In) const
Definition VulkanPipeline.h:372
uint8 bHasDepthStencilResolve
Definition VulkanPipeline.h:363
void WriteInto(FVulkanRenderTargetLayout &OutState) const
Definition VulkanPipeline.cpp:1090
TArray< FAttachmentDesc > Descriptions
Definition VulkanPipeline.h:356
uint8 bHasFragmentDensityAttachment
Definition VulkanPipeline.h:364
FVector Extent3D
Definition VulkanPipeline.h:367
uint8 NumColorAttachments
Definition VulkanPipeline.h:360
uint32 RenderPassCompatibleHash
Definition VulkanPipeline.h:366
uint8 NumUsedClearValues
Definition VulkanPipeline.h:365
TArray< FAttachmentRef > ColorAttachments
Definition VulkanPipeline.h:306
FStencilAttachmentRef Stencil
Definition VulkanPipeline.h:309
TArray< FAttachmentRef > ResolveAttachments
Definition VulkanPipeline.h:307
FAttachmentRef FragmentDensity
Definition VulkanPipeline.h:310
uint8 NumAttachments
Definition VulkanPipeline.h:359
uint8 bHasDepthStencil
Definition VulkanPipeline.h:361
FStencilAttachmentDesc StencilDescription
Definition VulkanPipeline.h:357
Definition VulkanPipeline.h:182
void ReadFrom(const VkVertexInputAttributeDescription &InState)
Definition VulkanPipeline.cpp:816
uint32 Binding
Definition VulkanPipeline.h:184
bool operator==(const FVertexAttribute &In) const
Definition VulkanPipeline.h:192
uint32 Offset
Definition VulkanPipeline.h:186
void WriteInto(VkVertexInputAttributeDescription &OutState) const
Definition VulkanPipeline.cpp:824
uint32 Format
Definition VulkanPipeline.h:185
uint32 Location
Definition VulkanPipeline.h:183
Definition VulkanPipeline.h:164
void ReadFrom(const VkVertexInputBindingDescription &InState)
Definition VulkanPipeline.cpp:785
uint16 Binding
Definition VulkanPipeline.h:166
void WriteInto(VkVertexInputBindingDescription &OutState) const
Definition VulkanPipeline.cpp:792
uint16 InputRate
Definition VulkanPipeline.h:167
bool operator==(const FVertexBinding &In) const
Definition VulkanPipeline.h:173
uint32 Stride
Definition VulkanPipeline.h:165
Definition VulkanPipeline.h:127
TArray< TArray< FDescriptorSetLayoutBinding > > DescriptorSetLayoutBindings
Definition VulkanPipeline.h:161
bool operator==(const FGfxPipelineDesc &In) const
Definition VulkanPipeline.h:401
TArray< FVertexAttribute > VertexAttributes
Definition VulkanPipeline.h:200
FRasterizer Rasterizer
Definition VulkanPipeline.h:220
uint32 VertexInputKey
Definition VulkanPipeline.h:130
TArray< FVertexBinding > VertexBindings
Definition VulkanPipeline.h:180
uint32 Topology
Definition VulkanPipeline.h:132
EVRSShadingRate ShadingRate
Definition VulkanPipeline.h:398
FVulkanPSOKey CreateKey2() const
Definition VulkanPipeline.cpp:1208
uint8 UseAlphaToCoverage
Definition VulkanPipeline.h:396
uint8 SubpassIndex
Definition VulkanPipeline.h:394
uint64 ShaderKeyShared
Definition VulkanPipeline.h:274
TArray< FBlendAttachment > ColorAttachmentStates
Definition VulkanPipeline.h:159
FRenderTargets RenderTargets
Definition VulkanPipeline.h:392
uint64 ShaderKeys[ShaderStage::NumGraphicsStages]
Definition VulkanPipeline.h:273
EVRSRateCombiner Combiner
Definition VulkanPipeline.h:399
uint16 RasterizationSamples
Definition VulkanPipeline.h:131
FDepthStencil DepthStencil
Definition VulkanPipeline.h:270
static UE_FORCEINLINE_HINT int32 Memcmp(const void *Buf1, const void *Buf2, SIZE_T Count)
Definition UnrealMemory.h:114
Definition VulkanPipeline.h:95
FVulkanPipelineSize()
Definition VulkanPipeline.h:100
uint64 ShaderHash
Definition VulkanPipeline.h:97
uint32 PipelineSize
Definition VulkanPipeline.h:98
Definition VulkanPipeline.h:63
uint32 Hash
Definition VulkanPipeline.h:64
friend bool operator==(const FVulkanShaderHashes &A, const FVulkanShaderHashes &B)
Definition VulkanPipeline.h:80
FSHAHash Stages[ShaderStage::MaxNumStages]
Definition VulkanPipeline.h:65
void Finalize()
Definition VulkanPipeline.h:75
friend uint32 GetTypeHash(const FVulkanShaderHashes &Hashes)
Definition VulkanPipeline.h:70
FVulkanShaderHashes()
Definition VulkanPipeline.cpp:2190
FVulkanGraphicsPipelineState TConcreteType
Definition VulkanPipeline.h:848
class FVulkanComputePipeline TConcreteType
Definition VulkanPipeline.h:842
Definition VulkanResources.h:1168
Definition VulkanPipeline.h:643
void Set(uint32_t Frame) const
Definition VulkanPipeline.h:644
std::atomic< uint32 > LastUsedFrame
Definition VulkanPipeline.h:655
uint32 Get() const
Definition VulkanPipeline.h:649