VKDevice提供创建BUFFER时直接传入数据块的函数
This commit is contained in:
parent
adf4897650
commit
09a2566282
@ -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;
|
||||
|
||||
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));
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user