add Dynamic GPUBuffer support.
This commit is contained in:
parent
b3789bca21
commit
24d52b85e5
@ -18,25 +18,29 @@ protected:
|
||||
VkDevice device;
|
||||
GPUBufferData buf;
|
||||
|
||||
bool dynamic;
|
||||
|
||||
private:
|
||||
|
||||
friend class GPUDevice;
|
||||
friend class VertexAttribBuffer;
|
||||
friend class IndexBuffer;
|
||||
|
||||
GPUBuffer(VkDevice d,const GPUBufferData &b)
|
||||
GPUBuffer(VkDevice d,const GPUBufferData &b,bool dy)
|
||||
{
|
||||
device=d;
|
||||
buf=b;
|
||||
dynamic=dy;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
virtual ~GPUBuffer();
|
||||
|
||||
VkBuffer GetBuffer ()const{return buf.buffer;}
|
||||
GPUMemory * GetMemory ()const{return buf.memory;}
|
||||
const VkDescriptorBufferInfo * GetBufferInfo()const{return &buf.info;}
|
||||
const bool IsDynamic ()const{return dynamic;}
|
||||
VkBuffer GetBuffer ()const{return buf.buffer;}
|
||||
GPUMemory * GetMemory ()const{return buf.memory;}
|
||||
const VkDescriptorBufferInfo * GetBufferInfo ()const{return &buf.info;}
|
||||
|
||||
void * Map () {return buf.memory->Map();}
|
||||
virtual void * Map (VkDeviceSize start,VkDeviceSize size) {return buf.memory->Map(start,size);}
|
||||
@ -57,7 +61,7 @@ private:
|
||||
|
||||
friend class GPUDevice;
|
||||
|
||||
VertexAttribBuffer(VkDevice d,const GPUBufferData &vb,VkFormat fmt,uint32_t _stride,uint32_t _count):GPUBuffer(d,vb)
|
||||
VertexAttribBuffer(VkDevice d,const GPUBufferData &vb,VkFormat fmt,uint32_t _stride,uint32_t _count,bool dy=false):GPUBuffer(d,vb,dy)
|
||||
{
|
||||
format=fmt;
|
||||
stride=_stride;
|
||||
@ -89,7 +93,7 @@ private:
|
||||
|
||||
friend class GPUDevice;
|
||||
|
||||
IndexBuffer(VkDevice d,const GPUBufferData &vb,IndexType it,uint32_t _count):GPUBuffer(d,vb)
|
||||
IndexBuffer(VkDevice d,const GPUBufferData &vb,IndexType it,uint32_t _count,bool dy=false):GPUBuffer(d,vb,dy)
|
||||
{
|
||||
index_type=it;
|
||||
count=_count;
|
||||
|
@ -99,12 +99,12 @@ public: //内存相关
|
||||
|
||||
private: //Buffer相关
|
||||
|
||||
bool CreateBuffer(GPUBufferData *buf,VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,SharingMode sharing_mode);
|
||||
bool CreateBuffer(GPUBufferData *buf,VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,SharingMode sharing_mode,bool dynamic=false);
|
||||
|
||||
public: //Buffer相关
|
||||
|
||||
GPUBuffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data, SharingMode sharing_mode=SharingMode::Exclusive);
|
||||
GPUBuffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size, SharingMode sharing_mode=SharingMode::Exclusive){return CreateBuffer(buf_usage,size,nullptr,sharing_mode);}
|
||||
GPUBuffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data, SharingMode sharing_mode=SharingMode::Exclusive,bool dynamic=false);
|
||||
GPUBuffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size, SharingMode sharing_mode=SharingMode::Exclusive,bool dynamic=false){return CreateBuffer(buf_usage,size,nullptr,sharing_mode,dynamic);}
|
||||
|
||||
VAB * CreateVAB (VkFormat format,uint32_t count,const void *data, SharingMode sharing_mode=SharingMode::Exclusive);
|
||||
VAB * CreateVAB (VkFormat format,uint32_t count, SharingMode sharing_mode=SharingMode::Exclusive){return CreateVAB(format,count,nullptr,sharing_mode);}
|
||||
@ -118,8 +118,8 @@ public: //Buffer相关
|
||||
IndexBuffer * CreateIBO16 ( uint32_t count,SharingMode sharing_mode=SharingMode::Exclusive){return CreateIBO(IndexType::U16,count,nullptr,sharing_mode);}
|
||||
IndexBuffer * CreateIBO32 ( uint32_t count,SharingMode sharing_mode=SharingMode::Exclusive){return CreateIBO(IndexType::U32,count,nullptr,sharing_mode);}
|
||||
|
||||
#define CREATE_BUFFER_OBJECT(LargeName,type) GPUBuffer *Create##LargeName(VkDeviceSize size,void *data,SharingMode sharing_mode=SharingMode::Exclusive){return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size,data,sharing_mode);} \
|
||||
GPUBuffer *Create##LargeName(VkDeviceSize size,SharingMode sharing_mode=SharingMode::Exclusive){return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size,nullptr,sharing_mode);}
|
||||
#define CREATE_BUFFER_OBJECT(LargeName,type) GPUBuffer *Create##LargeName(VkDeviceSize size,void *data, SharingMode sharing_mode=SharingMode::Exclusive,bool dynamic=false){return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size,data, sharing_mode,dynamic);} \
|
||||
GPUBuffer *Create##LargeName(VkDeviceSize size, SharingMode sharing_mode=SharingMode::Exclusive,bool dynamic=false){return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size,nullptr, sharing_mode,dynamic);}
|
||||
|
||||
CREATE_BUFFER_OBJECT(UBO,UNIFORM)
|
||||
CREATE_BUFFER_OBJECT(SSBO,STORAGE)
|
||||
|
@ -67,8 +67,8 @@ public: // VBO/VAO
|
||||
VAB *CreateVAB(VkFormat format,uint32_t count,SharingMode sm=SharingMode::Exclusive){return CreateVAB(format,count,nullptr,sm);}
|
||||
VAB *CreateVAB(const VAD *vad,SharingMode sm=SharingMode::Exclusive){return CreateVAB(vad->GetVulkanFormat(),vad->GetCount(),vad->GetData(),sm);}
|
||||
|
||||
#define SCENE_DB_CREATE_FUNC(name) GPUBuffer *Create##name(VkDeviceSize size,void *data,SharingMode sm=SharingMode::Exclusive); \
|
||||
GPUBuffer *Create##name(VkDeviceSize size,SharingMode sm=SharingMode::Exclusive);
|
||||
#define SCENE_DB_CREATE_FUNC(name) GPUBuffer *Create##name(VkDeviceSize size,void *data,SharingMode sm=SharingMode::Exclusive,bool dynamic=false); \
|
||||
GPUBuffer *Create##name(VkDeviceSize size,SharingMode sm=SharingMode::Exclusive,bool dynamic=false);
|
||||
|
||||
SCENE_DB_CREATE_FUNC(UBO)
|
||||
SCENE_DB_CREATE_FUNC(SSBO)
|
||||
|
@ -2,7 +2,7 @@
|
||||
#include<hgl/graph/VKBuffer.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
bool GPUDevice::CreateBuffer(GPUBufferData *buf,VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,SharingMode sharing_mode)
|
||||
bool GPUDevice::CreateBuffer(GPUBufferData *buf,VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,SharingMode sharing_mode,bool dynamic)
|
||||
{
|
||||
BufferCreateInfo buf_info;
|
||||
|
||||
@ -19,7 +19,12 @@ bool GPUDevice::CreateBuffer(GPUBufferData *buf,VkBufferUsageFlags buf_usage,VkD
|
||||
|
||||
vkGetBufferMemoryRequirements(attr->device,buf->buffer,&mem_reqs);
|
||||
|
||||
GPUMemory *dm=CreateMemory(mem_reqs,VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
|
||||
uint32_t prop=VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
|
||||
|
||||
if(!dynamic)
|
||||
prop|=VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
|
||||
|
||||
GPUMemory *dm=CreateMemory(mem_reqs,prop);
|
||||
|
||||
if(dm&&dm->BindBuffer(buf->buffer))
|
||||
{
|
||||
@ -80,13 +85,13 @@ IndexBuffer *GPUDevice::CreateIBO(IndexType index_type,uint32_t count,const void
|
||||
return(new IndexBuffer(attr->device,buf,index_type,count));
|
||||
}
|
||||
|
||||
GPUBuffer *GPUDevice::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,SharingMode sharing_mode)
|
||||
GPUBuffer *GPUDevice::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,SharingMode sharing_mode,bool dynamic)
|
||||
{
|
||||
GPUBufferData buf;
|
||||
|
||||
if(!CreateBuffer(&buf,buf_usage,size,data,sharing_mode))
|
||||
if(!CreateBuffer(&buf,buf_usage,size,data,sharing_mode,dynamic))
|
||||
return(nullptr);
|
||||
|
||||
return(new GPUBuffer(attr->device,buf));
|
||||
return(new GPUBuffer(attr->device,buf,dynamic));
|
||||
}
|
||||
VK_NAMESPACE_END
|
||||
|
@ -16,18 +16,18 @@ VAB *RenderResource::CreateVAB(VkFormat format,uint32_t count,const void *data,S
|
||||
return vb;
|
||||
}
|
||||
|
||||
#define SCENE_DB_CREATE_BUFFER(name) GPUBuffer *RenderResource::Create##name(VkDeviceSize size,void *data,SharingMode sharing_mode) \
|
||||
#define SCENE_DB_CREATE_BUFFER(name) GPUBuffer *RenderResource::Create##name(VkDeviceSize size,void *data,SharingMode sharing_mode,bool dynamic) \
|
||||
{ \
|
||||
GPUBuffer *buf=device->Create##name(size,data,sharing_mode); \
|
||||
GPUBuffer *buf=device->Create##name(size,data,sharing_mode,dynamic); \
|
||||
\
|
||||
if(!buf)return(nullptr); \
|
||||
rm_buffers.Add(buf); \
|
||||
return(buf); \
|
||||
} \
|
||||
\
|
||||
GPUBuffer *RenderResource::Create##name(VkDeviceSize size,SharingMode sharing_mode) \
|
||||
GPUBuffer *RenderResource::Create##name(VkDeviceSize size,SharingMode sharing_mode,bool dynamic) \
|
||||
{ \
|
||||
GPUBuffer *buf=device->Create##name(size,sharing_mode); \
|
||||
GPUBuffer *buf=device->Create##name(size,sharing_mode,dynamic); \
|
||||
\
|
||||
if(!buf)return(nullptr); \
|
||||
rm_buffers.Add(buf); \
|
||||
|
Loading…
x
Reference in New Issue
Block a user