From 1cebaa2714f6f0b683f4d5affd1e894dc3494e11 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 6 May 2019 22:33:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9BShader=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E7=AE=A1=E7=90=86=EF=BC=8C=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E4=B8=80=E6=AC=A1=E6=B3=A8=E5=86=8C=E6=89=80=E6=9C=89=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Vulkan/main.cpp | 2 +- inc/hgl/graph/vulkan/VKMaterial.h | 21 ++++++-- inc/hgl/graph/vulkan/VKShaderModule.h | 26 ++-------- inc/hgl/graph/vulkan/VKShaderResource.h | 29 +++++++++++ src/RenderDevice/Vulkan/CMakeLists.txt | 1 + .../Vulkan/VKDescriptorSetLayoutCreater.h | 49 ++++++++++--------- src/RenderDevice/Vulkan/VKMaterial.cpp | 29 +++++------ src/RenderDevice/Vulkan/VKShaderModule.cpp | 33 +++++++------ src/RenderDevice/Vulkan/VKShaderParse.h | 19 ++++++- 9 files changed, 128 insertions(+), 81 deletions(-) create mode 100644 inc/hgl/graph/vulkan/VKShaderResource.h diff --git a/example/Vulkan/main.cpp b/example/Vulkan/main.cpp index 4e564aa8..9636479c 100644 --- a/example/Vulkan/main.cpp +++ b/example/Vulkan/main.cpp @@ -88,7 +88,7 @@ private: if(!ubo_mvp) return(false); - return desciptor_sets->UpdateUBO(material->GetUBOBinding("world"),*ubo_mvp); + return desciptor_sets->UpdateUBO(material->GetUBO("world"),*ubo_mvp); //material中这里可以改成不区分类型,返回的值包含类型和ID,这样descriptor_sets->Update也不再需要类型 } void InitVBO() diff --git a/inc/hgl/graph/vulkan/VKMaterial.h b/inc/hgl/graph/vulkan/VKMaterial.h index 1df6f985..cba30280 100644 --- a/inc/hgl/graph/vulkan/VKMaterial.h +++ b/inc/hgl/graph/vulkan/VKMaterial.h @@ -37,9 +37,24 @@ public: Material(Device *dev,ShaderModuleMap *smm,List *,DescriptorSetLayoutCreater *dslc); ~Material(); - const int GetUBOBinding(const UTF8String &)const; -// const int GetSSBOBinding(const UTF8String &)const; -// const int GetINBOBinding(const UTF8String &)const; + const int GetBinding(VkDescriptorType,const UTF8String &)const; + +#define GET_BO_BINDING(name,vk_name) const int Get##name(const UTF8String &obj_name)const{return GetBinding(VK_DESCRIPTOR_TYPE_##vk_name,obj_name);} + GET_BO_BINDING(Sampler, SAMPLER) + + GET_BO_BINDING(CombindImageSampler, COMBINED_IMAGE_SAMPLER) + GET_BO_BINDING(SampledImage, SAMPLED_IMAGE) + GET_BO_BINDING(StorageImage, STORAGE_IMAGE) + + GET_BO_BINDING(UTBO, UNIFORM_TEXEL_BUFFER) + GET_BO_BINDING(SSTBO, STORAGE_TEXEL_BUFFER) + GET_BO_BINDING(UBO, UNIFORM_BUFFER) + GET_BO_BINDING(SSBO, STORAGE_BUFFER) + GET_BO_BINDING(UBODynamic, UNIFORM_BUFFER_DYNAMIC) + GET_BO_BINDING(SSBODynamic, STORAGE_BUFFER_DYNAMIC) + + GET_BO_BINDING(InputAttachment, INPUT_ATTACHMENT) + #undef GET_BO_BINDING const uint32_t GetStageCount ()const{return shader_stage_list->GetCount();} const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list->GetData();} diff --git a/inc/hgl/graph/vulkan/VKShaderModule.h b/inc/hgl/graph/vulkan/VKShaderModule.h index 091c92dc..02f32f40 100644 --- a/inc/hgl/graph/vulkan/VKShaderModule.h +++ b/inc/hgl/graph/vulkan/VKShaderModule.h @@ -1,14 +1,9 @@ #ifndef HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE #define HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE -#include"VK.h" -#include -#include +#include VK_NAMESPACE_BEGIN - -using ShaderBindingList=List; /// ubo_map; - ShaderBindingList ubo_list; - -protected: - - void ParseUBO(const ShaderParse *); + ShaderResource resource; public: @@ -47,17 +37,11 @@ public: const VkShaderStageFlagBits GetStage ()const{return stage_create_info->stage;} const VkPipelineShaderStageCreateInfo * GetCreateInfo ()const{return stage_create_info;} - const int GetUBO (const UTF8String &name)const + const ShaderResource & GetResource ()const{return resource;} + const int GetBinding (VkDescriptorType desc_type,const UTF8String &name)const { - int binding; - - if(ubo_map.Get(name,binding)) - return binding; - else - return -1; + return resource[desc_type].GetBinding(name); } - - const ShaderBindingList & GetUBOBindingList()const{return ubo_list;} ///<取得UBO绑定点列表 };//class ShaderModule class VertexAttributeBinding; diff --git a/inc/hgl/graph/vulkan/VKShaderResource.h b/inc/hgl/graph/vulkan/VKShaderResource.h new file mode 100644 index 00000000..17f1b4c4 --- /dev/null +++ b/inc/hgl/graph/vulkan/VKShaderResource.h @@ -0,0 +1,29 @@ +#ifndef HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE +#define HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE + +#include +#include +#include + +VK_NAMESPACE_BEGIN +struct ShaderResourceList +{ + Map binding_by_name; ///<名字索引 + List binding_list; ///<资源binding列表 + +public: + + const int GetBinding(const UTF8String &name)const + { + int binding; + + if(binding_by_name.Get(name,binding)) + return binding; + else + return -1; + } +};//struct ShaderResource + +using ShaderResource=ShaderResourceList[VK_DESCRIPTOR_TYPE_RANGE_SIZE]; +VK_NAMESPACE_END +#endif//HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE diff --git a/src/RenderDevice/Vulkan/CMakeLists.txt b/src/RenderDevice/Vulkan/CMakeLists.txt index c7011894..ed0e78b3 100644 --- a/src/RenderDevice/Vulkan/CMakeLists.txt +++ b/src/RenderDevice/Vulkan/CMakeLists.txt @@ -17,6 +17,7 @@ ${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKRenderable.h ${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKRenderPass.h ${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKSemaphore.h + ${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKShaderResource.h ${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKShaderModule.h ${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKShaderModuleManage.h ${ROOT_INCLUDE_PATH}/hgl/graph/vulkan/VKSurfaceExtensionName.h diff --git a/src/RenderDevice/Vulkan/VKDescriptorSetLayoutCreater.h b/src/RenderDevice/Vulkan/VKDescriptorSetLayoutCreater.h index 77f5aed5..8bf57f48 100644 --- a/src/RenderDevice/Vulkan/VKDescriptorSetLayoutCreater.h +++ b/src/RenderDevice/Vulkan/VKDescriptorSetLayoutCreater.h @@ -1,7 +1,6 @@ #pragma once -#include -#include +#include VK_NAMESPACE_BEGIN class Device; class DescriptorSets; @@ -26,27 +25,33 @@ public: void Bind(const uint32_t binding,VkDescriptorType,VkShaderStageFlagBits); void Bind(const uint32_t *binding,const uint32_t count,VkDescriptorType type,VkShaderStageFlagBits stage); + void Bind(const ShaderResourceList &srl,VkDescriptorType type,VkShaderStageFlagBits stage){Bind(srl.binding_list.GetData(),srl.binding_list.GetCount(),type,stage);} + void Bind(const ShaderResource &sr,VkShaderStageFlagBits stage) + { + for(uint32_t i=VK_DESCRIPTOR_TYPE_BEGIN_RANGE;i<=VK_DESCRIPTOR_TYPE_END_RANGE;i++) + Bind(sr[i],(VkDescriptorType)i,stage); + } -#define DESC_SET_BIND_FUNC(name,vkname) void Bind##name(const uint32_t binding,VkShaderStageFlagBits stage_flag){Bind(binding,VK_DESCRIPTOR_TYPE_##vkname,stage_flag);} \ - void Bind##name(const uint32_t *binding,const uint32_t count,VkShaderStageFlagBits stage_flag){Bind(binding,count,VK_DESCRIPTOR_TYPE_##vkname,stage_flag);} - - DESC_SET_BIND_FUNC(Sampler, SAMPLER); - DESC_SET_BIND_FUNC(UBO, UNIFORM_BUFFER); - DESC_SET_BIND_FUNC(SSBO, STORAGE_BUFFER); - - DESC_SET_BIND_FUNC(CombinedImageSampler, COMBINED_IMAGE_SAMPLER); - DESC_SET_BIND_FUNC(SampledImage, SAMPLED_IMAGE); - DESC_SET_BIND_FUNC(StorageImage, STORAGE_IMAGE); - DESC_SET_BIND_FUNC(UniformTexelBuffer, UNIFORM_TEXEL_BUFFER); - DESC_SET_BIND_FUNC(StorageTexelBuffer, STORAGE_TEXEL_BUFFER); - - - DESC_SET_BIND_FUNC(UBODynamic, UNIFORM_BUFFER_DYNAMIC); - DESC_SET_BIND_FUNC(SBODynamic, STORAGE_BUFFER_DYNAMIC); - - DESC_SET_BIND_FUNC(InputAttachment, INPUT_ATTACHMENT); - -#undef DESC_SET_BIND_FUNC +// +//#define DESC_SET_BIND_FUNC(name,vkname) void Bind##name(const uint32_t binding,VkShaderStageFlagBits stage_flag){Bind(binding,VK_DESCRIPTOR_TYPE_##vkname,stage_flag);} \ +// void Bind##name(const uint32_t *binding,const uint32_t count,VkShaderStageFlagBits stage_flag){Bind(binding,count,VK_DESCRIPTOR_TYPE_##vkname,stage_flag);} +// +// DESC_SET_BIND_FUNC(Sampler, SAMPLER); +// +// DESC_SET_BIND_FUNC(CombinedImageSampler, COMBINED_IMAGE_SAMPLER); +// DESC_SET_BIND_FUNC(SampledImage, SAMPLED_IMAGE); +// DESC_SET_BIND_FUNC(StorageImage, STORAGE_IMAGE); +// +// DESC_SET_BIND_FUNC(UTBO, UNIFORM_TEXEL_BUFFER); +// DESC_SET_BIND_FUNC(SSTBO, STORAGE_TEXEL_BUFFER); +// DESC_SET_BIND_FUNC(UBO, UNIFORM_BUFFER); +// DESC_SET_BIND_FUNC(SSBO, STORAGE_BUFFER); +// DESC_SET_BIND_FUNC(UBODynamic, UNIFORM_BUFFER_DYNAMIC); +// DESC_SET_BIND_FUNC(SSBODynamic, STORAGE_BUFFER_DYNAMIC); +// +// DESC_SET_BIND_FUNC(InputAttachment, INPUT_ATTACHMENT); +// +//#undef DESC_SET_BIND_FUNC bool CreatePipelineLayout(); diff --git a/src/RenderDevice/Vulkan/VKMaterial.cpp b/src/RenderDevice/Vulkan/VKMaterial.cpp index fc3b7450..7c7cf1cf 100644 --- a/src/RenderDevice/Vulkan/VKMaterial.cpp +++ b/src/RenderDevice/Vulkan/VKMaterial.cpp @@ -34,11 +34,7 @@ Material *CreateMaterial(Device *dev,ShaderModuleMap *shader_maps) sm=(*itp)->right; memcpy(p,sm->GetCreateInfo(),sizeof(VkPipelineShaderStageCreateInfo)); - { - const ShaderBindingList &ubo_list=sm->GetUBOBindingList(); - - dsl_creater->BindUBO(ubo_list.GetData(),ubo_list.GetCount(),sm->GetStage()); - } + dsl_creater->Bind(sm->GetResource(),sm->GetStage()); ++p; ++itp; @@ -78,9 +74,14 @@ Material::~Material() delete shader_maps; } -const int Material::GetUBOBinding(const UTF8String &name)const +const int Material::GetBinding(VkDescriptorType desc_type,const UTF8String &name)const { - int result; + if(desc_typeVK_DESCRIPTOR_TYPE_END_RANGE + ||name.IsEmpty()) + return(-1); + + int binding; const int shader_count=shader_maps->GetCount(); const ShaderModule *sm; @@ -88,9 +89,9 @@ const int Material::GetUBOBinding(const UTF8String &name)const for(int i=0;iright; - result=sm->GetUBO(name); - if(result!=-1) - return result; + binding=sm->GetBinding(desc_type,name); + if(binding!=-1) + return binding; ++itp; } @@ -98,14 +99,6 @@ const int Material::GetUBOBinding(const UTF8String &name)const return(-1); } -//const int Material::GetSSBOBinding(const UTF8String &name)const -//{ -//} -// -//const int Material::GetINBOBinding(const UTF8String &name)const -//{ -//} - const VkPipelineLayout Material::GetPipelineLayout()const { return dsl_creater->GetPipelineLayout(); diff --git a/src/RenderDevice/Vulkan/VKShaderModule.cpp b/src/RenderDevice/Vulkan/VKShaderModule.cpp index 6c462262..1f4901ea 100644 --- a/src/RenderDevice/Vulkan/VKShaderModule.cpp +++ b/src/RenderDevice/Vulkan/VKShaderModule.cpp @@ -3,6 +3,21 @@ #include"VKShaderParse.h" VK_NAMESPACE_BEGIN +namespace +{ + void EnumShaderResource(const ShaderParse *parse,ShaderResourceList &sr,const spirv_cross::SmallVector &res) + { + for(const auto &obj:res) + { + const UTF8String & name =parse->GetName(obj); + const uint binding =parse->GetBinding(obj); + + sr.binding_by_name.Add(name,binding); + sr.binding_list.Add(binding); + } + } +}//namespace + ShaderModule::ShaderModule(VkDevice dev,int id,VkPipelineShaderStageCreateInfo *sci,const ShaderParse *sp) { device=dev; @@ -11,7 +26,9 @@ ShaderModule::ShaderModule(VkDevice dev,int id,VkPipelineShaderStageCreateInfo * stage_create_info=sci; - ParseUBO(sp); + EnumShaderResource(sp,resource[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER],sp->GetUBO()); + EnumShaderResource(sp,resource[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER],sp->GetSSBO()); +// EnumShaderResource(sp,resource[VK_DESCRIPTOR_TYPE_SAMPLER],sp->GetSampler()); } ShaderModule::~ShaderModule() @@ -20,21 +37,9 @@ ShaderModule::~ShaderModule() delete stage_create_info; } -void ShaderModule::ParseUBO(const ShaderParse *parse) -{ - for(const auto &ubo:parse->GetUBO()) - { - const UTF8String & name =parse->GetName(ubo); - const uint binding =parse->GetBinding(ubo); - - ubo_map.Add(name,binding); - ubo_list.Add(binding); - } -} - VertexShaderModule::VertexShaderModule(VkDevice dev,int id,VkPipelineShaderStageCreateInfo *pssci,const ShaderParse *parse):ShaderModule(dev,id,pssci,parse) { - const auto &stage_inputs=parse->GetStageInput(); + const auto &stage_inputs=parse->GetStageInputs(); attr_count=(uint32_t)stage_inputs.size(); binding_list=new VkVertexInputBindingDescription[attr_count]; diff --git a/src/RenderDevice/Vulkan/VKShaderParse.h b/src/RenderDevice/Vulkan/VKShaderParse.h index 1ee04127..18985d17 100644 --- a/src/RenderDevice/Vulkan/VKShaderParse.h +++ b/src/RenderDevice/Vulkan/VKShaderParse.h @@ -25,8 +25,23 @@ public: delete compiler; } - const spirv_cross::SmallVector &GetUBO()const{return resource.uniform_buffers;} - const spirv_cross::SmallVector &GetStageInput()const{return resource.stage_inputs;} +#define SHADER_PARSE_GET_RESOURCE(name,buf_name) const spirv_cross::SmallVector &Get##name()const{return resource.buf_name;} + + SHADER_PARSE_GET_RESOURCE(UBO, uniform_buffers) + SHADER_PARSE_GET_RESOURCE(SSBO, storage_buffers) + SHADER_PARSE_GET_RESOURCE(StageInputs, stage_inputs) + SHADER_PARSE_GET_RESOURCE(StageOutputs, stage_outputs) + + //SmallVector subpass_inputs; + //SmallVector storage_images; + //SmallVector sampled_images; + //SmallVector atomic_counters; + //SmallVector acceleration_structures; + //SmallVector push_constant_buffers; + //SmallVector separate_images; + //SmallVector separate_samplers; + +#undef SHADER_PARSE_GET_RESOURCE public: