optimized RenderCmdBuffer::BindFramebuffer
This commit is contained in:
parent
39aa63aa0a
commit
02ac76e5bd
2
CMCore
2
CMCore
@ -1 +1 @@
|
||||
Subproject commit 11e32b77f1136bcb552abb406cf73db799720e11
|
||||
Subproject commit 9dd89aa5a34ef90b983895d32645df9b53cce955
|
@ -1 +1 @@
|
||||
Subproject commit 4949c2e3e82c8a88a783579aff120617c4ecfdab
|
||||
Subproject commit 2370ba12d7656da491f65be66d9e134484377866
|
@ -195,12 +195,12 @@ public:
|
||||
Resize(w,h);
|
||||
}
|
||||
|
||||
bool BuildCommandBuffer(RenderCmdBuffer *cb,RenderPass *rp,Framebuffer *fb,Renderable *ri)
|
||||
bool BuildCommandBuffer(RenderCmdBuffer *cb,Framebuffer *fb,Renderable *ri)
|
||||
{
|
||||
if(!ri)return(false);
|
||||
|
||||
cb->Begin();
|
||||
cb->BindFramebuffer(rp,fb);
|
||||
cb->BindFramebuffer(fb);
|
||||
cb->SetClearColor(0,clear_color);
|
||||
cb->BeginRenderPass();
|
||||
cb->BindPipeline(ri->GetPipeline());
|
||||
@ -213,12 +213,12 @@ public:
|
||||
return(true);
|
||||
}
|
||||
|
||||
void BuildCommandBuffer(RenderCmdBuffer *cb,RenderTarget *rt,Renderable *ri)
|
||||
bool BuildCommandBuffer(RenderCmdBuffer *cb,RenderTarget *rt,Renderable *ri)
|
||||
{
|
||||
if(!cb||!rt||!ri)
|
||||
return;
|
||||
return(false);
|
||||
|
||||
BuildCommandBuffer(cb,rt->GetRenderPass(),rt->GetFramebuffer(),ri);
|
||||
return BuildCommandBuffer(cb,rt->GetFramebuffer(),ri);
|
||||
}
|
||||
|
||||
bool BuildCommandBuffer(uint32_t index,Renderable *ri)
|
||||
@ -226,15 +226,15 @@ public:
|
||||
if(!ri)return(false);
|
||||
|
||||
return BuildCommandBuffer(sc_render_target->GetRenderCmdBuffer(index),
|
||||
sc_render_target->GetRenderPass(),
|
||||
sc_render_target->GetFramebuffer(index),ri);
|
||||
sc_render_target->GetFramebuffer(index),
|
||||
ri);
|
||||
}
|
||||
|
||||
bool BuildCommandBuffer(Renderable *ri)
|
||||
{
|
||||
if(!ri)return(false);
|
||||
|
||||
for(int32_t i=0;i<sc_render_target->GetImageCount();i++)
|
||||
for(uint32_t i=0;i<sc_render_target->GetImageCount();i++)
|
||||
BuildCommandBuffer(i,ri);
|
||||
|
||||
return(true);
|
||||
@ -254,7 +254,7 @@ public:
|
||||
RenderCmdBuffer *cb=sc_render_target->GetRenderCmdBuffer(index);
|
||||
|
||||
cb->Begin();
|
||||
cb->BindFramebuffer(sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index));
|
||||
cb->BindFramebuffer(sc_render_target->GetFramebuffer(index));
|
||||
cb->SetClearColor(0,clear_color);
|
||||
cb->BeginRenderPass();
|
||||
rl->Render(cb);
|
||||
@ -264,7 +264,7 @@ public:
|
||||
|
||||
void BuildCommandBuffer(RenderList *rl)
|
||||
{
|
||||
for(int32_t i=0;i<sc_render_target->GetImageCount();i++)
|
||||
for(uint32_t i=0;i<sc_render_target->GetImageCount();i++)
|
||||
BuildCommandBuffer(i,rl);
|
||||
}
|
||||
|
||||
|
@ -44,11 +44,12 @@ class RenderCmdBuffer:public GPUCmdBuffer
|
||||
VkRect2D render_area;
|
||||
VkViewport viewport;
|
||||
|
||||
Framebuffer *fbo;
|
||||
RenderPassBeginInfo rp_begin;
|
||||
VkPipelineLayout pipeline_layout;
|
||||
|
||||
void SetFBO(Framebuffer *);
|
||||
private:
|
||||
|
||||
void SetClear();
|
||||
|
||||
public:
|
||||
|
||||
@ -78,7 +79,7 @@ public:
|
||||
|
||||
//以上设定在Begin开始后即不可改变
|
||||
|
||||
bool BindFramebuffer(RenderPass *rp,Framebuffer *fb);
|
||||
bool BindFramebuffer(Framebuffer *);
|
||||
|
||||
bool BeginRenderPass();
|
||||
void NextSubpass(){vkCmdNextSubpass(cmd_buf,VK_SUBPASS_CONTENTS_INLINE);}
|
||||
|
@ -1,13 +1,13 @@
|
||||
#ifndef HGL_GRAPH_VULKAN_FRAMEBUFFER_INCLUDE
|
||||
#define HGL_GRAPH_VULKAN_FRAMEBUFFER_INCLUDE
|
||||
|
||||
#include<hgl/graph/VK.h>
|
||||
#include<hgl/graph/VKRenderPass.h>
|
||||
VK_NAMESPACE_BEGIN
|
||||
class Framebuffer
|
||||
{
|
||||
VkDevice device;
|
||||
VkFramebuffer frame_buffer;
|
||||
VkRenderPass render_pass;
|
||||
RenderPass *render_pass;
|
||||
|
||||
VkExtent2D extent;
|
||||
uint32_t attachment_count;
|
||||
@ -18,7 +18,7 @@ private:
|
||||
|
||||
friend class GPUDevice;
|
||||
|
||||
Framebuffer(VkDevice,VkFramebuffer,const VkExtent2D &,VkRenderPass,uint32_t color_count,bool depth);
|
||||
Framebuffer(VkDevice,VkFramebuffer,const VkExtent2D &,RenderPass *,uint32_t color_count,bool depth);
|
||||
|
||||
public:
|
||||
|
||||
@ -27,7 +27,7 @@ public:
|
||||
operator VkFramebuffer(){return frame_buffer;}
|
||||
|
||||
const VkFramebuffer GetFramebuffer ()const{return frame_buffer;}
|
||||
const VkRenderPass GetRenderPass ()const{return render_pass;}
|
||||
RenderPass * GetRenderPass () {return render_pass;}
|
||||
|
||||
const VkExtent2D & GetExtent ()const{return extent;}
|
||||
|
||||
|
@ -37,8 +37,10 @@ public:
|
||||
|
||||
virtual ~RenderPass();
|
||||
|
||||
VkRenderPass GetVkRenderPass(){return render_pass;}
|
||||
VkPipelineCache GetPipelineCache(){return pipeline_cache;}
|
||||
operator const VkRenderPass()const{return render_pass;}
|
||||
|
||||
const VkRenderPass GetVkRenderPass()const{return render_pass;}
|
||||
const VkPipelineCache GetPipelineCache()const{return pipeline_cache;}
|
||||
|
||||
const uint GetColorCount()const{return color_formats.GetCount();}
|
||||
const List<VkFormat> & GetColorFormat()const{return color_formats;}
|
||||
|
@ -17,7 +17,6 @@ protected:
|
||||
|
||||
DeviceQueue *queue;
|
||||
|
||||
RenderPass *render_pass;
|
||||
Framebuffer *fbo;
|
||||
|
||||
VkExtent2D extent;
|
||||
@ -35,7 +34,7 @@ protected:
|
||||
friend class GPUDevice;
|
||||
|
||||
RenderTarget(DeviceQueue *,Semaphore *);
|
||||
RenderTarget(DeviceQueue *,Semaphore *,RenderPass *_rp,Framebuffer *_fb,Texture2D **color_texture_list,const uint32_t color_count,Texture2D *depth_texture);
|
||||
RenderTarget(DeviceQueue *,Semaphore *,Framebuffer *_fb,Texture2D **color_texture_list,const uint32_t color_count,Texture2D *depth_texture);
|
||||
|
||||
public:
|
||||
|
||||
@ -43,14 +42,12 @@ public:
|
||||
|
||||
DeviceQueue * GetQueue () {return queue;}
|
||||
const VkExtent2D & GetExtent ()const {return extent;}
|
||||
virtual RenderPass * GetRenderPass () {return render_pass;}
|
||||
virtual const VkRenderPass GetVkRenderPass ()const {return render_pass->GetVkRenderPass();}
|
||||
|
||||
virtual const uint32_t GetColorCount ()const {return fbo->GetColorCount();}
|
||||
virtual RenderPass * GetRenderPass () {return GetFramebuffer()->GetRenderPass();}
|
||||
virtual uint32_t GetColorCount () {return GetFramebuffer()->GetColorCount();}
|
||||
|
||||
virtual Framebuffer * GetFramebuffer () {return fbo;}
|
||||
virtual Texture2D * GetColorTexture (const int index=0){return color_textures[index];}
|
||||
virtual Texture2D * GetDepthTexture (){return depth_texture;}
|
||||
virtual Texture2D * GetDepthTexture () {return depth_texture;}
|
||||
|
||||
public: // command buffer
|
||||
|
||||
@ -76,27 +73,24 @@ class RTSwapchain:public RenderTarget
|
||||
|
||||
public:
|
||||
|
||||
RTSwapchain(VkDevice dev,Swapchain *sc,DeviceQueue *q,Semaphore *rcs,Semaphore *pcs,RenderPass *rp);
|
||||
RTSwapchain(VkDevice dev,Swapchain *sc,DeviceQueue *q,Semaphore *rcs,Semaphore *pcs);
|
||||
~RTSwapchain();
|
||||
|
||||
const uint32_t GetColorCount ()const override {return 1;} ///Swapchain的FBO颜色成份只有一个
|
||||
const uint32_t GetImageCount ()const {return swapchain->image_count;}
|
||||
uint32_t GetColorCount () override {return 1;}
|
||||
uint32_t GetImageCount ()const {return swapchain->image_count;}
|
||||
uint32_t GetCurrentFrameIndices ()const {return current_frame;}
|
||||
|
||||
Framebuffer * GetFramebuffer ()override {return swapchain->sc_image[current_frame].fbo;}
|
||||
Framebuffer * GetFramebuffer (const int index) {return swapchain->sc_image[index].fbo;}
|
||||
Framebuffer * GetFramebuffer (int index) {return swapchain->sc_image[index].fbo;}
|
||||
|
||||
virtual Texture2D * GetColorTexture (const int index=0) override{return swapchain->sc_image[current_frame].color;}
|
||||
virtual Texture2D * GetDepthTexture () override{return swapchain->sc_image[current_frame].depth;}
|
||||
|
||||
RenderCmdBuffer *GetRenderCmdBuffer(const int index)
|
||||
{
|
||||
return swapchain->sc_image[index].cmd_buf;
|
||||
}
|
||||
RenderCmdBuffer * GetRenderCmdBuffer (int index) {return swapchain->sc_image[index].cmd_buf;}
|
||||
|
||||
public:
|
||||
|
||||
const uint32_t GetCurrentFrameIndices ()const {return current_frame;}
|
||||
Semaphore * GetPresentCompleteSemaphore () {return present_complete_semaphore;}
|
||||
Semaphore * GetPresentSemaphore () {return present_complete_semaphore;}
|
||||
|
||||
public:
|
||||
|
||||
|
2
res
2
res
@ -1 +1 @@
|
||||
Subproject commit 008dbd5353e6afe7add287333cbda1b5c5fffdec
|
||||
Subproject commit e1a36d78f0eead5f6bb65493432c4690637b991d
|
@ -5,6 +5,7 @@
|
||||
#include<hgl/graph/VKDeviceAttribute.h>
|
||||
#include<hgl/graph/VKPhysicalDevice.h>
|
||||
#include<hgl/graph/VKIndexBuffer.h>
|
||||
#include<hgl/graph/VKRenderTarget.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
RenderCmdBuffer::RenderCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb):GPUCmdBuffer(attr,cb)
|
||||
@ -15,7 +16,6 @@ RenderCmdBuffer::RenderCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer
|
||||
hgl_zero(render_area);
|
||||
hgl_zero(viewport);
|
||||
|
||||
fbo=nullptr;
|
||||
pipeline_layout=VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
@ -25,13 +25,8 @@ RenderCmdBuffer::~RenderCmdBuffer()
|
||||
hgl_free(clear_values);
|
||||
}
|
||||
|
||||
void RenderCmdBuffer::SetFBO(Framebuffer *fb)
|
||||
void RenderCmdBuffer::SetClear()
|
||||
{
|
||||
if(fbo==fb)return;
|
||||
|
||||
fbo=fb;
|
||||
cv_count=fbo->GetAttachmentCount();
|
||||
|
||||
if(cv_count>0)
|
||||
{
|
||||
clear_values=hgl_align_realloc<VkClearValue>(clear_values,cv_count);
|
||||
@ -44,11 +39,6 @@ void RenderCmdBuffer::SetFBO(Framebuffer *fb)
|
||||
hgl_free(clear_values);
|
||||
clear_values=nullptr;
|
||||
}
|
||||
|
||||
render_area.offset.x=0;
|
||||
render_area.offset.y=0;
|
||||
render_area.extent.width=0;
|
||||
render_area.extent.height=0;
|
||||
}
|
||||
|
||||
void RenderCmdBuffer::SetRenderArea(const VkExtent2D &ext2d)
|
||||
@ -58,18 +48,19 @@ void RenderCmdBuffer::SetRenderArea(const VkExtent2D &ext2d)
|
||||
render_area.extent=ext2d;
|
||||
}
|
||||
|
||||
bool RenderCmdBuffer::BindFramebuffer(RenderPass *rp,Framebuffer *fb)
|
||||
bool RenderCmdBuffer::BindFramebuffer(Framebuffer *fbo)
|
||||
{
|
||||
if(!rp||!fb)return(false);
|
||||
if(!fbo)return(false);
|
||||
|
||||
SetFBO(fb);
|
||||
cv_count=fbo->GetAttachmentCount();
|
||||
SetClear();
|
||||
|
||||
render_area.offset.x=0;
|
||||
render_area.offset.y=0;
|
||||
render_area.extent=fb->GetExtent();
|
||||
render_area.extent=fbo->GetExtent();
|
||||
|
||||
rp_begin.renderPass = rp->GetVkRenderPass();
|
||||
rp_begin.framebuffer = *fb;
|
||||
rp_begin.renderPass = *fbo->GetRenderPass();
|
||||
rp_begin.framebuffer = *fbo;
|
||||
rp_begin.renderArea = render_area;
|
||||
rp_begin.clearValueCount = cv_count;
|
||||
rp_begin.pClearValues = clear_values;
|
||||
|
@ -75,7 +75,7 @@ Framebuffer *GPUDevice::CreateFBO(RenderPass *rp,ImageView **color_list,const ui
|
||||
if(!fbo)
|
||||
return(nullptr);
|
||||
|
||||
return(new Framebuffer(GetDevice(),fbo,extent,rp->GetVkRenderPass(),color_count,depth));
|
||||
return(new Framebuffer(GetDevice(),fbo,extent,rp,color_count,depth));
|
||||
}
|
||||
//
|
||||
//Framebuffer *GPUDevice::CreateFBO(RenderPass *rp,List<ImageView *> &color,ImageView *depth)
|
||||
|
@ -37,7 +37,7 @@ RenderTarget *GPUDevice::CreateRT(const FramebufferInfo *fbi,RenderPass *rp,cons
|
||||
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);
|
||||
RenderTarget *rt=new RenderTarget(q,render_complete_semaphore,fb,color_texture_list,color_count,depth_texture);
|
||||
|
||||
color_texture_list.DiscardObject();
|
||||
return rt;
|
||||
@ -73,8 +73,7 @@ RTSwapchain *GPUDevice::CreateSwapchainRenderTarget()
|
||||
sc,
|
||||
q,
|
||||
render_complete_semaphore,
|
||||
present_complete_semaphore,
|
||||
sc->render_pass
|
||||
present_complete_semaphore
|
||||
);
|
||||
|
||||
return srt;
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
|
||||
Framebuffer::Framebuffer(VkDevice dev,VkFramebuffer fb,const VkExtent2D &ext,VkRenderPass rp,uint32_t cc,bool depth)
|
||||
Framebuffer::Framebuffer(VkDevice dev,VkFramebuffer fb,const VkExtent2D &ext,RenderPass *rp,uint32_t cc,bool depth)
|
||||
{
|
||||
device=dev;
|
||||
frame_buffer=fb;
|
||||
|
@ -9,7 +9,6 @@ VK_NAMESPACE_BEGIN
|
||||
RenderTarget::RenderTarget(DeviceQueue *q,Semaphore *s)
|
||||
{
|
||||
queue=q;
|
||||
render_pass=nullptr;
|
||||
fbo=nullptr;
|
||||
|
||||
color_count=0;
|
||||
@ -18,10 +17,9 @@ RenderTarget::RenderTarget(DeviceQueue *q,Semaphore *s)
|
||||
render_complete_semaphore=s;
|
||||
}
|
||||
|
||||
RenderTarget::RenderTarget(DeviceQueue *q,Semaphore *s,RenderPass *_rp,Framebuffer *_fb,Texture2D **ctl,const uint32_t cc,Texture2D *dt)
|
||||
RenderTarget::RenderTarget(DeviceQueue *q,Semaphore *s,Framebuffer *_fb,Texture2D **ctl,const uint32_t cc,Texture2D *dt)
|
||||
{
|
||||
queue=q;
|
||||
render_pass=_rp;
|
||||
fbo=_fb;
|
||||
|
||||
depth_texture=dt;
|
||||
|
@ -3,7 +3,7 @@
|
||||
#include<hgl/graph/VKSemaphore.h>
|
||||
|
||||
VK_NAMESPACE_BEGIN
|
||||
RTSwapchain::RTSwapchain(VkDevice dev,Swapchain *sc,DeviceQueue *q,Semaphore *rcs,Semaphore *pcs,RenderPass *rp):RenderTarget(q,rcs)
|
||||
RTSwapchain::RTSwapchain(VkDevice dev,Swapchain *sc,DeviceQueue *q,Semaphore *rcs,Semaphore *pcs):RenderTarget(q,rcs)
|
||||
{
|
||||
device=dev;
|
||||
|
||||
@ -15,8 +15,6 @@ RTSwapchain::RTSwapchain(VkDevice dev,Swapchain *sc,DeviceQueue *q,Semaphore *rc
|
||||
present_info.pResults = nullptr;
|
||||
present_info.pSwapchains = &(swapchain->swap_chain);
|
||||
|
||||
render_pass=rp;
|
||||
|
||||
extent=swapchain->extent;
|
||||
|
||||
current_frame=0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user