UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
VulkanDescriptorSets.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Async/AsyncWork.h"
7#include "VulkanDevice.h"
8#include "VulkanMemory.h"
9#include "VulkanRHIPrivate.h"
11
12#if (UE_BUILD_SHIPPING || UE_BUILD_TEST)
13#define VULKAN_VALIDATE_DESCRIPTORS_WRITTEN 0
14#else
15#define VULKAN_VALIDATE_DESCRIPTORS_WRITTEN 1
16#endif
17
18
20
21// (AlwaysCompareData == true) because of CRC-32 hash collisions
22class FVulkanDSetKey : public TDataKey<FVulkanDSetKey, true> {};
23class FVulkanDSetsKey : public TDataKey<FVulkanDSetsKey, true> {};
24
29
30
31// Information for the layout of descriptor sets; does not hold runtime objects
33{
34public:
36 {
37 // Add expected descriptor types
39 {
40 LayoutTypes.Add(static_cast<VkDescriptorType>(i), 0);
41 }
42
44 }
45
47 {
48 if (LayoutTypes.Contains(Type))
49 {
50 return LayoutTypes[Type];
51 }
52 else
53 {
54 return 0;
55 }
56 }
57
59 {
62
67
68 friend uint32 GetTypeHash(const FSetLayout& In)
69 {
70 return In.Hash;
71 }
72
73 inline bool operator == (const FSetLayout& In) const
74 {
75 if (In.Hash != Hash)
76 {
77 return false;
78 }
79
81 if (In.LayoutBindings.Num() != NumBindings)
82 {
83 return false;
84 }
85
87 {
88 return false;
89 }
90
91 return true;
92 }
93
94 inline bool operator != (const FSetLayout& In) const
95 {
96 return !(*this == In);
97 }
98 };
99
101 {
102 return SetLayouts;
103 }
104
106
107 template<bool bIsCompute>
108 void FinalizeBindings(const FVulkanDevice& Device, const FUniformBufferGatherInfo& UBGatherInfo, const TArrayView<FRHISamplerState*>& ImmutableSamplers, bool bUsesBindless);
109
111
113 {
114 return In.Hash;
115 }
116
118 {
119 if (In.Hash != Hash)
120 {
121 return false;
122 }
123
124 if (In.BindPoint != BindPoint)
125 {
126 return false;
127 }
128
129 if (In.SetLayouts.Num() != SetLayouts.Num())
130 {
131 return false;
132 }
133
134 if (In.TypesUsageID != TypesUsageID)
135 {
136 return false;
137 }
138
139 for (int32 Index = 0; Index < In.SetLayouts.Num(); ++Index)
140 {
141 if (In.SetLayouts[Index] != SetLayouts[Index])
142 {
143 return false;
144 }
145 }
146
147 if (StageInfos != In.StageInfos)
148 {
149 return false;
150 }
151
152 return true;
153 }
154
156 {
157 LayoutTypes = Info.LayoutTypes;
158 Hash = Info.Hash;
159 TypesUsageID = Info.TypesUsageID;
160 SetLayouts = Info.SetLayouts;
161 StageInfos = Info.StageInfos;
162 }
163
165 {
166 return LayoutTypes;
167 }
168
169 inline uint32 GetTypesUsageID() const
170 {
171 return TypesUsageID;
172 }
173
174 inline bool HasInputAttachments() const
175 {
177 }
178
180 {
187
188 inline bool IsEmpty() const
189 {
190 if ((Types.Num() != 0) || (PackedGlobalsSize != 0) || (NumBoundUniformBuffers != 0))
191 {
192 return false;
193 }
194
195 return true;
196 }
197
198 inline bool operator==(const FStageInfo& In) const
199 {
205 Types.Num() != In.Types.Num() ||
207 {
208 return false;
209 }
210
211 return true;
212 }
213 };
215
216protected:
219
221
223
225
226 void CompileTypesUsageID();
227
229
232 friend class FVulkanLayout;
233};
234
240
242
243// The actual run-time descriptor set layouts
245{
246public:
249
250 // Can be called only once, the idea is that the Layout remains fixed.
251 void Compile(FVulkanDescriptorSetLayoutMap& DSetLayoutMap);
252
254 {
255 return LayoutHandles;
256 }
257
258 inline const TArray<uint32>& GetHandleIds() const
259 {
260 return LayoutHandleIds;
261 }
262
264 {
265 return DescriptorSetAllocateInfo;
266 }
267
268 inline uint32 GetHash() const
269 {
270 return Hash;
271 }
272
273private:
274 FVulkanDevice* Device;
275 //uint32 Hash = 0;
276 TArray<VkDescriptorSetLayout> LayoutHandles;
277 TArray<uint32> LayoutHandleIds;
278 VkDescriptorSetAllocateInfo DescriptorSetAllocateInfo;
279};
280
282{
283public:
286
288 {
289 return DescriptorPool;
290 }
291
293 {
294 return MaxDescriptorSets > NumAllocatedDescriptorSets + InLayout.GetLayouts().Num();
295 }
296
299
300 inline bool IsEmpty() const
301 {
302 return NumAllocatedDescriptorSets == 0;
303 }
304
305 void Reset();
308 {
309 return NumAllocatedDescriptorSets;
310 }
311
312private:
313 FVulkanDevice* Device;
314
315 uint32 MaxDescriptorSets;
316 uint32 NumAllocatedDescriptorSets;
317 uint32 PeakAllocatedDescriptorSets;
318
319 // Tracks number of allocated types, to ensure that we are not exceeding our allocated limit
321 VkDescriptorPool DescriptorPool;
322
324};
325
326
328{
330
331 FVulkanDescriptorPool* GetFreePool(bool bForceNewPool = false);
332 FVulkanDescriptorPool* PushNewPool();
333
334protected:
337
339 : Device(InDevice)
341 , PoolsCount(0)
342 {
343 PushNewPool();
344 };
345
347
348 void Reset();
349
350public:
352
353private:
354 FVulkanDevice* Device;
356 uint32 PoolsCount;
357
358 FPoolList* PoolListHead = nullptr;
359 FPoolList* PoolListCurrent = nullptr;
360};
361
363{
364public:
366 : Device(InDevice)
367 , LastFrameUsed(GFrameNumberRenderThread)
368 , bUsed(true)
369 {
370 }
371
373
375
376 void Reset();
377
378 inline void SetUsed(bool bInUsed)
379 {
380 bUsed = bInUsed;
381 LastFrameUsed = bUsed ? GFrameNumberRenderThread : LastFrameUsed;
382 }
383
384 inline bool IsUnused() const
385 {
386 return !bUsed;
387 }
388
390 {
391 return LastFrameUsed;
392 }
393
394private:
395 FVulkanDevice* Device;
396
398
399 uint32 LastFrameUsed;
400 bool bUsed;
401};
402
404{
405 class FVulkanAsyncPoolSetDeletionWorker : public FNonAbandonableTask
406 {
408
409 public:
410 FVulkanAsyncPoolSetDeletionWorker(FVulkanDescriptorPoolSetContainer* InPoolSet)
411 : PoolSet(InPoolSet)
412 {};
413
414 void DoWork()
415 {
416 check(PoolSet != nullptr);
417
418 delete PoolSet;
419
420 PoolSet = nullptr;
421 }
422
424 {
425 check(PoolSet == nullptr);
426 PoolSet = InPoolSet;
427 }
428
429 FORCEINLINE TStatId GetStatId() const
430 {
431 RETURN_QUICK_DECLARE_CYCLE_STAT(FVulkanAsyncPoolSetDeletionWorker, STATGROUP_ThreadPoolAsyncTasks);
432 }
433 };
434
435public:
437
439 {
440 Device = InDevice;
441 }
442
445 void GC();
446
447private:
448 FVulkanDevice* Device = nullptr;
449 FAsyncTask<FVulkanAsyncPoolSetDeletionWorker>* AsyncDeletionTask = nullptr;
450
453};
454
482
483// This container holds the actual VkWriteDescriptorSet structures; a Compute pipeline uses the arrays 'as-is', whereas a
484// Gfx PSO will have one big array and chunk it depending on the stage (eg Vertex, Pixel).
496
497
498// This class encapsulates updating VkWriteDescriptorSet structures (but doesn't own them), and their flags for dirty ranges; it is intended
499// to be used to access a sub-region of a long array of VkWriteDescriptorSet (ie FVulkanDescriptorSetWriteContainer)
501{
502public:
504 : WriteDescriptors(nullptr)
506 , DynamicOffsets(nullptr)
507 , NumWrites(0)
508 , HashableDescriptorInfos(nullptr)
510 {
511 }
512
513 const FVulkanDSetKey& GetKey() const
514 {
516 if (bIsKeyDirty)
517 {
519 bIsKeyDirty = false;
520 }
521 return Key;
522 }
523
525 {
526 return WriteDescriptors;
527 }
528
529 const uint32 GetNumWrites() const
530 {
531 return NumWrites;
532 }
533
534 bool WriteUniformBuffer(uint32 DescriptorIndex, VkBuffer BufferHandle, uint32 HandleId, VkDeviceSize Offset, VkDeviceSize Range)
535 {
536 return WriteBuffer<VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER>(DescriptorIndex, BufferHandle, HandleId, Offset, Range);
537 }
538
539 bool WriteDynamicUniformBuffer(uint32 DescriptorIndex, VkBuffer BufferHandle, uint32 HandleId, VkDeviceSize Offset, VkDeviceSize Range, uint32 DynamicOffset)
540 {
541 return WriteBuffer<VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC>(DescriptorIndex, BufferHandle, HandleId, Offset, Range, DynamicOffset);
542 }
543
544 bool WriteSampler(uint32 DescriptorIndex, const FVulkanSamplerState& Sampler)
545 {
546 check(DescriptorIndex < NumWrites);
548 VkDescriptorImageInfo* ImageInfo = const_cast<VkDescriptorImageInfo*>(WriteDescriptors[DescriptorIndex].pImageInfo);
550
551 bool bChanged = false;
553 {
555 check(Sampler.SamplerId > 0);
556 if (HashableInfo.Image.SamplerId != Sampler.SamplerId)
557 {
558 HashableInfo.Image.SamplerId = Sampler.SamplerId;
559 ImageInfo->sampler = Sampler.Sampler;
560 bChanged = true;
561 }
562 bIsKeyDirty |= bChanged;
563 }
564 else
565 {
566 bChanged = CopyAndReturnNotEqual(ImageInfo->sampler, Sampler.Sampler);
567 }
568
569 return bChanged;
570 }
571
572 bool WriteImage(uint32 DescriptorIndex, const FVulkanView::FTextureView& TextureView, VkImageLayout Layout)
573 {
574 return WriteTextureView<VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE>(DescriptorIndex, TextureView, Layout);
575 }
576
578 {
579 return WriteTextureView<VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT>(DescriptorIndex, TextureView, Layout);
580 }
581
582 bool WriteStorageImage(uint32 DescriptorIndex, const FVulkanView::FTextureView& TextureView, VkImageLayout Layout)
583 {
584 return WriteTextureView<VK_DESCRIPTOR_TYPE_STORAGE_IMAGE>(DescriptorIndex, TextureView, Layout);
585 }
586
588 {
590 }
591
593 {
594 return WriteBuffer<VK_DESCRIPTOR_TYPE_STORAGE_BUFFER>(DescriptorIndex, View.Buffer, View.HandleId, View.Offset, View.Size);
595 }
596
598 {
600 }
601
602
604 {
605 checkf(!UseVulkanDescriptorCache(), TEXT("Descriptor cache path for WriteAccelerationStructure() is not implemented"));
606
607 check(DescriptorIndex < NumWrites);
608 SetWritten(DescriptorIndex);
609
611
612 // Find the acceleration structure extension in the generic VkWriteDescriptorSet.
614 const VkBaseInStructure* Cursor = reinterpret_cast<const VkBaseInStructure*>(WriteDescriptors[DescriptorIndex].pNext);
615 while (Cursor)
616 {
618 {
619 FoundWrite = reinterpret_cast<const VkWriteDescriptorSetAccelerationStructureKHR*>(Cursor);
620 break;
621 }
622 Cursor = Cursor->pNext;
623 }
624
626 TEXT("Expected to find a VkWriteDescriptorSetAccelerationStructureKHR that's needed to bind an acceleration structure descriptor. ")
627 TEXT("Possibly something went wrong in SetupDescriptorWrites()."));
628
629 checkf(FoundWrite->accelerationStructureCount == 1, TEXT("Acceleration structure write operation is expected to contain exactly one descriptor"));
630
632
634
635 return bChanged;
636 }
637
639 {
640 for (uint32 Index = 0; Index < NumWrites; ++Index)
641 {
643 }
644 }
645
646protected:
647 template <VkDescriptorType DescriptorType>
648 bool WriteBuffer(uint32 DescriptorIndex, VkBuffer BufferHandle, uint32 HandleId, VkDeviceSize Offset, VkDeviceSize Range, uint32 DynamicOffset = 0)
649 {
650 check(DescriptorIndex < NumWrites);
651 SetWritten(DescriptorIndex);
652 if (DescriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER)
653 {
655 TEXT("DescriptorType mismatch at index %d: called WriteBuffer<%s> and was expecting %s."),
656 DescriptorIndex, VK_TYPE_TO_STRING(VkDescriptorType, DescriptorType), VK_TYPE_TO_STRING(VkDescriptorType, WriteDescriptors[DescriptorIndex].descriptorType));
657 }
658 else
659 {
660 checkf(WriteDescriptors[DescriptorIndex].descriptorType == DescriptorType,
661 TEXT("DescriptorType mismatch at index %d: called WriteBuffer<%s> and was expecting %s."),
662 DescriptorIndex, VK_TYPE_TO_STRING(VkDescriptorType, DescriptorType), VK_TYPE_TO_STRING(VkDescriptorType, WriteDescriptors[DescriptorIndex].descriptorType));
663 }
664 VkDescriptorBufferInfo* BufferInfo = const_cast<VkDescriptorBufferInfo*>(WriteDescriptors[DescriptorIndex].pBufferInfo);
666
667 bool bChanged = false;
669 {
671 check(HandleId > 0);
672 if (HashableInfo.Buffer.Id != HandleId)
673 {
674 HashableInfo.Buffer.Id = HandleId;
675 BufferInfo->buffer = BufferHandle;
676 bChanged = true;
677 }
678 if (HashableInfo.Buffer.Offset != static_cast<uint32>(Offset))
679 {
680 HashableInfo.Buffer.Offset = static_cast<uint32>(Offset);
681 BufferInfo->offset = Offset;
682 bChanged = true;
683 }
684 if (HashableInfo.Buffer.Range != static_cast<uint32>(Range))
685 {
686 HashableInfo.Buffer.Range = static_cast<uint32>(Range);
687 BufferInfo->range = Range;
688 bChanged = true;
689 }
690 bIsKeyDirty |= bChanged;
691 }
692 else
693 {
694 bChanged = CopyAndReturnNotEqual(BufferInfo->buffer, BufferHandle);
695 bChanged |= CopyAndReturnNotEqual(BufferInfo->offset, Offset);
696 bChanged |= CopyAndReturnNotEqual(BufferInfo->range, Range);
697 }
698
699 if (DescriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)
700 {
701 const uint8 DynamicOffsetIndex = BindingToDynamicOffsetMap[DescriptorIndex];
702 DynamicOffsets[DynamicOffsetIndex] = DynamicOffset;
703 }
704 return bChanged;
705 }
706
707 template <VkDescriptorType DescriptorType>
708 bool WriteTextureView(uint32 DescriptorIndex, const FVulkanView::FTextureView& TextureView, VkImageLayout Layout)
709 {
710 check(DescriptorIndex < NumWrites);
711 SetWritten(DescriptorIndex);
712 if (DescriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE)
713 {
715 TEXT("DescriptorType mismatch at index %d: called WriteTextureView<%d> and was expecting %d."),
716 DescriptorIndex, (uint32)DescriptorType, (uint32)WriteDescriptors[DescriptorIndex].descriptorType);
723 Layout == VK_IMAGE_LAYOUT_GENERAL, TEXT("Invalid Layout %s, Index %d, Type %s\n"),
725 }
726 else
727 {
728 checkf(WriteDescriptors[DescriptorIndex].descriptorType == DescriptorType,
729 TEXT("DescriptorType mismatch at index %d: called WriteTextureView<%s> and was expecting %s."),
730 DescriptorIndex, VK_TYPE_TO_STRING(VkDescriptorType, DescriptorType), VK_TYPE_TO_STRING(VkDescriptorType, WriteDescriptors[DescriptorIndex].descriptorType));
731 }
732 VkDescriptorImageInfo* ImageInfo = const_cast<VkDescriptorImageInfo*>(WriteDescriptors[DescriptorIndex].pImageInfo);
734
735 bool bChanged = false;
737 {
739 check(TextureView.ViewId > 0);
740 if (HashableInfo.Image.ImageViewId != TextureView.ViewId)
741 {
742 HashableInfo.Image.ImageViewId = TextureView.ViewId;
743 ImageInfo->imageView = TextureView.View;
744 bChanged = true;
745 }
746 if (HashableInfo.Image.ImageLayout != static_cast<uint32>(Layout))
747 {
748 HashableInfo.Image.ImageLayout = static_cast<uint32>(Layout);
749 ImageInfo->imageLayout = Layout;
750 bChanged = true;
751 }
752 bIsKeyDirty |= bChanged;
753 }
754 else
755 {
756 bChanged = CopyAndReturnNotEqual(ImageInfo->imageView, TextureView.View);
757 bChanged |= CopyAndReturnNotEqual(ImageInfo->imageLayout, Layout);
758 }
759
760 return bChanged;
761 }
762
763 template <VkDescriptorType DescriptorType>
764 bool WriteBufferView(uint32 DescriptorIndex, const FVulkanView::FTypedBufferView& View)
765 {
766 check(DescriptorIndex < NumWrites);
767 checkf(WriteDescriptors[DescriptorIndex].descriptorType == DescriptorType,
768 TEXT("DescriptorType mismatch at index %d: called WriteBufferView<%s> and was expecting %s."),
769 DescriptorIndex, VK_TYPE_TO_STRING(VkDescriptorType, DescriptorType), VK_TYPE_TO_STRING(VkDescriptorType, WriteDescriptors[DescriptorIndex].descriptorType));
770 SetWritten(DescriptorIndex);
771 WriteDescriptors[DescriptorIndex].pTexelBufferView = &View.View;
772
773 const bool bVolatile = View.bVolatile;
774
775 bHasVolatileResources|= bVolatile;
776
777 if (!bVolatile && UseVulkanDescriptorCache())
778 {
779 bool bChanged = false;
781 check(View.ViewId > 0);
782 if (HashableInfo.BufferView.Id != View.ViewId)
783 {
784 HashableInfo.BufferView.Id = View.ViewId;
785 bChanged = true;
786 }
787 bIsKeyDirty |= bChanged;
788 return bChanged;
789 }
790 else
791 {
792 return true;
793 }
794 }
795
796protected:
797 // A view into someone else's descriptors
799
800 // A view into the mapping from binding index to dynamic uniform buffer offsets
802
803 // A view into someone else's dynamic uniform buffer offsets
805
807
810 mutable bool bIsKeyDirty;
812
820
825
826#if VULKAN_VALIDATE_DESCRIPTORS_WRITTEN
829#endif
830 void CheckAllWritten();
831 void Reset();
832 void SetWritten(uint32 DescriptorIndex);
833 void SetWrittenBase(uint32 DescriptorIndex);
835};
836
837
839{
840public:
843
845 {
846 return Device;
847 }
848
850 {
851 return MaxDescriptorSets;
852 }
853
854 void Reset();
856
857private:
858 FVulkanDevice* const Device;
859 const uint32 MaxDescriptorSets;
860 VkDescriptorPool DescriptorPool;
861 // information for debugging
863};
864
866{
867public:
870
873 void GC();
874
875private:
876 void UpdateAllocRatio();
877 void AddCachedPool();
878
879private:
880 struct FSetsEntry
881 {
883 int32 NumSets;
884 };
885
886 class FCachedPool : FNoncopyable
887 {
888 public:
890
891 inline uint32 GetMaxDescriptorSets() const
892 {
893 return Pool.GetMaxDescriptorSets();
894 }
895
896 void Reset();
897 bool CanGC() const;
898 float CalcAllocRatio() const;
899
900 bool FindDescriptorSets(const FVulkanDSetsKey& DSetsKey, VkDescriptorSet* OutSets);
901 bool CreateDescriptorSets(const FVulkanDSetsKey& DSetsKey, const FVulkanDescriptorSetsLayout& SetsLayout,
903
904 void CalcPoolSizesRatio(float PoolSizesRatio[VK_DESCRIPTOR_TYPE_RANGE_SIZE]);
905
906 private:
907 static const float MinAllocRatio;
908 static const float MaxAllocRatio;
909
910 private:
911 const uint32 SetCapacity;
915 uint32 RecentFrame;
916
917 public:
918 uint32 PoolSizesStatistic[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
919 };
920
921private:
922 FVulkanDevice* const Device;
925 float PoolAllocRatio;
926};
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
uint32 GFrameNumberRenderThread
Definition CoreGlobals.cpp:427
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define RETURN_QUICK_DECLARE_CYCLE_STAT(StatId, GroupId)
Definition Stats.h:655
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
return true
Definition ExternalRpcRegistry.cpp:601
#define VK_TYPE_TO_STRING(Type, Value)
Definition VulkanConfiguration.h:244
uint32 Offset
Definition VulkanMemory.cpp:4033
bool UseVulkanDescriptorCache()
Definition VulkanRHIPrivate.h:643
bool CopyAndReturnNotEqual(T &A, T B)
Definition VulkanUtil.h:38
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 AsyncWork.h:585
Definition AsyncWork.h:663
Definition UnrealTemplate.h:321
Definition VulkanCommandBuffer.h:204
Definition VulkanCommandBuffer.h:43
Definition VulkanContext.h:241
Definition VulkanPipelineState.h:24
Definition VulkanPipelineState.h:182
Definition VulkanDescriptorSets.h:22
Definition VulkanDescriptorSets.h:23
Definition VulkanDescriptorSets.h:363
FVulkanDescriptorPoolSetContainer(FVulkanDevice *InDevice)
Definition VulkanDescriptorSets.h:365
uint32 GetLastFrameUsed() const
Definition VulkanDescriptorSets.h:389
FVulkanTypedDescriptorPoolSet * AcquireTypedPoolSet(const FVulkanDescriptorSetsLayout &Layout)
Definition VulkanPendingState.cpp:228
void Reset()
Definition VulkanPendingState.cpp:243
void SetUsed(bool bInUsed)
Definition VulkanDescriptorSets.h:378
~FVulkanDescriptorPoolSetContainer()
Definition VulkanPendingState.cpp:217
bool IsUnused() const
Definition VulkanDescriptorSets.h:384
Definition VulkanDescriptorSets.h:282
uint32 GetNumAllocatedDescriptorSets() const
Definition VulkanDescriptorSets.h:307
bool CanAllocate(const FVulkanDescriptorSetsLayout &InLayout) const
Definition VulkanDescriptorSets.h:292
void Reset()
Definition VulkanPendingState.cpp:112
bool AllocateDescriptorSets(const VkDescriptorSetAllocateInfo &InDescriptorSetAllocateInfo, VkDescriptorSet *OutSets)
Definition VulkanPendingState.cpp:122
void TrackRemoveUsage(const FVulkanDescriptorSetsLayout &InLayout)
Definition VulkanPendingState.cpp:98
void TrackAddUsage(const FVulkanDescriptorSetsLayout &InLayout)
Definition VulkanPendingState.cpp:82
VkDescriptorPool GetHandle() const
Definition VulkanDescriptorSets.h:287
~FVulkanDescriptorPool()
Definition VulkanPendingState.cpp:70
bool IsEmpty() const
Definition VulkanDescriptorSets.h:300
Definition VulkanDescriptorSets.h:404
~FVulkanDescriptorPoolsManager()
Definition VulkanPendingState.cpp:252
void GC()
Definition VulkanPendingState.cpp:287
void ReleasePoolSet(FVulkanDescriptorPoolSetContainer &PoolSet)
Definition VulkanPendingState.cpp:281
FVulkanDescriptorPoolSetContainer & AcquirePoolSetContainer()
Definition VulkanPendingState.cpp:262
void Init(FVulkanDevice *InDevice)
Definition VulkanDescriptorSets.h:438
Definition VulkanDescriptorSets.h:866
~FVulkanDescriptorSetCache()
Definition VulkanPendingState.cpp:946
void GetDescriptorSets(const FVulkanDSetsKey &DSetsKey, const FVulkanDescriptorSetsLayout &SetsLayout, TArray< FVulkanDescriptorSetWriter > &DSWriters, VkDescriptorSet *OutSets)
Definition VulkanPendingState.cpp:984
void GC()
Definition VulkanPendingState.cpp:1007
Definition VulkanDescriptorSets.h:501
bool WriteStorageTexelBuffer(uint32 DescriptorIndex, const FVulkanView::FTypedBufferView &View)
Definition VulkanDescriptorSets.h:587
VkWriteDescriptorSet * WriteDescriptors
Definition VulkanDescriptorSets.h:798
bool WriteStorageBuffer(uint32 DescriptorIndex, const FVulkanView::FStructuredBufferView &View)
Definition VulkanDescriptorSets.h:592
TArray< uint32, TInlineAllocator< 2 > > BaseWrittenMask
Definition VulkanDescriptorSets.h:828
const uint32 GetNumWrites() const
Definition VulkanDescriptorSets.h:529
bool WriteSampler(uint32 DescriptorIndex, const FVulkanSamplerState &Sampler)
Definition VulkanDescriptorSets.h:544
const FVulkanDSetKey & GetKey() const
Definition VulkanDescriptorSets.h:513
void InitWrittenMasks(uint32 NumDescriptorWrites)
Definition VulkanDescriptorSets.cpp:517
FVulkanHashableDescriptorInfo * HashableDescriptorInfos
Definition VulkanDescriptorSets.h:808
bool WriteDynamicUniformBuffer(uint32 DescriptorIndex, VkBuffer BufferHandle, uint32 HandleId, VkDeviceSize Offset, VkDeviceSize Range, uint32 DynamicOffset)
Definition VulkanDescriptorSets.h:539
bool WriteInputAttachment(uint32 DescriptorIndex, const FVulkanView::FTextureView &TextureView, VkImageLayout Layout)
Definition VulkanDescriptorSets.h:577
bool WriteTextureView(uint32 DescriptorIndex, const FVulkanView::FTextureView &TextureView, VkImageLayout Layout)
Definition VulkanDescriptorSets.h:708
bool WriteBuffer(uint32 DescriptorIndex, VkBuffer BufferHandle, uint32 HandleId, VkDeviceSize Offset, VkDeviceSize Range, uint32 DynamicOffset=0)
Definition VulkanDescriptorSets.h:648
bool bHasVolatileResources
Definition VulkanDescriptorSets.h:811
TArray< uint32, TInlineAllocator< 2 > > WrittenMask
Definition VulkanDescriptorSets.h:827
uint32 * DynamicOffsets
Definition VulkanDescriptorSets.h:804
void Reset()
Definition VulkanDescriptorSets.cpp:492
void SetWrittenBase(uint32 DescriptorIndex)
Definition VulkanDescriptorSets.cpp:508
void SetWritten(uint32 DescriptorIndex)
Definition VulkanDescriptorSets.cpp:500
FVulkanDescriptorSetWriter()
Definition VulkanDescriptorSets.h:503
void SetDescriptorSet(VkDescriptorSet DescriptorSet)
Definition VulkanDescriptorSets.h:638
bool bIsKeyDirty
Definition VulkanDescriptorSets.h:810
bool WriteImage(uint32 DescriptorIndex, const FVulkanView::FTextureView &TextureView, VkImageLayout Layout)
Definition VulkanDescriptorSets.h:572
bool WriteBufferView(uint32 DescriptorIndex, const FVulkanView::FTypedBufferView &View)
Definition VulkanDescriptorSets.h:764
FVulkanDSetKey Key
Definition VulkanDescriptorSets.h:809
bool WriteStorageImage(uint32 DescriptorIndex, const FVulkanView::FTextureView &TextureView, VkImageLayout Layout)
Definition VulkanDescriptorSets.h:582
bool WriteUniformBuffer(uint32 DescriptorIndex, VkBuffer BufferHandle, uint32 HandleId, VkDeviceSize Offset, VkDeviceSize Range)
Definition VulkanDescriptorSets.h:534
uint8 * BindingToDynamicOffsetMap
Definition VulkanDescriptorSets.h:801
uint32 NumWrites
Definition VulkanDescriptorSets.h:806
uint32 SetupDescriptorWrites(const TArray< VkDescriptorType > &Types, FVulkanHashableDescriptorInfo *InHashableDescriptorInfos, VkWriteDescriptorSet *InWriteDescriptors, VkDescriptorImageInfo *InImageInfo, VkDescriptorBufferInfo *InBufferInfo, uint8 *InBindingToDynamicOffsetMap, VkWriteDescriptorSetAccelerationStructureKHR *InAccelerationStructuresWriteDescriptors, VkAccelerationStructureKHR *InAccelerationStructures, const FVulkanSamplerState &DefaultSampler, const FVulkanView::FTextureView &DefaultImageView)
Definition VulkanDescriptorSets.cpp:348
const VkWriteDescriptorSet * GetWriteDescriptors() const
Definition VulkanDescriptorSets.h:524
bool WriteUniformTexelBuffer(uint32 DescriptorIndex, const FVulkanView::FTypedBufferView &View)
Definition VulkanDescriptorSets.h:597
void CheckAllWritten()
Definition VulkanDescriptorSets.cpp:421
bool WriteAccelerationStructure(uint32 DescriptorIndex, VkAccelerationStructureKHR InAccelerationStructure)
Definition VulkanDescriptorSets.h:603
Definition VulkanDescriptorSets.h:33
uint32 TypesUsageID
Definition VulkanDescriptorSets.h:222
TStaticArray< FStageInfo, ShaderStage::MaxNumStages > StageInfos
Definition VulkanDescriptorSets.h:214
TArray< FSetLayout > SetLayouts
Definition VulkanDescriptorSets.h:218
void FinalizeBindings(const FVulkanDevice &Device, const FUniformBufferGatherInfo &UBGatherInfo, const TArrayView< FRHISamplerState * > &ImmutableSamplers, bool bUsesBindless)
Definition VulkanDescriptorSets.cpp:20
uint32 GetTypesUsageID() const
Definition VulkanDescriptorSets.h:169
bool HasInputAttachments() const
Definition VulkanDescriptorSets.h:174
const TArray< FSetLayout > & GetLayouts() const
Definition VulkanDescriptorSets.h:100
TMap< VkDescriptorType, uint32 > LayoutTypes
Definition VulkanDescriptorSets.h:217
FVulkanDescriptorSetsLayoutInfo()
Definition VulkanDescriptorSets.h:35
uint32 Hash
Definition VulkanDescriptorSets.h:220
uint32 GetTypesUsed(VkDescriptorType Type) const
Definition VulkanDescriptorSets.h:46
VkPipelineBindPoint BindPoint
Definition VulkanDescriptorSets.h:224
bool operator==(const FVulkanDescriptorSetsLayoutInfo &In) const
Definition VulkanDescriptorSets.h:117
void AddDescriptor(int32 DescriptorSetIndex, const VkDescriptorSetLayoutBinding &Descriptor)
Definition VulkanDescriptorSets.cpp:113
void CompileTypesUsageID()
Definition VulkanDescriptorSets.cpp:197
friend uint32 GetTypeHash(const FVulkanDescriptorSetsLayoutInfo &In)
Definition VulkanDescriptorSets.h:112
const TMap< VkDescriptorType, uint32 > & GetLayoutTypes() const
Definition VulkanDescriptorSets.h:164
void GenerateHash(const TArrayView< FRHISamplerState * > &ImmutableSamplers, VkPipelineBindPoint InBindPoint)
Definition VulkanDescriptorSets.cpp:163
void CopyFrom(const FVulkanDescriptorSetsLayoutInfo &Info)
Definition VulkanDescriptorSets.h:155
void ProcessBindingsForStage(VkShaderStageFlagBits StageFlags, ShaderStage::EStage DescSetStage, const FVulkanShaderHeader &CodeHeader, FUniformBufferGatherInfo &OutUBGatherInfo) const
Definition VulkanDescriptorSets.cpp:14
Definition VulkanDescriptorSets.h:245
const VkDescriptorSetAllocateInfo & GetAllocateInfo() const
Definition VulkanDescriptorSets.h:263
const TArray< uint32 > & GetHandleIds() const
Definition VulkanDescriptorSets.h:258
const TArray< VkDescriptorSetLayout > & GetHandles() const
Definition VulkanDescriptorSets.h:253
uint32 GetHash() const
Definition VulkanDescriptorSets.h:268
~FVulkanDescriptorSetsLayout()
Definition VulkanDescriptorSets.cpp:234
Definition VulkanDevice.h:279
Definition VulkanDescriptorSets.h:839
~FVulkanGenericDescriptorPool()
Definition VulkanPendingState.cpp:908
void Reset()
Definition VulkanPendingState.cpp:919
uint32 GetMaxDescriptorSets() const
Definition VulkanDescriptorSets.h:849
bool AllocateDescriptorSet(VkDescriptorSetLayout Layout, VkDescriptorSet &OutSet)
Definition VulkanPendingState.cpp:925
FVulkanDevice * GetDevice() const
Definition VulkanDescriptorSets.h:844
Definition VulkanPipelineState.h:239
Definition VulkanLayout.h:10
Definition VulkanPipeline.h:492
Definition VulkanState.h:17
Definition VulkanDescriptorSets.h:328
void Reset()
Definition VulkanPendingState.cpp:207
bool AllocateDescriptorSets(const FVulkanDescriptorSetsLayout &Layout, VkDescriptorSet *OutSets)
Definition VulkanPendingState.cpp:184
~FVulkanTypedDescriptorPoolSet()
Definition VulkanPendingState.cpp:130
FVulkanTypedDescriptorPoolSet(FVulkanDevice *InDevice, const FVulkanDescriptorSetsLayout &InLayout)
Definition VulkanDescriptorSets.h:338
Definition ArrayView.h:139
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
UE_NODEBUG UE_FORCEINLINE_HINT SIZE_T NumBytes() const
Definition Array.h:1150
Definition VulkanUtil.h:144
void GenerateFromData(const void *InData, uint32 InSize)
Definition VulkanUtil.h:166
Definition List.h:824
Definition UnrealString.h.inl:34
Definition StaticArray.h:26
Definition UniquePtr.h:107
EStage
Definition VulkanCommon.h:35
@ MaxNumStages
Definition VulkanCommon.h:55
U16 Index
Definition radfft.cpp:71
static UE_FORCEINLINE_HINT uint32 MemCrc32(const void *Data, int32 Length, uint32 CRC=0)
Definition Crc.h:31
static UE_FORCEINLINE_HINT int32 Memcmp(const void *Buf1, const void *Buf2, SIZE_T Count)
Definition UnrealMemory.h:114
Definition VulkanDescriptorSets.h:26
const FVulkanShaderHeader * CodeHeaders[ShaderStage::MaxNumStages]
Definition VulkanDescriptorSets.h:27
Definition VulkanDescriptorSets.h:236
uint32 HandleId
Definition VulkanDescriptorSets.h:238
VkDescriptorSetLayout Handle
Definition VulkanDescriptorSets.h:237
Definition VulkanDescriptorSets.h:486
TArray< VkAccelerationStructureKHR > AccelerationStructures
Definition VulkanDescriptorSets.h:491
TArray< VkWriteDescriptorSetAccelerationStructureKHR > AccelerationStructureWrites
Definition VulkanDescriptorSets.h:492
TArray< VkWriteDescriptorSet > DescriptorWrites
Definition VulkanDescriptorSets.h:490
TArray< VkDescriptorImageInfo > DescriptorImageInfo
Definition VulkanDescriptorSets.h:488
TArray< FVulkanHashableDescriptorInfo > HashableDescriptorInfo
Definition VulkanDescriptorSets.h:487
TArray< uint8 > BindingToDynamicOffsetMap
Definition VulkanDescriptorSets.h:494
TArray< VkDescriptorBufferInfo > DescriptorBufferInfo
Definition VulkanDescriptorSets.h:489
Definition VulkanDescriptorSets.h:59
friend uint32 GetTypeHash(const FSetLayout &In)
Definition VulkanDescriptorSets.h:68
uint32 Hash
Definition VulkanDescriptorSets.h:61
bool operator==(const FSetLayout &In) const
Definition VulkanDescriptorSets.h:73
void GenerateHash()
Definition VulkanDescriptorSets.h:63
bool operator!=(const FSetLayout &In) const
Definition VulkanDescriptorSets.h:94
TArray< VkDescriptorSetLayoutBinding > LayoutBindings
Definition VulkanDescriptorSets.h:60
Definition VulkanDescriptorSets.h:180
uint16 NumAccelerationStructures
Definition VulkanDescriptorSets.h:186
bool IsEmpty() const
Definition VulkanDescriptorSets.h:188
uint16 NumImageInfos
Definition VulkanDescriptorSets.h:184
uint32 PackedGlobalsSize
Definition VulkanDescriptorSets.h:182
uint32 NumBoundUniformBuffers
Definition VulkanDescriptorSets.h:183
bool operator==(const FStageInfo &In) const
Definition VulkanDescriptorSets.h:198
TArray< VkDescriptorType > Types
Definition VulkanDescriptorSets.h:181
uint16 NumBufferInfos
Definition VulkanDescriptorSets.h:185
Definition VulkanShaderResources.h:20
Definition VulkanResources.h:448
uint32 Size
Definition VulkanResources.h:452
uint32 HandleId
Definition VulkanResources.h:450
VkBuffer Buffer
Definition VulkanResources.h:449
uint32 Offset
Definition VulkanResources.h:451
Definition VulkanResources.h:461
VkImageView View
Definition VulkanResources.h:462
uint32 ViewId
Definition VulkanResources.h:464
Definition VulkanResources.h:441
uint32 ViewId
Definition VulkanResources.h:443
bool bVolatile
Definition VulkanResources.h:444
VkBufferView View
Definition VulkanResources.h:442
Definition LightweightStats.h:416
Definition VulkanDescriptorSets.h:456
uint32 Max0
Definition VulkanDescriptorSets.h:459
uint32 Id
Definition VulkanDescriptorSets.h:465
uint32 ImageViewId
Definition VulkanDescriptorSets.h:472
uint32 Zero1
Definition VulkanDescriptorSets.h:478
uint32 ImageLayout
Definition VulkanDescriptorSets.h:473
uint32 LayoutId
Definition VulkanDescriptorSets.h:461
uint32 Range
Definition VulkanDescriptorSets.h:467
uint32 Max1
Definition VulkanDescriptorSets.h:460
struct FVulkanHashableDescriptorInfo::@2435 BufferView
uint32 Zero2
Definition VulkanDescriptorSets.h:479
uint32 SamplerId
Definition VulkanDescriptorSets.h:471
struct FVulkanHashableDescriptorInfo::@2434 Image
struct FVulkanHashableDescriptorInfo::@2432 Layout
uint32 Offset
Definition VulkanDescriptorSets.h:466
struct FVulkanHashableDescriptorInfo::@2433 Buffer