ULRE/src/RenderDevice/Vulkan/VKDeviceBuffer.cpp

95 lines
2.7 KiB
C++
Raw Normal View History

#include<hgl/graph/vulkan/VKDevice.h>
#include<hgl/graph/vulkan/VKBuffer.h>
VK_NAMESPACE_BEGIN
2020-09-02 18:36:24 +08:00
bool Device::CreateBuffer(BufferData *buf,VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,SharingMode sharing_mode)
{
2019-11-25 22:05:05 +08:00
VkBufferCreateInfo buf_info={};
2020-09-02 18:36:24 +08:00
buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
buf_info.pNext = nullptr;
buf_info.usage = buf_usage;
buf_info.size = size;
buf_info.queueFamilyIndexCount = 0;
buf_info.pQueueFamilyIndices = nullptr;
buf_info.sharingMode = VkSharingMode(sharing_mode);
buf_info.flags = 0;
2019-11-25 22:05:05 +08:00
if(vkCreateBuffer(attr->device,&buf_info,nullptr,&buf->buffer)!=VK_SUCCESS)
return(false);
2019-11-25 22:05:05 +08:00
VkMemoryRequirements mem_reqs;
2019-11-25 22:05:05 +08:00
vkGetBufferMemoryRequirements(attr->device,buf->buffer,&mem_reqs);
2019-11-25 22:05:05 +08:00
Memory *dm=CreateMemory(mem_reqs,VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
2019-11-25 22:05:05 +08:00
if(dm&&dm->BindBuffer(buf->buffer))
{
buf->info.buffer =buf->buffer;
buf->info.offset =0;
buf->info.range =size;
2019-06-26 18:38:35 +08:00
2019-11-25 22:05:05 +08:00
buf->memory =dm;
2019-11-25 22:05:05 +08:00
if(!data)
return(true);
2019-11-25 22:05:05 +08:00
dm->Write(data,0,size);
return(true);
}
2019-11-25 22:05:05 +08:00
delete dm;
vkDestroyBuffer(attr->device,buf->buffer,nullptr);
return(false);
}
2020-09-02 18:36:24 +08:00
VAB *Device::CreateVAB(VkFormat format,uint32_t count,const void *data,SharingMode sharing_mode)
{
const uint32_t stride=GetStrideByFormat(format);
if(stride==0)
{
std::cerr<<"format["<<format<<"] stride length is 0,please use \"Device::CreateBuffer(VkBufferUsageFlags,VkDeviceSize,VkSharingMode)\" function.";
return(nullptr);
}
const VkDeviceSize size=stride*count;
2019-11-25 22:05:05 +08:00
BufferData buf;
2019-11-25 22:05:05 +08:00
if(!CreateBuffer(&buf,VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,size,data,sharing_mode))
return(nullptr);
return(new VertexAttribBuffer(attr->device,buf,format,stride,count));
}
IndexBuffer *Device::CreateIBO(IndexType index_type,uint32_t count,const void *data,SharingMode sharing_mode)
{
uint32_t stride;
if(index_type==IndexType::U16)stride=2;else
if(index_type==IndexType::U32)stride=4;else
2019-05-06 12:00:03 +08:00
return(nullptr);
const VkDeviceSize size=stride*count;
2019-11-25 22:05:05 +08:00
BufferData buf;
2019-11-25 22:05:05 +08:00
if(!CreateBuffer(&buf,VK_BUFFER_USAGE_INDEX_BUFFER_BIT,size,data,sharing_mode))
return(nullptr);
2019-11-25 22:05:05 +08:00
return(new IndexBuffer(attr->device,buf,index_type,count));
}
2020-09-02 18:36:24 +08:00
Buffer *Device::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,SharingMode sharing_mode)
{
2019-11-25 22:05:05 +08:00
BufferData buf;
2019-11-25 22:05:05 +08:00
if(!CreateBuffer(&buf,buf_usage,size,data,sharing_mode))
return(nullptr);
2019-11-25 22:05:05 +08:00
return(new Buffer(attr->device,buf));
}
VK_NAMESPACE_END