ULRE/inc/hgl/graph/VKArrayBuffer.h

78 lines
2.0 KiB
C
Raw Normal View History

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/VK.h>
#include<hgl/graph/VKUBODynamic.h>
2021-02-10 18:53:07 +08:00
namespace hgl
{
class Collection;
2021-02-10 18:53:07 +08:00
namespace graph
{
class VKMemoryAllocator;
2021-02-10 18:53:07 +08:00
/**
2021-03-25 20:00:19 +08:00
* GPU数据阵列缓冲区<br>
* instance等
2021-02-10 18:53:07 +08:00
*/
2023-03-22 21:18:46 +08:00
class GPUArrayBuffer
2021-02-10 18:53:07 +08:00
{
protected:
GPUDevice *device;
VkBufferUsageFlags buffer_usage_flags;
2023-03-22 21:18:46 +08:00
uint item_length; ///<单个数据长度
2023-03-28 22:24:22 +08:00
uint unit_size;
2023-03-22 21:18:46 +08:00
VKMemoryAllocator *vk_ma;
2021-05-08 18:14:44 +08:00
Collection *coll;
2021-02-10 18:53:07 +08:00
protected:
void * Map(const uint32 start,const uint32 count);
void Flush(const uint32 count);
2023-03-28 22:24:22 +08:00
private:
GPUArrayBuffer(GPUDevice *dev,const VkBufferUsageFlags &flag,const uint il,const uint us);
friend class GPUDevice;
public:
virtual ~GPUArrayBuffer();
2021-02-10 18:53:07 +08:00
2023-03-28 22:24:22 +08:00
const uint32_t GetUnitSize()const{return unit_size;}
DeviceBuffer * GetBuffer();
2021-03-25 20:00:19 +08:00
uint32 Alloc(const uint32 max_count); ///<预分配空间
void Clear();
template<typename T>
bool Start(UBODynamicAccess<T> *ubo_access,const uint32 start,const uint32 count)
{
if(!ubo_access)return(false);
void *ptr=Map(start,count);
if(!ptr)return(false);
2023-03-28 22:24:22 +08:00
ubo_access->Start((uchar *)ptr,start,count);
return(true);
}
void End(UBODynamicAccess<void> *ubo_access)
{
if(!ubo_access)return;
Flush(ubo_access->GetCount());
ubo_access->Restart();
}
2021-02-10 18:53:07 +08:00
};//class GPUArrayBuffer
}//namespace graph
}//namespace hgl
#endif//HGL_GRAPH_VULKAN_ARRAY_BUFFER_INCLUDE