Skip to content

Commit

Permalink
Buffers: Fixed vertex buffers pools alignment.
Browse files Browse the repository at this point in the history
  • Loading branch information
DragonJoker committed May 1, 2024
1 parent 174afe6 commit 7c3ed7c
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 16 deletions.
7 changes: 5 additions & 2 deletions include/Core/Castor3D/Buffer/ObjectBufferPool.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,16 +69,19 @@ namespace castor3d
*\brief Libère un tampon GPU.
*\param[in] bufferOffset Le tampon à libérer.
*/
C3D_API void putBuffer( ObjectBufferOffset const & bufferOffset )noexcept;
template< typename VertexT >
void putBuffer( ObjectBufferOffset const & bufferOffset )noexcept;

private:
C3D_API BufferArray::iterator doFindBuffer( VkDeviceSize size
, BufferArray & array )const;
C3D_API castor::Vector< castor::Pair< size_t, BufferArray > >::iterator doInsertBuffers( size_t align );
C3D_API castor::Vector< castor::Pair< size_t, BufferArray > >::const_iterator doFindBuffers( size_t align )const;

private:
RenderDevice const & m_device;
castor::String m_debugName;
BufferArray m_buffers;
castor::Vector < castor::Pair< size_t, BufferArray > > m_buffers;
};

class IndexBufferPool
Expand Down
30 changes: 23 additions & 7 deletions include/Core/Castor3D/Buffer/ObjectBufferPool.inl
Original file line number Diff line number Diff line change
Expand Up @@ -64,26 +64,42 @@ namespace castor3d
{
ObjectBufferOffset result;
auto size = VkDeviceSize( vertexCount * sizeof( VertexT ) );
auto it = doFindBuffer( size, m_buffers );
auto ait = doInsertBuffers( sizeof( VertexT ) );
auto it = doFindBuffer( size, ait->second );

if ( it == m_buffers.end() )
if ( it == ait->second.end() )
{
ModelBuffers buffers{ details::createBaseBuffer< uint8_t >( m_device
, std::max( size, VkDeviceSize( 65536U ) )
, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT
, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
, m_debugName + cuT( "Vertex" ) + castor::string::toString( m_buffers.size() )
, uint32_t( m_device.properties.limits.minMemoryMapAlignment ) ) };
m_buffers.emplace_back( castor::move( buffers ) );
it = std::next( m_buffers.begin()
, ptrdiff_t( m_buffers.size() - 1u ) );
, m_debugName + cuT( "Vertex" ) + castor::string::toString( ait->second.size() )
, uint32_t( ait->first ) ) };
ait->second.emplace_back( castor::move( buffers ) );
it = std::next( ait->second.begin()
, ptrdiff_t( ait->second.size() - 1u ) );
}

result.buffers[uint32_t( SubmeshData::ePositions )].buffer = it->vertex.get();
result.buffers[uint32_t( SubmeshData::ePositions )].chunk = it->vertex->allocate( size );
return result;
}

template< typename VertexT >
void VertexBufferPool::putBuffer( ObjectBufferOffset const & bufferOffset )noexcept
{
auto ait = doFindBuffers( sizeof( VertexT ) );
CU_Require( ait != m_buffers.end() );
auto it = std::find_if( ait->second.begin()
, ait->second.end()
, [&bufferOffset]( ModelBuffers const & lookup )
{
return &lookup.vertex->getBuffer() == &bufferOffset.getBuffer( SubmeshData::ePositions );
} );
CU_Require( it != ait->second.end() );
it->vertex->deallocate( bufferOffset.buffers[uint32_t( SubmeshData::ePositions )].chunk );
}

//*********************************************************************************************

template< typename IndexT >
Expand Down
30 changes: 25 additions & 5 deletions source/Core/Castor3D/Buffer/ObjectBufferPool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
#include <ashespp/Core/Device.hpp>
#include <ashespp/Sync/Fence.hpp>

#include <numeric>

CU_ImplementSmartPtr( castor3d, IndexBufferPool )
CU_ImplementSmartPtr( castor3d, VertexBufferPool )
CU_ImplementSmartPtr( castor3d, ObjectBufferPool )
Expand Down Expand Up @@ -111,16 +113,34 @@ namespace castor3d
m_buffers.clear();
}

void VertexBufferPool::putBuffer( ObjectBufferOffset const & bufferOffset )noexcept
castor::Vector< castor::Pair< size_t, VertexBufferPool::BufferArray > >::iterator VertexBufferPool::doInsertBuffers( size_t align )
{
align = std::lcm( align, m_device.properties.limits.minMemoryMapAlignment );
auto it = std::find_if( m_buffers.begin()
, m_buffers.end()
, [&bufferOffset]( ModelBuffers const & lookup )
, [align]( castor::Pair< size_t, VertexBufferPool::BufferArray > const & lookup )
{
return &lookup.vertex->getBuffer() == &bufferOffset.getBuffer( SubmeshData::ePositions );
return align == lookup.first;
} );

if ( it == m_buffers.end() )
{
m_buffers.emplace_back( align, BufferArray{} );
it = std::next( m_buffers.begin(), ptrdiff_t( m_buffers.size() - 1u ) );
}

return it;
}

castor::Vector< castor::Pair< size_t, VertexBufferPool::BufferArray > >::const_iterator VertexBufferPool::doFindBuffers( size_t align )const
{
align = std::lcm( align, m_device.properties.limits.minMemoryMapAlignment );
return std::find_if( m_buffers.begin()
, m_buffers.end()
, [align]( castor::Pair< size_t, VertexBufferPool::BufferArray > const & lookup )
{
return align == lookup.first;
} );
CU_Require( it != m_buffers.end() );
it->vertex->deallocate( bufferOffset.buffers[uint32_t( SubmeshData::ePositions )].chunk );
}

VertexBufferPool::BufferArray::iterator VertexBufferPool::doFindBuffer( VkDeviceSize size
Expand Down
2 changes: 1 addition & 1 deletion source/Core/Castor3D/Render/Debug/DebugDrawer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ namespace castor3d
DebugDrawer::FramePass::~FramePass()noexcept
{
m_device.indexPools->putBuffer( m_aabb.indices );
m_device.vertexPools->putBuffer( m_aabb.vertices );
m_device.vertexPools->putBuffer< castor::Point4f >( m_aabb.vertices );
}

void DebugDrawer::FramePass::addAabbs( ashes::VkDescriptorSetLayoutBindingArray const & bindings
Expand Down
2 changes: 1 addition & 1 deletion source/Core/Castor3D/Scene/BillboardList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ namespace castor3d
if ( m_initialised )
{
m_initialised = false;
device.vertexPools->putBuffer( m_bufferOffsets );
device.vertexPools->putBuffer< Quad >( m_bufferOffsets );
m_bufferOffsets.reset();
m_geometryBuffers.buffers.clear();
m_geometryBuffers.offsets.clear();
Expand Down

0 comments on commit 7c3ed7c

Please sign in to comment.