From 5749d8ec8abb4644f81ebf21886d04656ca7e1d3 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Mon, 12 Jun 2023 16:30:16 +0800 Subject: [PATCH] optimized ShaderModuleMapByName in RenderResource --- CMCore | 2 +- inc/hgl/graph/VKMaterialParameters.h | 2 +- inc/hgl/graph/VKRenderResource.h | 7 +++-- .../Vulkan/VKRenderResourceMaterial.cpp | 31 ++++++++++--------- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/CMCore b/CMCore index 72fcbb18..be17b06a 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 72fcbb18ab3bbd8971777f62ee9fcb967ab25e9e +Subproject commit be17b06a2f243faffd55fc7bde6156c83d2c5a7a diff --git a/inc/hgl/graph/VKMaterialParameters.h b/inc/hgl/graph/VKMaterialParameters.h index cffadf27..f943b28e 100644 --- a/inc/hgl/graph/VKMaterialParameters.h +++ b/inc/hgl/graph/VKMaterialParameters.h @@ -34,7 +34,7 @@ public: #define MP_TYPE_IS(name) const bool is##name()const{return set_type==DescriptorSetType::name;} MP_TYPE_IS(Instance) - //MP_TYPE_IS(PerMaterial) + MP_TYPE_IS(PerMaterial) MP_TYPE_IS(PerFrame) MP_TYPE_IS(Global) #undef MP_TYPE_IS diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index afe7b671..f0d72c7f 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -29,6 +29,9 @@ using TextureID =int; class VertexAttribData; +using ShaderModuleMapByName=ObjectMap; +constexpr const size_t VK_SHADER_STAGE_TYPE_COUNT=20;//GetBitOffset((uint32_t)VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI)+1; + /** * 资源管理,用于管理场景内所需的所有数据 */ @@ -36,7 +39,7 @@ class RenderResource { GPUDevice *device; - ObjectMap shader_module_by_name; + ShaderModuleMapByName shader_module_by_name[VK_SHADER_STAGE_TYPE_COUNT]; Map material_by_name; Map texture_by_name; @@ -95,7 +98,7 @@ public: // VBO/VAO public: //Material - const ShaderModule *CreateShaderModule(const AnsiString &shader_module_name,VkShaderStageFlagBits shader_stage,const uint32_t *spv_data,const size_t spv_size); + const ShaderModule *CreateShaderModule(const AnsiString &shader_module_name,const ShaderCreateInfo *); Material * CreateMaterial(const mtl::MaterialCreateInfo *); diff --git a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp index 712cb3cd..127d367c 100644 --- a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp @@ -12,21 +12,28 @@ #include VK_NAMESPACE_BEGIN -const ShaderModule *RenderResource::CreateShaderModule(const AnsiString &sm_name,VkShaderStageFlagBits shader_stage,const uint32_t *spv_data,const size_t spv_size) +const ShaderModule *RenderResource::CreateShaderModule(const AnsiString &sm_name,const ShaderCreateInfo *sci) { if(!device)return(nullptr); if(sm_name.IsEmpty())return(nullptr); - if(!spv_data)return(nullptr); - if(spv_size<4)return(nullptr); + + const int bit_offset=GetBitOffset((uint32_t)sci->GetShaderStage()); + + if(bit_offset<0||bit_offset>VK_SHADER_STAGE_TYPE_COUNT)return(nullptr); ShaderModule *sm; - if(shader_module_by_name.Get(sm_name,sm)) + ShaderModuleMapByName &sm_map=shader_module_by_name[bit_offset]; + + if(sm_map.Get(sm_name,sm)) return sm; - sm=device->CreateShaderModule(shader_stage,spv_data,spv_size); + sm=device->CreateShaderModule(sci->GetShaderStage(),sci->GetSPVData(),sci->GetSPVSize()); - shader_module_by_name.Add(sm_name,sm); + if(!sm) + return(nullptr); + + sm_map.Add(sm_name,sm); #ifdef _DEBUG { @@ -65,9 +72,7 @@ Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci) if(vert) { - sm=CreateShaderModule( mtl_name+U8_TEXT("?Vertex"), - VK_SHADER_STAGE_VERTEX_BIT, - vert->GetSPVData(),vert->GetSPVSize()); + sm=CreateShaderModule(mtl_name,vert); if(!sm) return(false); @@ -80,9 +85,7 @@ Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci) if(geom) { - sm=CreateShaderModule( mtl_name+U8_TEXT("?Geometry"), - VK_SHADER_STAGE_GEOMETRY_BIT, - geom->GetSPVData(),geom->GetSPVSize()); + sm=CreateShaderModule(mtl_name,geom); smm->Add(sm); } @@ -91,9 +94,7 @@ Material *RenderResource::CreateMaterial(const mtl::MaterialCreateInfo *mci) if(frag) { - sm=CreateShaderModule( mtl_name+U8_TEXT("?Fragment"), - VK_SHADER_STAGE_FRAGMENT_BIT, - frag->GetSPVData(),frag->GetSPVSize()); + sm=CreateShaderModule(mtl_name,frag); smm->Add(sm); }