From 7a0acaf63ed41b57f3c3da3035eb2045163c3271 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sat, 4 Mar 2023 05:11:51 +0800 Subject: [PATCH] 1.moved descriptor to MaterialDescriptorManager from ShaderDescriptorManager. 2.added UBOCodes in MaterialDescriptorManager --- CMCore | 2 +- CMSceneGraph | 2 +- inc/hgl/graph/VKTexture.h | 2 +- inc/hgl/shadergen/MaterialDescriptorManager.h | 31 +++++++++++++--- inc/hgl/shadergen/ShaderDescriptorManager.h | 20 ++++++----- src/ShaderGen/CMakeLists.txt | 10 +----- src/ShaderGen/MaterialCreater.cpp | 36 +++++++++++++------ src/ShaderGen/MaterialDescriptorManager.cpp | 13 +++---- src/ShaderGen/ShaderDescriptorManager.cpp | 24 +++++-------- 9 files changed, 82 insertions(+), 58 deletions(-) diff --git a/CMCore b/CMCore index 59f7b250..643773c9 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 59f7b25075e79af4bba1579851f74efbc20e0b82 +Subproject commit 643773c93d97de2c1834cc05a10fb8cfbe76124c diff --git a/CMSceneGraph b/CMSceneGraph index 062c9cd6..c4823cd3 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit 062c9cd64239ada350cce73dd50b833759c48e56 +Subproject commit c4823cd334a539362fc2cf2d0b49e299bb8ce9b4 diff --git a/inc/hgl/graph/VKTexture.h b/inc/hgl/graph/VKTexture.h index 8e94f570..33184909 100644 --- a/inc/hgl/graph/VKTexture.h +++ b/inc/hgl/graph/VKTexture.h @@ -27,7 +27,7 @@ public: VkImageLayout GetImageLayout () {return data?data->image_layout:VK_IMAGE_LAYOUT_UNDEFINED;} VkImageView GetVulkanImageView () {return data?data->image_view->GetImageView():VK_NULL_HANDLE;} - DeviceMemory * GetMemory () {return data?data->memory:nullptr;} + DeviceMemory * GetMemory () {return data?data->memory:nullptr;} ImageView * GetImageView () {return data?data->image_view:nullptr;} const uint32 GetMipLevel ()const {return data?data->miplevel:0;} diff --git a/inc/hgl/shadergen/MaterialDescriptorManager.h b/inc/hgl/shadergen/MaterialDescriptorManager.h index 939252be..d4e0b550 100644 --- a/inc/hgl/shadergen/MaterialDescriptorManager.h +++ b/inc/hgl/shadergen/MaterialDescriptorManager.h @@ -22,10 +22,10 @@ class MaterialDescriptorManager int set; int count; - ObjectMap descriptor_map; + ObjectMap descriptor_map; - List ubo_list; - List sampler_list; + ObjectList ubo_list; + ObjectList sampler_list; public: @@ -36,13 +36,34 @@ class MaterialDescriptorManager ShaderDescriptorSetArray desc_set_array; + Map ubo_code_map; + public: MaterialDescriptorManager(); ~MaterialDescriptorManager()=default; - const UBODescriptor *AddUBO(VkShaderStageFlagBits ssb,DescriptorSetType type,UBODescriptor *sd); - const SamplerDescriptor *AddSampler(VkShaderStageFlagBits ssb,DescriptorSetType type,SamplerDescriptor *sd); + bool AddUBOCode(const AnsiString &name,const AnsiString &code) + { + if(ubo_code_map.KeyExist(name)) + return(false); + + ubo_code_map.Add(name,code); + return(true); + } + + bool GetUBOCode(const AnsiString &name,AnsiString &code) const + { + return(ubo_code_map.Get(name,code)); + } + + bool hasUBOCode(const AnsiString &name) const + { + return(ubo_code_map.KeyExist(name)); + } + + const UBODescriptor *AddUBO(VkShaderStageFlagBits ssb,DescriptorSetType set_type,UBODescriptor *sd); + const SamplerDescriptor *AddSampler(VkShaderStageFlagBits ssb,DescriptorSetType set_type,SamplerDescriptor *sd); const DescriptorSetType GetSetType(const AnsiString &)const; diff --git a/inc/hgl/shadergen/ShaderDescriptorManager.h b/inc/hgl/shadergen/ShaderDescriptorManager.h index 31306a22..b37f8a8b 100644 --- a/inc/hgl/shadergen/ShaderDescriptorManager.h +++ b/inc/hgl/shadergen/ShaderDescriptorManager.h @@ -7,6 +7,10 @@ #include SHADERGEN_NAMESPACE_BEGIN + +using ConstUBODescriptorList=List; +using ConstSamplerDescriptorList=List; + /** * Shader数据管理器,用于生成正式Shader前的资源统计 */ @@ -14,11 +18,9 @@ class ShaderDescriptorManager { ShaderStageIO stage_io; - MaterialDescriptorManager * material_descriptor_manager; - //ubo/object在这里以及MaterialDescriptorManager中均有一份,mdm中的用于产生set/binding号,这里的用于产生shader - List ubo_list; - List sampler_list; + ConstUBODescriptorList ubo_list; + ConstSamplerDescriptorList sampler_list; ObjectList const_value_list; ObjectList subpass_input; @@ -29,7 +31,7 @@ class ShaderDescriptorManager public: - ShaderDescriptorManager(VkShaderStageFlagBits,MaterialDescriptorManager *); + ShaderDescriptorManager(VkShaderStageFlagBits); ~ShaderDescriptorManager()=default; const VkShaderStageFlagBits GetStageBits()const { return stage_io.cur; } @@ -42,8 +44,8 @@ public: const ShaderStageIO & GetShaderStageIO()const{return stage_io;} - const List & GetUBOList()const{return ubo_list;} - const List & GetSamplerList()const{return sampler_list;} + const ConstUBODescriptorList & GetUBOList()const{return ubo_list;} + const ConstSamplerDescriptorList & GetSamplerList()const{return sampler_list;} const ObjectList & GetConstList()const{return const_value_list;} @@ -56,8 +58,8 @@ public: bool AddInput(ShaderStage *); bool AddOutput(ShaderStage *); - bool AddUBO(DescriptorSetType type,UBODescriptor *sd); - bool AddSampler(DescriptorSetType type,SamplerDescriptor *sd); + bool AddUBO(DescriptorSetType type,const UBODescriptor *sd); + bool AddSampler(DescriptorSetType type,const SamplerDescriptor *sd); bool AddConstValue(ConstValueDescriptor *sd); bool AddSubpassInput(const AnsiString name,uint8_t index); diff --git a/src/ShaderGen/CMakeLists.txt b/src/ShaderGen/CMakeLists.txt index 924f873a..b28ce074 100644 --- a/src/ShaderGen/CMakeLists.txt +++ b/src/ShaderGen/CMakeLists.txt @@ -1,15 +1,8 @@ set(SHADERGEN_INCLUDE_PATH ${ROOT_INCLUDE_PATH}/hgl/shadergen) -SET(SHADERGEN_HEADER_FILES ${SHADERGEN_INCLUDE_PATH}/ShadingProgram.h - ${SHADERGEN_INCLUDE_PATH}/PMC.h - ${SHADERGEN_INCLUDE_PATH}/VertexInputStage.h - ${SHADERGEN_INCLUDE_PATH}/ShaderModule.h - ${SHADERGEN_INCLUDE_PATH}/VertexShaderModule.h - ${SHADERGEN_INCLUDE_PATH}/ShaderCommon.h +SET(SHADERGEN_HEADER_FILES ${SHADERGEN_INCLUDE_PATH}/ShaderCommon.h ${SHADERGEN_INCLUDE_PATH}/ShaderDescriptorManager.h ${SHADERGEN_INCLUDE_PATH}/MaterialDescriptorManager.h - ${SHADERGEN_INCLUDE_PATH}/VertexPolicy.h - ${SHADERGEN_INCLUDE_PATH}/MaterialGen.h ) SET(SHADERGEN_SOURCE_FILES @@ -24,5 +17,4 @@ SET(SHADERGEN_SOURCE_FILES add_cm_library(ULRE.ShaderGen "ULRE" ${SHADERGEN_HEADER_FILES} ${SHADERGEN_SOURCE_FILES} - ShaderGen.cpp MaterialCreater.cpp) diff --git a/src/ShaderGen/MaterialCreater.cpp b/src/ShaderGen/MaterialCreater.cpp index cb09c21b..e843212c 100644 --- a/src/ShaderGen/MaterialCreater.cpp +++ b/src/ShaderGen/MaterialCreater.cpp @@ -5,6 +5,7 @@ #include #include #include +#include using namespace hgl; using namespace hgl::graph; @@ -22,7 +23,7 @@ public: public: - ShaderCreater(VkShaderStageFlagBits ss,MaterialDescriptorManager *mdm):sdm(ss,mdm) + ShaderCreater(VkShaderStageFlagBits ss):sdm(ss) { shader_stage=ss; } @@ -58,7 +59,7 @@ class VertexShaderCreater:public ShaderCreater public: - VertexShaderCreater(MaterialDescriptorManager *mdm):ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT,mdm){} + VertexShaderCreater():ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT){} ~VertexShaderCreater()=default; int AddInput(const AnsiString &name,const VertexAttribType &type) @@ -79,7 +80,7 @@ class GeometryShaderCreater:public ShaderCreater { public: - GeometryShaderCreater(MaterialDescriptorManager *mdm):ShaderCreater(VK_SHADER_STAGE_GEOMETRY_BIT,mdm){} + GeometryShaderCreater():ShaderCreater(VK_SHADER_STAGE_GEOMETRY_BIT){} ~GeometryShaderCreater()=default; }; @@ -87,7 +88,7 @@ class FragmentShaderCreater:public ShaderCreater { public: - FragmentShaderCreater(MaterialDescriptorManager *mdm):ShaderCreater(VK_SHADER_STAGE_FRAGMENT_BIT,mdm){} + FragmentShaderCreater():ShaderCreater(VK_SHADER_STAGE_FRAGMENT_BIT){} ~FragmentShaderCreater()=default; }; @@ -123,9 +124,9 @@ public: rt_count=rc; shader_stage=ss; - if(hasVertex ())shader_map.Add(vert=new VertexShaderCreater (&MDM));else vert=nullptr; - if(hasGeometry ())shader_map.Add(geom=new GeometryShaderCreater(&MDM));else geom=nullptr; - if(hasFragment ())shader_map.Add(frag=new FragmentShaderCreater(&MDM));else frag=nullptr; + if(hasVertex ())shader_map.Add(vert=new VertexShaderCreater );else vert=nullptr; + if(hasGeometry ())shader_map.Add(geom=new GeometryShaderCreater);else geom=nullptr; + if(hasFragment ())shader_map.Add(frag=new FragmentShaderCreater);else frag=nullptr; } ~MaterialCreater() @@ -139,11 +140,22 @@ public: return vert->AddInput(name,type); } + bool AddUBOCode(const AnsiString &ubo_typename,const AnsiString &codes) + { + if(ubo_typename.IsEmpty()||codes.IsEmpty()) + return(false); + + return MDM.AddUBOCode(ubo_typename,codes); + } + bool AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name) { if(!shader_map.KeyExist(flag_bits)) return(false); + if(!MDM.hasUBOCode(type_name)) + return(false); + ShaderCreater *sc=shader_map[flag_bits]; if(!sc) @@ -154,14 +166,16 @@ public: ubo->type=type_name; ubo->name=name; - return sc->sdm.AddUBO(set_type,ubo); + return sc->sdm.AddUBO(set_type,MDM.AddUBO(flag_bits,set_type,ubo)); } - bool AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name) + bool AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name) { if(!shader_map.KeyExist(flag_bits)) return(false); + RANGE_CHECK_RETURN_FALSE(st); + ShaderCreater *sc=shader_map[flag_bits]; if(!sc) @@ -169,10 +183,10 @@ public: SamplerDescriptor *sampler=new SamplerDescriptor(); - sampler->type=type_name; + sampler->type=GetSamplerTypeName(st); sampler->name=name; - return sc->sdm.AddSampler(set_type,sampler); + return sc->sdm.AddSampler(set_type,MDM.AddSampler(flag_bits,set_type,sampler)); } };//class MaterialCreater diff --git a/src/ShaderGen/MaterialDescriptorManager.cpp b/src/ShaderGen/MaterialDescriptorManager.cpp index e623c527..d16a74d1 100644 --- a/src/ShaderGen/MaterialDescriptorManager.cpp +++ b/src/ShaderGen/MaterialDescriptorManager.cpp @@ -34,6 +34,7 @@ const ShaderDescriptor *MaterialDescriptorManager::ShaderDescriptorSet::AddDescr if(descriptor_map.Get(new_sd->name,sd)) { + delete new_sd; sd->stage_flag|=ssb; return(sd); } @@ -50,12 +51,12 @@ const ShaderDescriptor *MaterialDescriptorManager::ShaderDescriptorSet::AddDescr } } -const UBODescriptor *MaterialDescriptorManager::AddUBO(VkShaderStageFlagBits ssb,DescriptorSetType type,UBODescriptor *sd) +const UBODescriptor *MaterialDescriptorManager::AddUBO(VkShaderStageFlagBits ssb,DescriptorSetType set_type,UBODescriptor *sd) { - RANGE_CHECK_RETURN_NULLPTR(type); + RANGE_CHECK_RETURN_NULLPTR(set_type); if(!sd)return(nullptr); - ShaderDescriptorSet *sds=desc_set_array+(size_t)type; + ShaderDescriptorSet *sds=desc_set_array+(size_t)set_type; const ShaderDescriptor *obj=sds->AddDescriptor(ssb,sd); @@ -65,12 +66,12 @@ const UBODescriptor *MaterialDescriptorManager::AddUBO(VkShaderStageFlagBits ssb return((UBODescriptor *)obj); } -const SamplerDescriptor *MaterialDescriptorManager::AddSampler(VkShaderStageFlagBits ssb,DescriptorSetType type,SamplerDescriptor *sd) +const SamplerDescriptor *MaterialDescriptorManager::AddSampler(VkShaderStageFlagBits ssb,DescriptorSetType set_type,SamplerDescriptor *sd) { - RANGE_CHECK_RETURN_NULLPTR(type); + RANGE_CHECK_RETURN_NULLPTR(set_type); if(!sd)return(nullptr); - ShaderDescriptorSet *sds=desc_set_array+(size_t)type; + ShaderDescriptorSet *sds=desc_set_array+(size_t)set_type; const ShaderDescriptor *obj=sds->AddDescriptor(ssb,sd); diff --git a/src/ShaderGen/ShaderDescriptorManager.cpp b/src/ShaderGen/ShaderDescriptorManager.cpp index c9a15adf..9c963b6e 100644 --- a/src/ShaderGen/ShaderDescriptorManager.cpp +++ b/src/ShaderGen/ShaderDescriptorManager.cpp @@ -1,10 +1,8 @@ #include SHADERGEN_NAMESPACE_BEGIN -ShaderDescriptorManager::ShaderDescriptorManager(VkShaderStageFlagBits cur,MaterialDescriptorManager *mdm) +ShaderDescriptorManager::ShaderDescriptorManager(VkShaderStageFlagBits cur) { - material_descriptor_manager=mdm; - stage_io.cur=cur; stage_io.prev=(VkShaderStageFlagBits)0; stage_io.next=(VkShaderStageFlagBits)0; @@ -46,26 +44,22 @@ bool ShaderDescriptorManager::AddOutput(ShaderStage *ss) return(true); } -bool ShaderDescriptorManager::AddUBO(DescriptorSetType type,UBODescriptor *sd) +bool ShaderDescriptorManager::AddUBO(DescriptorSetType type,const UBODescriptor *ubo) { - const UBODescriptor *obj=material_descriptor_manager->AddUBO(stage_io.cur,type,sd); - - if(!obj) + if(!ubo) return(false); - ubo_list.Add(obj); - return obj; + ubo_list.Add(ubo); + return true; } -bool ShaderDescriptorManager::AddSampler(DescriptorSetType type,SamplerDescriptor *sd) +bool ShaderDescriptorManager::AddSampler(DescriptorSetType type,const SamplerDescriptor *sampler) { - const SamplerDescriptor *obj=material_descriptor_manager->AddSampler(stage_io.cur,type,sd); - - if(!obj) + if(!sampler) return(false); - sampler_list.Add(obj); - return obj; + sampler_list.Add(sampler); + return true; } bool ShaderDescriptorManager::AddConstValue(ConstValueDescriptor *sd)