ULRE/src/SceneGraph/Vulkan/VKDeviceRenderTarget.cpp

81 lines
2.7 KiB
C++
Raw Normal View History

#include<hgl/graph/VKDevice.h>
VK_NAMESPACE_BEGIN
2021-09-22 15:32:20 +08:00
RenderTarget *GPUDevice::CreateRenderTarget(const FramebufferInfo *fbi,RenderPass *rp,const uint32_t fence_count)
{
if(!fbi)return(nullptr);
2020-10-17 14:20:49 +08:00
if(!rp)return(nullptr);
const uint32_t color_count=fbi->GetColorCount();
const VkExtent2D extent=fbi->GetExtent();
const VkFormat depth_format=fbi->GetDepthFormat();
2020-10-17 14:20:49 +08:00
AutoDeleteObjectArray<Texture2D> color_texture_list(color_count);
AutoDeleteArray<ImageView *> color_iv_list(color_count); //iv只是从Texture2D中取出来的无需一个个delete
2020-10-17 14:20:49 +08:00
Texture2D **tp=color_texture_list;
ImageView **iv=color_iv_list;
2020-10-16 19:44:00 +08:00
for(const VkFormat &fmt:fbi->GetColorFormatList())
2020-10-16 19:44:00 +08:00
{
Texture2D *color_texture=CreateTexture2D(new ColorAttachmentTextureCreateInfo(fmt,extent));
2020-10-16 19:44:00 +08:00
if(!color_texture)
return(nullptr);
2020-10-17 14:20:49 +08:00
*tp++=color_texture;
*iv++=color_texture->GetImageView();
2020-10-16 19:44:00 +08:00
}
2021-06-24 19:25:43 +08:00
Texture2D *depth_texture=(depth_format!=PF_UNDEFINED)?CreateTexture2D(new DepthAttachmentTextureCreateInfo(depth_format,extent)):nullptr;
2020-10-17 14:20:49 +08:00
Framebuffer *fb=CreateFramebuffer(rp,color_iv_list,color_count,depth_texture?depth_texture->GetImageView():nullptr);
2020-10-16 19:44:00 +08:00
2020-10-17 14:20:49 +08:00
if(fb)
2020-10-16 19:44:00 +08:00
{
DeviceQueue *q=CreateQueue(fence_count,false);
Semaphore *render_complete_semaphore=CreateGPUSemaphore();
RenderTarget *rt=new RenderTarget(q,render_complete_semaphore,rp,fb,color_texture_list,color_count,depth_texture);
2020-10-17 14:20:49 +08:00
color_texture_list.DiscardObject();
return rt;
2020-10-16 19:44:00 +08:00
}
2020-10-17 14:20:49 +08:00
SAFE_CLEAR(depth_texture);
return nullptr;
}
2021-09-22 15:32:20 +08:00
RenderTarget *GPUDevice::CreateRenderTarget(const FramebufferInfo *fbi,const uint32_t fence_count)
{
if(!fbi)return(nullptr);
RenderPass *rp=AcquireRenderPass(fbi);
2021-09-22 15:32:20 +08:00
if(!rp)return(nullptr);
return CreateRenderTarget(fbi,rp,fence_count);
}
SwapchainRenderTarget *GPUDevice::CreateSwapchainRenderTarget()
{
Swapchain *sc=CreateSwapchain(attr->surface_caps.currentExtent);
if(!sc)
return(false);
DeviceQueue *q=CreateQueue(sc->color_count,false);
Semaphore *render_complete_semaphore=CreateGPUSemaphore();
Semaphore *present_complete_semaphore=CreateGPUSemaphore();
SwapchainRenderTarget *srt=new SwapchainRenderTarget( attr->device,
sc,
q,
render_complete_semaphore,
present_complete_semaphore,
device_render_pass
);
return srt;
}
VK_NAMESPACE_END