From e7f000990876850d9b3f07b8561731cdfdafd269 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sat, 5 Sep 2020 18:36:18 +0800 Subject: [PATCH] upgrade ShaderModuleMap, auto detect kind of ShaderModule --- CMAssetsManage | 2 +- CMCore | 2 +- CMPlatform | 2 +- CMSceneGraph | 2 +- inc/hgl/graph/vulkan/ShaderModuleMap.h | 23 +++++++++++++++++++ inc/hgl/graph/vulkan/VK.h | 1 + inc/hgl/graph/vulkan/VKMaterial.h | 1 - inc/hgl/graph/vulkan/VKShaderModule.h | 10 ++++++++ src/RenderDevice/Vulkan/CMakeLists.txt | 2 ++ src/RenderDevice/Vulkan/ShaderModuleMap.cpp | 15 ++++++++++++ src/RenderDevice/Vulkan/VKMaterial.cpp | 1 + .../Vulkan/VKShaderModuleManage.cpp | 21 +++++++++-------- 12 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 inc/hgl/graph/vulkan/ShaderModuleMap.h create mode 100644 src/RenderDevice/Vulkan/ShaderModuleMap.cpp diff --git a/CMAssetsManage b/CMAssetsManage index c2a18897..1e14c1b0 160000 --- a/CMAssetsManage +++ b/CMAssetsManage @@ -1 +1 @@ -Subproject commit c2a18897ee57706681ed8b803187a129df5b3e40 +Subproject commit 1e14c1b01dd9b1e6590110cdf5fb239da30d00c1 diff --git a/CMCore b/CMCore index 80d1e17d..7927586b 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 80d1e17dcb28bba754a826044462bf08ab81de32 +Subproject commit 7927586bd1e36f0e0d7dd6d1e944570bd5121e19 diff --git a/CMPlatform b/CMPlatform index 12590b9c..1209d487 160000 --- a/CMPlatform +++ b/CMPlatform @@ -1 +1 @@ -Subproject commit 12590b9c6420114154696d23dab0ca14e0baae21 +Subproject commit 1209d487ba12af9cab085c18aa4c3722d8e8f6d0 diff --git a/CMSceneGraph b/CMSceneGraph index 762124c1..384727bf 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit 762124c15723d71fd9d2b056d91ff4bf7737fd59 +Subproject commit 384727bf3ed298d9aaaa2454afa910568039f1ff diff --git a/inc/hgl/graph/vulkan/ShaderModuleMap.h b/inc/hgl/graph/vulkan/ShaderModuleMap.h new file mode 100644 index 00000000..dd7d8f8b --- /dev/null +++ b/inc/hgl/graph/vulkan/ShaderModuleMap.h @@ -0,0 +1,23 @@ +#ifndef HGL_GRAPH_VULKAN_SHADER_MODULE_MAP_INCLUDE +#define HGL_GRAPH_VULKAN_SHADER_MODULE_MAP_INCLUDE + +#include +#include + +VK_NAMESPACE_BEGIN + +using namespace hgl; + +class ShaderModule; + +class ShaderModuleMap:public Map +{ +public: + + using Map::Map; + ~ShaderModuleMap()=default; + + bool Add(const ShaderModule *sm); +};//class ShaderModuleMap:public Map +VK_NAMESPACE_END +#endif//HGL_GRAPH_VULKAN_SHADER_MODULE_MAP_INCLUDE diff --git a/inc/hgl/graph/vulkan/VK.h b/inc/hgl/graph/vulkan/VK.h index e0345542..2c5361fd 100644 --- a/inc/hgl/graph/vulkan/VK.h +++ b/inc/hgl/graph/vulkan/VK.h @@ -49,6 +49,7 @@ class Semaphore; struct ShaderStage; +class ShaderModuleMap; class ShaderModule; class ShaderModuleManage; class VertexShaderModule; diff --git a/inc/hgl/graph/vulkan/VKMaterial.h b/inc/hgl/graph/vulkan/VKMaterial.h index 8fa4353c..5c7c300e 100644 --- a/inc/hgl/graph/vulkan/VKMaterial.h +++ b/inc/hgl/graph/vulkan/VKMaterial.h @@ -6,7 +6,6 @@ #include VK_NAMESPACE_BEGIN class DescriptorSetLayoutCreater; -using ShaderModuleMap=hgl::Map; /** * 材质类
diff --git a/inc/hgl/graph/vulkan/VKShaderModule.h b/inc/hgl/graph/vulkan/VKShaderModule.h index 22c2998f..589c5062 100644 --- a/inc/hgl/graph/vulkan/VKShaderModule.h +++ b/inc/hgl/graph/vulkan/VKShaderModule.h @@ -37,6 +37,16 @@ public: public: const VkShaderStageFlagBits GetStage ()const{return stage_create_info->stage;} + + const bool IsVertex ()const{return stage_create_info->stage==VK_SHADER_STAGE_VERTEX_BIT;} + const bool IsTessControl ()const{return stage_create_info->stage==VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;} + const bool IsTessEval ()const{return stage_create_info->stage==VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;} + const bool IsGeometry ()const{return stage_create_info->stage==VK_SHADER_STAGE_GEOMETRY_BIT;} + const bool IsFragment ()const{return stage_create_info->stage==VK_SHADER_STAGE_FRAGMENT_BIT;} + const bool IsCompute ()const{return stage_create_info->stage==VK_SHADER_STAGE_COMPUTE_BIT;} + const bool IsTask ()const{return stage_create_info->stage==VK_SHADER_STAGE_TASK_BIT_NV;} + const bool IsMesh ()const{return stage_create_info->stage==VK_SHADER_STAGE_MESH_BIT_NV;} + const VkPipelineShaderStageCreateInfo * GetCreateInfo ()const{return stage_create_info;} const int GetBinding (VkDescriptorType desc_type,const AnsiString &name)const diff --git a/src/RenderDevice/Vulkan/CMakeLists.txt b/src/RenderDevice/Vulkan/CMakeLists.txt index 150444a0..e98e2daf 100644 --- a/src/RenderDevice/Vulkan/CMakeLists.txt +++ b/src/RenderDevice/Vulkan/CMakeLists.txt @@ -59,6 +59,8 @@ SET(VK_TEXTURE_SOURCE ${RD_INCLUDE_PATH}/VKImageView.h SET(VK_MATERIAL_SOURCE ${RD_INCLUDE_PATH}/VKMaterial.h ${RD_INCLUDE_PATH}/VKMaterialInstance.h + ${RD_INCLUDE_PATH}/ShaderModuleMap.h + ShaderModuleMap.cpp VKMaterial.cpp VKMaterialInstance.cpp) diff --git a/src/RenderDevice/Vulkan/ShaderModuleMap.cpp b/src/RenderDevice/Vulkan/ShaderModuleMap.cpp new file mode 100644 index 00000000..208aa002 --- /dev/null +++ b/src/RenderDevice/Vulkan/ShaderModuleMap.cpp @@ -0,0 +1,15 @@ +#include +#include + +VK_NAMESPACE_BEGIN +bool ShaderModuleMap::Add(const ShaderModule *sm) +{ + if(!sm)return(false); + + const VkShaderStageFlagBits stage=sm->GetStage(); + + if(this->KeyExist(stage))return(false); + + return this->Map::Add(stage,sm); +} +VK_NAMESPACE_END \ No newline at end of file diff --git a/src/RenderDevice/Vulkan/VKMaterial.cpp b/src/RenderDevice/Vulkan/VKMaterial.cpp index 61debcd9..a16d3e2f 100644 --- a/src/RenderDevice/Vulkan/VKMaterial.cpp +++ b/src/RenderDevice/Vulkan/VKMaterial.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include diff --git a/src/RenderDevice/Vulkan/VKShaderModuleManage.cpp b/src/RenderDevice/Vulkan/VKShaderModuleManage.cpp index b6e07b1d..07b3888d 100644 --- a/src/RenderDevice/Vulkan/VKShaderModuleManage.cpp +++ b/src/RenderDevice/Vulkan/VKShaderModuleManage.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -104,13 +105,13 @@ Material *ShaderModuleManage::CreateMaterial(const VertexShaderModule *vertex_sh if(!vertex_shader_module||!fragment_shader_module) return(nullptr); - if(vertex_shader_module->GetStage()!=VK_SHADER_STAGE_VERTEX_BIT)return(nullptr); - if(fragment_shader_module->GetStage()!=VK_SHADER_STAGE_FRAGMENT_BIT)return(nullptr); + if(!vertex_shader_module->IsVertex())return(nullptr); + if(!fragment_shader_module->IsFragment())return(nullptr); ShaderModuleMap *smm=new ShaderModuleMap; - smm->Add(VK_SHADER_STAGE_VERTEX_BIT,vertex_shader_module); - smm->Add(VK_SHADER_STAGE_FRAGMENT_BIT,fragment_shader_module); + smm->Add(vertex_shader_module); + smm->Add(fragment_shader_module); return(VK_NAMESPACE::CreateMaterial(device,smm)); } @@ -122,15 +123,15 @@ Material *ShaderModuleManage::CreateMaterial(const VertexShaderModule *vertex_sh ||!fragment_shader_module) return(nullptr); - if(vertex_shader_module->GetStage()!=VK_SHADER_STAGE_VERTEX_BIT)return(nullptr); - if(geometry_shader_module->GetStage()!=VK_SHADER_STAGE_GEOMETRY_BIT)return(nullptr); - if(fragment_shader_module->GetStage()!=VK_SHADER_STAGE_FRAGMENT_BIT)return(nullptr); + if(!vertex_shader_module->IsVertex())return(nullptr); + if(!geometry_shader_module->IsGeometry())return(nullptr); + if(!fragment_shader_module->IsFragment())return(nullptr); ShaderModuleMap *smm=new ShaderModuleMap; - smm->Add(VK_SHADER_STAGE_VERTEX_BIT,vertex_shader_module); - smm->Add(VK_SHADER_STAGE_GEOMETRY_BIT,geometry_shader_module); - smm->Add(VK_SHADER_STAGE_FRAGMENT_BIT,fragment_shader_module); + smm->Add(vertex_shader_module); + smm->Add(geometry_shader_module); + smm->Add(fragment_shader_module); return(VK_NAMESPACE::CreateMaterial(device,smm)); }