diff --git a/inc/hgl/graph/VKBuffer.h b/inc/hgl/graph/VKBuffer.h index 33e0b81f..daa0f990 100644 --- a/inc/hgl/graph/VKBuffer.h +++ b/inc/hgl/graph/VKBuffer.h @@ -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; diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index 0a587f22..93baa675 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -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) diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index 6ca5193d..639e16f7 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -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) diff --git a/src/SceneGraph/Vulkan/VKDeviceBuffer.cpp b/src/SceneGraph/Vulkan/VKDeviceBuffer.cpp index cb1bc111..ed7790db 100644 --- a/src/SceneGraph/Vulkan/VKDeviceBuffer.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceBuffer.cpp @@ -2,7 +2,7 @@ #include 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 diff --git a/src/SceneGraph/Vulkan/VKRenderResource.cpp b/src/SceneGraph/Vulkan/VKRenderResource.cpp index 3974976b..a0b64723 100644 --- a/src/SceneGraph/Vulkan/VKRenderResource.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResource.cpp @@ -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); \