From 902dc20340e50f211a78fc544053ca2dcfc1413d Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Tue, 19 Sep 2023 21:09:09 +0800 Subject: [PATCH] used ActiveMemoryBlockManager to manage data of material instances in Material class. --- CMCore | 2 +- CMPlatform | 2 +- CMUtil | 2 +- example/Vulkan/fourth_triangle.cpp | 6 +-- inc/hgl/graph/VKMaterial.h | 15 +++++-- inc/hgl/graph/VKMaterialInstance.h | 12 +++++- src/SceneGraph/Vulkan/VKMaterial.cpp | 9 +++-- src/SceneGraph/Vulkan/VKMaterialInstance.cpp | 39 ++++++++++++++++++- .../Vulkan/VKRenderResourceMaterial.cpp | 8 +++- 9 files changed, 77 insertions(+), 18 deletions(-) diff --git a/CMCore b/CMCore index 6a21b387..21e59f03 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 6a21b387f52699840fc6245291bcc93a3a797a6a +Subproject commit 21e59f0337a3637e646529611f84fa646cb1d9e0 diff --git a/CMPlatform b/CMPlatform index 2ad618e1..5e8b83cc 160000 --- a/CMPlatform +++ b/CMPlatform @@ -1 +1 @@ -Subproject commit 2ad618e1ffd27bfe8df2b966e1cb8049fa9d114b +Subproject commit 5e8b83cce4529e6401de59ec010e2ef68b634150 diff --git a/CMUtil b/CMUtil index ff819d8a..c0990c52 160000 --- a/CMUtil +++ b/CMUtil @@ -1 +1 @@ -Subproject commit ff819d8a60753269343a3f87777ee03ae5071cb4 +Subproject commit c0990c52ebbc2a19b661a3d6fd64891d05e59305 diff --git a/example/Vulkan/fourth_triangle.cpp b/example/Vulkan/fourth_triangle.cpp index 251bd4da..91544361 100644 --- a/example/Vulkan/fourth_triangle.cpp +++ b/example/Vulkan/fourth_triangle.cpp @@ -57,15 +57,15 @@ private: AutoDelete mci=mtl::CreatePureColor2D(&cfg); -/* for(uint i=0;i<6;i++) + for(uint i=0;i<6;i++) { material_instance[i]=db->CreateMaterialInstance(mci); if(!material_instance[i]) return(false); - material_instance[i]->SetFloat4(0,color_data[i]); - }*/ + material_instance[i]->WriteMIData(color_data[i],sizeof(float)*4); //设置MaterialInstance的数据 + } } // pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d")); diff --git a/inc/hgl/graph/VKMaterial.h b/inc/hgl/graph/VKMaterial.h index 6c709431..e019b92b 100644 --- a/inc/hgl/graph/VKMaterial.h +++ b/inc/hgl/graph/VKMaterial.h @@ -6,6 +6,11 @@ #include #include #include + +namespace hgl +{ + class ActiveMemoryBlockManager; +} VK_NAMESPACE_BEGIN using ShaderStageCreateInfoList=List; @@ -30,15 +35,17 @@ class Material MaterialParameters *mp_array[DESCRIPTOR_SET_TYPE_COUNT]; uint32_t mi_data_bytes; ///<实例数据大小 - uint32_t mi_max_count; ///<最大实例数量(注:代表一次drawcall大小,而不是整个的大小) + + ActiveMemoryBlockManager *mi_data_manager; private: friend class RenderResource; + Material(const AnsiString &); + public: - Material(const AnsiString &); virtual ~Material(); const UTF8String & GetName ()const{return name;} @@ -69,7 +76,9 @@ public: public: const uint32_t GetMIDataBytes ()const{return mi_data_bytes;} - const uint32_t GetMIMaxCount ()const{return mi_max_count;} + + void ReleaseMI(int); ///<释放材质实例 + void *GetMIData(int); ///<取得指定ID号的材质实例数据访问指针 MaterialInstance *CreateMI(const VILConfig *vil_cfg=nullptr); };//class Material diff --git a/inc/hgl/graph/VKMaterialInstance.h b/inc/hgl/graph/VKMaterialInstance.h index 46a8924c..64e290f2 100644 --- a/inc/hgl/graph/VKMaterialInstance.h +++ b/inc/hgl/graph/VKMaterialInstance.h @@ -50,6 +50,8 @@ protected: VIL *vil; + int mi_id; + public: Material * GetMaterial () {return material;} @@ -60,11 +62,17 @@ private: friend class Material; - MaterialInstance(Material *,VIL *); + MaterialInstance(Material *,VIL *,const int); public: - virtual ~MaterialInstance()=default; + virtual ~MaterialInstance() + { + material->ReleaseMI(mi_id); + } + + void *GetMIData(){return material->GetMIData(mi_id);} + void WriteMIData(const void *data,const int size); bool BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic=false); bool BindSSBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic=false); diff --git a/src/SceneGraph/Vulkan/VKMaterial.cpp b/src/SceneGraph/Vulkan/VKMaterial.cpp index fd1dab66..81faf38c 100644 --- a/src/SceneGraph/Vulkan/VKMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKMaterial.cpp @@ -3,6 +3,8 @@ #include #include #include"VKPipelineLayoutData.h" +#include + VK_NAMESPACE_BEGIN Material::Material(const AnsiString &n) { @@ -16,11 +18,13 @@ Material::Material(const AnsiString &n) hgl_zero(mp_array); mi_data_bytes=0; - mi_max_count=0; + mi_data_manager=nullptr; } Material::~Material() { + SAFE_CLEAR(mi_data_manager); + SAFE_CLEAR(vertex_input); delete shader_maps; //不用SAFE_CLEAR是因为这个一定会有 SAFE_CLEAR(desc_manager); @@ -28,9 +32,6 @@ Material::~Material() for(int i=0;i #include #include +#include VK_NAMESPACE_BEGIN MaterialInstance *Material::CreateMI(const VILConfig *vil_cfg) @@ -10,14 +11,48 @@ MaterialInstance *Material::CreateMI(const VILConfig *vil_cfg) if(!vil)return(nullptr); - return(new MaterialInstance(this,vil)); + int mi_id=-1; + + if(mi_data_manager) + mi_data_manager->GetOrCreate(&mi_id,1); + else + mi_id=-1; + + return(new MaterialInstance(this,vil,mi_id)); } -MaterialInstance::MaterialInstance(Material *mtl,VIL *v) +void Material::ReleaseMI(int mi_id) +{ + if(mi_id<0||!mi_data_manager)return; + + mi_data_manager->Release(&mi_id,1); +} + +void *Material::GetMIData(int id) +{ + if(!mi_data_manager) + return(nullptr); + + return mi_data_manager->GetData(id); +} + +void MaterialInstance::WriteMIData(const void *data,const int size) +{ + if(!data||size<=0||size>material->GetMIDataBytes())return; + + void *tp=GetMIData(); + + if(tp) + memcpy(tp,data,size); +} + +MaterialInstance::MaterialInstance(Material *mtl,VIL *v,const int id) { material=mtl; vil=v; + + mi_id=id; } bool MaterialInstance::BindUBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic) diff --git a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp index fcfafe83..574ff44d 100644 --- a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp @@ -10,6 +10,7 @@ #include #include #include +#include VK_NAMESPACE_BEGIN @@ -145,7 +146,12 @@ Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci) } mtl->mi_data_bytes =mci->GetMIDataBytes(); - mtl->mi_max_count =mci->GetMIMaxCount(); + //mtl->mi_max_count =mci->GetMIMaxCount(); + + if(mtl->mi_data_bytes>0) + { + mtl->mi_data_manager=new ActiveMemoryBlockManager(mtl->mi_data_bytes); + } Add(mtl);