optimized VKArrayBuffer

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-03-28 22:24:22 +08:00
parent 05e96c58ba
commit 59b02bcb8c
4 changed files with 33 additions and 25 deletions

View File

@ -23,11 +23,10 @@ namespace hgl
VkBufferUsageFlags buffer_usage_flags; VkBufferUsageFlags buffer_usage_flags;
uint item_length; ///<单个数据长度 uint item_length; ///<单个数据长度
uint unit_size;
VKMemoryAllocator *vk_ma; VKMemoryAllocator *vk_ma;
uint32_t offset_alignment;
Collection *coll; Collection *coll;
protected: protected:
@ -35,13 +34,17 @@ namespace hgl
void * Map(const uint32 start,const uint32 count); void * Map(const uint32 start,const uint32 count);
void Flush(const uint32 count); void Flush(const uint32 count);
private:
GPUArrayBuffer(GPUDevice *dev,const VkBufferUsageFlags &flag,const uint il,const uint us);
friend class GPUDevice;
public: public:
GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il,VkDescriptorType dt);
virtual ~GPUArrayBuffer(); virtual ~GPUArrayBuffer();
const uint32_t GetOffsetAlignment()const{return offset_alignment;} const uint32_t GetUnitSize()const{return unit_size;}
const uint32_t GetUnitSize()const;
DeviceBuffer * GetBuffer(); DeviceBuffer * GetBuffer();
uint32 Alloc(const uint32 max_count); ///<预分配空间 uint32 Alloc(const uint32 max_count); ///<预分配空间
@ -56,7 +59,7 @@ namespace hgl
if(!ptr)return(false); if(!ptr)return(false);
ubo_access->Start((uchar *)ptr,offset_alignment,count); ubo_access->Start((uchar *)ptr,start,count);
return(true); return(true);
} }

View File

@ -22,6 +22,7 @@ VK_NAMESPACE_BEGIN
class TileData; class TileData;
class TileFont; class TileFont;
class FontSource; class FontSource;
class GPUArrayBuffer;
/* /*
* GPU设备创建信息 * GPU设备创建信息
@ -148,6 +149,9 @@ public: //Buffer相关
#undef CREATE_BUFFER_OBJECT #undef CREATE_BUFFER_OBJECT
GPUArrayBuffer *CreateUBO(const VkDeviceSize &uint_size);
GPUArrayBuffer *CreateSSBO(const VkDeviceSize &uint_size);
public: //Image public: //Image
VkImage CreateImage (VkImageCreateInfo *); VkImage CreateImage (VkImageCreateInfo *);

View File

@ -25,7 +25,7 @@ public:
const uint32_t GetBufferUsageFlagBits ()const{return buffer_usage_flag_bits;} const uint32_t GetBufferUsageFlagBits ()const{return buffer_usage_flag_bits;}
DeviceBuffer * GetBuffer (){return gpu_buffer;} DeviceBuffer * GetBuffer (){return gpu_buffer;}
public: public:

View File

@ -8,23 +8,13 @@ namespace hgl
{ {
namespace graph namespace graph
{ {
GPUArrayBuffer::GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il,VkDescriptorType dt) GPUArrayBuffer::GPUArrayBuffer(GPUDevice *dev,const VkBufferUsageFlags &flag,const uint il,const uint us)
{ {
device=dev; device=dev;
buffer_usage_flags=flags;
item_length=il; item_length=il;
buffer_usage_flags=flag;
if(dt==VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER unit_size=hgl_align<VkDeviceSize>(item_length,us);
||dt==VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC)
offset_alignment=device->GetUBOAlign();
else
if(dt==VK_DESCRIPTOR_TYPE_STORAGE_BUFFER
||dt==VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)
offset_alignment=device->GetSSBOAlign();
else
offset_alignment=0;
const uint32_t unit_size=hgl_align<uint32_t>(item_length,offset_alignment);
vk_ma=new VKMemoryAllocator(device,buffer_usage_flags,unit_size); // construct function is going to set AllocUnitSize by minUniformOffsetAlignment vk_ma=new VKMemoryAllocator(device,buffer_usage_flags,unit_size); // construct function is going to set AllocUnitSize by minUniformOffsetAlignment
MemoryBlock *mb=new MemoryBlock(vk_ma); MemoryBlock *mb=new MemoryBlock(vk_ma);
@ -37,11 +27,6 @@ namespace hgl
delete coll; delete coll;
} }
const uint32_t GPUArrayBuffer::GetUnitSize()const
{
return coll->GetUnitBytes();
}
DeviceBuffer *GPUArrayBuffer::GetBuffer() DeviceBuffer *GPUArrayBuffer::GetBuffer()
{ {
return vk_ma->GetBuffer(); return vk_ma->GetBuffer();
@ -69,5 +54,21 @@ namespace hgl
{ {
vk_ma->Flush(count*GetUnitSize()); vk_ma->Flush(count*GetUnitSize());
} }
GPUArrayBuffer *GPUDevice::CreateUBO(const VkDeviceSize &uint_size)
{
return(new GPUArrayBuffer( this,
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
uint_size,
GetUBOAlign()));
}
GPUArrayBuffer *GPUDevice::CreateSSBO(const VkDeviceSize &uint_size)
{
return(new GPUArrayBuffer( this,
VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
uint_size,
GetSSBOAlign()));
}
}//namespace graph }//namespace graph
}//namespace hgl }//namespace hgl