diff --git a/inc/hgl/graph/vulkan/VKBuffer.h b/inc/hgl/graph/vulkan/VKBuffer.h index 2c559617..211611b2 100644 --- a/inc/hgl/graph/vulkan/VKBuffer.h +++ b/inc/hgl/graph/vulkan/VKBuffer.h @@ -2,13 +2,14 @@ #define HGL_GRAPH_VULKAN_BUFFER_INCLUDE #include +#include VK_NAMESPACE_BEGIN struct VulkanBuffer { - VkBuffer buffer; - VkDeviceMemory memory; - VkDescriptorBufferInfo info; + VkBuffer buffer; + Memory * memory=nullptr; + VkDescriptorBufferInfo info; };//struct VulkanBuffer class Buffer @@ -35,14 +36,15 @@ public: virtual ~Buffer(); operator VkBuffer (){return buf.buffer;} - operator VkDeviceMemory (){return buf.memory;} + operator Memory * (){return buf.memory;} operator VkDescriptorBufferInfo * (){return &buf.info;} - virtual uint8_t *Map(uint32_t start=0,uint32_t size=0); - void Unmap(); + void * Map() {return buf.memory->Map();} + virtual void * Map(VkDeviceSize start,VkDeviceSize size) {return buf.memory->Map(start,size);} + void Unmap() {return buf.memory->Unmap();} - bool Write(const void *ptr,uint32_t start,uint32_t size); - bool Write(const void *ptr){return Write(ptr,0,buf.info.range);} + bool Write(const void *ptr,uint32_t start,uint32_t size) {return buf.memory->Write(ptr,start,size);} + bool Write(const void *ptr) {return buf.memory->Write(ptr);} };//class Buffer class VertexBuffer:public Buffer @@ -70,7 +72,7 @@ public: const uint32_t GetStride()const { return stride; } const uint32_t GetCount ()const { return count; } - uint8_t *Map(uint32_t start=0,uint32_t size=0) override + void *Map(VkDeviceSize start=0,VkDeviceSize size=0) override { return Buffer::Map(start*stride,size*stride); } diff --git a/inc/hgl/graph/vulkan/VKMemory.h b/inc/hgl/graph/vulkan/VKMemory.h index a299e87a..f5dfbde6 100644 --- a/inc/hgl/graph/vulkan/VKMemory.h +++ b/inc/hgl/graph/vulkan/VKMemory.h @@ -39,9 +39,13 @@ public: const uint32_t GetProperties ()const{return properties;} void *Map(); - void *Map(VkDeviceSize offset,VkDeviceSize map_size); + void *Map(VkDeviceSize offset,VkDeviceSize size); void Unmap(); + bool Write(const void *ptr,VkDeviceSize start,VkDeviceSize size); + bool Write(const void *ptr){return Write(ptr,0,req.size);} + + bool Bind(VkBuffer buffer); bool Bind(VkImage image); };//class Memory diff --git a/src/RenderDevice/Vulkan/VKBuffer.cpp b/src/RenderDevice/Vulkan/VKBuffer.cpp index 8a9473d3..f1e1aa3d 100644 --- a/src/RenderDevice/Vulkan/VKBuffer.cpp +++ b/src/RenderDevice/Vulkan/VKBuffer.cpp @@ -3,43 +3,7 @@ VK_NAMESPACE_BEGIN Buffer::~Buffer() { - vkFreeMemory(device,buf.memory,nullptr); + if(buf.memory)delete buf.memory; vkDestroyBuffer(device,buf.buffer,nullptr); } - -uint8_t *Buffer::Map(uint32_t start,uint32_t size) -{ - uint8_t *p; - - if(start>buf.info.range - ||start+size>buf.info.range) - return(nullptr); - - if(start==0&&size==0) - size=buf.info.range; - - if(vkMapMemory(device,buf.memory,start,size,0,(void **)&p)==VK_SUCCESS) - return p; - - return nullptr; -} - -void Buffer::Unmap() -{ - vkUnmapMemory(device,buf.memory); -} - -bool Buffer::Write(const void *ptr,uint32_t start,uint32_t size) -{ - if(!ptr)return(false); - - void *dst; - - if(vkMapMemory(device,buf.memory,start,size,0,&dst)!=VK_SUCCESS) - return(false); - - memcpy(dst,ptr,size); - vkUnmapMemory(device,buf.memory); - return(true); -} VK_NAMESPACE_END diff --git a/src/RenderDevice/Vulkan/VKDeviceBuffer.cpp b/src/RenderDevice/Vulkan/VKDeviceBuffer.cpp index da3dee77..b25b6c4f 100644 --- a/src/RenderDevice/Vulkan/VKDeviceBuffer.cpp +++ b/src/RenderDevice/Vulkan/VKDeviceBuffer.cpp @@ -22,41 +22,23 @@ namespace VkMemoryRequirements mem_reqs; vkGetBufferMemoryRequirements(rsa->device,vb.buffer,&mem_reqs); - VkMemoryAllocateInfo alloc_info={}; - alloc_info.sType=VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - alloc_info.pNext=nullptr; - alloc_info.memoryTypeIndex=0; - alloc_info.allocationSize=mem_reqs.size; + Memory *dm=CreateMemory(rsa->device,rsa->physical_device,mem_reqs,VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); - if(rsa->CheckMemoryType(mem_reqs.memoryTypeBits,VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,&alloc_info.memoryTypeIndex)) + if(dm&&dm->Bind(vb.buffer)) { - if(vkAllocateMemory(rsa->device,&alloc_info,nullptr,&vb.memory)==VK_SUCCESS) - { - if(vkBindBufferMemory(rsa->device,vb.buffer,vb.memory,0)==VK_SUCCESS) - { - vb.info.buffer=vb.buffer; - vb.info.offset=0; - vb.info.range=size; + vb.info.buffer =vb.buffer; + vb.info.offset =0; + vb.info.range =size; - if(!data) - return(true); + if(!data) + return(true); - { - void *dst; - - if(vkMapMemory(rsa->device,vb.memory,0,size,0,&dst)==VK_SUCCESS) - { - memcpy(dst,data,size); - vkUnmapMemory(rsa->device,vb.memory); - return(true); - } - } - } - - vkFreeMemory(rsa->device,vb.memory,nullptr); - } + dm->Write(data,0,size); + return(true); } + delete dm; + vkDestroyBuffer(rsa->device,vb.buffer,nullptr); return(false); } diff --git a/src/RenderDevice/Vulkan/VKMemory.cpp b/src/RenderDevice/Vulkan/VKMemory.cpp index 2fa9ec92..019e682c 100644 --- a/src/RenderDevice/Vulkan/VKMemory.cpp +++ b/src/RenderDevice/Vulkan/VKMemory.cpp @@ -56,6 +56,27 @@ void Memory::Unmap() vkUnmapMemory(device,memory); } +bool Memory::Write(const void *ptr,VkDeviceSize start,VkDeviceSize size) +{ + if(!ptr)return(false); + + void *dst; + + if(vkMapMemory(device,memory,start,size,0,&dst)!=VK_SUCCESS) + return(false); + + memcpy(dst,ptr,size); + vkUnmapMemory(device,memory); + return(true); +} + +bool Memory::Bind(VkBuffer buffer) +{ + if(!buffer)return(false); + + return(vkBindBufferMemory(device,buffer,memory,0)==VK_SUCCESS); +} + bool Memory::Bind(VkImage image) { if(!image)return(false);