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