删除创建Buffer时的内存分配代码,改用统一的VKMemory

This commit is contained in:
hyzboy 2019-06-26 17:08:01 +08:00
parent 4a7ff689fb
commit 2c3c5294c6
5 changed files with 49 additions and 76 deletions

View File

@ -2,13 +2,14 @@
#define HGL_GRAPH_VULKAN_BUFFER_INCLUDE
#include<hgl/graph/vulkan/VK.h>
#include<hgl/graph/vulkan/VKMemory.h>
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);
}

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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);