拆分创建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,9 +1,12 @@
#include"RenderSurface.h" #include"RenderSurface.h"
#include<hgl/type/Pair.h>
VK_NAMESPACE_BEGIN 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={}; VkBufferCreateInfo buf_info={};
buf_info.sType=VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; buf_info.sType=VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
buf_info.pNext=nullptr; buf_info.pNext=nullptr;
@ -14,13 +17,11 @@ Buffer *RenderSurface::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize si
buf_info.sharingMode=sharing_mode; buf_info.sharingMode=sharing_mode;
buf_info.flags=0; buf_info.flags=0;
VkBuffer buf; if(vkCreateBuffer(rsa->device,&buf_info,nullptr,&vb.buffer)!=VK_SUCCESS)
return(false);
if(vkCreateBuffer(rsa->device,&buf_info,nullptr,&buf)!=VK_SUCCESS)
return(nullptr);
VkMemoryRequirements mem_reqs; VkMemoryRequirements mem_reqs;
vkGetBufferMemoryRequirements(rsa->device,buf,&mem_reqs); vkGetBufferMemoryRequirements(rsa->device,vb.buffer,&mem_reqs);
VkMemoryAllocateInfo alloc_info={}; VkMemoryAllocateInfo alloc_info={};
alloc_info.sType=VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_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(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; return(true);
buf_info.offset=0;
buf_info.range=size;
return(new Buffer(rsa->device,buf,mem,buf_info));
} }
vkFreeMemory(rsa->device,mem,nullptr); 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(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() CommandBuffer *RenderSurface::CreateCommandBuffer()

View File

@ -38,12 +38,16 @@ public:
public: public:
Buffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE); 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);} #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(UBO,UNIFORM)
CREATE_BUFFER_OBJECT(VBO,VERTEX)
CREATE_BUFFER_OBJECT(IBO,INDEX)
CREATE_BUFFER_OBJECT(SSBO,STORAGE) CREATE_BUFFER_OBJECT(SSBO,STORAGE)
CREATE_BUFFER_OBJECT(INBO,INDIRECT) CREATE_BUFFER_OBJECT(INBO,INDIRECT)