实现延迟渲染之间的信号等待(未完成)

This commit is contained in:
hyzboy 2019-07-16 21:32:29 +08:00
parent 396363d303
commit ad200efa71
5 changed files with 32 additions and 4 deletions

View File

@ -46,6 +46,11 @@ private:
struct DeferredGBuffer struct DeferredGBuffer
{ {
vulkan::Semaphore *present_complete_semaphore =nullptr,
*render_complete_semaphore =nullptr;
vulkan::RenderTarget *rt;
VkExtent2D extent; VkExtent2D extent;
vulkan::Framebuffer *framebuffer; vulkan::Framebuffer *framebuffer;
vulkan::RenderPass *renderpass; vulkan::RenderPass *renderpass;
@ -152,6 +157,9 @@ private:
gbuffer.extent.width =512; gbuffer.extent.width =512;
gbuffer.extent.height =512; gbuffer.extent.height =512;
gbuffer.present_complete_semaphore =device->CreateSem();
gbuffer.render_complete_semaphore =device->CreateSem();
//根据候选格式表选择格式 //根据候选格式表选择格式
//const VkFormat position_format =GetCandidateFormat(position_candidate_format, sizeof(position_candidate_format)); //const VkFormat position_format =GetCandidateFormat(position_candidate_format, sizeof(position_candidate_format));
//const VkFormat color_format =GetCandidateFormat(color_candidate_format, sizeof(color_candidate_format)); //const VkFormat color_format =GetCandidateFormat(color_candidate_format, sizeof(color_candidate_format));
@ -208,6 +216,8 @@ private:
if(!gbuffer.framebuffer) if(!gbuffer.framebuffer)
return(false); return(false);
gbuffer.rt=device->CreateRenderTarget(gbuffer.framebuffer);
return(true); return(true);
} }
@ -227,7 +237,7 @@ private:
bool InitGBufferPipeline(SubpassParam *sp) bool InitGBufferPipeline(SubpassParam *sp)
{ {
AutoDelete<vulkan::PipelineCreater> pipeline_creater=new vulkan::PipelineCreater(device,sp->material,gbuffer.renderpass,gbuffer.extent); AutoDelete<vulkan::PipelineCreater> pipeline_creater=new vulkan::PipelineCreater(device,sp->material,gbuffer.rt);
pipeline_creater->Set(PRIM_TRIANGLES); pipeline_creater->Set(PRIM_TRIANGLES);
sp->pipeline_solid=pipeline_creater->Create(); sp->pipeline_solid=pipeline_creater->Create();
@ -400,7 +410,7 @@ private:
return(false); return(false);
gbuffer_cmd->Begin(); gbuffer_cmd->Begin();
if(!gbuffer_cmd->BeginRenderPass(gbuffer.renderpass,gbuffer.framebuffer)) if(!gbuffer_cmd->BeginRenderPass(gbuffer.rt))
return(false); return(false);
render_list.Render(gbuffer_cmd); render_list.Render(gbuffer_cmd);
@ -408,7 +418,7 @@ private:
gbuffer_cmd->EndRenderPass(); gbuffer_cmd->EndRenderPass();
gbuffer_cmd->End(); gbuffer_cmd->End();
device->Submit(*gbuffer_cmd); gbuffer.rt->Submit(*gbuffer_cmd,gbuffer.present_complete_semaphore,gbuffer.render_complete_semaphore);
return(true); return(true);
} }
@ -435,6 +445,15 @@ public:
return(true); return(true);
} }
virtual void SubmitDraw(int index)
{
VkCommandBuffer cb=*cmd_buf[index];
sc_render_target->Submit(cb,present_complete_semaphore,render_complete_semaphore);
sc_render_target->PresentBackbuffer(render_complete_semaphore);
sc_render_target->Wait();
}
void BuildCommandBuffer(uint32_t index) override void BuildCommandBuffer(uint32_t index) override
{ {
render_root.RefreshMatrix(); render_root.RefreshMatrix();

View File

@ -226,7 +226,7 @@ public:
return sc_render_target->AcquireNextImage(present_complete_semaphore); return sc_render_target->AcquireNextImage(present_complete_semaphore);
} }
void SubmitDraw(int index) virtual void SubmitDraw(int index)
{ {
VkCommandBuffer cb=*cmd_buf[index]; VkCommandBuffer cb=*cmd_buf[index];

View File

@ -92,6 +92,7 @@ public:
} }
bool BeginRenderPass(VkRenderPass rp,VkFramebuffer fb); bool BeginRenderPass(VkRenderPass rp,VkFramebuffer fb);
bool BeginRenderPass(RenderTarget *rt);
bool Bind(Pipeline *p) bool Bind(Pipeline *p)
{ {

View File

@ -53,6 +53,7 @@ public:
const VkExtent2D & GetExtent()const{return extent;} const VkExtent2D & GetExtent()const{return extent;}
virtual const VkRenderPass GetRenderPass()const{return fb->GetRenderPass();} virtual const VkRenderPass GetRenderPass()const{return fb->GetRenderPass();}
virtual const uint32_t GetColorCount()const{return fb->GetColorCount();} virtual const uint32_t GetColorCount()const{return fb->GetColorCount();}
virtual const VkFramebuffer GetFramebuffer()const{return fb->GetFramebuffer();}
};//class RenderTarget };//class RenderTarget
/** /**
@ -77,6 +78,7 @@ public:
~SwapchainRenderTarget(); ~SwapchainRenderTarget();
const VkRenderPass GetRenderPass()const override{return *main_rp;} const VkRenderPass GetRenderPass()const override{return *main_rp;}
const VkFramebuffer GetFramebuffer()const override{return render_frame[current_frame]->GetFramebuffer();}
VkFramebuffer GetFramebuffer(const uint32_t index){return render_frame[index]->GetFramebuffer();} VkFramebuffer GetFramebuffer(const uint32_t index){return render_frame[index]->GetFramebuffer();}
const uint32_t GetColorCount()const override{return 1;} const uint32_t GetColorCount()const override{return 1;}

View File

@ -1,6 +1,7 @@
#include<hgl/graph/vulkan/VKCommandBuffer.h> #include<hgl/graph/vulkan/VKCommandBuffer.h>
#include<hgl/graph/vulkan/VKRenderPass.h> #include<hgl/graph/vulkan/VKRenderPass.h>
#include<hgl/graph/vulkan/VKFramebuffer.h> #include<hgl/graph/vulkan/VKFramebuffer.h>
#include<hgl/graph/vulkan/VKRenderTarget.h>
#include<hgl/graph/vulkan/VKPipeline.h> #include<hgl/graph/vulkan/VKPipeline.h>
#include<hgl/graph/vulkan/VKBuffer.h> #include<hgl/graph/vulkan/VKBuffer.h>
#include<hgl/graph/vulkan/VKMaterial.h> #include<hgl/graph/vulkan/VKMaterial.h>
@ -86,6 +87,11 @@ bool CommandBuffer::BeginRenderPass(VkRenderPass rp,VkFramebuffer fb)
return(true); return(true);
} }
bool CommandBuffer::BeginRenderPass(RenderTarget *rt)
{
return BeginRenderPass(rt->GetRenderPass(),rt->GetFramebuffer());
}
bool CommandBuffer::Bind(Renderable *render_obj) bool CommandBuffer::Bind(Renderable *render_obj)
{ {
if(!render_obj) if(!render_obj)