ULRE/src/RenderDevice/Vulkan/VKDevice.cpp

123 lines
3.1 KiB
C++
Raw Normal View History

#include<hgl/graph/vulkan/VKDevice.h>
#include<hgl/type/Pair.h>
2019-06-26 16:03:21 +08:00
#include<hgl/graph/vulkan/VKTexture.h>
#include<hgl/graph/vulkan/VKImageView.h>
#include<hgl/graph/vulkan/VKCommandBuffer.h>
//#include<hgl/graph/vulkan/VKDescriptorSet.h>
#include<hgl/graph/vulkan/VKRenderPass.h>
#include<hgl/graph/vulkan/VKFramebuffer.h>
#include<hgl/graph/vulkan/VKShaderModuleManage.h>
#include<hgl/graph/vulkan/VKDescriptorSets.h>
VK_NAMESPACE_BEGIN
Swapchain *CreateSwapchain(Device *attr,const VkExtent2D &);
2019-04-19 20:10:59 +08:00
Device::Device(DeviceAttribute *da)
{
attr=da;
2019-06-26 11:26:38 +08:00
texture_fence=this->CreateFence(false);
2019-06-15 23:52:10 +08:00
hgl_zero(texture_submit_info);
texture_submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2019-06-14 10:32:43 +08:00
texture_cmd_buf=nullptr;
swapchain=nullptr;
swapchainRT=nullptr;
Resize(attr->surface_caps.currentExtent);
2019-04-19 20:10:59 +08:00
}
2019-04-18 22:24:39 +08:00
Device::~Device()
{
SAFE_CLEAR(swapchainRT);
SAFE_CLEAR(swapchain);
delete texture_cmd_buf;
delete texture_fence;
2019-04-20 16:12:22 +08:00
2019-04-18 22:24:39 +08:00
delete attr;
}
bool Device::Resize(const VkExtent2D &extent)
{
SAFE_CLEAR(swapchainRT);
SAFE_CLEAR(swapchain);
2019-06-14 10:32:43 +08:00
swapchain=CreateSwapchain(this,extent);
if(texture_cmd_buf)delete texture_cmd_buf;
texture_cmd_buf=CreateCommandBuffer(swapchain->GetExtent(),0);
swapchainRT=new SwapchainRenderTarget(this,swapchain);
return(true);
}
CommandBuffer *Device::CreateCommandBuffer(const VkExtent2D &extent,const uint32_t atta_count)
{
2019-04-18 22:24:39 +08:00
if(!attr->cmd_pool)
return(nullptr);
2019-06-20 21:41:40 +08:00
VkCommandBufferAllocateInfo cmd;
cmd.sType =VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
cmd.pNext =nullptr;
cmd.commandPool =attr->cmd_pool;
cmd.level =VK_COMMAND_BUFFER_LEVEL_PRIMARY;
cmd.commandBufferCount =1;
VkCommandBuffer cmd_buf;
2019-04-18 22:24:39 +08:00
VkResult res=vkAllocateCommandBuffers(attr->device,&cmd,&cmd_buf);
if(res!=VK_SUCCESS)
return(nullptr);
return(new CommandBuffer(attr->device,extent,atta_count,attr->cmd_pool,cmd_buf));
}
2019-06-26 11:26:38 +08:00
/**
*
* @param create_signaled
*/
Fence *Device::CreateFence(bool create_signaled)
2019-04-19 19:58:01 +08:00
{
VkFenceCreateInfo fenceInfo;
fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
fenceInfo.pNext = nullptr;
2019-06-26 11:26:38 +08:00
fenceInfo.flags = create_signaled?VK_FENCE_CREATE_SIGNALED_BIT:0;
2019-04-19 19:58:01 +08:00
2019-04-20 16:12:22 +08:00
VkFence fence;
2019-04-19 19:58:01 +08:00
2019-04-20 16:12:22 +08:00
if(vkCreateFence(attr->device, &fenceInfo, nullptr, &fence)!=VK_SUCCESS)
2019-04-19 19:58:01 +08:00
return(nullptr);
2019-04-20 16:12:22 +08:00
return(new Fence(attr->device,fence));
2019-04-19 19:58:01 +08:00
}
2019-04-19 20:04:08 +08:00
Semaphore *Device::CreateSem()
{
VkSemaphoreCreateInfo SemaphoreCreateInfo;
SemaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
SemaphoreCreateInfo.pNext = nullptr;
SemaphoreCreateInfo.flags = 0;
VkSemaphore sem;
if(vkCreateSemaphore(attr->device, &SemaphoreCreateInfo, nullptr, &sem)!=VK_SUCCESS)
return(nullptr);
return(new Semaphore(attr->device,sem));
}
2019-04-19 20:10:59 +08:00
ShaderModuleManage *Device::CreateShaderModuleManage()
{
return(new ShaderModuleManage(this));
}
RenderTarget *Device::CreateRenderTarget(Framebuffer *fb)
{
return(new RenderTarget(this,fb));
}
VK_NAMESPACE_END