optimized CreatePipeline of RenderPass class

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-02-23 14:43:57 +08:00
parent 844636a46b
commit 99939bd83d
4 changed files with 16 additions and 35 deletions

@ -1 +1 @@
Subproject commit ee17ef4c80334b4aecbebd56a7c329e647572812 Subproject commit 09fe2f07ba212393a4b8d3eeffe82f01a058ddc3

View File

@ -94,7 +94,7 @@ private:
return pipeline; return pipeline;
} }
bool InitVBO() bool InitVBO()
{ {
RenderablePrimitiveCreater rpc(db,VERTEX_COUNT); RenderablePrimitiveCreater rpc(db,VERTEX_COUNT);

View File

@ -25,7 +25,7 @@ protected:
ObjectList<Pipeline> pipeline_list; ObjectList<Pipeline> pipeline_list;
Pipeline *CreatePipeline(Material *,PipelineData *,const VIL *); Pipeline *CreatePipeline(PipelineData *,const ShaderStageCreateInfoList &,VkPipelineLayout,const VIL *);
private: private:
@ -52,11 +52,6 @@ public:
const VkExtent2D & GetGranularity()const{return granularity;} const VkExtent2D & GetGranularity()const{return granularity;}
public:
Pipeline *CreatePipeline(MaterialInstance *, const PipelineData *);
Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &);
public: public:
Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &, const Prim &prim,const bool prim_restart=false); Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &, const Prim &prim,const bool prim_restart=false);

View File

@ -23,16 +23,16 @@ RenderPass::~RenderPass()
vkDestroyRenderPass(device,render_pass,nullptr); 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; VkPipeline graphicsPipeline;
pd->InitShaderStage(mtl->GetStageList()); pd->InitShaderStage(ssci_list);
pd->InitVertexInputState(vil); pd->InitVertexInputState(vil);
pd->SetColorAttachments(color_formats.GetCount()); pd->SetColorAttachments(color_formats.GetCount());
pd->pipeline_info.layout = mtl->GetPipelineLayout(); pd->pipeline_info.layout = pl;
{ {
pd->pipeline_info.renderPass = render_pass; pd->pipeline_info.renderPass = render_pass;
@ -45,6 +45,8 @@ Pipeline *RenderPass::CreatePipeline(Material *mtl,PipelineData *pd,const VIL *v
nullptr, nullptr,
&graphicsPipeline) != VK_SUCCESS) &graphicsPipeline) != VK_SUCCESS)
{ {
//有一种常见问题就是PipelineData未调用SetPrim
delete pd; delete pd;
return(nullptr); return(nullptr);
} }
@ -52,35 +54,18 @@ Pipeline *RenderPass::CreatePipeline(Material *mtl,PipelineData *pd,const VIL *v
return(new Pipeline(device,graphicsPipeline,pd)); 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) Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const InlinePipeline &ip,const Prim &prim,const bool prim_restart)
{ {
if(!mi)return(nullptr); if(!mi)return(nullptr);
Material *mtl=mi->GetMaterial();
const PipelineData *cpd=GetPipelineData(ip); const PipelineData *cpd=GetPipelineData(ip);
PipelineData *pd=new PipelineData(cpd); 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) if(p)
pipeline_list.Add(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) Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const PipelineData *cpd,const Prim &prim,const bool prim_restart)
{ {
Material *mtl=mi->GetMaterial();
PipelineData *pd=new PipelineData(cpd); 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) if(p)
pipeline_list.Add(p); pipeline_list.Add(p);