KarmaEngine
Game Engine for practical learning and research purposes
Loading...
Searching...
No Matches
VulkanDescriptorSets.h
Go to the documentation of this file.
1
9
10#pragma once
11
12#include "KarmaTypes.h"
13#include <vulkan/vulkan.h>
14
15namespace Karma
16{
17 class FVulkanDevice;
18
20 {
21 public:
32
33 void SetLayoutTypes(const KarmaVector<VkDescriptorType>& NeededDescriptorTypes)
34 {
35 for (const VkDescriptorType& type : NeededDescriptorTypes)
36 {
37 m_LayoutTypes.Add(type, 1);
38 }
39 }
40
49 inline uint32_t GetTypesUsed(VkDescriptorType Type) const
50 {
51 if (m_LayoutTypes.Contains(Type))
52 {
53 return m_LayoutTypes[Type];
54 }
55 else
56 {
57 return 0;
58 }
59 }
60
65 {
71 uint32_t m_Hash = 0;
72
79
80 inline void GenerateHash()
81 {
82 // Simple hash generation based on bindings
83 m_Hash = 0;
84 for (const auto& binding : m_LayoutBindings)
85 {
86 m_Hash ^= std::hash<uint32_t>()(binding.binding) ^
87 std::hash<uint32_t>()(binding.descriptorType) ^
88 std::hash<uint32_t>()(binding.descriptorCount) ^
89 std::hash<uint32_t>()(binding.stageFlags);
90 }
91 }
92
93 friend uint32_t GetTypeHash(const FSetLayout& Layout)
94 {
95 return Layout.m_Hash;
96 }
97
98 };
99
100 inline const KarmaVector<FSetLayout>& GetLayouts() const
101 {
102 return m_SetLayouts;
103 }
104
105 inline const KarmaMap<VkDescriptorType, uint32_t>& GetLayoutTypes() const
106 {
107 return m_LayoutTypes;
108 }
109
110 /*protected:*/
111 void AddDescriptor(int32_t DescriptorSetIndex, const VkDescriptorSetLayoutBinding& Descriptor);
112 void AddDescriptorSet(FSetLayout SetLayout);
113
114 protected:
119 KarmaVector<FSetLayout> m_SetLayouts;
120
121 uint32_t m_Hash = 0;
122 VkPipelineBindPoint m_BindPoint = VK_PIPELINE_BIND_POINT_MAX_ENUM;
123 };
124
125 class FVulkanDescriptorSetsLayout : public FVulkanDescriptorSetsLayoutInfo
126 {
127 public:
128 FVulkanDescriptorSetsLayout(FVulkanDevice* InDevice);
129 ~FVulkanDescriptorSetsLayout();
130
131 void Compile();
132
133 inline const KarmaVector<VkDescriptorSetLayout>& GetHandles() const
134 {
135 return m_LayoutHandles;
136 }
137
138 inline const KarmaVector<uint32_t>& GetHandleIds() const
139 {
140 return m_LayoutHandleIds;
141 }
142
143 inline const VkDescriptorSetAllocateInfo& GetAllocateInfo() const
144 {
145 return m_DescriptorSetsAllocateInfo;
146 }
147
148 inline uint32_t GetHash() const
149 {
150 return m_Hash;
151 }
152
153 private:
154 FVulkanDevice* m_Device;
156 KarmaVector<uint32_t> m_LayoutHandleIds;
157 VkDescriptorSetAllocateInfo m_DescriptorSetsAllocateInfo;
158 };
159
161 {
176
188 void UpdateUniformBufferDescriptorSet(class VulkanUniformBuffer* Uniform, uint32_t SetLayoutIndex, uint32_t DescriptorSetIndex, uint32_t FrameIndex);
189
200 void UpdateTextureDescriptorSet(class VulkanTexture* Texture, uint32_t SetLayoutIndex, uint32_t DescriptorSetIndex);
201
202 FVulkanDevice* m_Device;
204 };
205
206 class FVulkanDescriptorPool
207 {
208 public:
209 FVulkanDescriptorPool(FVulkanDevice* InDevice, const FVulkanDescriptorSetsLayout& InLayout/*, uint32_t MaxSetsAllocations*/);
210 ~FVulkanDescriptorPool();
211
218 inline VkDescriptorPool GetHandle() const
219 {
220 return m_DescriptorPool;
221 }
222
223
233
234 private:
235 FVulkanDevice* m_Device;
236 uint32_t m_MaxDescriptorSets;
237 const FVulkanDescriptorSetsLayout& m_Layout;
238 VkDescriptorPool m_DescriptorPool;
239 };
240
242 {
243 private:
244 FVulkanDevice* m_Device = nullptr;
245
246 };
247}
This file contains the custom types used in Engine's logic.
VkDescriptorPool GetHandle() const
Retrieves the Vulkan descriptor pool handle.
Definition VulkanDescriptorSets.h:218
void AllocateDescriptorSets(const FVulkanDescriptorSetsLayout &InLayout, FVulkanDescriptorSets &InDSets)
Allocates descriptor sets from the pool based on the provided allocation info.
Definition VulkanDescriptorSets.cpp:139
Definition VulkanDescriptorSets.h:242
Definition VulkanDescriptorSets.h:126
FVulkanDescriptorSetsLayoutInfo()
Constructor.
Definition VulkanDescriptorSets.h:29
uint32_t GetTypesUsed(VkDescriptorType Type) const
Returns the number of descriptors of a specific type used in the layout, across all descriptor sets.
Definition VulkanDescriptorSets.h:49
KarmaMap< VkDescriptorType, uint32_t > m_LayoutTypes
Map storing the count of each Vulkan descriptor type used in the layout.
Definition VulkanDescriptorSets.h:118
Manages Vulkan device resources and operations.
Definition VulkanDevice.h:33
Texture class.
Definition Texture.h:45
Vulkan specific implementation of Texture class.
Definition VulkanTexture.h:30
Karma's std::map wrapper.
Definition KarmaTypes.h:90
void Add(const KeyType &Key, const ValueType &Value)
Addes a key-value pair to the map.
Definition KarmaTypes.h:109
Karma's std::vector wrapper with additional functionalities.
Definition KarmaTypes.h:243
Definition VulkanDescriptorSets.h:161
FVulkanDescriptorSets(FVulkanDevice *InDevice, const FVulkanDescriptorSetsLayout &InLayout)
Constructor for FVulkanDescriptorSets.
Definition VulkanDescriptorSets.cpp:162
void UpdateUniformBufferDescriptorSet(class VulkanUniformBuffer *Uniform, uint32_t SetLayoutIndex, uint32_t DescriptorSetIndex, uint32_t FrameIndex)
Assigns an Engine's uniform buffer to a specific descriptor set of a specific layout.
Definition VulkanDescriptorSets.cpp:176
void UpdateTextureDescriptorSet(class VulkanTexture *Texture, uint32_t SetLayoutIndex, uint32_t DescriptorSetIndex)
Assigns an Engine's texture to a specific descriptor set of a specific layout.
Definition VulkanDescriptorSets.cpp:195
Structure representing a descriptor set layout.
Definition VulkanDescriptorSets.h:65
KarmaVector< VkDescriptorSetLayoutBinding > m_LayoutBindings
Layout bindings for this descriptor set, representing the individual descriptors and their configurat...
Definition VulkanDescriptorSets.h:70
uint32_t m_NumberOfDescriptorSets
The number of descriptor sets that use this layout. This is used for calculating the total number of ...
Definition VulkanDescriptorSets.h:78
The actual uniform buffer class with implemented function using Vulkan API.
Definition VulkanBuffer.h:266