ULRE/src/SceneGraph/Vulkan/VKDevice.cpp

149 lines
3.5 KiB
C++
Raw Normal View History

#include<hgl/graph/VKDevice.h>
#include<hgl/type/Pair.h>
#include<hgl/graph/VKSemaphore.h>
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/VKImageView.h>
#include<hgl/graph/VKPipeline.h>
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/VKRenderPass.h>
#include<hgl/graph/VKFramebuffer.h>
#include<hgl/graph/VKDescriptorSet.h>
#include<hgl/graph/VKDeviceRenderPassManage.h>
#include<hgl/graph/module/GraphModule.h>
VK_NAMESPACE_BEGIN
GraphModuleManager *InitGraphModuleManager(GPUDevice *dev);
bool ClearGraphModuleManager(GPUDevice *dev);
2020-10-21 12:39:22 +08:00
GPUDevice::GPUDevice(GPUDeviceAttribute *da)
2019-04-19 20:10:59 +08:00
{
attr=da;
2021-03-25 20:00:19 +08:00
texture_queue=nullptr;
2019-06-14 10:32:43 +08:00
texture_cmd_buf=nullptr;
graph_module_manager=InitGraphModuleManager(this);
InitRenderPassManage();
sc_rt=nullptr;
Resize(attr->surface_caps.currentExtent);
2021-09-23 19:08:07 +08:00
texture_cmd_buf=CreateTextureCommandBuffer(attr->physical_device->GetDeviceName()+AnsiString(":TexCmdBuffer"));
texture_queue=CreateQueue();
2019-04-19 20:10:59 +08:00
}
2020-10-21 12:39:22 +08:00
GPUDevice::~GPUDevice()
2019-04-18 22:24:39 +08:00
{
ClearRenderPassManage();
SAFE_CLEAR(sc_rt);
2021-03-25 20:00:19 +08:00
SAFE_CLEAR(texture_queue);
SAFE_CLEAR(texture_cmd_buf);
2019-04-20 16:12:22 +08:00
2019-04-18 22:24:39 +08:00
delete attr;
//按设计上面那些rt/queue/cmdbuf都需要走graph_module_manager释放和申请
ClearGraphModuleManager(this);
2019-04-18 22:24:39 +08:00
}
2020-10-21 12:39:22 +08:00
bool GPUDevice::Resize(const VkExtent2D &extent)
{
graph_module_manager->OnResize(extent);
SAFE_CLEAR(sc_rt);
2019-06-14 10:32:43 +08:00
attr->RefreshSurfaceCaps();
sc_rt=CreateSwapchainRenderTarget();
return(sc_rt);
}
VkCommandBuffer GPUDevice::CreateCommandBuffer(const AnsiString &name)
{
2019-04-18 22:24:39 +08:00
if(!attr->cmd_pool)
return(VK_NULL_HANDLE);
2020-09-27 20:58:25 +08:00
CommandBufferAllocateInfo cmd;
2019-06-20 21:41:40 +08:00
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(VK_NULL_HANDLE);
#ifdef _DEBUG
if(attr->debug_utils)
2023-10-13 02:01:57 +08:00
attr->debug_utils->SetCommandBuffer(cmd_buf,name);
#endif//_DEBUG
return cmd_buf;
}
RenderCmdBuffer *GPUDevice::CreateRenderCommandBuffer(const AnsiString &name)
{
VkCommandBuffer cb=CreateCommandBuffer(name);
if(cb==VK_NULL_HANDLE)return(nullptr);
return(new RenderCmdBuffer(attr,cb));
}
TextureCmdBuffer *GPUDevice::CreateTextureCommandBuffer(const AnsiString &name)
{
VkCommandBuffer cb=CreateCommandBuffer(name);
if(cb==VK_NULL_HANDLE)return(nullptr);
return(new TextureCmdBuffer(attr,cb));
}
2019-06-26 11:26:38 +08:00
/**
*
* @param create_signaled
*/
2022-10-14 19:27:29 +08:00
Fence *GPUDevice::CreateFence(bool create_signaled)
2019-04-19 19:58:01 +08:00
{
2020-09-27 20:58:25 +08:00
FenceCreateInfo fenceInfo(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);
2022-10-14 19:27:29 +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 *GPUDevice::CreateGPUSemaphore()
2019-04-19 20:04:08 +08:00
{
2020-09-27 20:58:25 +08:00
SemaphoreCreateInfo SemaphoreCreateInfo;
2019-04-19 20:04:08 +08:00
VkSemaphore sem;
2020-09-27 20:58:25 +08:00
2019-04-19 20:04:08 +08:00
if(vkCreateSemaphore(attr->device, &SemaphoreCreateInfo, nullptr, &sem)!=VK_SUCCESS)
return(nullptr);
return(new Semaphore(attr->device,sem));
2019-04-19 20:04:08 +08:00
}
DeviceQueue *GPUDevice::CreateQueue(const uint32_t fence_count,const bool create_signaled)
{
if(fence_count<=0)return(nullptr);
2022-10-14 19:27:29 +08:00
Fence **fence_list=new Fence *[fence_count];
for(uint32_t i=0;i<fence_count;i++)
fence_list[i]=CreateFence(create_signaled);
return(new DeviceQueue(attr->device,attr->graphics_queue,fence_list,fence_count));
}
VK_NAMESPACE_END