Files
FGL-Engine/src/engine/descriptors/DescriptorPool.cpp
2025-09-27 14:44:46 -04:00

73 lines
2.3 KiB
C++

//
// Created by kj16609 on 12/14/23.
//
#include "DescriptorPool.hpp"
#include "engine/rendering/devices/Device.hpp"
namespace fgl::engine::descriptors
{
static const std::unordered_map< vk::DescriptorType, float > DESCRIPTOR_ALLOCATION_RATIOS {
{ vk::DescriptorType::eUniformBuffer, 1.0f },
{ vk::DescriptorType::eCombinedImageSampler, 2.0f },
{ vk::DescriptorType::eStorageBuffer, 1.0f },
{ vk::DescriptorType::eInputAttachment, 0.5f },
{ vk::DescriptorType::eSampledImage, 2.0f }
};
vk::raii::DescriptorPool createPool( const std::uint32_t set_count )
{
std::vector< vk::DescriptorPoolSize > pool_sizes {};
for ( auto& [ type, ratio ] : DESCRIPTOR_ALLOCATION_RATIOS )
{
pool_sizes.emplace_back( type, static_cast< std::uint32_t >( static_cast< float >( set_count ) * ratio ) );
}
vk::DescriptorPoolCreateInfo pool_info {};
pool_info.setPoolSizeCount( static_cast< std::uint32_t >( pool_sizes.size() ) );
pool_info.setPPoolSizes( pool_sizes.data() );
pool_info.setMaxSets( set_count );
pool_info.setFlags(
vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet | vk::DescriptorPoolCreateFlagBits::eUpdateAfterBind );
return Device::getInstance()->createDescriptorPool( pool_info );
}
DescriptorPool::DescriptorPool( const std::uint32_t set_count ) : m_pool( createPool( set_count ) )
{}
[[nodiscard]] vk::raii::DescriptorSet DescriptorPool::allocateSet( const vk::raii::DescriptorSetLayout& layout )
const
{
vk::DescriptorSetAllocateInfo alloc_info {};
alloc_info.setDescriptorPool( m_pool );
alloc_info.setDescriptorSetCount( 1 );
alloc_info.setPSetLayouts( &( *layout ) );
std::vector< vk::raii::DescriptorSet > sets { Device::getInstance()->allocateDescriptorSets( alloc_info ) };
assert( sets.size() == 1 );
vk::raii::DescriptorSet set { std::move( sets[ 0 ] ) };
return set;
}
static std::unique_ptr< DescriptorPool > s_pool { nullptr };
DescriptorPool& DescriptorPool::init()
{
assert( !s_pool && "Descriptor pool already initialized" );
s_pool = std::unique_ptr< DescriptorPool >( new DescriptorPool( 1000 ) );
return *s_pool;
}
[[nodiscard]] DescriptorPool& DescriptorPool::getInstance()
{
assert( s_pool && "Descriptor pool not initialized" );
return *s_pool;
}
} // namespace fgl::engine::descriptors