Create a copy for PipelineData while CreatePipeline

This commit is contained in:
hyzboy 2022-01-07 16:26:40 +08:00
parent ec7194ee13
commit 3bdf9bbb77
2 changed files with 39 additions and 23 deletions

View File

@ -25,6 +25,8 @@ protected:
ObjectList<Pipeline> pipeline_list; ObjectList<Pipeline> pipeline_list;
Pipeline *CreatePipeline(Material *,PipelineData *,const VAB *);
private: private:
friend class DeviceRenderPassManage; friend class DeviceRenderPassManage;
@ -52,13 +54,13 @@ public:
public: public:
Pipeline *CreatePipeline(MaterialInstance *, PipelineData *); Pipeline *CreatePipeline(MaterialInstance *, const PipelineData *);
Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &); 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);
Pipeline *CreatePipeline(MaterialInstance *, PipelineData *, const Prim &prim,const bool prim_restart=false); Pipeline *CreatePipeline(MaterialInstance *, const PipelineData *, const Prim &prim,const bool prim_restart=false);
Pipeline *CreatePipeline(MaterialInstance *, const OSString &, const Prim &prim,const bool prim_restart=false); Pipeline *CreatePipeline(MaterialInstance *, const OSString &, const Prim &prim,const bool prim_restart=false);
};//class RenderPass };//class RenderPass
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -23,37 +23,47 @@ RenderPass::~RenderPass()
vkDestroyRenderPass(device,render_pass,nullptr); vkDestroyRenderPass(device,render_pass,nullptr);
} }
Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,PipelineData *data) Pipeline *RenderPass::CreatePipeline(Material *mtl,PipelineData *pd,const VAB *vab)
{ {
VkPipeline graphicsPipeline; VkPipeline graphicsPipeline;
Material *mtl=mi->GetMaterial(); pd->InitShaderStage(mtl->GetStageList());
pd->InitVertexInputState(vab);
data->InitShaderStage(mtl->GetStageList()); pd->SetColorAttachments(color_formats.GetCount());
data->InitVertexInputState(mi->GetVAB());
data->SetColorAttachments(color_formats.GetCount()); pd->pipeline_info.layout = mtl->GetPipelineLayout();
data->pipeline_info.layout = mtl->GetPipelineLayout();
{ {
data->pipeline_info.renderPass = render_pass; pd->pipeline_info.renderPass = render_pass;
data->pipeline_info.subpass = 0; //subpass由于还不知道有什么用所以暂时写0待知道功用后需改进 pd->pipeline_info.subpass = 0; //subpass由于还不知道有什么用所以暂时写0待知道功用后需改进
} }
if (vkCreateGraphicsPipelines( device, if (vkCreateGraphicsPipelines( device,
pipeline_cache, pipeline_cache,
1,&data->pipeline_info, 1,&pd->pipeline_info,
nullptr, nullptr,
&graphicsPipeline) != VK_SUCCESS) &graphicsPipeline) != VK_SUCCESS)
{
delete pd;
return(nullptr); return(nullptr);
}
return(new Pipeline(device,graphicsPipeline,data)); 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->GetVAB());
} }
Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const InlinePipeline &ip) Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const InlinePipeline &ip)
{ {
PipelineData *pd=GetPipelineData(ip); const PipelineData *pd=GetPipelineData(ip);
if(!pd)return(nullptr); if(!pd)return(nullptr);
@ -64,11 +74,13 @@ Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const InlinePipeline &
{ {
if(!mi)return(nullptr); if(!mi)return(nullptr);
PipelineData *pd=GetPipelineData(ip); const PipelineData *cpd=GetPipelineData(ip);
PipelineData *pd=new PipelineData(cpd);
pd->Set(prim,prim_restart); pd->Set(prim,prim_restart);
Pipeline *p=CreatePipeline(mi,pd); Pipeline *p=CreatePipeline(mi->GetMaterial(),pd,mi->GetVAB());
if(p) if(p)
pipeline_list.Add(p); pipeline_list.Add(p);
@ -76,11 +88,13 @@ Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const InlinePipeline &
return p; return p;
} }
Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,PipelineData *pd,const Prim &prim,const bool prim_restart) Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const PipelineData *cpd,const Prim &prim,const bool prim_restart)
{ {
PipelineData *pd=new PipelineData(cpd);
pd->Set(prim,prim_restart); pd->Set(prim,prim_restart);
Pipeline *p=CreatePipeline(mi,pd); Pipeline *p=CreatePipeline(mi->GetMaterial(),pd,mi->GetVAB());
if(p) if(p)
pipeline_list.Add(p); pipeline_list.Add(p);
@ -90,7 +104,7 @@ Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,PipelineData *pd,const
Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const OSString &pipeline_filename,const Prim &prim,const bool prim_restart) Pipeline *RenderPass::CreatePipeline(MaterialInstance *mi,const OSString &pipeline_filename,const Prim &prim,const bool prim_restart)
{ {
PipelineData *pd=GetPipelineData(pipeline_filename); const PipelineData *pd=GetPipelineData(pipeline_filename);
if(!pd)return(nullptr); if(!pd)return(nullptr);