1616#include < engine/graphics/utilities/initializers.h>
1717#include < engine/graphics/utilities/translator.h>
1818#include < unordered_map>
19+ #include < variant>
1920
2021VULKAN_ENGINE_NAMESPACE_BEGIN
2122
2223namespace Graphics {
2324
25+ using BoundResource = std::variant<VkImageView, VkBuffer, VkAccelerationStructureKHR>;
26+
2427struct DescriptorSet {
25- VkDescriptorSet handle{};
2628
27- std::vector<Buffer*> binded_buffers;
28- uint32_t layoutID;
29- uint32_t bindings;
30- bool isDynamic;
31- bool allocated{false };
29+ VkDescriptorSet handle = VK_NULL_HANDLE;
30+ VkDevice device = VK_NULL_HANDLE;
31+ uint32_t layoutID;
32+ std::unordered_map<uint32_t , BoundResource> boundSlots;
33+
34+ bool isArrayed = false ;
35+ std::unordered_map<uint32_t , BoundResource> boundArraySlots; // Resource per array slot (if arrayed)
36+
37+ /*
38+ Update for Uniform Buffers
39+ */
40+ void update (Buffer* buffer, size_t dataSize, size_t readOffset, UniformDataType type, uint32_t binding);
41+ /*
42+ Update for Images
43+ */
44+ void update (Image* image, ImageLayout layout, uint32_t binding, UniformDataType type = UNIFORM_COMBINED_IMAGE_SAMPLER, uint32_t arraySlot = 0 );
45+ /*
46+ Update for Image Array
47+ */
48+ void update (std::vector<Image>& images, ImageLayout layout, uint32_t binding, UniformDataType type = UNIFORM_COMBINED_IMAGE_SAMPLER);
49+ /*
50+ Update for Acceleration Structures
51+ */
52+ void update (TLAS* accel, uint32_t binding);
3253};
3354
3455struct LayoutBinding {
@@ -40,49 +61,32 @@ struct LayoutBinding {
4061 }
4162};
4263
64+ struct DescriptorLayout {
65+ VkDescriptorSetLayout handle = VK_NULL_HANDLE;
66+ VkDevice device = VK_NULL_HANDLE;
67+
68+ std::vector<LayoutBinding> bindings;
69+
70+ void cleanup ();
71+ };
72+
4373struct DescriptorPool {
44- VkDescriptorPool handle = VK_NULL_HANDLE;
45- VkDevice device = VK_NULL_HANDLE;
46- std::unordered_map<uint32_t , VkDescriptorSetLayout > layouts;
74+ VkDescriptorPool handle = VK_NULL_HANDLE;
75+ VkDevice device = VK_NULL_HANDLE;
76+ std::unordered_map<uint32_t , DescriptorLayout > layouts;
4777
4878 void set_layout (uint32_t layoutSetIndex,
4979 std::vector<LayoutBinding> bindings,
5080 VkDescriptorSetLayoutCreateFlags flags = 0 ,
5181 VkDescriptorBindingFlagsEXT extFlags = 0 );
5282
53- inline VkDescriptorSetLayout get_layout (uint32_t layoutSetIndex) {
83+ inline DescriptorLayout get_layout (uint32_t layoutSetIndex) {
5484 return layouts[layoutSetIndex];
5585 }
5686
5787 void allocate_descriptor_set (uint32_t layoutSetIndex, DescriptorSet* descriptor);
5888 void allocate_variable_descriptor_set (uint32_t layoutSetIndex, DescriptorSet* descriptor, uint32_t count);
5989
60- /*
61- Set writes for Uniform Buffers
62- */
63- void update_descriptor (Buffer* buffer, size_t dataSize, size_t readOffset, DescriptorSet* descriptor, UniformDataType type, uint32_t binding);
64- /*
65- Set writes for Images
66- */
67- void update_descriptor (Image* image,
68- ImageLayout layout,
69- DescriptorSet* descriptor,
70- uint32_t binding,
71- UniformDataType type = UNIFORM_COMBINED_IMAGE_SAMPLER,
72- uint32_t arraySlot = 0 );
73- /*
74- Set writes for Image Array
75- */
76- void update_descriptor (std::vector<Image>& images,
77- ImageLayout layout,
78- DescriptorSet* descriptor,
79- uint32_t binding,
80- UniformDataType type = UNIFORM_COMBINED_IMAGE_SAMPLER);
81- /*
82- Set writes for Acceleration Structures
83- */
84- void update_descriptor (TLAS* accel, DescriptorSet* descriptor, uint32_t binding);
85-
8690 void cleanup ();
8791};
8892/*
0 commit comments