#pragma once #include #include #include #include "vulkan_buffer.h" #include "vulkan_common.h" #include "vulkan_descriptor_set.h" namespace progressia::desktop { template class Uniform : public DescriptorSetInterface { private: constexpr static uint32_t POOL_SIZE = 64; std::vector pools; struct StateImpl { struct Set { VkDescriptorSet vk; Buffer contents; Set(VkDescriptorSet, Vulkan &); }; std::array, MAX_FRAMES_IN_FLIGHT> sets; std::array newContents; uint64_t setsToUpdate; StateImpl(const std::array &vks, Vulkan &); }; std::vector> states; uint32_t lastPoolCapacity; void allocatePool(); public: class State { private: std::size_t id; public: Uniform *uniform; private: friend class Uniform; State(std::size_t id, Uniform *); void doUpdate(); public: State(); void update(const Entries &...entries); void bind(); }; Uniform(uint32_t setNumber, Vulkan &); ~Uniform(); State addState(); void doUpdates(); }; } // namespace progressia::desktop #include "vulkan_uniform.inl"