2021-03-25 20:00:19 +08:00
|
|
|
|
#include<hgl/graph/VKArrayBuffer.h>
|
2023-03-24 20:39:02 +08:00
|
|
|
|
#include<hgl/graph/VKMemoryAllocator.h>
|
|
|
|
|
#include<hgl/type/Collection.h>
|
|
|
|
|
#include<hgl/graph/VKBuffer.h>
|
|
|
|
|
#include<hgl/graph/VKDevice.h>
|
2021-02-10 18:53:07 +08:00
|
|
|
|
|
|
|
|
|
namespace hgl
|
|
|
|
|
{
|
|
|
|
|
namespace graph
|
|
|
|
|
{
|
2023-03-24 22:14:05 +08:00
|
|
|
|
GPUArrayBuffer::GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags,const uint il,VkDescriptorType dt)
|
2021-02-10 18:53:07 +08:00
|
|
|
|
{
|
2023-03-24 20:39:02 +08:00
|
|
|
|
device=dev;
|
|
|
|
|
buffer_usage_flags=flags;
|
|
|
|
|
item_length=il;
|
2021-03-25 20:00:19 +08:00
|
|
|
|
|
2023-03-24 22:14:05 +08:00
|
|
|
|
if(dt==VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER
|
|
|
|
|
||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;
|
2021-02-10 18:53:07 +08:00
|
|
|
|
|
2023-03-24 22:14:05 +08:00
|
|
|
|
const uint32_t unit_size=hgl_align<uint32_t>(item_length,offset_alignment);
|
2023-03-24 20:39:02 +08:00
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
coll=new Collection(unit_size,mb);
|
2021-02-10 18:53:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GPUArrayBuffer::~GPUArrayBuffer()
|
|
|
|
|
{
|
2023-03-24 20:39:02 +08:00
|
|
|
|
delete coll;
|
2021-02-10 18:53:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-24 20:39:02 +08:00
|
|
|
|
const uint32_t GPUArrayBuffer::GetUnitSize()const
|
2021-02-10 18:53:07 +08:00
|
|
|
|
{
|
2023-03-24 20:39:02 +08:00
|
|
|
|
return coll->GetUnitBytes();
|
2021-02-10 18:53:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-24 20:39:02 +08:00
|
|
|
|
DeviceBuffer *GPUArrayBuffer::GetBuffer()
|
2021-03-25 20:00:19 +08:00
|
|
|
|
{
|
2023-03-24 20:39:02 +08:00
|
|
|
|
return vk_ma->GetBuffer();
|
|
|
|
|
}
|
2021-03-25 20:00:19 +08:00
|
|
|
|
|
2023-03-24 20:39:02 +08:00
|
|
|
|
uint32 GPUArrayBuffer::Alloc(const uint32 max_count) ///<预分配空间
|
|
|
|
|
{
|
|
|
|
|
if(!coll->Alloc(max_count))
|
|
|
|
|
return(0);
|
2021-03-25 20:00:19 +08:00
|
|
|
|
|
2023-03-24 20:39:02 +08:00
|
|
|
|
return coll->GetAllocCount();
|
|
|
|
|
}
|
2021-02-10 18:53:07 +08:00
|
|
|
|
|
2023-03-24 20:39:02 +08:00
|
|
|
|
void GPUArrayBuffer::Clear()
|
|
|
|
|
{
|
|
|
|
|
coll->Clear();
|
|
|
|
|
}
|
2021-03-25 20:00:19 +08:00
|
|
|
|
|
2023-03-24 20:39:02 +08:00
|
|
|
|
void *GPUArrayBuffer::Map(const uint32 start,const uint32 count)
|
|
|
|
|
{
|
|
|
|
|
return coll->Map(start,count);
|
|
|
|
|
}
|
2021-03-25 20:00:19 +08:00
|
|
|
|
|
2023-03-24 20:39:02 +08:00
|
|
|
|
void GPUArrayBuffer::Flush(const uint32 count)
|
|
|
|
|
{
|
|
|
|
|
vk_ma->Flush(count*GetUnitSize());
|
2021-03-25 20:00:19 +08:00
|
|
|
|
}
|
2021-02-10 18:53:07 +08:00
|
|
|
|
}//namespace graph
|
|
|
|
|
}//namespace hgl
|