2021-03-25 20:00:19 +08:00
|
|
|
|
#ifndef HGL_GRAPH_VULKAN_ARRAY_BUFFER_INCLUDE
|
2021-02-10 18:53:07 +08:00
|
|
|
|
#define HGL_GRAPH_VULKAN_ARRAY_BUFFER_INCLUDE
|
|
|
|
|
|
|
|
|
|
#include<hgl/graph/VKBuffer.h>
|
2021-03-25 20:00:19 +08:00
|
|
|
|
#include<hgl/graph/VKDevice.h>
|
2021-04-26 20:36:56 +08:00
|
|
|
|
#include<hgl/graph/VKMemoryAllocator.h>
|
2021-04-07 21:17:24 +08:00
|
|
|
|
#include<hgl/type/Collection.h>
|
2021-02-10 18:53:07 +08:00
|
|
|
|
namespace hgl
|
|
|
|
|
{
|
|
|
|
|
namespace graph
|
|
|
|
|
{
|
|
|
|
|
/**
|
2021-03-25 20:00:19 +08:00
|
|
|
|
* GPU数据阵列缓冲区<br>
|
|
|
|
|
* 它用于储存多份相同格式的数据,常用于多物件渲染,instance等
|
2021-02-10 18:53:07 +08:00
|
|
|
|
*/
|
2021-04-07 21:17:24 +08:00
|
|
|
|
template<typename T> class GPUArrayBuffer
|
2021-02-10 18:53:07 +08:00
|
|
|
|
{
|
|
|
|
|
protected:
|
|
|
|
|
|
2021-04-26 20:36:56 +08:00
|
|
|
|
GPUDevice *device;
|
|
|
|
|
VkBufferUsageFlags buffer_usage_flags;
|
2021-02-10 18:53:07 +08:00
|
|
|
|
|
2021-05-08 18:14:44 +08:00
|
|
|
|
Collection *coll;
|
2021-02-10 18:53:07 +08:00
|
|
|
|
|
2021-04-26 20:36:56 +08:00
|
|
|
|
public:
|
2021-04-06 19:13:53 +08:00
|
|
|
|
|
2021-04-26 20:36:56 +08:00
|
|
|
|
GPUArrayBuffer(GPUDevice *dev,VkBufferUsageFlags flags)
|
2021-04-07 21:17:24 +08:00
|
|
|
|
{
|
2021-04-26 20:36:56 +08:00
|
|
|
|
device=dev;
|
|
|
|
|
buffer_usage_flags=flags;
|
|
|
|
|
|
2021-05-08 18:14:44 +08:00
|
|
|
|
{
|
2021-05-08 19:02:08 +08:00
|
|
|
|
uint32_t unit_size=sizeof(T);
|
2021-05-11 20:45:00 +08:00
|
|
|
|
VKMemoryAllocator *ma=new VKMemoryAllocator(device,buffer_usage_flags); // construct function is going to set AllocUnitSize by minUniformOffsetAlignment
|
2021-05-08 18:14:44 +08:00
|
|
|
|
MemoryBlock *mb=new MemoryBlock(ma);
|
|
|
|
|
|
2021-05-11 20:45:00 +08:00
|
|
|
|
const uint32_t align_size=ma->GetAllocUnitSize()-1; // this value is "min UBO Offset alignment"
|
2021-05-08 19:02:08 +08:00
|
|
|
|
|
|
|
|
|
unit_size=(unit_size+align_size)&(~align_size);
|
|
|
|
|
|
2021-05-08 18:14:44 +08:00
|
|
|
|
coll=new Collection(unit_size,mb);
|
|
|
|
|
}
|
2021-04-07 21:17:24 +08:00
|
|
|
|
}
|
2021-04-06 19:13:53 +08:00
|
|
|
|
|
2021-04-26 20:36:56 +08:00
|
|
|
|
virtual ~GPUArrayBuffer()
|
|
|
|
|
{
|
|
|
|
|
delete coll;
|
|
|
|
|
}
|
2021-04-06 19:13:53 +08:00
|
|
|
|
|
2021-04-26 20:36:56 +08:00
|
|
|
|
uint32 Alloc(const uint32 max_count) ///<预分配空间
|
|
|
|
|
{
|
|
|
|
|
if(!coll->Alloc(max_count))
|
|
|
|
|
return(0);
|
2021-02-10 18:53:07 +08:00
|
|
|
|
|
2021-04-26 20:36:56 +08:00
|
|
|
|
return coll->GetAllocCount();
|
|
|
|
|
}
|
2021-02-10 18:53:07 +08:00
|
|
|
|
|
2021-04-26 20:36:56 +08:00
|
|
|
|
void Clear()
|
|
|
|
|
{
|
|
|
|
|
coll->Clear();
|
|
|
|
|
}
|
2021-03-25 20:00:19 +08:00
|
|
|
|
|
2021-04-26 20:36:56 +08:00
|
|
|
|
T *Map(const uint32 start,const uint32 count)
|
|
|
|
|
{
|
2021-05-11 20:45:00 +08:00
|
|
|
|
return (T *)(coll->Map(start,count));
|
2021-04-26 20:36:56 +08:00
|
|
|
|
}
|
2021-02-10 18:53:07 +08:00
|
|
|
|
};//class GPUArrayBuffer
|
|
|
|
|
}//namespace graph
|
|
|
|
|
}//namespace hgl
|
|
|
|
|
#endif//HGL_GRAPH_VULKAN_ARRAY_BUFFER_INCLUDE
|