Blaze/Blaze/Source/BufferManager.h

93 lines
2.7 KiB
C++

#pragma once
#include <optional>
#include <span>
#include "FreeList.h"
#include "MacroUtils.h"
#include "RID.h"
#include "RenderDevice.h"
#include "VulkanHeader.h"
namespace Blaze
{
struct GlobalMemory;
struct RenderDevice;
struct Buffer
{
VkBuffer buffer;
VmaAllocation allocation;
std::byte* mappedData; // Assume the system has ReBAR/SAM enabled.
VkDeviceAddress deviceAddress;
size_t size;
uint32_t index;
};
static_assert( sizeof( Buffer ) > sizeof( Util::FreeList::Node ) and "Buffer is used intrusively by FreeList" );
static_assert(
offsetof( Buffer, index ) >= sizeof( Util::FreeList::Node ) and
"Index should not be overwritten even in invalid state" );
using BufferID = RID<Buffer>;
struct BufferManager
{
private:
constexpr static uint32_t kIndexMask = 0x0007FFFF;
constexpr static uint32_t kGenerationMask = ~kIndexMask;
constexpr static uint32_t kGenerationOffset = 19;
static_assert(
( ( kGenerationMask >> kGenerationOffset & 0x1 ) == 0x1 ) and
( ( kGenerationMask >> ( kGenerationOffset - 1 ) & 0x1 ) != 0x1 ) and "Checks boundary" );
RenderDevice* m_renderDevice;
// Buffer Manager
Buffer* m_buffers;
uint32_t m_count;
uint32_t m_capacity;
Util::FreeList m_freeList;
void DestroyBuffer( Buffer& buf );
Buffer& FetchBufferUnchecked( BufferID const& rid );
void WriteToBufferImpl( BufferID const& rid, void const* data, size_t size );
public:
[[nodiscard]] bool IsValidID( BufferID const& rid ) const;
BufferID CreateVertexBuffer( size_t size );
BufferID CreateIndexBuffer( size_t size );
BufferID CreateStorageBuffer( size_t size );
void FreeBuffer( BufferID* rid );
DEPRECATE_JULY_2025
std::optional<VkBuffer> FetchBuffer( BufferID const& rid );
std::optional<VkDeviceAddress> FetchDeviceAddress( BufferID const& rid );
// Utility to directly muck the data
void WriteToBuffer( BufferID const& rid, std::ranges::contiguous_range auto const& data )
{
WriteToBufferImpl(
rid,
std::ranges::data( data ),
std::ranges::size( data ) * sizeof( std::ranges::range_value_t<decltype( data )> ) );
}
static BufferManager* Create( GlobalMemory* mem, RenderDevice* render_device, uint32_t max_count );
void Destroy();
BufferManager( RenderDevice* render_device, Buffer* buffers, uint32_t capacity );
BufferManager( BufferManager const& other ) = delete;
BufferManager( BufferManager&& other ) noexcept = delete;
BufferManager& operator=( BufferManager const& other ) = delete;
BufferManager& operator=( BufferManager&& other ) noexcept = delete;
~BufferManager();
};
} // namespace Blaze