diff --git a/example/Vulkan/Deferred.cpp b/example/Vulkan/Deferred.cpp index b72deeb2..6a7eb0ad 100644 --- a/example/Vulkan/Deferred.cpp +++ b/example/Vulkan/Deferred.cpp @@ -46,6 +46,11 @@ private: struct DeferredGBuffer { + vulkan::Semaphore *present_complete_semaphore =nullptr, + *render_complete_semaphore =nullptr; + + vulkan::RenderTarget *rt; + VkExtent2D extent; vulkan::Framebuffer *framebuffer; vulkan::RenderPass *renderpass; @@ -152,6 +157,9 @@ private: gbuffer.extent.width =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 color_format =GetCandidateFormat(color_candidate_format, sizeof(color_candidate_format)); @@ -208,6 +216,8 @@ private: if(!gbuffer.framebuffer) return(false); + gbuffer.rt=device->CreateRenderTarget(gbuffer.framebuffer); + return(true); } @@ -227,7 +237,7 @@ private: bool InitGBufferPipeline(SubpassParam *sp) { - AutoDelete pipeline_creater=new vulkan::PipelineCreater(device,sp->material,gbuffer.renderpass,gbuffer.extent); + AutoDelete pipeline_creater=new vulkan::PipelineCreater(device,sp->material,gbuffer.rt); pipeline_creater->Set(PRIM_TRIANGLES); sp->pipeline_solid=pipeline_creater->Create(); @@ -400,7 +410,7 @@ private: return(false); gbuffer_cmd->Begin(); - if(!gbuffer_cmd->BeginRenderPass(gbuffer.renderpass,gbuffer.framebuffer)) + if(!gbuffer_cmd->BeginRenderPass(gbuffer.rt)) return(false); render_list.Render(gbuffer_cmd); @@ -408,7 +418,7 @@ private: gbuffer_cmd->EndRenderPass(); gbuffer_cmd->End(); - device->Submit(*gbuffer_cmd); + gbuffer.rt->Submit(*gbuffer_cmd,gbuffer.present_complete_semaphore,gbuffer.render_complete_semaphore); return(true); } @@ -435,6 +445,15 @@ public: 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 { render_root.RefreshMatrix(); diff --git a/example/Vulkan/VulkanAppFramework.h b/example/Vulkan/VulkanAppFramework.h index 34062d59..90050705 100644 --- a/example/Vulkan/VulkanAppFramework.h +++ b/example/Vulkan/VulkanAppFramework.h @@ -226,7 +226,7 @@ public: return sc_render_target->AcquireNextImage(present_complete_semaphore); } - void SubmitDraw(int index) + virtual void SubmitDraw(int index) { VkCommandBuffer cb=*cmd_buf[index]; diff --git a/inc/hgl/graph/vulkan/VKCommandBuffer.h b/inc/hgl/graph/vulkan/VKCommandBuffer.h index e54d390e..4896a5f9 100644 --- a/inc/hgl/graph/vulkan/VKCommandBuffer.h +++ b/inc/hgl/graph/vulkan/VKCommandBuffer.h @@ -92,6 +92,7 @@ public: } bool BeginRenderPass(VkRenderPass rp,VkFramebuffer fb); + bool BeginRenderPass(RenderTarget *rt); bool Bind(Pipeline *p) { diff --git a/inc/hgl/graph/vulkan/VKRenderTarget.h b/inc/hgl/graph/vulkan/VKRenderTarget.h index ab6748bf..e663e1dc 100644 --- a/inc/hgl/graph/vulkan/VKRenderTarget.h +++ b/inc/hgl/graph/vulkan/VKRenderTarget.h @@ -53,6 +53,7 @@ public: const VkExtent2D & GetExtent()const{return extent;} virtual const VkRenderPass GetRenderPass()const{return fb->GetRenderPass();} virtual const uint32_t GetColorCount()const{return fb->GetColorCount();} + virtual const VkFramebuffer GetFramebuffer()const{return fb->GetFramebuffer();} };//class RenderTarget /** @@ -77,6 +78,7 @@ public: ~SwapchainRenderTarget(); 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();} const uint32_t GetColorCount()const override{return 1;} diff --git a/src/RenderDevice/Vulkan/VKCommandBuffer.cpp b/src/RenderDevice/Vulkan/VKCommandBuffer.cpp index d81ef39c..71c24f18 100644 --- a/src/RenderDevice/Vulkan/VKCommandBuffer.cpp +++ b/src/RenderDevice/Vulkan/VKCommandBuffer.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -86,6 +87,11 @@ bool CommandBuffer::BeginRenderPass(VkRenderPass rp,VkFramebuffer fb) return(true); } +bool CommandBuffer::BeginRenderPass(RenderTarget *rt) +{ + return BeginRenderPass(rt->GetRenderPass(),rt->GetFramebuffer()); +} + bool CommandBuffer::Bind(Renderable *render_obj) { if(!render_obj)