Moved Pipeline to MaterialRenderMap from MaterialRenderList

This commit is contained in:
hyzboy 2024-10-20 21:41:27 +08:00
parent 6e54a4051d
commit 0df9d64dcf
5 changed files with 61 additions and 49 deletions

View File

@ -8,6 +8,41 @@ class RenderAssignBuffer;
class SceneNode; class SceneNode;
struct CameraInfo; struct CameraInfo;
struct RenderPipelineIndex
{
Material *material;
Pipeline *pipeline;
public:
const int Comp(const RenderPipelineIndex &rli)const
{
if(material<rli.material)return(-1);
if(material>rli.material)return(1);
if(pipeline<rli.pipeline)return(-1);
if(pipeline>rli.pipeline)return(1);
return(0);
}
CompOperator(const RenderPipelineIndex &,Comp)
public:
RenderPipelineIndex()
{
material=nullptr;
pipeline=nullptr;
}
RenderPipelineIndex(Material *m,Pipeline *p)
{
material=m;
pipeline=p;
}
};//struct RenderPipelineIndex
/** /**
* *
*/ */
@ -16,7 +51,7 @@ class MaterialRenderList
GPUDevice *device; GPUDevice *device;
RenderCmdBuffer *cmd_buf; RenderCmdBuffer *cmd_buf;
Material *material; RenderPipelineIndex rp_index;
CameraInfo *camera_info; CameraInfo *camera_info;
@ -33,7 +68,6 @@ private:
uint32_t first_instance; ///<第一个绘制实例(和instance渲染无关,对应InstanceRate的VAB) uint32_t first_instance; ///<第一个绘制实例(和instance渲染无关,对应InstanceRate的VAB)
uint32_t instance_count; uint32_t instance_count;
Pipeline * pipeline;
MaterialInstance * mi; MaterialInstance * mi;
const PrimitiveDataBuffer * pdb; const PrimitiveDataBuffer * pdb;
@ -60,7 +94,6 @@ protected:
VABList * vab_list; VABList * vab_list;
Pipeline * last_pipeline;
const PrimitiveDataBuffer * last_data_buffer; const PrimitiveDataBuffer * last_data_buffer;
const VDM * last_vdm; const VDM * last_vdm;
const PrimitiveRenderData * last_render_data; const PrimitiveRenderData * last_render_data;
@ -75,7 +108,7 @@ protected:
public: public:
MaterialRenderList(GPUDevice *d,bool l2w,Material *m); MaterialRenderList(GPUDevice *d,bool l2w,const RenderPipelineIndex &rpi);
~MaterialRenderList(); ~MaterialRenderList();
void Add(SceneNode *); void Add(SceneNode *);

View File

@ -2,7 +2,7 @@
#include<hgl/graph/MaterialRenderList.h> #include<hgl/graph/MaterialRenderList.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
class MaterialRenderMap:public ObjectMap<Material *,MaterialRenderList> class MaterialRenderMap:public ObjectMap<RenderPipelineIndex,MaterialRenderList>
{ {
public: public:

View File

@ -34,15 +34,6 @@ int Comparator<hgl::graph::RenderNode>::compare(const hgl::graph::RenderNode &ob
hgl::graph::Renderable *ri_one=obj_one.scene_node->GetRenderable(); hgl::graph::Renderable *ri_one=obj_one.scene_node->GetRenderable();
hgl::graph::Renderable *ri_two=obj_two.scene_node->GetRenderable(); hgl::graph::Renderable *ri_two=obj_two.scene_node->GetRenderable();
//比较管线
{
off=ri_one->GetPipeline()
-ri_two->GetPipeline();
if(off)
return off;
}
auto *prim_one=ri_one->GetPrimitive(); auto *prim_one=ri_one->GetPrimitive();
auto *prim_two=ri_two->GetPrimitive(); auto *prim_two=ri_two->GetPrimitive();
@ -82,17 +73,17 @@ int Comparator<hgl::graph::RenderNode>::compare(const hgl::graph::RenderNode &ob
} }
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
MaterialRenderList::MaterialRenderList(GPUDevice *d,bool l2w,Material *m) MaterialRenderList::MaterialRenderList(GPUDevice *d,bool l2w,const RenderPipelineIndex &rpi)
{ {
device=d; device=d;
cmd_buf=nullptr; cmd_buf=nullptr;
material=m; rp_index=rpi;
camera_info=nullptr; camera_info=nullptr;
assign_buffer=new RenderAssignBuffer(device,material); assign_buffer=new RenderAssignBuffer(device,rp_index.material);
vab_list=new VABList(material->GetVertexInput()->GetCount()); vab_list=new VABList(rp_index.material->GetVertexInput()->GetCount());
icb_draw=nullptr; icb_draw=nullptr;
icb_draw_indexed=nullptr; icb_draw_indexed=nullptr;
@ -215,7 +206,6 @@ void MaterialRenderList::UpdateMaterialInstance(SceneNode *sn)
void MaterialRenderList::RenderItem::Set(Renderable *ri) void MaterialRenderList::RenderItem::Set(Renderable *ri)
{ {
pipeline=ri->GetPipeline();
mi =ri->GetMaterialInstance(); mi =ri->GetMaterialInstance();
pdb =ri->GetDataBuffer(); pdb =ri->GetDataBuffer();
prd =ri->GetRenderData(); prd =ri->GetRenderData();
@ -280,7 +270,6 @@ void MaterialRenderList::Stat()
ri->instance_count=1; ri->instance_count=1;
ri->Set(ro); ri->Set(ro);
last_pipeline =ri->pipeline;
last_data_buffer=ri->pdb; last_data_buffer=ri->pdb;
last_vdm =ri->pdb->vdm; last_vdm =ri->pdb->vdm;
last_render_data=ri->prd; last_render_data=ri->prd;
@ -291,7 +280,6 @@ void MaterialRenderList::Stat()
{ {
ro=rn->scene_node->GetRenderable(); ro=rn->scene_node->GetRenderable();
if(last_pipeline==ro->GetPipeline())
if(last_data_buffer->Comp(ro->GetDataBuffer())) if(last_data_buffer->Comp(ro->GetDataBuffer()))
if(last_render_data->_Comp(ro->GetRenderData())==0) if(last_render_data->_Comp(ro->GetRenderData())==0)
{ {
@ -318,7 +306,6 @@ void MaterialRenderList::Stat()
ri->instance_count=1; ri->instance_count=1;
ri->Set(ro); ri->Set(ro);
last_pipeline =ri->pipeline;
last_data_buffer=ri->pdb; last_data_buffer=ri->pdb;
last_vdm =ri->pdb->vdm; last_vdm =ri->pdb->vdm;
last_render_data=ri->prd; last_render_data=ri->prd;
@ -412,16 +399,6 @@ void MaterialRenderList::ProcIndirectRender()
void MaterialRenderList::Render(RenderItem *ri) void MaterialRenderList::Render(RenderItem *ri)
{ {
if(last_pipeline!=ri->pipeline)
{
cmd_buf->BindPipeline(ri->pipeline);
last_pipeline=ri->pipeline;
last_data_buffer=nullptr;
//这里未来尝试换pipeline同时不换mi/primitive是否需要重新绑定mi/primitive
}
if(!ri->pdb->Comp(last_data_buffer)) //换buf了 if(!ri->pdb->Comp(last_data_buffer)) //换buf了
{ {
if(indirect_draw_count) //如果有间接绘制的数据,赶紧给画了 if(indirect_draw_count) //如果有间接绘制的数据,赶紧给画了
@ -460,15 +437,16 @@ void MaterialRenderList::Render(RenderCmdBuffer *rcb)
cmd_buf=rcb; cmd_buf=rcb;
last_pipeline =nullptr; cmd_buf->BindPipeline(rp_index.pipeline);
last_data_buffer=nullptr; last_data_buffer=nullptr;
last_vdm =nullptr; last_vdm =nullptr;
last_render_data=nullptr; last_render_data=nullptr;
if(assign_buffer) if(assign_buffer)
assign_buffer->Bind(material); assign_buffer->Bind(rp_index.material);
cmd_buf->BindDescriptorSets(material); cmd_buf->BindDescriptorSets(rp_index.material);
RenderItem *ri=ri_array.GetData(); RenderItem *ri=ri_array.GetData();
for(uint i=0;i<ri_count;i++) for(uint i=0;i<ri_count;i++)

View File

@ -26,14 +26,15 @@ namespace hgl
if(ri) if(ri)
{ {
Material *mtl=ri->GetMaterial(); RenderPipelineIndex rpi(ri->GetMaterial(),ri->GetPipeline());
MaterialRenderList *mrl; MaterialRenderList *mrl;
if(!mrl_map.Get(mtl,mrl)) if(!mrl_map.Get(rpi,mrl))
{ {
mrl=new MaterialRenderList(device,true,mtl); mrl=new MaterialRenderList(device,true,rpi);
mrl_map.Add(mtl,mrl); mrl_map.Add(rpi,mrl);
} }
mrl->Add(sn); mrl->Add(sn);
@ -92,10 +93,10 @@ namespace hgl
if(!ri)return; if(!ri)return;
Material *mtl=ri->GetMaterial(); RenderPipelineIndex rli(ri->GetMaterial(),ri->GetPipeline());
MaterialRenderList *mrl; MaterialRenderList *mrl;
if(!mrl_map.Get(mtl,mrl)) //找到对应的 if(!mrl_map.Get(rli,mrl)) //找到对应的
return; return;
mrl->UpdateMaterialInstance(sn); mrl->UpdateMaterialInstance(sn);