ULRE/example/Vulkan/RenderSurface.cpp

79 lines
2.2 KiB
C++

#include"RenderSurface.h"
VK_NAMESPACE_BEGIN
Buffer *RenderSurface::CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode)
{
VkBufferCreateInfo buf_info={};
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=sharing_mode;
buf_info.flags=0;
VkBuffer buf;
if(vkCreateBuffer(rsa->device,&buf_info,nullptr,&buf)!=VK_SUCCESS)
return(nullptr);
VkMemoryRequirements mem_reqs;
vkGetBufferMemoryRequirements(rsa->device,buf,&mem_reqs);
VkMemoryAllocateInfo alloc_info={};
alloc_info.sType=VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
alloc_info.pNext=NULL;
alloc_info.memoryTypeIndex=0;
alloc_info.allocationSize=mem_reqs.size;
if(rsa->CheckMemoryType(mem_reqs.memoryTypeBits,VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,&alloc_info.memoryTypeIndex))
{
VkDeviceMemory mem;
if(vkAllocateMemory(rsa->device,&alloc_info,nullptr,&mem)==VK_SUCCESS)
{
if(vkBindBufferMemory(rsa->device,buf,mem,0)==VK_SUCCESS)
{
VkDescriptorBufferInfo buf_info;
buf_info.buffer=buf;
buf_info.offset=0;
buf_info.range=size;
return(new Buffer(rsa->device,buf,mem,buf_info));
}
vkFreeMemory(rsa->device,mem,nullptr);
}
}
vkDestroyBuffer(rsa->device,buf,nullptr);
return(nullptr);
}
CommandBuffer *RenderSurface::CreateCommandBuffer()
{
if(!rsa->cmd_pool)
return(nullptr);
VkCommandBufferAllocateInfo cmd={};
cmd.sType=VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
cmd.pNext=nullptr;
cmd.commandPool=rsa->cmd_pool;
cmd.level=VK_COMMAND_BUFFER_LEVEL_PRIMARY;
cmd.commandBufferCount=1;
VkCommandBuffer cmd_buf;
VkResult res=vkAllocateCommandBuffers(rsa->device,&cmd,&cmd_buf);
if(res!=VK_SUCCESS)
return(nullptr);
return(new CommandBuffer(rsa->device,rsa->cmd_pool,cmd_buf));
}
VK_NAMESPACE_END