VKDevice提供创建BUFFER时直接传入数据块的函数
This commit is contained in:
parent
adf4897650
commit
09a2566282
@ -14,7 +14,7 @@
|
|||||||
VK_NAMESPACE_BEGIN
|
VK_NAMESPACE_BEGIN
|
||||||
namespace
|
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={};
|
VkBufferCreateInfo buf_info={};
|
||||||
buf_info.sType=VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
buf_info.sType=VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
|
||||||
@ -48,7 +48,19 @@ namespace
|
|||||||
vb.info.offset=0;
|
vb.info.offset=0;
|
||||||
vb.info.range=size;
|
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);
|
vkFreeMemory(rsa->device,vb.memory,nullptr);
|
||||||
@ -98,7 +110,7 @@ Device::~Device()
|
|||||||
delete attr;
|
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);
|
const uint32_t stride=GetStrideByFormat(format);
|
||||||
|
|
||||||
@ -112,13 +124,13 @@ VertexBuffer *Device::CreateVBO(VkFormat format,uint32_t count,VkSharingMode sha
|
|||||||
|
|
||||||
VulkanBuffer vb;
|
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(nullptr);
|
||||||
|
|
||||||
return(new VertexBuffer(attr->device,vb,format,stride,count));
|
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;
|
uint32_t stride;
|
||||||
|
|
||||||
@ -130,17 +142,17 @@ IndexBuffer *Device::CreateIBO(VkIndexType index_type,uint32_t count,VkSharingMo
|
|||||||
|
|
||||||
VulkanBuffer vb;
|
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(nullptr);
|
||||||
|
|
||||||
return(new IndexBuffer(attr->device,vb,index_type,count));
|
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;
|
VulkanBuffer vb;
|
||||||
|
|
||||||
if(!CreateVulkanBuffer(vb,attr,buf_usage,size,sharing_mode))
|
if(!CreateVulkanBuffer(vb,attr,buf_usage,size,data,sharing_mode))
|
||||||
return(nullptr);
|
return(nullptr);
|
||||||
|
|
||||||
return(new Buffer(attr->device,vb));
|
return(new Buffer(attr->device,vb));
|
||||||
|
@ -68,15 +68,22 @@ public:
|
|||||||
|
|
||||||
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 * CreateIBO(VkIndexType index_type,uint32_t count,const void *data,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 * 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,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT32,count,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(UBO,UNIFORM)
|
||||||
CREATE_BUFFER_OBJECT(SSBO,STORAGE)
|
CREATE_BUFFER_OBJECT(SSBO,STORAGE)
|
||||||
|
@ -115,24 +115,8 @@ vulkan::VertexBuffer *color_buffer=nullptr;
|
|||||||
|
|
||||||
vulkan::VertexInput *CreateVertexBuffer(vulkan::Device *dev)
|
vulkan::VertexInput *CreateVertexBuffer(vulkan::Device *dev)
|
||||||
{
|
{
|
||||||
vertex_buffer=dev->CreateVBO(FMT_RG32F,6*sizeof(float));
|
vertex_buffer=dev->CreateVBO(FMT_RG32F,3,vertex_data);
|
||||||
color_buffer=dev->CreateVBO(FMT_RGB32F,9*sizeof(float));
|
color_buffer=dev->CreateVBO(FMT_RGB32F,3,color_data);
|
||||||
|
|
||||||
{
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
vulkan::VertexInput *vi=new vulkan::VertexInput();
|
vulkan::VertexInput *vi=new vulkan::VertexInput();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user