拆分创建VBO/IBO返回新的VertexBuffer

This commit is contained in:
hyzboy 2019-04-16 02:21:35 +08:00
parent 33194750f8
commit 276d179186
2 changed files with 70 additions and 43 deletions

View File

@ -1,8 +1,11 @@
#include"RenderSurface.h"
#include<hgl/type/Pair.h>
VK_NAMESPACE_BEGIN
Buffer *RenderSurface::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode)
namespace
{
bool CreateVulkanBuffer(VulkanBuffer &vb,const RenderSurfaceAttribute *rsa,VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode)
{
VkBufferCreateInfo buf_info={};
buf_info.sType=VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
@ -14,13 +17,11 @@ Buffer *RenderSurface::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize si
buf_info.sharingMode=sharing_mode;
buf_info.flags=0;
VkBuffer buf;
if(vkCreateBuffer(rsa->device,&buf_info,nullptr,&buf)!=VK_SUCCESS)
return(nullptr);
if(vkCreateBuffer(rsa->device,&buf_info,nullptr,&vb.buffer)!=VK_SUCCESS)
return(false);
VkMemoryRequirements mem_reqs;
vkGetBufferMemoryRequirements(rsa->device,buf,&mem_reqs);
vkGetBufferMemoryRequirements(rsa->device,vb.buffer,&mem_reqs);
VkMemoryAllocateInfo alloc_info={};
alloc_info.sType=VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
@ -34,23 +35,45 @@ Buffer *RenderSurface::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize si
if(vkAllocateMemory(rsa->device,&alloc_info,nullptr,&mem)==VK_SUCCESS)
{
if(vkBindBufferMemory(rsa->device,buf,mem,0)==VK_SUCCESS)
if(vkBindBufferMemory(rsa->device,vb.buffer,mem,0)==VK_SUCCESS)
{
VkDescriptorBufferInfo buf_info;
vb.info.buffer=vb.buffer;
vb.info.offset=0;
vb.info.range=size;
buf_info.buffer=buf;
buf_info.offset=0;
buf_info.range=size;
return(new Buffer(rsa->device,buf,mem,buf_info));
return(true);
}
vkFreeMemory(rsa->device,mem,nullptr);
}
}
vkDestroyBuffer(rsa->device,buf,nullptr);
vkDestroyBuffer(rsa->device,vb.buffer,nullptr);
return(false);
}
}//namespace
VertexBuffer *RenderSurface::CreateBuffer(VkBufferUsageFlags buf_usage,VkFormat format,uint32_t count,VkSharingMode sharing_mode)
{
VulkanBuffer vb;
const uint32_t stride=GetStrideForFormat(format);
const VkDeviceSize size=stride*count;
if(!CreateVulkanBuffer(vb,rsa,buf_usage,size,sharing_mode))
return(nullptr);
return(new VertexBuffer(rsa->device,vb,format,stride,count));
}
Buffer *RenderSurface::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode)
{
VulkanBuffer vb;
if(!CreateVulkanBuffer(vb,rsa,buf_usage,size,sharing_mode))
return(nullptr);
return(new Buffer(rsa->device,vb));
}
CommandBuffer *RenderSurface::CreateCommandBuffer()

View File

@ -38,12 +38,16 @@ public:
public:
Buffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE);
VertexBuffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkFormat format,uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE);
#define CREATE_FORMAT_BUFFER_OBJECT(LargeName,type) Buffer *Create##LargeName(VkFormat format,uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,format,count,sharing_mode);}
CREATE_FORMAT_BUFFER_OBJECT(VBO,VERTEX)
CREATE_FORMAT_BUFFER_OBJECT(IBO,INDEX)
#undef CREATE_FORMAT_BUFFER_OBJECT
#define CREATE_BUFFER_OBJECT(LargeName,type) Buffer *Create##LargeName(VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size,sharing_mode);}
CREATE_BUFFER_OBJECT(UBO,UNIFORM)
CREATE_BUFFER_OBJECT(VBO,VERTEX)
CREATE_BUFFER_OBJECT(IBO,INDEX)
CREATE_BUFFER_OBJECT(SSBO,STORAGE)
CREATE_BUFFER_OBJECT(INBO,INDIRECT)