From d05f1109b55282d907b8205e707edaca42d83b83 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Wed, 14 Jun 2023 18:20:23 +0800 Subject: [PATCH] removed MaterialData --- inc/hgl/graph/VKMaterial.h | 36 +++++++------------ src/SceneGraph/Vulkan/VKMaterial.cpp | 20 ++++------- .../Vulkan/VKRenderResourceMaterial.cpp | 35 +++++++++--------- 3 files changed, 38 insertions(+), 53 deletions(-) diff --git a/inc/hgl/graph/VKMaterial.h b/inc/hgl/graph/VKMaterial.h index ccccdd2f..f68874f8 100644 --- a/inc/hgl/graph/VKMaterial.h +++ b/inc/hgl/graph/VKMaterial.h @@ -9,7 +9,11 @@ VK_NAMESPACE_BEGIN using ShaderStageCreateInfoList=List; -struct MaterialData +/** + * 材质类
+ * 用于管理shader,提供DescriptorSetLayoutCreater + */ +class Material { AnsiString name; @@ -28,38 +32,24 @@ struct MaterialData uint32_t mi_data_bytes; ///<实例数据大小 uint32_t mi_max_count; ///<最大实例数量(注:代表一次drawcall大小,而不是整个的大小) -public: - - MaterialData(const AnsiString &n); - ~MaterialData(); -};//struct MaterialData - -/** - * 材质类
- * 用于管理shader,提供DescriptorSetLayoutCreater - */ -class Material -{ - MaterialData *data; - private: - friend GPUDevice; + friend class RenderResource; public: - Material(MaterialData *md):data(md){} + Material(const AnsiString &); virtual ~Material(); - const UTF8String & GetName ()const{return data->name;} + const UTF8String & GetName ()const{return name;} - const VertexInput * GetVertexInput ()const{return data->vertex_input;} + const VertexInput * GetVertexInput ()const{return vertex_input;} - const ShaderStageCreateInfoList & GetStageList ()const{return data->shader_stage_list;} + const ShaderStageCreateInfoList & GetStageList ()const{return shader_stage_list;} - const MaterialDescriptorManager * GetDescriptorSets ()const{return data->desc_manager;} + const MaterialDescriptorManager * GetDescriptorSets ()const{return desc_manager;} const VkPipelineLayout GetPipelineLayout ()const; - const PipelineLayoutData * GetPipelineLayoutData ()const{return data->pipeline_layout_data;} + const PipelineLayoutData * GetPipelineLayoutData ()const{return pipeline_layout_data;} public: @@ -67,7 +57,7 @@ public: { RANGE_CHECK_RETURN_NULLPTR(type) - return data->mp_array[size_t(type)]; + return mp_array[size_t(type)]; } const bool hasSet (const DescriptorSetType &type)const; diff --git a/src/SceneGraph/Vulkan/VKMaterial.cpp b/src/SceneGraph/Vulkan/VKMaterial.cpp index 46715f8f..fd1dab66 100644 --- a/src/SceneGraph/Vulkan/VKMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKMaterial.cpp @@ -4,7 +4,7 @@ #include #include"VKPipelineLayoutData.h" VK_NAMESPACE_BEGIN -MaterialData::MaterialData(const AnsiString &n) +Material::Material(const AnsiString &n) { name=n; @@ -19,7 +19,7 @@ MaterialData::MaterialData(const AnsiString &n) mi_max_count=0; } -MaterialData::~MaterialData() +Material::~Material() { SAFE_CLEAR(vertex_input); delete shader_maps; //不用SAFE_CLEAR是因为这个一定会有 @@ -33,34 +33,28 @@ MaterialData::~MaterialData() mi_max_count=0; } -Material::~Material() -{ - delete data->pipeline_layout_data; - delete data; -} - const VkPipelineLayout Material::GetPipelineLayout()const { - return data->pipeline_layout_data->pipeline_layout; + return pipeline_layout_data->pipeline_layout; } const bool Material::hasSet(const DescriptorSetType &dst)const { - return data->desc_manager->hasSet(dst); + return desc_manager->hasSet(dst); } VIL *Material::CreateVIL(const VILConfig *format_map) { - return data->vertex_input->CreateVIL(format_map); + return vertex_input->CreateVIL(format_map); } bool Material::Release(VIL *vil) { - return data->vertex_input->Release(vil); + return vertex_input->Release(vil); } const uint Material::GetVILCount() { - return data->vertex_input->GetInstanceCount(); + return vertex_input->GetInstanceCount(); } VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp index e9547336..3d43833c 100644 --- a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp @@ -79,12 +79,14 @@ Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci) if(!mci) return(nullptr); - Material *mtl; - const AnsiString &mtl_name=mci->GetName(); - if(material_by_name.Get(mtl_name,mtl)) - return mtl; + { + Material *mtl; + + if(material_by_name.Get(mtl_name,mtl)) + return mtl; + } const ShaderCreateInfoMap &sci_map=mci->GetShaderMap(); const uint sci_count=sci_map.GetCount(); @@ -95,7 +97,7 @@ Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci) if(!mci->GetFS()) return(nullptr); - AutoDelete data=new MaterialData(mtl_name); + AutoDelete ad_mtl=new Material(mtl_name); { const ShaderModule *sm; @@ -109,44 +111,43 @@ Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci) if(!sm) return(nullptr); - data->shader_maps->Add(sm); + ad_mtl->shader_maps->Add(sm); ++sci; } } - CreateShaderStageList(data->shader_stage_list,data->shader_maps); + CreateShaderStageList(ad_mtl->shader_stage_list,ad_mtl->shader_maps); { ShaderCreateInfoVertex *vert=mci->GetVS(); if(vert) - data->vertex_input=new VertexInput(vert->sdm->GetShaderStageIO().input); + ad_mtl->vertex_input=new VertexInput(vert->sdm->GetShaderStageIO().input); } { const auto &mdi=mci->GetMDI(); if(mdi.GetCount()>0) - data->desc_manager=new MaterialDescriptorManager(mci->GetName(),mdi.Get()); + ad_mtl->desc_manager=new MaterialDescriptorManager(mci->GetName(),mdi.Get()); } - data->pipeline_layout_data=device->CreatePipelineLayoutData(data->desc_manager); + ad_mtl->pipeline_layout_data=device->CreatePipelineLayoutData(ad_mtl->desc_manager); - if(data->desc_manager) + if(ad_mtl->desc_manager) { ENUM_CLASS_FOR(DescriptorSetType,int,dst) { - if(data->desc_manager->hasSet((DescriptorSetType)dst)) - data->mp_array[dst]=device->CreateMP(data->desc_manager,data->pipeline_layout_data,(DescriptorSetType)dst); + if(ad_mtl->desc_manager->hasSet((DescriptorSetType)dst)) + ad_mtl->mp_array[dst]=device->CreateMP(ad_mtl->desc_manager,ad_mtl->pipeline_layout_data,(DescriptorSetType)dst); } } - data->mi_data_bytes =mci->GetMIDataBytes(); - data->mi_max_count =mci->GetMIMaxCount(); + ad_mtl->mi_data_bytes =mci->GetMIDataBytes(); + ad_mtl->mi_max_count =mci->GetMIMaxCount(); - mtl=new Material(data); - data.Discard(); //mtl已经接管了data的内容,这里不需要再释放 + Material *mtl=ad_mtl.Finish(); Add(mtl);