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;
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;
RenderCmdBuffer *cmd_buf;
Material *material;
RenderPipelineIndex rp_index;
CameraInfo *camera_info;
@ -33,7 +68,6 @@ private:
uint32_t first_instance; ///<第一个绘制实例(和instance渲染无关,对应InstanceRate的VAB)
uint32_t instance_count;
Pipeline * pipeline;
MaterialInstance * mi;
const PrimitiveDataBuffer * pdb;
@ -60,7 +94,6 @@ protected:
VABList * vab_list;
Pipeline * last_pipeline;
const PrimitiveDataBuffer * last_data_buffer;
const VDM * last_vdm;
const PrimitiveRenderData * last_render_data;
@ -75,7 +108,7 @@ protected:
public:
MaterialRenderList(GPUDevice *d,bool l2w,Material *m);
MaterialRenderList(GPUDevice *d,bool l2w,const RenderPipelineIndex &rpi);
~MaterialRenderList();
void Add(SceneNode *);

View File

@ -2,7 +2,7 @@
#include<hgl/graph/MaterialRenderList.h>
VK_NAMESPACE_BEGIN
class MaterialRenderMap:public ObjectMap<Material *,MaterialRenderList>
class MaterialRenderMap:public ObjectMap<RenderPipelineIndex,MaterialRenderList>
{
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_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_two=ri_two->GetPrimitive();
@ -82,17 +73,17 @@ int Comparator<hgl::graph::RenderNode>::compare(const hgl::graph::RenderNode &ob
}
VK_NAMESPACE_BEGIN
MaterialRenderList::MaterialRenderList(GPUDevice *d,bool l2w,Material *m)
MaterialRenderList::MaterialRenderList(GPUDevice *d,bool l2w,const RenderPipelineIndex &rpi)
{
device=d;
cmd_buf=nullptr;
material=m;
rp_index=rpi;
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_indexed=nullptr;
@ -215,7 +206,6 @@ void MaterialRenderList::UpdateMaterialInstance(SceneNode *sn)
void MaterialRenderList::RenderItem::Set(Renderable *ri)
{
pipeline=ri->GetPipeline();
mi =ri->GetMaterialInstance();
pdb =ri->GetDataBuffer();
prd =ri->GetRenderData();
@ -280,7 +270,6 @@ void MaterialRenderList::Stat()
ri->instance_count=1;
ri->Set(ro);
last_pipeline =ri->pipeline;
last_data_buffer=ri->pdb;
last_vdm =ri->pdb->vdm;
last_render_data=ri->prd;
@ -291,7 +280,6 @@ void MaterialRenderList::Stat()
{
ro=rn->scene_node->GetRenderable();
if(last_pipeline==ro->GetPipeline())
if(last_data_buffer->Comp(ro->GetDataBuffer()))
if(last_render_data->_Comp(ro->GetRenderData())==0)
{
@ -318,7 +306,6 @@ void MaterialRenderList::Stat()
ri->instance_count=1;
ri->Set(ro);
last_pipeline =ri->pipeline;
last_data_buffer=ri->pdb;
last_vdm =ri->pdb->vdm;
last_render_data=ri->prd;
@ -412,16 +399,6 @@ void MaterialRenderList::ProcIndirectRender()
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(indirect_draw_count) //如果有间接绘制的数据,赶紧给画了
@ -460,15 +437,16 @@ void MaterialRenderList::Render(RenderCmdBuffer *rcb)
cmd_buf=rcb;
last_pipeline =nullptr;
cmd_buf->BindPipeline(rp_index.pipeline);
last_data_buffer=nullptr;
last_vdm =nullptr;
last_render_data=nullptr;
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();
for(uint i=0;i<ri_count;i++)

View File

@ -26,14 +26,15 @@ namespace hgl
if(ri)
{
Material *mtl=ri->GetMaterial();
RenderPipelineIndex rpi(ri->GetMaterial(),ri->GetPipeline());
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);
@ -92,10 +93,10 @@ namespace hgl
if(!ri)return;
Material *mtl=ri->GetMaterial();
RenderPipelineIndex rli(ri->GetMaterial(),ri->GetPipeline());
MaterialRenderList *mrl;
if(!mrl_map.Get(mtl,mrl)) //找到对应的
if(!mrl_map.Get(rli,mrl)) //找到对应的
return;
mrl->UpdateMaterialInstance(sn);