// ============================================= // Aster: pipeline_utils.h // Copyright (c) 2020-2024 Anish Bhobe // ============================================= #pragma once #include "global.h" #include #include struct Device; struct Texture; struct UniformStorageBuffer; struct RenderResourceManager; struct Handle { u32 m_Index; }; struct BufferHandle : Handle { }; struct TextureHandle : Handle { }; struct FreeList { eastl::stack> m_List; u32 m_MaxVisited = 0; u32 m_MaxCapacity = 16; void Init(u32 maxCapacity) { m_MaxCapacity = maxCapacity; } [[nodiscard]] u32 Alloc() { if (!m_List.empty()) { const u32 value = m_List.top(); m_List.pop(); return value; } if (m_MaxVisited < m_MaxCapacity) { return m_MaxVisited++; } ERROR("Out of Handles.") THEN_ABORT(-1); } void Free(u32 index) { WARN_IF(index >= m_MaxCapacity, "Trying to free an out-of-bounds index."); if (index < m_MaxCapacity) m_List.push(index); } }; struct RenderResourceManager { private: union WriteInfo { vk::DescriptorBufferInfo uBufferInfo; vk::DescriptorImageInfo uImageInfo; vk::BufferView uBufferView; explicit WriteInfo(vk::DescriptorBufferInfo info); explicit WriteInfo(vk::DescriptorImageInfo info); explicit WriteInfo(vk::BufferView info); }; eastl::deque m_WriteInfos; eastl::vector m_Writes; vk::Sampler m_Sampler; FreeList m_BufferFreeList; FreeList m_TextureFreeList; public: const Device *m_Device; constexpr static u32 BUFFER_BINDING_INDEX = 0; constexpr static u32 TEXTURE_BINDING_INDEX = 1; vk::DescriptorPool m_DescriptorPool; vk::DescriptorSetLayout m_SetLayout; vk::DescriptorSet m_DescriptorSet; BufferHandle Commit(const UniformStorageBuffer *storageBuffer); TextureHandle Commit(const Texture *texture); void Update(); // Ctor/Dtor explicit RenderResourceManager(const Device *device, u16 maxSize); ~RenderResourceManager(); };