From 99939bd83dd44bc33716985b578e9e591a52f9f0 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Thu, 23 Feb 2023 14:43:57 +0800 Subject: [PATCH] optimized CreatePipeline of RenderPass class --- CMSceneGraph | 2 +- example/Vulkan/first_triangle.cpp | 2 +- inc/hgl/graph/VKRenderPass.h | 7 +---- src/SceneGraph/Vulkan/VKRenderPass.cpp | 40 +++++++++----------------- 4 files changed, 16 insertions(+), 35 deletions(-) diff --git a/CMSceneGraph b/CMSceneGraph index ee17ef4c..09fe2f07 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit ee17ef4c80334b4aecbebd56a7c329e647572812 +Subproject commit 09fe2f07ba212393a4b8d3eeffe82f01a058ddc3 diff --git a/example/Vulkan/first_triangle.cpp b/example/Vulkan/first_triangle.cpp index 8e97f483..4a95d593 100644 --- a/example/Vulkan/first_triangle.cpp +++ b/example/Vulkan/first_triangle.cpp @@ -94,7 +94,7 @@ private: return pipeline; } - + bool InitVBO() { RenderablePrimitiveCreater rpc(db,VERTEX_COUNT); diff --git a/inc/hgl/graph/VKRenderPass.h b/inc/hgl/graph/VKRenderPass.h index f8be2043..e7e0cdd1 100644 --- a/inc/hgl/graph/VKRenderPass.h +++ b/inc/hgl/graph/VKRenderPass.h @@ -25,7 +25,7 @@ protected: ObjectList pipeline_list; - Pipeline *CreatePipeline(Material *,PipelineData *,const VIL *); + Pipeline *CreatePipeline(PipelineData *,const ShaderStageCreateInfoList &,VkPipelineLayout,const VIL *); private: @@ -52,11 +52,6 @@ public: const VkExtent2D & GetGranularity()const{return granularity;} -public: - - Pipeline *CreatePipeline(MaterialInstance *, const PipelineData *); - Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &); - public: Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &, const Prim &prim,const bool prim_restart=false); diff --git a/src/SceneGraph/Vulkan/VKRenderPass.cpp b/src/SceneGraph/Vulkan/VKRenderPass.cpp index bfaffff0..44a8cbdd 100644 --- a/src/SceneGraph/Vulkan/VKRenderPass.cpp +++ b/src/SceneGraph/Vulkan/VKRenderPass.cpp @@ -23,16 +23,16 @@ RenderPass::~RenderPass() vkDestroyRenderPass(device,render_pass,nullptr); } -Pipeline *RenderPass::CreatePipeline(Material *mtl,PipelineData *pd,const VIL *vil) +Pipeline *RenderPass::CreatePipeline(PipelineData *pd,const ShaderStageCreateInfoList &ssci_list,VkPipelineLayout pl,const VIL *vil) { VkPipeline graphicsPipeline; - pd->InitShaderStage(mtl->GetStageList()); + pd->InitShaderStage(ssci_list); pd->InitVertexInputState(vil); pd->SetColorAttachments(color_formats.GetCount()); - pd->pipeline_info.layout = mtl->GetPipelineLayout(); + pd->pipeline_info.layout = pl; { pd->pipeline_info.renderPass = render_pass; @@ -45,6 +45,8 @@ Pipeline *RenderPass::CreatePipeline(Material *mtl,PipelineData *pd,const VIL *v nullptr, &graphicsPipeline) != VK_SUCCESS) { + //有一种常见问题就是PipelineData未调用SetPrim + delete pd; return(nullptr); } @@ -52,35 +54,18 @@ Pipeline *RenderPass::CreatePipeline(Material *mtl,PipelineData *pd,const VIL *v return(new Pipeline(device,graphicsPipeline,pd)); } -Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const PipelineData *data) -{ - Material *mtl=mi->GetMaterial(); - - PipelineData *pd=new PipelineData(data); - - return CreatePipeline(mtl,pd,mi->GetVIL()); -} - -Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const InlinePipeline &ip) -{ - const PipelineData *pd=GetPipelineData(ip); - - if(!pd)return(nullptr); - - return CreatePipeline(mi,pd); -} - Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const InlinePipeline &ip,const Prim &prim,const bool prim_restart) { if(!mi)return(nullptr); - + + Material *mtl=mi->GetMaterial(); const PipelineData *cpd=GetPipelineData(ip); PipelineData *pd=new PipelineData(cpd); - pd->Set(prim,prim_restart); + pd->SetPrim(prim,prim_restart); - Pipeline *p=CreatePipeline(mi->GetMaterial(),pd,mi->GetVIL()); + Pipeline *p=CreatePipeline(pd,mtl->GetStageList(),mtl->GetPipelineLayout(),mi->GetVIL()); if(p) pipeline_list.Add(p); @@ -90,11 +75,12 @@ Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const InlinePipeline & Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const PipelineData *cpd,const Prim &prim,const bool prim_restart) { + Material *mtl=mi->GetMaterial(); PipelineData *pd=new PipelineData(cpd); - pd->Set(prim,prim_restart); - - Pipeline *p=CreatePipeline(mi->GetMaterial(),pd,mi->GetVIL()); + pd->SetPrim(prim,prim_restart); + + Pipeline *p=CreatePipeline(pd,mtl->GetStageList(),mtl->GetPipelineLayout(),mi->GetVIL()); if(p) pipeline_list.Add(p);