From facdec5556b3678fdb0663e3e52be00c43379b64 Mon Sep 17 00:00:00 2001 From: "HuYingzhuo(hugo/hyzboy)" Date: Sun, 19 Mar 2023 19:41:21 +0800 Subject: [PATCH] 1.removed VertexShaderModule 2.added VertexInput at MaterialData 3.newly CreateShaderModule/CreateMaterial functions at GPUDevice/RenderResource class. --- CMSceneGraph | 2 +- example/Vulkan/first_triangle.cpp | 1 + inc/hgl/graph/VK.h | 37 +---- inc/hgl/graph/VKDevice.h | 6 +- inc/hgl/graph/VKMaterial.h | 13 +- inc/hgl/graph/VKRenderResource.h | 2 +- inc/hgl/graph/VKShaderModule.h | 50 +------ inc/hgl/graph/VKShaderResource.h | 11 -- src/SceneGraph/Vulkan/VKDeviceMaterial.cpp | 47 +------ src/SceneGraph/Vulkan/VKMaterial.cpp | 18 +++ src/SceneGraph/Vulkan/VKMaterialInstance.cpp | 4 +- .../Vulkan/VKRenderResourceMaterial.cpp | 20 ++- src/SceneGraph/Vulkan/VKShaderModule.cpp | 129 +++--------------- src/SceneGraph/font/TextRender.cpp | 1 + 14 files changed, 73 insertions(+), 268 deletions(-) diff --git a/CMSceneGraph b/CMSceneGraph index f51a6a98..4a7af92a 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit f51a6a98d6268e93fe854a2c3a07e559778c3e54 +Subproject commit 4a7af92ac66d55d1e6bf3d7e384ab92797e0559a diff --git a/example/Vulkan/first_triangle.cpp b/example/Vulkan/first_triangle.cpp index 4a95d593..6484cb4e 100644 --- a/example/Vulkan/first_triangle.cpp +++ b/example/Vulkan/first_triangle.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include using namespace hgl; diff --git a/inc/hgl/graph/VK.h b/inc/hgl/graph/VK.h index f1879402..7715f3e2 100644 --- a/inc/hgl/graph/VK.h +++ b/inc/hgl/graph/VK.h @@ -75,7 +75,6 @@ struct ShaderAttribute; class ShaderResource; class ShaderModule; -class VertexShaderModule; class ShaderModuleMap; class MaterialDescriptorSets; @@ -86,39 +85,9 @@ struct PipelineData; enum class InlinePipeline; class Pipeline; -struct VAConfig -{ - VkFormat format; - bool instance; - -public: - - VAConfig() - { - format=PF_UNDEFINED; - instance=false; - } - - VAConfig(const VkFormat fmt,bool inst=false) - { - format=fmt; - instance=inst; - } - - CompOperatorMemcmp(const VAConfig &); -}; - -class VILConfig:public Map -{ -public: - - using Map::Map; - - bool Add(const AnsiString &name,const VkFormat fmt,const bool inst=false) - { - return Map::Add(name,VAConfig(fmt,inst)); - } -}; +struct VAConfig; +class VILConfig; +class VertexInput; class VertexInputLayout; using VIL=VertexInputLayout; diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index e6c1c6e5..683ae077 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -224,11 +224,9 @@ public: //shader & material MaterialParameters *CreateMP(const MaterialDescriptorSets *,const PipelineLayoutData *,const DescriptorSetType &); MaterialParameters *CreateMP(Material *,const DescriptorSetType &); - ShaderModule *CreateShaderModule(ShaderResource *); + ShaderModule *CreateShaderModule(VkShaderStageFlagBits,const void *,const size_t); - Material *CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps,MaterialDescriptorSets *); - Material *CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *); - Material *CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *); + Material *CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps,MaterialDescriptorSets *,VertexInput *); MaterialInstance *CreateMI(Material *,const VILConfig *vil_cfg=nullptr); diff --git a/inc/hgl/graph/VKMaterial.h b/inc/hgl/graph/VKMaterial.h index 8ff4ffb3..b3dcff0d 100644 --- a/inc/hgl/graph/VKMaterial.h +++ b/inc/hgl/graph/VKMaterial.h @@ -15,10 +15,11 @@ struct MaterialData { UTF8String name; - ShaderModuleMap *shader_maps; - MaterialDescriptorSets *mds; + VertexInput *vertex_input; - VertexShaderModule *vertex_sm; + ShaderModuleMap *shader_maps; + + MaterialDescriptorSets *mds; ShaderStageCreateInfoList shader_stage_list; @@ -54,7 +55,7 @@ public: const UTF8String & GetName ()const{return data->name;} - VertexShaderModule * GetVertexShaderModule () {return data->vertex_sm;} + const VertexInput * GetVertexInput ()const{return data->vertex_input;} const ShaderStageCreateInfoList & GetStageList ()const{return data->shader_stage_list;} @@ -72,6 +73,10 @@ public: } const bool hasSet (const DescriptorSetType &type)const; + + VIL * CreateVIL(const VILConfig *format_map=nullptr); + bool Release(VIL *); + const uint GetVILCount(); };//class Material VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index 3362bcd1..bd6b49e2 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -88,7 +88,7 @@ public: // VBO/VAO public: //Material - const ShaderModule *CreateShaderModule(const OSString &filename,ShaderResource *shader_resource); + const ShaderModule *CreateShaderModule(const OSString &filename,VkShaderStageFlagBits shader_stage,const void *spv_data,const size_t spv_size); Material * CreateMaterial(const OSString &); Material * CreateMaterial(const hgl::shadergen::MaterialCreateInfo *); diff --git a/inc/hgl/graph/VKShaderModule.h b/inc/hgl/graph/VKShaderModule.h index 339e75f1..d948cf0d 100644 --- a/inc/hgl/graph/VKShaderModule.h +++ b/inc/hgl/graph/VKShaderModule.h @@ -2,7 +2,6 @@ #define HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE #include -#include #include #include @@ -21,13 +20,9 @@ private: VkPipelineShaderStageCreateInfo *stage_create_info; -protected: - - ShaderResource *shader_resource; - public: - ShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *pssci,ShaderResource *); + ShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *pssci); virtual ~ShaderModule(); const int IncRef(){return ++ref_count;} @@ -50,48 +45,5 @@ public: operator VkShaderModule ()const{return stage_create_info->module;} };//class ShaderModule - -/** - * 顶点Shader模块
- * 由于顶点shader在最前方执行,所以它比其它shader多了VertexInput的数据 - */ -class VertexShaderModule:public ShaderModule -{ - uint32_t attr_count; - VAT *type_list; - const char **name_list; - ShaderAttribute *shader_attr_list; - -private: - - SortedSets vil_sets; - -public: - - VertexShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *pssci,ShaderResource *sr); - virtual ~VertexShaderModule(); - - /** - * 获取输入流绑定点,需要注意的时,这里获取的binding并非是shader中的binding/location,而是绑定顺序的序列号。对应vkCmdBindVertexBuffer的缓冲区序列号 - */ - const int GetInputBinding(const AnsiString &name)const{return shader_resource->GetInputBinding(name);} - const ShaderAttribute * GetInput (const AnsiString &name)const{return shader_resource->GetInput(name);} - const uint GetInputCount () const{return shader_resource->GetInputCount();} - const ShaderAttributeArray & GetInputs () const{return shader_resource->GetInputs();} - - //const uint32_t GetAttrCount()const{return attr_count;} - - //const VkVertexInputBindingDescription * GetBindList ()const{return binding_list;} - //const VkVertexInputAttributeDescription * GetAttrList ()const{return attribute_list;} - - //const VkVertexInputBindingDescription * GetBind (const uint32_t index)const{return (index>=attr_count?nullptr:binding_list+index);} - //const VkVertexInputAttributeDescription * GetAttr (const uint32_t index)const{return (index>=attr_count?nullptr:attribute_list+index);} - -public: - - VIL * CreateVIL(const VILConfig *format_map=nullptr); - bool Release(VIL *); - const uint32_t GetInstanceCount()const{return vil_sets.GetCount();} -};//class VertexShaderModule:public ShaderModule VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE diff --git a/inc/hgl/graph/VKShaderResource.h b/inc/hgl/graph/VKShaderResource.h index a292ce37..b157e08a 100644 --- a/inc/hgl/graph/VKShaderResource.h +++ b/inc/hgl/graph/VKShaderResource.h @@ -38,16 +38,5 @@ public: const ShaderAttribute * GetInput (const AnsiString &)const; const int GetInputBinding (const AnsiString &)const; };//class ShaderResource - -struct ShaderModuleCreateInfo:public vkstruct_flag -{ -public: - - ShaderModuleCreateInfo(ShaderResource *sr) - { - codeSize=sr->GetCodeSize(); - pCode =sr->GetCode(); - } -};//struct ShaderModuleCreateInfo VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_SHADER_RESOURCE_INCLUDE diff --git a/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp b/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp index c5d4cffe..bc577f69 100644 --- a/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKDeviceMaterial.cpp @@ -77,16 +77,11 @@ void CreateShaderStageList(List &shader_stage_l } } -Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps,MaterialDescriptorSets *mds) +Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *shader_maps,MaterialDescriptorSets *mds,VertexInput *vi) { const int shader_count=shader_maps->GetCount(); - if(shader_count<2) - return(nullptr); - - const ShaderModule *vsm; - - if(!shader_maps->Get(VK_SHADER_STAGE_VERTEX_BIT,vsm)) + if(shader_count<1) return(nullptr); PipelineLayoutData *pld=CreatePipelineLayoutData(mds); @@ -103,7 +98,7 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap * data->name =mtl_name; data->shader_maps =shader_maps; data->mds =mds; - data->vertex_sm =(VertexShaderModule *)vsm; + data->vertex_input =vi; CreateShaderStageList(data->shader_stage_list,shader_maps); @@ -124,40 +119,4 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap * return(new Material(data)); } - -Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *mds) -{ - if(!vertex_shader_module||!fragment_shader_module) - return(nullptr); - - if(!vertex_shader_module->IsVertex())return(nullptr); - if(!fragment_shader_module->IsFragment())return(nullptr); - - ShaderModuleMap *smm=new ShaderModuleMap; - - smm->Add(vertex_shader_module); - smm->Add(fragment_shader_module); - - return CreateMaterial(mtl_name,smm,mds); -} - -Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,const VertexShaderModule *vertex_shader_module,const ShaderModule *geometry_shader_module,const ShaderModule *fragment_shader_module,MaterialDescriptorSets *mds) -{ - if(!vertex_shader_module - ||!geometry_shader_module - ||!fragment_shader_module) - 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(vertex_shader_module); - smm->Add(geometry_shader_module); - smm->Add(fragment_shader_module); - - return CreateMaterial(mtl_name,smm,mds); -} VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKMaterial.cpp b/src/SceneGraph/Vulkan/VKMaterial.cpp index 35352a63..8f05e410 100644 --- a/src/SceneGraph/Vulkan/VKMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKMaterial.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include"VKPipelineLayoutData.h" VK_NAMESPACE_BEGIN MaterialData::~MaterialData() @@ -11,6 +12,8 @@ MaterialData::~MaterialData() delete shader_maps; SAFE_CLEAR(mds); + + delete vertex_input; } Material::~Material() @@ -28,4 +31,19 @@ const bool Material::hasSet(const DescriptorSetType &dst)const { return data->mds->hasSet(dst); } + +VIL *Material::CreateVIL(const VILConfig *format_map) +{ + return data->vertex_input->CreateVIL(format_map); +} + +bool Material::Release(VIL *vil) +{ + return data->vertex_input->Release(vil); +} + +const uint Material::GetVILCount() +{ + return data->vertex_input->GetInstanceCount(); +} VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKMaterialInstance.cpp b/src/SceneGraph/Vulkan/VKMaterialInstance.cpp index 5fdcf473..a7700979 100644 --- a/src/SceneGraph/Vulkan/VKMaterialInstance.cpp +++ b/src/SceneGraph/Vulkan/VKMaterialInstance.cpp @@ -8,9 +8,7 @@ MaterialInstance *GPUDevice::CreateMI(Material *mtl,const VILConfig *vil_cfg) { if(!mtl)return(nullptr); - VertexShaderModule *vsm=mtl->GetVertexShaderModule(); - - VIL *vil=vsm->CreateVIL(vil_cfg); + VIL *vil=mtl->CreateVIL(vil_cfg); if(!vil)return(nullptr); diff --git a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp index 6aa30a32..63b32c8b 100644 --- a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -11,18 +12,19 @@ VK_NAMESPACE_BEGIN -const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename,ShaderResource *shader_resource) +const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename,VkShaderStageFlagBits shader_stage,const void *spv_data,const size_t spv_size) { if(!device)return(nullptr); if(filename.IsEmpty())return(nullptr); - if(!shader_resource)return(nullptr); + if(!spv_data)return(nullptr); + if(spv_size<4)return(nullptr); ShaderModule *sm; if(shader_module_by_name.Get(filename,sm)) return sm; - sm=device->CreateShaderModule(shader_resource); + sm=device->CreateShaderModule(shader_stage,spv_data,spv_size); shader_module_by_name.Add(filename,sm); @@ -128,6 +130,7 @@ Material *RenderResource::CreateMaterial(const OSString &filename) bool result=true; ShaderModuleMap *smm=new ShaderModuleMap; + VertexInput *vertex_input=nullptr; OSString shader_name; @@ -142,12 +145,17 @@ Material *RenderResource::CreateMaterial(const OSString &filename) { shader_name=filename+OS_TEXT("?")+ToOSString(sr->GetStageName()); - sm=CreateShaderModule(shader_name,sr); + sm=CreateShaderModule(shader_name,sr->GetStage(),sr->GetCode(),sr->GetCodeSize()); if(sm) { if(smm->Add(sm)) + { + if(sr->GetStage()==VK_SHADER_STAGE_VERTEX_BIT) + vertex_input=new VertexInput(sr->GetInputs()); + continue; + } } } @@ -172,9 +180,9 @@ Material *RenderResource::CreateMaterial(const OSString &filename) } } - if(result) + if(result&&vertex_input) { - mtl=device->CreateMaterial(mtl_name,smm,mds); + mtl=device->CreateMaterial(mtl_name,smm,mds,vertex_input); Add(mtl); } else diff --git a/src/SceneGraph/Vulkan/VKShaderModule.cpp b/src/SceneGraph/Vulkan/VKShaderModule.cpp index fd5c88c6..ee31c85e 100644 --- a/src/SceneGraph/Vulkan/VKShaderModule.cpp +++ b/src/SceneGraph/Vulkan/VKShaderModule.cpp @@ -3,135 +3,42 @@ #include VK_NAMESPACE_BEGIN -ShaderModule *GPUDevice::CreateShaderModule(ShaderResource *sr) +struct ShaderModuleCreateInfo:public vkstruct_flag { - if(!sr)return(nullptr); +public: - PipelineShaderStageCreateInfo *shader_stage=new PipelineShaderStageCreateInfo(sr->GetStage()); + ShaderModuleCreateInfo(const void *spv_data,const size_t spv_size) + { + codeSize=spv_size; + pCode =(const uint32_t *)spv_data; + } +};//struct ShaderModuleCreateInfo - ShaderModuleCreateInfo moduleCreateInfo(sr); +ShaderModule *GPUDevice::CreateShaderModule(VkShaderStageFlagBits shader_stage,const void *spv_data,const size_t spv_size) +{ + if(!spv_data||spv_size<4)return(nullptr); - if(vkCreateShaderModule(attr->device,&moduleCreateInfo,nullptr,&(shader_stage->module))!=VK_SUCCESS) + PipelineShaderStageCreateInfo *pss_ci=new PipelineShaderStageCreateInfo(shader_stage); + + ShaderModuleCreateInfo moduleCreateInfo(spv_data,spv_size); + + if(vkCreateShaderModule(attr->device,&moduleCreateInfo,nullptr,&(pss_ci->module))!=VK_SUCCESS) return(nullptr); - ShaderModule *sm; - - if(sr->GetStage()==VK_SHADER_STAGE_VERTEX_BIT) - sm=new VertexShaderModule(attr->device,shader_stage,sr); - else - sm=new ShaderModule(attr->device,shader_stage,sr); - - return sm; + return(new ShaderModule(attr->device,pss_ci)); } -ShaderModule::ShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *sci,ShaderResource *sr) +ShaderModule::ShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *sci) { device=dev; ref_count=0; stage_create_info=sci; - - shader_resource=sr; } ShaderModule::~ShaderModule() { vkDestroyShaderModule(device,stage_create_info->module,nullptr); //这里不用删除stage_create_info,材质中会删除的 - - SAFE_CLEAR(shader_resource); -} - -VertexShaderModule::VertexShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *pssci,ShaderResource *sr):ShaderModule(dev,pssci,sr) -{ - const ShaderAttributeArray &stage_input_list=sr->GetInputs(); - - attr_count=stage_input_list.count; - shader_attr_list=stage_input_list.items; - name_list=new const char *[attr_count]; - type_list=new VAT[attr_count]; - - for(uint i=0;i0) - { - //还有在用的,这是个错误 - } - - delete[] type_list; - delete[] name_list; -} - -VIL *VertexShaderModule::CreateVIL(const VILConfig *cfg) -{ - VkVertexInputBindingDescription *binding_list=new VkVertexInputBindingDescription[attr_count]; - VkVertexInputAttributeDescription *attribute_list=new VkVertexInputAttributeDescription[attr_count]; - - VkVertexInputBindingDescription *bind_desc=binding_list; - VkVertexInputAttributeDescription *attr_desc=attribute_list; - - const ShaderAttribute *sa=shader_attr_list; - VAConfig vac; - - for(uint i=0;ibinding =i; - attr_desc->location =sa->location; //此值对应shader中的layout(location= - - attr_desc->offset =0; - - bind_desc->binding =i; //binding对应在vkCmdBindVertexBuffer中设置的缓冲区的序列号,所以这个数字必须从0开始,而且紧密排列。 - //在Renderable类中,buffer_list必需严格按照本此binding为序列号排列 - - if(!cfg||!cfg->Get(sa->name,vac)) - { - attr_desc->format =GetVulkanFormat(sa); - - //if(memcmp((*sa)->name.c_str(),"Inst_",5)==0) //不可以使用CaseComp("Inst_",5)会被认为是比较一个5字长的字符串,而不是只比较5个字符 - // bind_desc->inputRate =VK_VERTEX_INPUT_RATE_INSTANCE; - //else - bind_desc->inputRate =VK_VERTEX_INPUT_RATE_VERTEX; - } - else - { - if(vac.format!=PF_UNDEFINED) - attr_desc->format =vac.format; - else - attr_desc->format =GetVulkanFormat(sa); - - bind_desc->inputRate =vac.instance?VK_VERTEX_INPUT_RATE_INSTANCE:VK_VERTEX_INPUT_RATE_VERTEX; - } - - bind_desc->stride =GetStrideByFormat(attr_desc->format); - - ++attr_desc; - ++bind_desc; - - ++sa; - } - - VIL *vil=new VIL(attr_count,name_list,type_list,binding_list,attribute_list); - - vil_sets.Add(vil); - - return(vil); -} - -bool VertexShaderModule::Release(VIL *vil) -{ - return vil_sets.Delete(vil); } VK_NAMESPACE_END diff --git a/src/SceneGraph/font/TextRender.cpp b/src/SceneGraph/font/TextRender.cpp index 4dd9d9a1..3d80e8f5 100644 --- a/src/SceneGraph/font/TextRender.cpp +++ b/src/SceneGraph/font/TextRender.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include namespace hgl