diff options
author | tylermurphy534 <tylermurphy534@gmail.com> | 2022-09-18 21:20:51 -0400 |
---|---|---|
committer | tylermurphy534 <tylermurphy534@gmail.com> | 2022-09-18 21:20:51 -0400 |
commit | 8045b8ba04aae39a4cf9733e72413f648b6ebe2b (patch) | |
tree | f90a9bd50a2316d5077df99c9e8584afc76ed656 /engine/xe_descriptors.hpp | |
download | minecraftvulkan-8045b8ba04aae39a4cf9733e72413f648b6ebe2b.tar.gz minecraftvulkan-8045b8ba04aae39a4cf9733e72413f648b6ebe2b.tar.bz2 minecraftvulkan-8045b8ba04aae39a4cf9733e72413f648b6ebe2b.zip |
stanford dragon rendering
Diffstat (limited to 'engine/xe_descriptors.hpp')
-rw-r--r-- | engine/xe_descriptors.hpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/engine/xe_descriptors.hpp b/engine/xe_descriptors.hpp new file mode 100644 index 0000000..6e7950e --- /dev/null +++ b/engine/xe_descriptors.hpp @@ -0,0 +1,104 @@ +#pragma once + +#include "xe_device.hpp" + +// std +#include <memory> +#include <unordered_map> +#include <vector> + +namespace xe { + +class XeDescriptorSetLayout { + public: + class Builder { + public: + Builder(XeDevice &xeDevice) : xeDevice{xeDevice} {} + + Builder &addBinding( + uint32_t binding, + VkDescriptorType descriptorType, + VkShaderStageFlags stageFlags, + uint32_t count = 1); + std::unique_ptr<XeDescriptorSetLayout> build() const; + + private: + XeDevice &xeDevice; + std::unordered_map<uint32_t, VkDescriptorSetLayoutBinding> bindings{}; + }; + + XeDescriptorSetLayout( + XeDevice &xeDevice, std::unordered_map<uint32_t, VkDescriptorSetLayoutBinding> bindings); + ~XeDescriptorSetLayout(); + XeDescriptorSetLayout(const XeDescriptorSetLayout &) = delete; + XeDescriptorSetLayout &operator=(const XeDescriptorSetLayout &) = delete; + + VkDescriptorSetLayout getDescriptorSetLayout() const { return descriptorSetLayout; } + + private: + XeDevice &xeDevice; + VkDescriptorSetLayout descriptorSetLayout; + std::unordered_map<uint32_t, VkDescriptorSetLayoutBinding> bindings; + + friend class XeDescriptorWriter; +}; + +class XeDescriptorPool { + public: + class Builder { + public: + Builder(XeDevice &xeDevice) : xeDevice{xeDevice} {} + + Builder &addPoolSize(VkDescriptorType descriptorType, uint32_t count); + Builder &setPoolFlags(VkDescriptorPoolCreateFlags flags); + Builder &setMaxSets(uint32_t count); + std::unique_ptr<XeDescriptorPool> build() const; + + private: + XeDevice &xeDevice; + std::vector<VkDescriptorPoolSize> poolSizes{}; + uint32_t maxSets = 1000; + VkDescriptorPoolCreateFlags poolFlags = 0; + }; + + XeDescriptorPool( + XeDevice &xeDevice, + uint32_t maxSets, + VkDescriptorPoolCreateFlags poolFlags, + const std::vector<VkDescriptorPoolSize> &poolSizes); + ~XeDescriptorPool(); + XeDescriptorPool(const XeDescriptorPool &) = delete; + XeDescriptorPool &operator=(const XeDescriptorPool &) = delete; + + bool allocateDescriptor( + const VkDescriptorSetLayout descriptorSetLayout, VkDescriptorSet &descriptor) const; + + void freeDescriptors(std::vector<VkDescriptorSet> &descriptors) const; + + void resetPool(); + + private: + XeDevice &xeDevice; + VkDescriptorPool descriptorPool; + + friend class XeDescriptorWriter; +}; + +class XeDescriptorWriter { + public: + XeDescriptorWriter(XeDescriptorSetLayout &setLayout, XeDescriptorPool &pool); + + XeDescriptorWriter &writeBuffer(uint32_t binding, VkDescriptorBufferInfo *bufferInfo); + XeDescriptorWriter &writeImage(uint32_t binding, VkDescriptorImageInfo *imageInfo); + + bool build(VkDescriptorSet &set); + void overwrite(VkDescriptorSet &set); + + private: + XeDescriptorSetLayout &setLayout; + XeDescriptorPool &pool; + std::vector<VkWriteDescriptorSet> writes; +}; + +} + |