Merge branch 'devel_37_RenderFramework' of http://www.hyzgame.com:3000/hyzboy/ULRE into devel_37_RenderFramework

# Conflicts:
#	CMSceneGraph
#	CMUtil
#	inc/hgl/graph/module/GraphModule.h
This commit is contained in:
hyzboy 2024-12-13 22:15:02 +08:00
commit 7dd075b495
17 changed files with 84 additions and 85 deletions

2
CMCore

@ -1 +1 @@
Subproject commit 680b7717fc9253b138108b5f59b985f6bbc5b4e3 Subproject commit 7295d68a5e6f2b9bc9ad08dc397375850af50bf7

@ -1 +1 @@
Subproject commit 7bb7dbc31d3cb0d8556ce78d10243e852211326f Subproject commit 441ca9ce5558d6825c92c7dd1b9f93b80404fb41

2
CMUtil

@ -1 +1 @@
Subproject commit 289cf37a6f893aa706988118b2d15edfb4f97dec Subproject commit 6582b635c9b93284c29dd7e1bc6dc5ecf59a8705

View File

@ -8,14 +8,14 @@ class RenderAssignBuffer;
class SceneNode; class SceneNode;
struct CameraInfo; struct CameraInfo;
struct RenderPipelineIndex struct RenderPipelineIndex:public Comparator<RenderPipelineIndex>
{ {
Material *material; Material *material;
Pipeline *pipeline; Pipeline *pipeline;
public: public:
const int Comp(const RenderPipelineIndex &rli)const const int compare(const RenderPipelineIndex &rli)const override
{ {
if(material<rli.material)return(-1); if(material<rli.material)return(-1);
if(material>rli.material)return(1); if(material>rli.material)return(1);
@ -26,8 +26,6 @@ public:
return(0); return(0);
} }
CompOperator(const RenderPipelineIndex &,Comp)
public: public:
RenderPipelineIndex() RenderPipelineIndex()

View File

@ -11,7 +11,7 @@ namespace hgl
class MaterialInstance; class MaterialInstance;
class SceneNode; class SceneNode;
struct RenderNode struct RenderNode:public Comparator<RenderNode>
{ {
uint index; ///<在MaterialRenderList中的索引 uint index; ///<在MaterialRenderList中的索引
@ -22,6 +22,11 @@ namespace hgl
Vector3f world_position; Vector3f world_position;
float to_camera_distance; float to_camera_distance;
public:
//该函数位于MaterialRenderList.cpp
const int compare(const RenderNode &)const override;
}; };
using RenderNodeList=List<RenderNode>; using RenderNodeList=List<RenderNode>;

View File

@ -12,7 +12,7 @@ VK_NAMESPACE_BEGIN
* <Br> * <Br>
* *
*/ */
struct PrimitiveDataBuffer struct PrimitiveDataBuffer:public Comparator<PrimitiveDataBuffer>
{ {
uint32_t vab_count; uint32_t vab_count;
VkBuffer * vab_list; VkBuffer * vab_list;
@ -32,14 +32,14 @@ public:
PrimitiveDataBuffer(const uint32_t,IndexBuffer *,VertexDataManager *_v=nullptr); PrimitiveDataBuffer(const uint32_t,IndexBuffer *,VertexDataManager *_v=nullptr);
~PrimitiveDataBuffer(); ~PrimitiveDataBuffer();
const bool Comp(const PrimitiveDataBuffer *pdb)const; const int compare(const PrimitiveDataBuffer &pdb)const override;
};//struct PrimitiveDataBuffer };//struct PrimitiveDataBuffer
/** /**
* <Br> * <Br>
* *
*/ */
struct PrimitiveRenderData struct PrimitiveRenderData:public ComparatorData<PrimitiveRenderData>
{ {
//因为要VAB是流式访问所以我们这个结构会被用做排序依据 //因为要VAB是流式访问所以我们这个结构会被用做排序依据
//也因此把vertex_offset放在最前面 //也因此把vertex_offset放在最前面
@ -59,9 +59,6 @@ public:
vertex_offset =vo; vertex_offset =vo;
first_index =fi; first_index =fi;
} }
CompOperatorMemcmp(const PrimitiveRenderData &);
CompOperatorMemcmpPointer(PrimitiveRenderData);
}; };
/** /**

View File

@ -12,7 +12,7 @@ namespace hgl
/** /**
* *
*/ */
struct Font struct Font:public ComparatorData<Font>
{ {
os_char name[MAX_FONT_NAME_LENGTH]; ///<字体名称 os_char name[MAX_FONT_NAME_LENGTH]; ///<字体名称
@ -28,8 +28,6 @@ namespace hgl
Font(); Font();
Font(const os_char *,int,int,bool b=false,bool i=false,bool=true); Font(const os_char *,int,int,bool b=false,bool i=false,bool=true);
CompOperatorMemcmp(const Font &); ///<比较操作符重载
};//struct Font };//struct Font
}//namespace graph }//namespace graph
}//namespace hgl }//namespace hgl

View File

@ -1,12 +1,15 @@
#pragma once #pragma once
#include<hgl/graph/module/GraphModule.h> #include<hgl/graph/module/GraphModule.h>
#include<hgl/type/Map.h> #include<hgl/type/Map.h>
#include<hgl/util/hash/Hash.h> #include<hgl/util/hash/Hash.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
using RenderPassHASHCode=util::HashCodeXXH3_128; using RenderPassHASHCode=util::HashCode<128/8>;
#define CreateRenderPassHash util::CreateXXH3_128Hash inline util::Hash *CreateRenderPassHash()
{
return util::CreateHash(util::HASH::xxH3_128);
}
class RenderPassManager:public GraphModule class RenderPassManager:public GraphModule
{ {

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include<hgl/graph/VK.h> #include<hgl/graph/VK.h>
#include<hgl/graph/VKDevice.h> #include<hgl/graph/VKDevice.h>
@ -59,12 +59,15 @@ public: //事件
GraphModuleManager *GetGraphModuleManager(GPUDevice *); GraphModuleManager *GetGraphModuleManager(GPUDevice *);
class GraphModule class GraphModule:public Comparator<GraphModule>
{ {
GraphModuleManager *module_manager; GraphModuleManager *module_manager;
AnsiIDName module_name; AnsiIDName module_name;
SortedSet<AnsiIDName> dependent_module; ///<依赖的模块
bool module_init;
bool module_enable; bool module_enable;
bool module_ready; bool module_ready;
@ -89,6 +92,9 @@ public:
static const AnsiIDName * GetModuleName (){return nullptr;} ///<取得模块名称(标准通用的名称比如Upscale供通用模块使用) static const AnsiIDName * GetModuleName (){return nullptr;} ///<取得模块名称(标准通用的名称比如Upscale供通用模块使用)
virtual const AnsiIDName * GetName ()const{return &module_name;} ///<取得名称(完整的私有名称比如FSR3Upscale,DLSS3Upscale) virtual const AnsiIDName * GetName ()const{return &module_name;} ///<取得名称(完整的私有名称比如FSR3Upscale,DLSS3Upscale)
virtual const bool IsRender (){return false;} ///<是否为渲染模块
const bool IsInit ()const{return module_init;} ///<是否已经初始化
const bool IsEnable ()const noexcept{return module_enable;} ///<当前模块是否启用 const bool IsEnable ()const noexcept{return module_enable;} ///<当前模块是否启用
const bool IsReady ()const noexcept{return module_ready;} ///<当前模块是否准备好 const bool IsReady ()const noexcept{return module_ready;} ///<当前模块是否准备好
@ -99,7 +105,12 @@ public:
GraphModule(GraphModuleManager *gmm,const AnsiIDName &name); GraphModule(GraphModuleManager *gmm,const AnsiIDName &name);
virtual ~GraphModule(); virtual ~GraphModule();
virtual bool Init(){return true;} ///<初始化当前模块 virtual bool Init(){module_init=true;return true;} ///<初始化当前模块
const int compare(const GraphModule &gm)const override
{
return(dependent_module.Contains(gm.module_name)?1:-1); //如果我依赖于他,那么我比他大
}
public: public:

View File

@ -1,4 +1,4 @@
#pragma once #pragma once
#include<hgl/graph/VKNamespace.h> #include<hgl/graph/VKNamespace.h>
@ -42,4 +42,4 @@ public:
#define REGISTRY_GRAPH_MODULE(Class) {RegistryGraphModuleFactory(#Class,new RegistryGraphModule<Class>);} #define REGISTRY_GRAPH_MODULE(Class) {RegistryGraphModuleFactory(#Class,new RegistryGraphModule<Class>);}
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -6,7 +6,7 @@
#include<hgl/graph/VertexAttrib.h> #include<hgl/graph/VertexAttrib.h>
STD_MTL_NAMESPACE_BEGIN STD_MTL_NAMESPACE_BEGIN
struct Material2DCreateConfig:public MaterialCreateConfig struct Material2DCreateConfig:public MaterialCreateConfig,public Comparator<Material2DCreateConfig>
{ {
CoordinateSystem2D coordinate_system; ///<使用的坐标系 CoordinateSystem2D coordinate_system; ///<使用的坐标系
@ -32,9 +32,9 @@ public:
position_format=VAT_VEC2; position_format=VAT_VEC2;
} }
int Comp(const Material2DCreateConfig &cfg)const const int compare(const Material2DCreateConfig &cfg)const override
{ {
int off=MaterialCreateConfig::Comp(cfg); int off=MaterialCreateConfig::compare(cfg);
if(off)return off; if(off)return off;
@ -48,8 +48,6 @@ public:
return off; return off;
} }
CompOperator(const Material2DCreateConfig &,Comp)
};//struct Material2DCreateConfig:public MaterialCreateConfig };//struct Material2DCreateConfig:public MaterialCreateConfig
MaterialCreateInfo *CreateVertexColor2D(const Material2DCreateConfig *); MaterialCreateInfo *CreateVertexColor2D(const Material2DCreateConfig *);

View File

@ -6,7 +6,7 @@
STD_MTL_NAMESPACE_BEGIN STD_MTL_NAMESPACE_BEGIN
struct Material3DCreateConfig:public MaterialCreateConfig struct Material3DCreateConfig:public MaterialCreateConfig,public Comparator<Material3DCreateConfig>
{ {
bool camera; ///<包含摄像机矩阵信息 bool camera; ///<包含摄像机矩阵信息
@ -32,9 +32,9 @@ public:
// reverse_depth=false; // reverse_depth=false;
} }
int Comp(const Material3DCreateConfig &cfg)const const int compare(const Material3DCreateConfig &cfg)const override
{ {
int off=MaterialCreateConfig::Comp(cfg); int off=MaterialCreateConfig::compare(cfg);
if(off)return off; if(off)return off;
@ -48,8 +48,6 @@ public:
return off; return off;
} }
CompOperator(const Material3DCreateConfig &,Comp)
};//struct Material3DCreateConfig:public MaterialCreateConfig };//struct Material3DCreateConfig:public MaterialCreateConfig
MaterialCreateInfo *CreateVertexColor3D(const Material3DCreateConfig *); MaterialCreateInfo *CreateVertexColor3D(const Material3DCreateConfig *);

View File

@ -13,7 +13,7 @@ class MaterialCreateInfo;
/** /**
* *
*/ */
struct MaterialCreateConfig struct MaterialCreateConfig:public Comparator<MaterialCreateConfig>
{ {
const GPUDeviceAttribute *dev_attr; const GPUDeviceAttribute *dev_attr;
@ -42,7 +42,7 @@ public:
prim=p; prim=p;
} }
virtual int Comp(const MaterialCreateConfig &cfg)const const int compare(const MaterialCreateConfig &cfg)const override
{ {
int off; int off;
@ -59,8 +59,6 @@ public:
return off; return off;
} }
CompOperator(const MaterialCreateConfig &,Comp)
};//struct MaterialCreateConfig };//struct MaterialCreateConfig
STD_MTL_NAMESPACE_END STD_MTL_NAMESPACE_END
#endif//HGL_GRAPH_MTL_CONFIG_INCLUDE #endif//HGL_GRAPH_MTL_CONFIG_INCLUDE

View File

@ -6,7 +6,7 @@
#include<hgl/graph/VKInterpolation.h> #include<hgl/graph/VKInterpolation.h>
#include<hgl/graph/VKSamplerType.h> #include<hgl/graph/VKSamplerType.h>
#include<hgl/graph/VKImageType.h> #include<hgl/graph/VKImageType.h>
#include<hgl/CompOperator.h> #include<hgl/Comparator.h>
namespace hgl namespace hgl
{ {
@ -28,7 +28,7 @@ namespace hgl
#pragma pack(push,1) #pragma pack(push,1)
struct ShaderVariableType struct ShaderVariableType:public Comparator<ShaderVariableType>
{ {
union union
{ {
@ -158,9 +158,7 @@ namespace hgl
const bool Check()const; const bool Check()const;
int Comp(const ShaderVariableType &svt)const; const int compare(const ShaderVariableType &svt)const override;
CompOperator(const ShaderVariableType &,Comp)
const char *GetTypename()const; const char *GetTypename()const;
@ -281,7 +279,7 @@ namespace hgl
using SVList=List<ShaderVariable>; using SVList=List<ShaderVariable>;
struct ShaderVariableArray struct ShaderVariableArray:public Comparator<ShaderVariableArray>
{ {
uint count; uint count;
@ -304,44 +302,36 @@ namespace hgl
Clear(); Clear();
} }
int Comp(const ShaderVariableArray *sva)const const int compare(const ShaderVariableArray &sva)const override
{ {
if(!sva) int off=count-sva.count;
return 1;
int off=count-sva->count;
if(off)return off; if(off)return off;
for(uint i=0;i<count;i++) for(uint i=0;i<count;i++)
{ {
off=items[i].location-sva->items[i].location; off=items[i].location-sva.items[i].location;
if(off) if(off)
return off; return off;
if(items[i].type.ToCode()>sva->items[i].type.ToCode()) if(items[i].type.ToCode()>sva.items[i].type.ToCode())
return 1; return 1;
//ToCode返回的是uint64可能差值超大所以不能直接用-的结果 //ToCode返回的是uint64可能差值超大所以不能直接用-的结果
if(items[i].type.ToCode()<sva->items[i].type.ToCode()) if(items[i].type.ToCode()<sva.items[i].type.ToCode())
return -1; return -1;
off=int(items[i].interpolation)-int(sva->items[i].interpolation); off=int(items[i].interpolation)-int(sva.items[i].interpolation);
if(off) if(off)
return off; return off;
off=hgl::strcmp(items[i].name,sva->items[i].name); off=hgl::strcmp(items[i].name,sva.items[i].name);
if(off) if(off)
return off; return off;
} }
return 0; return 0;
} }
int Comp(const ShaderVariableArray &sva)const{return Comp(&sva);}
CompOperator(const ShaderVariableArray *,Comp)
CompOperator(const ShaderVariableArray &,Comp)
bool Init(const uint c=0) bool Init(const uint c=0)
{ {

View File

@ -26,13 +26,13 @@
VBOINDIRECT缓冲区便 VBOINDIRECT缓冲区便
*/ */
template<> VK_NAMESPACE_BEGIN
int Comparator<hgl::graph::RenderNode>::compare(const hgl::graph::RenderNode &obj_one,const hgl::graph::RenderNode &obj_two) const const int RenderNode::compare(const RenderNode &other)const
{ {
hgl::int64 off; hgl::int64 off;
hgl::graph::Renderable *ri_one=obj_one.scene_node->GetRenderable(); hgl::graph::Renderable *ri_one=other.scene_node->GetRenderable();
hgl::graph::Renderable *ri_two=obj_two.scene_node->GetRenderable(); hgl::graph::Renderable *ri_two=scene_node->GetRenderable();
auto *prim_one=ri_one->GetPrimitive(); auto *prim_one=ri_one->GetPrimitive();
auto *prim_two=ri_two->GetPrimitive(); auto *prim_two=ri_two->GetPrimitive();
@ -63,8 +63,8 @@ int Comparator<hgl::graph::RenderNode>::compare(const hgl::graph::RenderNode &ob
//比较距离。。。。。。。。。。。。。。。。。。。。。还不知道这个是正了还是反了,等测出来确认后修改下面的返回值和这里的注释 //比较距离。。。。。。。。。。。。。。。。。。。。。还不知道这个是正了还是反了,等测出来确认后修改下面的返回值和这里的注释
float foff=obj_one.to_camera_distance float foff=other.to_camera_distance
-obj_two.to_camera_distance; -to_camera_distance;
if(foff>0) if(foff>0)
return 1; return 1;
@ -72,7 +72,6 @@ int Comparator<hgl::graph::RenderNode>::compare(const hgl::graph::RenderNode &ob
return -1; return -1;
} }
VK_NAMESPACE_BEGIN
MaterialRenderList::MaterialRenderList(GPUDevice *d,bool l2w,const RenderPipelineIndex &rpi) MaterialRenderList::MaterialRenderList(GPUDevice *d,bool l2w,const RenderPipelineIndex &rpi)
{ {
device=d; device=d;
@ -280,8 +279,8 @@ void MaterialRenderList::Stat()
{ {
ro=rn->scene_node->GetRenderable(); ro=rn->scene_node->GetRenderable();
if(last_data_buffer->Comp(ro->GetDataBuffer())) if(*last_data_buffer!=*ro->GetDataBuffer())
if(last_render_data->_Comp(ro->GetRenderData())==0) if(*last_render_data==*ro->GetRenderData())
{ {
++ri->instance_count; ++ri->instance_count;
++rn; ++rn;
@ -399,7 +398,7 @@ void MaterialRenderList::ProcIndirectRender()
void MaterialRenderList::Render(RenderItem *ri) void MaterialRenderList::Render(RenderItem *ri)
{ {
if(!ri->pdb->Comp(last_data_buffer)) //换buf了 if(*(ri->pdb)!=*last_data_buffer) //换buf了
{ {
if(indirect_draw_count) //如果有间接绘制的数据,赶紧给画了 if(indirect_draw_count) //如果有间接绘制的数据,赶紧给画了
ProcIndirectRender(); ProcIndirectRender();

View File

@ -24,25 +24,29 @@ PrimitiveDataBuffer::~PrimitiveDataBuffer()
delete[] vab_list; delete[] vab_list;
} }
const bool PrimitiveDataBuffer::Comp(const PrimitiveDataBuffer *pdb)const const int PrimitiveDataBuffer::compare(const PrimitiveDataBuffer &pdb)const
{ {
if(!pdb)return(false); ptrdiff_t off;
if(vdm&&pdb->vdm) off=&vdm-&pdb.vdm;
return (vdm==pdb->vdm); if(off)
return off;
if(vab_count!=pdb->vab_count)return(false); off=vab_count-pdb.vab_count;
if(off)
return off;
for(uint32_t i=0;i<vab_count;i++) off=hgl_cmp(vab_list,pdb.vab_list,vab_count);
{ if(off)
if(vab_list[i]!=pdb->vab_list[i])return(false); return off;
if(vab_offset[i]!=pdb->vab_offset[i])return(false);
}
if(ibo!=pdb->ibo) off=hgl_cmp(vab_offset,pdb.vab_offset,vab_count);
return(false); if(off)
return off;
return(true); off=ibo-pdb.ibo;
return off;
} }
Renderable::Renderable(Primitive *r,MaterialInstance *mi,Pipeline *p,PrimitiveDataBuffer *pdb,PrimitiveRenderData *prd) Renderable::Renderable(Primitive *r,MaterialInstance *mi,Pipeline *p,PrimitiveDataBuffer *pdb,PrimitiveRenderData *prd)
@ -61,7 +65,7 @@ Renderable *CreateRenderable(Primitive *prim,MaterialInstance *mi,Pipeline *p)
const VIL *vil=mi->GetVIL(); const VIL *vil=mi->GetVIL();
if(vil->Comp(p->GetVIL())) if(*vil!=*p->GetVIL())
return(nullptr); return(nullptr);
const uint32_t input_count=vil->GetVertexAttribCount(VertexInputGroup::Basic); //不统计Bone/LocalToWorld组的 const uint32_t input_count=vil->GetVertexAttribCount(VertexInputGroup::Basic); //不统计Bone/LocalToWorld组的

View File

@ -85,7 +85,7 @@ const bool ShaderVariableType::Check()const
return(true); return(true);
} }
int ShaderVariableType::Comp(const ShaderVariableType &svt)const const int ShaderVariableType::compare(const ShaderVariableType &svt)const
{ {
int off=(int)base_type-(int)svt.base_type; int off=(int)base_type-(int)svt.base_type;