#ifndef __MLX_DESCRIPTOR_SET__ #define __MLX_DESCRIPTOR_SET__ #include #include #include namespace mlx { struct Descriptor { NonOwningPtr storage_buffer_ptr; NonOwningPtr uniform_buffer_ptr; NonOwningPtr image_ptr; VkDescriptorType type; ShaderType shader_type; std::uint32_t binding; }; class DescriptorPool { public: DescriptorPool() = default; void Init() noexcept; void Destroy() noexcept; VkDescriptorSet AllocateDescriptorSet(std::uint32_t frame_index, VkDescriptorSetLayout layout); void ResetPoolFromFrameIndex(std::size_t frame_index); [[nodiscard]] inline VkDescriptorPool Get(std::uint32_t index) const noexcept { return m_pools[index]; } [[nodiscard]] MLX_FORCEINLINE std::size_t GetNumberOfSetsAllocated() const noexcept { return m_allocation_count; } ~DescriptorPool() = default; private: std::array m_pools; std::size_t m_allocation_count = 0; }; class DescriptorPoolManager { public: DescriptorPoolManager() = default; void ResetPoolsFromFrameIndex(std::size_t frame_index); DescriptorPool& GetAvailablePool(); void Destroy(); ~DescriptorPoolManager() = default; private: std::list m_pools; }; class DescriptorSet { public: DescriptorSet() { m_set.fill(VK_NULL_HANDLE); } DescriptorSet(DescriptorPoolManager& pools_manager, const ShaderSetLayout& layout, VkDescriptorSetLayout vklayout, ShaderType shader_type); void SetImage(std::size_t i, std::uint32_t binding, class Image& image); void SetStorageBuffer(std::size_t i, std::uint32_t binding, class GPUBuffer& buffer); void SetUniformBuffer(std::size_t i, std::uint32_t binding, class GPUBuffer& buffer); void Update(std::size_t i, VkCommandBuffer cmd = VK_NULL_HANDLE) noexcept; void Reallocate(std::size_t frame_index) noexcept; [[nodiscard]] inline VkDescriptorSet GetSet(std::size_t i) const noexcept { return m_set[i]; } [[nodiscard]] inline DescriptorSet Duplicate() const { return DescriptorSet{ *p_pools_manager, m_set_layout, m_descriptors }; } [[nodiscard]] inline bool IsInit() const noexcept { return m_set[0] != VK_NULL_HANDLE; } ~DescriptorSet() = default; private: DescriptorSet(DescriptorPoolManager& pools_manager, VkDescriptorSetLayout layout, const std::vector& descriptors); private: std::vector m_descriptors; std::array m_set; VkDescriptorSetLayout m_set_layout; NonOwningPtr p_pools_manager; }; } #endif