删除创建Buffer时的内存分配代码,改用统一的VKMemory
This commit is contained in:
parent
4a7ff689fb
commit
2c3c5294c6
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user