VKDevice提供创建BUFFER时直接传入数据块的函数

This commit is contained in:
HuYingzhuo 2019-04-25 14:33:50 +08:00
parent adf4897650
commit 09a2566282
3 changed files with 35 additions and 32 deletions

View File

@ -14,7 +14,7 @@
VK_NAMESPACE_BEGIN
namespace
{
bool CreateVulkanBuffer(VulkanBuffer &vb,const DeviceAttribute *rsa,VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode)
bool CreateVulkanBuffer(VulkanBuffer &vb,const DeviceAttribute *rsa,VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,VkSharingMode sharing_mode)
{
VkBufferCreateInfo buf_info={};
buf_info.sType=VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
@ -48,7 +48,19 @@ namespace
vb.info.offset=0;
vb.info.range=size;
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);
@ -98,7 +110,7 @@ Device::~Device()
delete attr;
}
VertexBuffer *Device::CreateVBO(VkFormat format,uint32_t count,VkSharingMode sharing_mode)
VertexBuffer *Device::CreateVBO(VkFormat format,uint32_t count,const void *data,VkSharingMode sharing_mode)
{
const uint32_t stride=GetStrideByFormat(format);
@ -112,13 +124,13 @@ VertexBuffer *Device::CreateVBO(VkFormat format,uint32_t count,VkSharingMode sha
VulkanBuffer vb;
if(!CreateVulkanBuffer(vb,attr,VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,size,sharing_mode))
if(!CreateVulkanBuffer(vb,attr,VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,size,data,sharing_mode))
return(nullptr);
return(new VertexBuffer(attr->device,vb,format,stride,count));
}
IndexBuffer *Device::CreateIBO(VkIndexType index_type,uint32_t count,VkSharingMode sharing_mode)
IndexBuffer *Device::CreateIBO(VkIndexType index_type,uint32_t count,const void *data,VkSharingMode sharing_mode)
{
uint32_t stride;
@ -130,17 +142,17 @@ IndexBuffer *Device::CreateIBO(VkIndexType index_type,uint32_t count,VkSharingMo
VulkanBuffer vb;
if(!CreateVulkanBuffer(vb,attr,VK_BUFFER_USAGE_INDEX_BUFFER_BIT,size,sharing_mode))
if(!CreateVulkanBuffer(vb,attr,VK_BUFFER_USAGE_INDEX_BUFFER_BIT,size,data,sharing_mode))
return(nullptr);
return(new IndexBuffer(attr->device,vb,index_type,count));
}
Buffer *Device::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode)
Buffer *Device::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,VkSharingMode sharing_mode)
{
VulkanBuffer vb;
if(!CreateVulkanBuffer(vb,attr,buf_usage,size,sharing_mode))
if(!CreateVulkanBuffer(vb,attr,buf_usage,size,data,sharing_mode))
return(nullptr);
return(new Buffer(attr->device,vb));

View File

@ -68,15 +68,22 @@ public:
public:
Buffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE);
Buffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE);
Buffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateBuffer(buf_usage,size,nullptr,sharing_mode);}
VertexBuffer * CreateVBO(VkFormat format,uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE);
VertexBuffer * CreateVBO(VkFormat format,uint32_t count,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE);
VertexBuffer * CreateVBO(VkFormat format,uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateVBO(format,count,nullptr,sharing_mode);}
IndexBuffer * CreateIBO(VkIndexType index_type,uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE);
IndexBuffer * CreateIBO16(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT16,count,sharing_mode);}
IndexBuffer * CreateIBO32(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT32,count,sharing_mode);}
IndexBuffer * CreateIBO(VkIndexType index_type,uint32_t count,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE);
IndexBuffer * CreateIBO16(uint32_t count,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT16,count,data,sharing_mode);}
IndexBuffer * CreateIBO32(uint32_t count,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT32,count,data,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);}
IndexBuffer * CreateIBO(VkIndexType index_type,uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(index_type,count,nullptr,sharing_mode);}
IndexBuffer * CreateIBO16(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT16,count,nullptr,sharing_mode);}
IndexBuffer * CreateIBO32(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT32,count,nullptr,sharing_mode);}
#define CREATE_BUFFER_OBJECT(LargeName,type) Buffer *Create##LargeName(VkDeviceSize size,void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size,data,sharing_mode);} \
Buffer *Create##LargeName(VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size,nullptr,sharing_mode);}
CREATE_BUFFER_OBJECT(UBO,UNIFORM)
CREATE_BUFFER_OBJECT(SSBO,STORAGE)

View File

@ -115,24 +115,8 @@ vulkan::VertexBuffer *color_buffer=nullptr;
vulkan::VertexInput *CreateVertexBuffer(vulkan::Device *dev)
{
vertex_buffer=dev->CreateVBO(FMT_RG32F,6*sizeof(float));
color_buffer=dev->CreateVBO(FMT_RGB32F,9*sizeof(float));
{
float *p=(float *)vertex_buffer->Map();
memcpy(p,vertex_data,6*sizeof(float));
vertex_buffer->Unmap();
}
{
float *p=(float *)color_buffer->Map();
memcpy(p,color_data,9*sizeof(float));
color_buffer->Unmap();
}
vertex_buffer=dev->CreateVBO(FMT_RG32F,3,vertex_data);
color_buffer=dev->CreateVBO(FMT_RGB32F,3,color_data);
vulkan::VertexInput *vi=new vulkan::VertexInput();