engine/engine/inc/uf/ext/vulkan/buffer.h

82 lines
2.7 KiB
C++

#pragma once
#include <uf/ext/vulkan/vk.h>
#include <uf/utils/memory/vector.h>
namespace ext {
namespace vulkan {
struct Device;
struct UF_API Buffer {
bool aliased = false;
ext::vulkan::Device* device = NULL;
VkBuffer buffer = VK_NULL_HANDLE;
VkDeviceMemory memory = VK_NULL_HANDLE;
VkDescriptorBufferInfo descriptor = {
VK_NULL_HANDLE,
0,
0
};
VkDeviceSize alignment = 0;
size_t address = {};
void* mapped = nullptr;
VkBufferUsageFlags usage = 0;
VkMemoryPropertyFlags memoryProperties = 0;
VmaAllocation allocation = {};
VmaAllocationInfo allocationInfo = {};
void* map( VkDeviceSize size = VK_WHOLE_SIZE, VkDeviceSize offset = 0 );
void unmap();
// void* map( VkDeviceSize size = VK_WHOLE_SIZE, VkDeviceSize offset = 0 ) const;
// void unmap() const;
// VkResult bind( VkDeviceSize offset = 0 );
// void copyTo( void* data, VkDeviceSize size );
// VkResult flush( VkDeviceSize size = VK_WHOLE_SIZE, VkDeviceSize offset = 0 ) const;
// VkResult invalidate( VkDeviceSize size = VK_WHOLE_SIZE, VkDeviceSize offset = 0 );
void updateDescriptor( VkDeviceSize size = VK_WHOLE_SIZE, VkDeviceSize offset = 0 );
void allocate( VkBufferCreateInfo );
uint64_t getAddress();
uint64_t getAddress() const;
// RAII
~Buffer();
void initialize( ext::vulkan::Device& device, size_t = {} );
void initialize( const void*, VkDeviceSize, VkBufferUsageFlags, VkMemoryPropertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, bool = VK_DEFAULT_STAGE_BUFFERS );
bool update( const void*, VkDeviceSize, bool = VK_DEFAULT_STAGE_BUFFERS ) const;
void destroy(bool = VK_DEFAULT_DEFER_BUFFER_DESTROY);
void swap( Buffer& );
Buffer alias() const;
void aliasBuffer( const Buffer& );
};
struct UF_API Buffers {
size_t requestedAlignment{};
uf::stl::vector<Buffer> buffers;
Device* device = NULL;
// ~Buffers();
//
void initialize( Device& device );
void destroy();
//
size_t initializeBuffer( const void*, VkDeviceSize, VkBufferUsageFlags, VkMemoryPropertyFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, bool = VK_DEFAULT_STAGE_BUFFERS );
bool updateBuffer( const void*, VkDeviceSize, const Buffer&, bool = VK_DEFAULT_STAGE_BUFFERS ) const;
inline bool updateBuffer( const void* data, VkDeviceSize length, size_t index = 0, bool stage = VK_DEFAULT_STAGE_BUFFERS ) const { return updateBuffer( data, length, buffers.at(index), stage ); }
};
struct AccelerationStructure {
VkAccelerationStructureKHR handle{VK_NULL_HANDLE};
size_t deviceAddress{};
Buffer buffer{};
size_t instanceID{};
bool aliased = false;
};
}
}