UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
VulkanPipelineState.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3/*=============================================================================
4 VulkanPipelineState.h: Vulkan pipeline state definitions.
5=============================================================================*/
6
7#pragma once
8
10#include "VulkanMemory.h"
11#include "VulkanCommandBuffer.h"
13#include "VulkanLayout.h"
14#include "VulkanPipeline.h"
15#include "VulkanRHIPrivate.h"
17
20
21
22// Common Pipeline state
24{
25public:
32
34
46
48 {
49 for (const FVulkanDescriptorSetWriter& Writer : DSWriter)
50 {
51 if (Writer.bHasVolatileResources)
52 {
53 return true;
54 }
55 }
56 return false;
57 }
58
59 inline void MarkDirty(bool bDirty)
60 {
61 bIsResourcesDirty |= bDirty;
62 bIsDSetsKeyDirty |= bDirty;
63 }
64
67
69 {
71 check(Texture && Texture->PartialView);
72
73 // If the texture doesn't support sampling, then we read it through a UAV
74 if (Texture->SupportsSampling())
75 {
76 MarkDirty(DSWriter[DescriptorSet].WriteImage(BindingIndex, Texture->PartialView->GetTextureView(), Layout));
77 }
78 else
79 {
80 MarkDirty(DSWriter[DescriptorSet].WriteStorageImage(BindingIndex, Texture->PartialView->GetTextureView(), Layout));
81 }
82 }
83
85 {
87 check(Sampler && Sampler->Sampler != VK_NULL_HANDLE);
88 MarkDirty(DSWriter[DescriptorSet].WriteSampler(BindingIndex, *Sampler));
89 }
90
92 {
94 MarkDirty(DSWriter[DescriptorSet].WriteInputAttachment(BindingIndex, TextureView, Layout));
95 }
96
97 template<bool bDynamic>
99 {
100 const VulkanRHI::FVulkanAllocation& Allocation = UniformBuffer->Allocation;
101 VkDeviceSize Range = UniformBuffer->IsUniformView() ? PLATFORM_MAX_UNIFORM_BUFFER_RANGE : UniformBuffer->GetSize();
102
103 if (bDynamic)
104 {
105 MarkDirty(DSWriter[DescriptorSet].WriteDynamicUniformBuffer(BindingIndex, Allocation.GetBufferHandle(), Allocation.HandleId, 0, Range, UniformBuffer->GetOffset()));
106 }
107 else
108 {
109 MarkDirty(DSWriter[DescriptorSet].WriteUniformBuffer(BindingIndex, Allocation.GetBufferHandle(), Allocation.HandleId, UniformBuffer->GetOffset(), Range));
110 }
111 }
112
113 inline void SetUniformBufferDynamicOffset(uint8 DescriptorSet, uint32 BindingIndex, uint32 DynamicOffset)
114 {
115 const uint8 DynamicOffsetIndex = DSWriter[DescriptorSet].BindingToDynamicOffsetMap[BindingIndex];
116 DSWriter[DescriptorSet].DynamicOffsets[DynamicOffsetIndex] = DynamicOffset;
117 }
118
120 {
122 return Layouts[DescriptorSet].LayoutBindings[BindingIndex].descriptorType;
123 }
124
125protected:
126 void Reset()
127 {
129 {
130 Writer.Reset();
131 }
132 }
133 inline void Bind(VkCommandBuffer CmdBuffer, VkPipelineLayout PipelineLayout, VkPipelineBindPoint BindPoint)
134 {
135 // Bindless will replace with global sets
137 {
138 const uint32 FirstSet = FMath::CountTrailingZeros(UsedSetsMask);
139 const uint32 NumSets = 32 - FMath::CountLeadingZeros(UsedSetsMask) - FirstSet;
141
142 VulkanRHI::vkCmdBindDescriptorSets(CmdBuffer,
143 BindPoint,
144 PipelineLayout,
147 }
148 }
149
151
153
155
156 //#todo-rco: Won't work multithreaded!
159
160 //#todo-rco: Won't work multithreaded!
162
163 // Bitmask of sets that exist in this pipeline
164 //#todo-rco: Won't work multithreaded!
166
167 //#todo-rco: Won't work multithreaded!
169
170 bool bIsResourcesDirty = true;
171
173
175 mutable bool bIsDSetsKeyDirty = true;
176
177 const bool bUseBindless;
178};
179
180
182{
183public:
189
195
196 inline void SetPackedGlobalShaderParameter(uint32 BufferIndex, uint32 ByteOffset, uint32 NumBytes, const void* NewValue)
197 {
198 check(BufferIndex == 0);
200 }
201
216
218
223
224protected:
228
230
231 template<bool bUseDynamicGlobalUBs>
233
236};
237
239{
240public:
246
247 inline void SetPackedGlobalShaderParameter(uint8 Stage, uint32 BufferIndex, uint32 ByteOffset, uint32 NumBytes, const void* NewValue)
248 {
249 check(BufferIndex == 0);
250 PackedUniformBuffers[Stage].SetPackedGlobalParameter(ByteOffset, NumBytes, NewValue, PackedUniformBuffersDirty[Stage]);
251 }
252
267
269
274
281
282protected:
286
288
289 template<bool bUseDynamicGlobalUBs>
291
294};
295
296template <bool bIsDynamic>
297static inline bool SubmitPackedUniformBuffers(FVulkanDescriptorSetWriter& DescriptorWriteSet, const VulkanRHI::FVulkanAllocation& TempAllocation)
298{
299 const int32 BindingIndex = 0; // Packed uniform buffers are only used for globals at binding 0
300 if (bIsDynamic)
301 {
302 return DescriptorWriteSet.WriteDynamicUniformBuffer(BindingIndex, TempAllocation.GetBufferHandle(), TempAllocation.HandleId, 0, TempAllocation.Size, TempAllocation.Offset);
303 }
304 else
305 {
306 return DescriptorWriteSet.WriteUniformBuffer(BindingIndex, TempAllocation.GetBufferHandle(), TempAllocation.HandleId, TempAllocation.Offset, TempAllocation.Size);
307 }
308}
#define check(expr)
Definition AssertionMacros.h:314
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define PLATFORM_MAX_UNIFORM_BUFFER_RANGE
Definition Platform.h:650
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
TAutoConsoleVariable< int32 > GDynamicGlobalUBs
bool UseVulkanDescriptorCache()
Definition VulkanRHIPrivate.h:643
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition VulkanResources.h:1075
void SetPackedGlobalParameter(uint32 ByteOffset, uint32 NumBytes, const void *RESTRICT NewValue, uint32 &InOutPackedUniformBufferStagingDirty)
Definition VulkanResources.h:1094
uint32 Release() const
Definition RHIResources.h:80
Definition VulkanContext.h:241
Definition VulkanPipelineState.h:24
uint32 UsedSetsMask
Definition VulkanPipelineState.h:165
const bool bUseBindless
Definition VulkanPipelineState.h:177
void MarkDirty(bool bDirty)
Definition VulkanPipelineState.h:59
TArray< FVulkanDescriptorSetWriter > DSWriter
Definition VulkanPipelineState.h:172
TArray< uint32 > DynamicOffsets
Definition VulkanPipelineState.h:168
FVulkanDSetsKey DSetsKey
Definition VulkanPipelineState.h:174
void SetUniformBuffer(uint8 DescriptorSet, uint32 BindingIndex, const FVulkanUniformBuffer *UniformBuffer)
Definition VulkanPipelineState.h:98
void SetInputAttachment(uint8 DescriptorSet, uint32 BindingIndex, const FVulkanView::FTextureView &TextureView, VkImageLayout Layout)
Definition VulkanPipelineState.h:91
virtual ~FVulkanCommonPipelineDescriptorState()
Definition VulkanPipelineState.h:33
void SetSRV(bool bCompute, uint8 DescriptorSet, uint32 BindingIndex, FVulkanShaderResourceView *SRV)
Definition VulkanPipelineState.cpp:625
void SetSamplerState(uint8 DescriptorSet, uint32 BindingIndex, const FVulkanSamplerState *Sampler)
Definition VulkanPipelineState.h:84
bool HasVolatileResources() const
Definition VulkanPipelineState.h:47
void SetUAV(bool bCompute, uint8 DescriptorSet, uint32 BindingIndex, FVulkanUnorderedAccessView *UAV)
Definition VulkanPipelineState.cpp:659
void SetUniformBufferDynamicOffset(uint8 DescriptorSet, uint32 BindingIndex, uint32 DynamicOffset)
Definition VulkanPipelineState.h:113
const FVulkanDescriptorSetsLayout * DescriptorSetsLayout
Definition VulkanPipelineState.h:158
void Reset()
Definition VulkanPipelineState.h:126
const FVulkanDSetsKey & GetDSetsKey() const
Definition VulkanPipelineState.h:35
VkDescriptorType GetDescriptorType(uint8 DescriptorSet, uint32 BindingIndex) const
Definition VulkanPipelineState.h:119
void CreateDescriptorWriteInfos()
Definition VulkanPipelineState.cpp:69
FVulkanDevice & Device
Definition VulkanPipelineState.h:152
TArray< VkDescriptorSet > DescriptorSetHandles
Definition VulkanPipelineState.h:161
FVulkanCommonPipelineDescriptorState(FVulkanDevice &InDevice, uint32 InMaxNumSets, bool InUsesBindless)
Definition VulkanPipelineState.h:26
void SetTexture(uint8 DescriptorSet, uint32 BindingIndex, const FVulkanTexture *Texture, VkImageLayout Layout)
Definition VulkanPipelineState.h:68
FVulkanDescriptorSetWriteContainer DSWriteContainer
Definition VulkanPipelineState.h:157
void Bind(VkCommandBuffer CmdBuffer, VkPipelineLayout PipelineLayout, VkPipelineBindPoint BindPoint)
Definition VulkanPipelineState.h:133
bool bIsResourcesDirty
Definition VulkanPipelineState.h:170
bool bIsDSetsKeyDirty
Definition VulkanPipelineState.h:175
const uint32 MaxNumSets
Definition VulkanPipelineState.h:154
Definition VulkanPipelineState.h:182
uint32 PackedUniformBuffersMask
Definition VulkanPipelineState.h:226
bool InternalUpdateDescriptorSets(FVulkanCommandListContext &Context)
Definition VulkanPipelineState.cpp:183
void Reset()
Definition VulkanPipelineState.h:190
FPackedUniformBuffers PackedUniformBuffers
Definition VulkanPipelineState.h:225
void BindDescriptorSets(VkCommandBuffer CmdBuffer)
Definition VulkanPipelineState.h:219
bool UpdateDescriptorSets(FVulkanCommandListContext &Context)
Definition VulkanPipelineState.h:202
void SetPackedGlobalShaderParameter(uint32 BufferIndex, uint32 ByteOffset, uint32 NumBytes, const void *NewValue)
Definition VulkanPipelineState.h:196
void UpdateBindlessDescriptors(FVulkanCommandListContext &Context)
Definition VulkanPipelineState.cpp:233
FVulkanComputePipeline * ComputePipeline
Definition VulkanPipelineState.h:229
virtual ~FVulkanComputePipelineDescriptorState()
Definition VulkanPipelineState.h:185
uint32 PackedUniformBuffersDirty
Definition VulkanPipelineState.h:227
Definition VulkanPipeline.h:705
const FVulkanLayout & GetLayout() const
Definition VulkanPipeline.h:715
Definition VulkanDescriptorSets.h:23
Definition VulkanDescriptorSets.h:501
const TArray< FSetLayout > & GetLayouts() const
Definition VulkanDescriptorSets.h:100
Definition VulkanDescriptorSets.h:245
Definition VulkanDevice.h:279
Definition VulkanPipelineState.h:239
void BindDescriptorSets(VkCommandBuffer CmdBuffer)
Definition VulkanPipelineState.h:270
FVulkanGraphicsPipelineState * GfxPipeline
Definition VulkanPipelineState.h:287
bool InternalUpdateDescriptorSets(FVulkanCommandListContext &Context)
Definition VulkanPipelineState.cpp:391
void SetPackedGlobalShaderParameter(uint8 Stage, uint32 BufferIndex, uint32 ByteOffset, uint32 NumBytes, const void *NewValue)
Definition VulkanPipelineState.h:247
void UpdateBindlessDescriptors(FVulkanCommandListContext &Context)
Definition VulkanPipelineState.cpp:466
virtual ~FVulkanGraphicsPipelineDescriptorState()
Definition VulkanPipelineState.h:242
bool UpdateDescriptorSets(FVulkanCommandListContext &Context)
Definition VulkanPipelineState.h:253
TStaticArray< FPackedUniformBuffers, ShaderStage::NumGraphicsStages > PackedUniformBuffers
Definition VulkanPipelineState.h:283
void Reset()
Definition VulkanPipelineState.h:275
TStaticArray< uint32, ShaderStage::NumGraphicsStages > PackedUniformBuffersDirty
Definition VulkanPipelineState.h:285
TStaticArray< uint32, ShaderStage::NumGraphicsStages > PackedUniformBuffersMask
Definition VulkanPipelineState.h:284
Definition VulkanPipeline.h:735
const FVulkanLayout & GetLayout() const
Definition VulkanPipeline.h:745
VkPipelineLayout GetPipelineLayout() const
Definition VulkanLayout.h:20
Definition VulkanPendingState.h:21
Definition VulkanPendingState.h:121
Definition VulkanState.h:17
Definition VulkanResources.h:1020
Definition VulkanResources.h:604
Definition VulkanResources.h:957
Definition VulkanResources.h:1003
virtual int32 GetInt() const =0
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
UE_NODEBUG UE_FORCEINLINE_HINT ElementType * GetData() UE_LIFETIMEBOUND
Definition Array.h:1027
Definition IConsoleManager.h:1792
void GenerateFromData(const void *InData, uint32 InSize)
Definition VulkanUtil.h:166
Definition StaticArray.h:26
Definition VulkanMemory.h:418
VkBuffer GetBufferHandle() const
Definition VulkanMemory.cpp:3866
uint32 HandleId
Definition VulkanMemory.h:433
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160
Definition VulkanDescriptorSets.h:486
TArray< FVulkanHashableDescriptorInfo > HashableDescriptorInfo
Definition VulkanDescriptorSets.h:487
Definition VulkanResources.h:461
Definition VulkanDescriptorSets.h:456