实现延迟渲染之间的信号等待(未完成)
This commit is contained in:
parent
396363d303
commit
ad200efa71
@ -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();
|
||||||
|
@ -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];
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;}
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user