拆分创建VBO/IBO返回新的VertexBuffer
This commit is contained in:
parent
33194750f8
commit
276d179186
@ -1,8 +1,11 @@
|
|||||||
#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;
|
||||||
@ -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()
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user