diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index 3a56d1f4..87bd4c88 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -54,15 +54,10 @@ protected: protected: GPUDevice * device =nullptr; - RenderPass * device_render_pass =nullptr; RTSwapchain * sc_render_target =nullptr; protected: - int32_t swap_chain_count =0; - - RenderCmdBuffer ** cmd_buf =nullptr; - Color4f clear_color; protected: @@ -91,7 +86,6 @@ public: win->Unjoin(this); SAFE_CLEAR(db); - SAFE_CLEAR_OBJECT_ARRAY_OBJECT(cmd_buf,swap_chain_count); SAFE_CLEAR(device); SAFE_CLEAR(win); @@ -146,14 +140,12 @@ public: if(!device) return(false); + + sc_render_target=device->GetSwapchainRT(); } - device_render_pass=device->GetRenderPass(); - db=new RenderResource(device); - InitCommandBuffer(); - win->Join(this); { @@ -198,26 +190,9 @@ public: if(w>0&&h>0) device->Resize(w,h); - InitCommandBuffer(); - Resize(w,h); - } - - void InitCommandBuffer() - { - if(cmd_buf) - SAFE_CLEAR_OBJECT_ARRAY_OBJECT(cmd_buf,swap_chain_count); - sc_render_target=device->GetSwapchainRT(); - swap_chain_count=sc_render_target->GetImageCount(); - { - const VkExtent2D extent=sc_render_target->GetExtent(); - - cmd_buf=hgl_zero_new(swap_chain_count); - - for(int32_t i=0;iCreateRenderCommandBuffer(device->GetPhysicalDevice()->GetDeviceName()+AnsiString(":RenderCmdBuffer_")+AnsiString::numberOf(i)); - } + Resize(w,h); } bool BuildCommandBuffer(RenderCmdBuffer *cb,RenderPass *rp,Framebuffer *fb,Renderable *ri) @@ -250,14 +225,16 @@ public: { if(!ri)return(false); - return BuildCommandBuffer(cmd_buf[index],sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index),ri); + return BuildCommandBuffer(sc_render_target->GetRenderCmdBuffer(index), + sc_render_target->GetRenderPass(), + sc_render_target->GetFramebuffer(index),ri); } bool BuildCommandBuffer(Renderable *ri) { if(!ri)return(false); - for(int32_t i=0;iGetImageCount();i++) BuildCommandBuffer(i,ri); return(true); @@ -274,7 +251,7 @@ public: { if(!rl)return; - RenderCmdBuffer *cb=cmd_buf[index]; + RenderCmdBuffer *cb=sc_render_target->GetRenderCmdBuffer(index); cb->Begin(); cb->BindFramebuffer(sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index)); @@ -287,7 +264,7 @@ public: void BuildCommandBuffer(RenderList *rl) { - for(int32_t i=0;iGetImageCount();i++) BuildCommandBuffer(i,rl); } @@ -299,7 +276,7 @@ public: template Pipeline *CreatePipeline(ARGS...args) { - Pipeline *p=device_render_pass->CreatePipeline(args...); + Pipeline *p=sc_render_target->GetRenderPass()->CreatePipeline(args...); if(!p) return(nullptr); @@ -323,7 +300,7 @@ public: virtual void SubmitDraw(int index) { - VkCommandBuffer cb=*cmd_buf[index]; + VkCommandBuffer cb=*(sc_render_target->GetRenderCmdBuffer(index)); sc_render_target->Submit(cb); sc_render_target->PresentBackbuffer(); @@ -335,7 +312,7 @@ public: { int index=AcquireNextImage(); - if(index<0||index>=swap_chain_count)return; + if(index<0||index>=sc_render_target->GetImageCount())return; SubmitDraw(index); } diff --git a/inc/hgl/graph/VKRenderTarget.h b/inc/hgl/graph/VKRenderTarget.h index f09a9ab4..11bfdd98 100644 --- a/inc/hgl/graph/VKRenderTarget.h +++ b/inc/hgl/graph/VKRenderTarget.h @@ -80,7 +80,6 @@ public: ~RTSwapchain(); const uint32_t GetColorCount ()const override {return 1;} ///Swapchain的FBO颜色成份只有一个 - const uint32_t GetImageCount ()const {return swapchain->image_count;} Framebuffer * GetFramebuffer ()override {return swapchain->sc_image[current_frame].fbo;} @@ -89,6 +88,11 @@ public: 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; + } + public: const uint32_t GetCurrentFrameIndices ()const {return current_frame;} diff --git a/inc/hgl/graph/VKSwapchain.h b/inc/hgl/graph/VKSwapchain.h index fedeb962..9fc4e783 100644 --- a/inc/hgl/graph/VKSwapchain.h +++ b/inc/hgl/graph/VKSwapchain.h @@ -4,6 +4,7 @@ #include #include #include +#include VK_NAMESPACE_BEGIN struct SwapchainImage @@ -13,10 +14,13 @@ struct SwapchainImage Framebuffer * fbo =nullptr; + RenderCmdBuffer * cmd_buf =nullptr; + public: ~SwapchainImage() { + delete cmd_buf; delete fbo; delete depth; delete color; diff --git a/src/SceneGraph/Vulkan/VKDeviceSwapchain.cpp b/src/SceneGraph/Vulkan/VKDeviceSwapchain.cpp index cc10ddf1..43c6aee6 100644 --- a/src/SceneGraph/Vulkan/VKDeviceSwapchain.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceSwapchain.cpp @@ -95,6 +95,9 @@ bool GPUDevice::CreateSwapchainFBO(Swapchain *swapchain) swapchain->sc_image=hgl_zero_new(swapchain->image_count); + AnsiString num_string; + + for(uint32_t i=0;iimage_count;i++) { swapchain->sc_image[i].color=CreateTexture2D(new SwapchainColorTextureCreateInfo(swapchain->surface_format.format,swapchain->extent,sc_images[i])); @@ -111,15 +114,19 @@ bool GPUDevice::CreateSwapchainFBO(Swapchain *swapchain) swapchain->sc_image[i].color->GetImageView(), swapchain->sc_image[i].depth->GetImageView()); + AnsiString num_string=AnsiString::numberOf(i); + + swapchain->sc_image[i].cmd_buf=CreateRenderCommandBuffer(AnsiString("Swapchain_RenderCmdBuffer_")+num_string); + #ifdef _DEBUG if(attr->debug_utils) { AnsiString num=AnsiString::numberOf(i); - attr->debug_utils->SetTexture(swapchain->sc_image[i].color,"SwapchainColor_"+num); - attr->debug_utils->SetTexture(swapchain->sc_image[i].depth,"SwapchainDepth_"+num); + attr->debug_utils->SetTexture(swapchain->sc_image[i].color,"SwapchainColor_"+num_string); + attr->debug_utils->SetTexture(swapchain->sc_image[i].depth,"SwapchainDepth_"+num_string); - attr->debug_utils->SetFramebuffer(swapchain->sc_image[i].fbo->GetFramebuffer(),"SwapchainFBO_"+num); + attr->debug_utils->SetFramebuffer(swapchain->sc_image[i].fbo->GetFramebuffer(),"SwapchainFBO_"+num_string); } #endif//_DEBUG }