#pragma once #include "xe_device.hpp" // std #include #include #include namespace xe { class DescriptorSetLayout { public: class Builder { public: Builder(Device &xeDevice) : xeDevice{xeDevice} {} Builder &addBinding( uint32_t binding, VkDescriptorType descriptorType, VkShaderStageFlags stageFlags, VkSampler *sampler); std::unique_ptr build() const; private: Device &xeDevice; std::unordered_map bindings{}; }; DescriptorSetLayout( Device &xeDevice, std::unordered_map bindings); ~DescriptorSetLayout(); DescriptorSetLayout(const DescriptorSetLayout &) = delete; DescriptorSetLayout &operator=(const DescriptorSetLayout &) = delete; VkDescriptorSetLayout getDescriptorSetLayout() const { return descriptorSetLayout; } private: Device &xeDevice; VkDescriptorSetLayout descriptorSetLayout; std::unordered_map bindings; friend class DescriptorWriter; }; class DescriptorPool { public: class Builder { public: Builder(Device &xeDevice) : xeDevice{xeDevice} {} Builder &addPoolSize(VkDescriptorType descriptorType, uint32_t count); Builder &setPoolFlags(VkDescriptorPoolCreateFlags flags); Builder &setMaxSets(uint32_t count); std::unique_ptr build() const; private: Device &xeDevice; std::vector poolSizes{}; uint32_t maxSets = 1000; VkDescriptorPoolCreateFlags poolFlags = 0; }; DescriptorPool( Device &xeDevice, uint32_t maxSets, VkDescriptorPoolCreateFlags poolFlags, const std::vector &poolSizes); ~DescriptorPool(); DescriptorPool(const DescriptorPool &) = delete; DescriptorPool &operator=(const DescriptorPool &) = delete; bool allocateDescriptor( const VkDescriptorSetLayout descriptorSetLayout, VkDescriptorSet &descriptor) const; void freeDescriptors(std::vector &descriptors) const; void resetPool(); private: Device &xeDevice; VkDescriptorPool descriptorPool; friend class DescriptorWriter; }; class DescriptorWriter { public: DescriptorWriter(DescriptorSetLayout &setLayout, DescriptorPool &pool); DescriptorWriter &writeBuffer(uint32_t binding, VkDescriptorBufferInfo *bufferInfo); DescriptorWriter &writeImage(uint32_t binding, VkDescriptorImageInfo *imageInfo); bool build(VkDescriptorSet &set); void overwrite(VkDescriptorSet &set); private: DescriptorSetLayout &setLayout; DescriptorPool &pool; std::vector writes; }; }