93 lines
2.7 KiB
C++
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
|