ULRE/inc/hgl/graph/VKRenderTarget.h

313 lines
8.9 KiB
C
Raw Normal View History

2025-01-26 23:22:25 +08:00
#pragma once
2019-06-19 21:12:39 +08:00
#include<hgl/graph/VK.h>
#include<hgl/graph/VKRenderPass.h>
#include<hgl/graph/VKFramebuffer.h>
#include<hgl/graph/VKSwapchain.h>
2020-10-21 12:39:22 +08:00
#include<hgl/graph/VKQueue.h>
#include<hgl/graph/VKPipeline.h>
2025-01-26 23:22:25 +08:00
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/VKDescriptorBindingManage.h>
//#include<iostream>
2025-01-25 15:25:29 +08:00
2025-01-26 23:22:25 +08:00
VK_NAMESPACE_BEGIN
2025-02-01 16:32:08 +08:00
class RenderFramework;
2025-01-25 15:25:29 +08:00
/**
* RenderTarget
*
* 1.
*
* 2.Swapchain
*
* RenderTarget的其实是一个多态类
*/
class IRenderTarget
{
2025-02-01 16:32:08 +08:00
RenderFramework *render_framework;
2025-01-26 23:22:25 +08:00
VkExtent2D extent;
2025-02-01 16:32:08 +08:00
graph::ViewportInfo vp_info;
graph::DeviceBuffer *ubo_vp_info;
DescriptorBinding desc_binding;
2025-01-25 15:25:29 +08:00
public:
2025-02-01 16:32:08 +08:00
RenderFramework * GetRenderFramework ()const{return render_framework;}
GPUDevice * GetDevice ()const;
VkDevice GetVkDevice ()const;
DescriptorBinding * GetDescriptorBinding(){return &desc_binding;}
2025-02-01 16:32:08 +08:00
2025-01-26 23:22:25 +08:00
const VkExtent2D &GetExtent ()const{return extent;}
virtual uint32_t GetColorCount ()=0;
virtual bool hasDepth ()=0;
public:
2025-02-01 16:32:08 +08:00
void OnResize(const VkExtent2D &ext);
public:
IRenderTarget(RenderFramework *,const VkExtent2D &);
virtual ~IRenderTarget();
2025-01-26 23:22:25 +08:00
virtual Framebuffer * GetFramebuffer ()=0;
virtual RenderPass * GetRenderPass ()=0;
2025-01-25 15:25:29 +08:00
2025-01-26 23:22:25 +08:00
virtual Texture2D * GetColorTexture (const int index=0)=0;
virtual Texture2D * GetDepthTexture ()=0;
public: // Command Buffer
virtual DeviceQueue * GetQueue ()=0;
virtual Semaphore * GetRenderCompleteSemaphore()=0;
virtual RenderCmdBuffer * GetRenderCmdBuffer ()=0;
virtual bool Submit (Semaphore *wait_sem)=0;
virtual bool Submit (){return Submit(nullptr);}
virtual bool WaitQueue ()=0;
virtual bool WaitFence ()=0;
virtual RenderCmdBuffer * BeginRender ()=0;
virtual void EndRender ()=0;
public:
virtual void Bind (Material *mtl)
{
if(mtl)
desc_binding.Bind(mtl);
}
2025-01-25 15:25:29 +08:00
};//class IRenderTarget
2025-01-26 23:22:25 +08:00
struct RenderTargetData
{
Framebuffer * fbo;
DeviceQueue * queue;
Semaphore * render_complete_semaphore;
RenderCmdBuffer * cmd_buf;
uint32_t color_count; ///<颜色成分数量
Texture2D ** color_textures; ///<颜色成分纹理列表
Texture2D * depth_texture; ///<深度成分纹理
public:
Texture2D *GetColorTexture(const uint32_t index)
{
if(index>=color_count)
return(nullptr);
return color_textures[index];
}
virtual void Clear();
};//struct RenderTargetData
/**
2025-01-26 23:22:25 +08:00
*
*/
2025-01-26 23:22:25 +08:00
class RenderTarget:public IRenderTarget
{
2025-01-26 23:22:25 +08:00
RenderTargetData *data;
protected:
2019-06-19 21:12:39 +08:00
2025-01-26 23:22:25 +08:00
friend class SwapchainModule;
friend class RenderTargetManager;
2025-02-01 16:32:08 +08:00
RenderTarget(RenderFramework *rf,RenderTargetData *rtd):IRenderTarget(rf,rtd->fbo->GetExtent())
2025-01-26 23:22:25 +08:00
{
data=rtd;
data->cmd_buf->SetDescriptorBinding(GetDescriptorBinding());
2025-01-26 23:22:25 +08:00
}
public:
2025-02-01 16:32:08 +08:00
virtual ~RenderTarget() override
2025-01-26 23:22:25 +08:00
{
if(data)
{
data->Clear();
delete data;
}
}
Framebuffer * GetFramebuffer ()override{return data->fbo;}
RenderPass * GetRenderPass ()override{return data->fbo->GetRenderPass();}
uint32_t GetColorCount ()override{return data->color_count;}
2025-01-26 23:22:25 +08:00
bool hasDepth ()override{return data->depth_texture;}
2025-01-26 23:22:25 +08:00
Texture2D * GetColorTexture (const int index=0) override{return data->GetColorTexture(index);}
Texture2D * GetDepthTexture () override{return data->depth_texture;}
public: // Command Buffer
DeviceQueue * GetQueue ()override{return data->queue;}
Semaphore * GetRenderCompleteSemaphore()override{return data->render_complete_semaphore;}
RenderCmdBuffer * GetRenderCmdBuffer ()override{return data->cmd_buf;}
virtual bool Submit (Semaphore *wait_sem)override
{
if(!data)
return(false);
return data->queue->Submit(data->cmd_buf,wait_sem,data->render_complete_semaphore);
2025-01-26 23:22:25 +08:00
}
bool WaitQueue ()override{return data->queue->WaitQueue();}
bool WaitFence ()override{return data->queue->WaitFence();}
public:
virtual RenderCmdBuffer *BeginRender()override
{
if(!data->cmd_buf)
return(nullptr);
data->cmd_buf->Begin();
data->cmd_buf->SetDescriptorBinding(GetDescriptorBinding());
data->cmd_buf->BindFramebuffer(data->fbo);
return data->cmd_buf;
}
virtual void EndRender() override
{
if(!data->cmd_buf)
return;
data->cmd_buf->End();
}
2025-01-26 23:22:25 +08:00
};//class RenderTarget
/**
*
*/
class MFRenderTarget:public IRenderTarget
{
2020-10-17 14:20:49 +08:00
protected:
2025-01-26 23:22:25 +08:00
uint32_t frame_number;
uint32_t current_frame;
2025-01-25 15:25:29 +08:00
2025-01-26 23:22:25 +08:00
RenderTarget **rt_list;
2020-10-17 14:20:49 +08:00
protected:
2019-06-19 21:12:39 +08:00
friend class RenderTargetManager;
2019-06-19 21:12:39 +08:00
2025-02-01 16:32:08 +08:00
MFRenderTarget(RenderFramework *rf,const uint32_t fn,RenderTarget **rtl):IRenderTarget(rf,rtl[0]->GetFramebuffer()->GetExtent())
2025-01-26 23:22:25 +08:00
{
frame_number=fn;
current_frame=0;
rt_list=rtl;
}
public:
2025-02-01 16:32:08 +08:00
virtual ~MFRenderTarget() override
2025-01-26 23:22:25 +08:00
{
SAFE_CLEAR_OBJECT_ARRAY_OBJECT(rt_list,frame_number);
}
virtual void NextFrame()
{
++current_frame;
if(current_frame>=frame_number)
current_frame=0;
}
uint32_t GetCurrentFrameIndices ()const{return current_frame;}
uint32_t GetFrameCount ()const{return frame_number;}
RenderTarget * GetCurrentFrameRenderTarget (){return rt_list[current_frame];}
2019-06-19 21:12:39 +08:00
public:
2025-01-26 23:22:25 +08:00
Framebuffer * GetFramebuffer ()override{return rt_list[current_frame]->GetFramebuffer();}
RenderPass * GetRenderPass ()override{return rt_list[current_frame]->GetRenderPass();}
uint32_t GetColorCount ()override{return rt_list[current_frame]->GetColorCount();}
Texture2D * GetColorTexture (const int index=0) override{return rt_list[current_frame]->GetColorTexture(index);}
Texture2D * GetDepthTexture () override{return rt_list[current_frame]->GetDepthTexture();}
2025-01-26 23:22:25 +08:00
bool hasDepth ()override{return rt_list[current_frame]->hasDepth();}
2025-01-26 23:22:25 +08:00
public: // Command Buffer
2025-01-26 23:22:25 +08:00
DeviceQueue * GetQueue ()override{return rt_list[current_frame]->GetQueue();}
Semaphore * GetRenderCompleteSemaphore()override{return rt_list[current_frame]->GetRenderCompleteSemaphore();}
RenderCmdBuffer * GetRenderCmdBuffer ()override{return rt_list[current_frame]->GetRenderCmdBuffer();}
Framebuffer * GetFramebuffer (const uint32_t index){return rt_list[index]->GetFramebuffer();}
RenderCmdBuffer * GetRenderCmdBuffer (const uint32_t index){return rt_list[index]->GetRenderCmdBuffer();}
2025-01-26 23:22:25 +08:00
virtual bool Submit ()override{return rt_list[current_frame]->Submit(nullptr);}
virtual bool Submit (Semaphore *wait_sem) override
{
return rt_list[current_frame]->Submit(wait_sem);
}
2025-01-26 23:22:25 +08:00
bool WaitQueue ()override{return rt_list[current_frame]->WaitQueue();}
bool WaitFence ()override{return rt_list[current_frame]->WaitFence();}
public:
virtual RenderCmdBuffer *BeginRender()override
{
//std::cout<<"Begin Render frame="<<current_frame<<std::endl;
return rt_list[current_frame]->BeginRender();
}
virtual void EndRender() override
{
//std::cout<<"End Render frame="<<current_frame<<std::endl;
rt_list[current_frame]->EndRender();
}
2025-01-26 23:22:25 +08:00
};//class MFRenderTarget
/**
*
*/
2025-01-26 23:22:25 +08:00
class SwapchainRenderTarget:public MFRenderTarget
{
Swapchain *swapchain;
2020-09-27 20:58:25 +08:00
PresentInfo present_info;
2019-06-19 21:12:39 +08:00
Semaphore *present_complete_semaphore=nullptr;
2025-01-26 23:22:25 +08:00
private:
2025-02-01 16:32:08 +08:00
SwapchainRenderTarget(RenderFramework *rf,Swapchain *sc,Semaphore *pcs,RenderTarget **rtl);
2025-01-26 23:22:25 +08:00
friend class SwapchainModule;
friend class RenderTargetManager;
public:
2020-10-17 14:20:49 +08:00
2025-02-01 16:32:08 +08:00
~SwapchainRenderTarget() override;
public:
IRenderTarget *AcquireNextImage(); ///<获取下一帧的索引
2020-10-17 14:20:49 +08:00
bool Submit()override; ///<提交当前帧的渲染,交推送到前台
2025-01-26 23:22:25 +08:00
};//class SwapchainRenderTarget:public RenderTarget
2019-06-19 21:12:39 +08:00
VK_NAMESPACE_END