Moved Pipeline to MaterialRenderMap from MaterialRenderList
This commit is contained in:
parent
6e54a4051d
commit
0df9d64dcf
@ -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 *);
|
||||||
|
@ -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:
|
||||||
|
|
||||||
|
@ -283,7 +283,7 @@ public:
|
|||||||
|
|
||||||
inline GPUDevice *CreateRenderDevice( VulkanInstance *vi,
|
inline GPUDevice *CreateRenderDevice( VulkanInstance *vi,
|
||||||
Window *win,
|
Window *win,
|
||||||
const VulkanHardwareRequirement *req=nullptr,
|
const VulkanHardwareRequirement *req =nullptr,
|
||||||
const PreferFormats * spf_color =&PreferSDR,
|
const PreferFormats * spf_color =&PreferSDR,
|
||||||
const PreferColorSpaces * spf_color_space =&PreferNonlinear,
|
const PreferColorSpaces * spf_color_space =&PreferNonlinear,
|
||||||
const PreferFormats * spf_depth =&PreferDepth)
|
const PreferFormats * spf_depth =&PreferDepth)
|
||||||
|
@ -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,14 +280,13 @@ 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)
|
{
|
||||||
{
|
++ri->instance_count;
|
||||||
++ri->instance_count;
|
++rn;
|
||||||
++rn;
|
continue;
|
||||||
continue;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if(ri->pdb->vdm)
|
if(ri->pdb->vdm)
|
||||||
{
|
{
|
||||||
@ -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++)
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user