diff --git a/CMCore b/CMCore index 41a2f9af..2f4a583b 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 41a2f9af7287765835d6b8b72a2a567be6eb17e0 +Subproject commit 2f4a583b9c6eb71b752deb3f85674feb22b3cd08 diff --git a/CMSceneGraph b/CMSceneGraph index d4999fb4..17790c14 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit d4999fb44535f0aa3d52295bad9a3f931d09f3a9 +Subproject commit 17790c141d4a2a7e9c15a90216c3060469c40258 diff --git a/example/MaterialCreaterTest.cpp b/example/MaterialCreaterTest.cpp index 81153315..dfabcfdf 100644 --- a/example/MaterialCreaterTest.cpp +++ b/example/MaterialCreaterTest.cpp @@ -6,7 +6,7 @@ using namespace hgl::shadergen; bool PureColor2DMaterial() { - MaterialCreateInfo mc(1,false); //一个新材质,1个RT输出,默认使用Vertex/Fragment shader + MaterialCreateInfo mc("PureColor2D",1,false); //一个新材质,1个RT输出,默认使用Vertex/Fragment shader //vertex部分 { @@ -68,7 +68,7 @@ void main() bool VertexColor2DMaterial() { - MaterialCreateInfo mc(1,false); + MaterialCreateInfo mc("VertexColor2D",1,false); //vertex部分 { diff --git a/inc/hgl/graph/VKDevice.h b/inc/hgl/graph/VKDevice.h index ab3136d6..c5c3be47 100644 --- a/inc/hgl/graph/VKDevice.h +++ b/inc/hgl/graph/VKDevice.h @@ -183,9 +183,9 @@ public: //Texture void Clear(TextureCreateInfo *); - bool ChangeTexture2D(Texture2D *,DeviceBuffer *buf,const List &, VkPipelineStageFlags=VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); - bool ChangeTexture2D(Texture2D *,DeviceBuffer *buf,uint32_t left,uint32_t top,uint32_t width,uint32_t height, VkPipelineStageFlags=VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); - bool ChangeTexture2D(Texture2D *,void *data, uint32_t left,uint32_t top,uint32_t width,uint32_t height,uint32_t size,VkPipelineStageFlags=VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + bool ChangeTexture2D(Texture2D *,DeviceBuffer *buf, const List &, VkPipelineStageFlags=VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + bool ChangeTexture2D(Texture2D *,DeviceBuffer *buf, uint32_t left,uint32_t top,uint32_t width,uint32_t height, VkPipelineStageFlags=VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); + bool ChangeTexture2D(Texture2D *,void *data, uint32_t left,uint32_t top,uint32_t width,uint32_t height,uint32_t size,VkPipelineStageFlags=VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT); template bool ChangeTexture2D(Texture2D *tex,DeviceBuffer *buf,const RectScope2 &rs) @@ -220,7 +220,7 @@ public: //shader & material PipelineLayoutData *CreatePipelineLayoutData(const MaterialDescriptorSets *); void Destroy(PipelineLayoutData *); - DescriptorSet * CreateDescriptorSets(const PipelineLayoutData *,const DescriptorSetType &type)const; + DescriptorSet * CreateDescriptorSets(const PipelineLayoutData *,const DescriptorSetType &type)const; MaterialParameters *CreateMP(const MaterialDescriptorSets *,const PipelineLayoutData *,const DescriptorSetType &); MaterialParameters *CreateMP(Material *,const DescriptorSetType &); diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index 888649c1..3362bcd1 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -14,6 +14,7 @@ #include #include #include +#include VK_NAMESPACE_BEGIN using MaterialID =int; using MaterialInstanceID =int; @@ -90,6 +91,8 @@ public: //Material const ShaderModule *CreateShaderModule(const OSString &filename,ShaderResource *shader_resource); Material * CreateMaterial(const OSString &); + Material * CreateMaterial(const hgl::shadergen::MaterialCreateInfo *); + MaterialInstance * CreateMaterialInstance(Material *,const VILConfig *vil_cfg=nullptr); MaterialInstance * CreateMaterialInstance(const OSString &,const VILConfig *vil_cfg=nullptr); diff --git a/inc/hgl/graph/VKShaderModule.h b/inc/hgl/graph/VKShaderModule.h index 5b5e17f3..b6ae718a 100644 --- a/inc/hgl/graph/VKShaderModule.h +++ b/inc/hgl/graph/VKShaderModule.h @@ -60,7 +60,7 @@ class VertexShaderModule:public ShaderModule uint32_t attr_count; VAT *type_list; const char **name_list; - ShaderAttribute **ssi_list; + ShaderAttribute *attr_list; private: @@ -77,7 +77,7 @@ public: 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 ShaderAttributeList & GetInputs () const{return shader_resource->GetInputs();} + const ShaderAttributeArray & GetInputs () const{return shader_resource->GetInputs();} //const uint32_t GetAttrCount()const{return attr_count;} diff --git a/inc/hgl/graph/VKShaderResource.h b/inc/hgl/graph/VKShaderResource.h index 0556458e..f30c6e73 100644 --- a/inc/hgl/graph/VKShaderResource.h +++ b/inc/hgl/graph/VKShaderResource.h @@ -21,7 +21,7 @@ class ShaderResource public: ShaderResource(const VkShaderStageFlagBits &,const void *,const uint32); - virtual ~ShaderResource()=default; + virtual ~ShaderResource(); const VkShaderStageFlagBits GetStage ()const {return stage_flag;} const char * GetStageName ()const {return GetShaderStageName(stage_flag);} @@ -29,11 +29,11 @@ public: const uint32_t * GetCode ()const {return (uint32_t *)spv_data;} const uint32_t GetCodeSize ()const {return spv_size;} - ShaderAttributeList & GetInputs () {return stage_io.input;} -// ShaderAttributeList & GetOutputs () {return stage_io.output;} + ShaderAttributeArray & GetInputs () {return stage_io.input;} +// ShaderAttributeArray & GetOutputs () {return stage_io.output;} - const uint GetInputCount ()const {return stage_io.input.GetCount();} -// const uint GetOutputCount ()const {return stage_io.output.GetCount();} + const uint GetInputCount ()const {return stage_io.input.count;} +// const uint GetOutputCount ()const {return stage_io.output.count;} const ShaderAttribute * GetInput (const AnsiString &)const; const int GetInputBinding (const AnsiString &)const; diff --git a/inc/hgl/shadergen/MaterialCreateInfo.h b/inc/hgl/shadergen/MaterialCreateInfo.h index 72e2dffd..0facc4ea 100644 --- a/inc/hgl/shadergen/MaterialCreateInfo.h +++ b/inc/hgl/shadergen/MaterialCreateInfo.h @@ -10,6 +10,8 @@ SHADERGEN_NAMESPACE_BEGIN class MaterialCreateInfo { + AnsiString shader_name; + protected: uint rt_color_count; ///<输出的RT数量 @@ -27,6 +29,10 @@ protected: public: + const AnsiString &GetName()const{return shader_name;} + + const uint32 GetShaderStage()const{return shader_stage;} + bool hasShader(const VkShaderStageFlagBits ss)const{return shader_stage&ss;} bool hasVertex ()const{return hasShader(VK_SHADER_STAGE_VERTEX_BIT);} @@ -42,7 +48,7 @@ public: public: - MaterialCreateInfo(const uint rc,const bool rd,const uint32 ss=VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT); + MaterialCreateInfo(const AnsiString &,const uint rc,const bool rd,const uint32 ss=VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT); ~MaterialCreateInfo()=default; bool AddStruct(const AnsiString &ubo_typename,const AnsiString &codes); diff --git a/inc/hgl/shadergen/ShaderDescriptorInfo.h b/inc/hgl/shadergen/ShaderDescriptorInfo.h index 85e744e8..404f3caf 100644 --- a/inc/hgl/shadergen/ShaderDescriptorInfo.h +++ b/inc/hgl/shadergen/ShaderDescriptorInfo.h @@ -25,7 +25,7 @@ class ShaderDescriptorInfo AnsiStringList struct_list; //用到的结构列表 - //ubo/object在这里以及MaterialDescriptorInfo中均有一份,mdm中的用于产生set/binding号,这里的用于产生shader + //ubo/object在这里以及MaterialDescriptorInfo中均有一份,mdi中的用于产生set/binding号,这里的用于产生shader UBODescriptorList ubo_list; SamplerDescriptorList sampler_list; diff --git a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp index e573742f..6aa30a32 100644 --- a/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResourceMaterial.cpp @@ -7,6 +7,7 @@ #include #include #include +#include VK_NAMESPACE_BEGIN @@ -185,5 +186,19 @@ Material *RenderResource::CreateMaterial(const OSString &filename) material_by_name.Add(filename,mtl); return(mtl); +} + +Material *RenderResource::CreateMaterial(const hgl::shadergen::MaterialCreateInfo *mci) +{ + SHADERGEN_NAMESPACE_USING + + if(!mci) + return(nullptr); + + const uint count=GetShaderCountByBits(mci->GetShaderStage()); + ShaderModuleMap *smm=new ShaderModuleMap; + + + } VK_NAMESPACE_END diff --git a/src/SceneGraph/Vulkan/VKShaderModule.cpp b/src/SceneGraph/Vulkan/VKShaderModule.cpp index b248fe0d..a1021ece 100644 --- a/src/SceneGraph/Vulkan/VKShaderModule.cpp +++ b/src/SceneGraph/Vulkan/VKShaderModule.cpp @@ -44,18 +44,18 @@ ShaderModule::~ShaderModule() VertexShaderModule::VertexShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *pssci,ShaderResource *sr):ShaderModule(dev,pssci,sr) { - const ShaderAttributeList &stage_input_list=sr->GetInputs(); + const ShaderAttributeArray &stage_input_list=sr->GetInputs(); - attr_count=stage_input_list.GetCount(); - ssi_list=stage_input_list.GetData(); + attr_count=stage_input_list.count; + attr_list=stage_input_list.items; name_list=new const char *[attr_count]; type_list=new VAT[attr_count]; for(uint i=0;iname; - type_list[i].basetype =VATBaseType(ssi_list[i]->basetype); - type_list[i].vec_size =ssi_list[i]->vec_size; + name_list[i] =attr_list[i].name; + type_list[i].basetype =VATBaseType(attr_list[i].basetype); + type_list[i].vec_size =attr_list[i].vec_size; } } @@ -70,8 +70,6 @@ VertexShaderModule::~VertexShaderModule() delete[] name_list; } -const VkFormat GetVulkanFormat(const VATBaseType &base_type,const uint vec_size); //VertexAttrib.cpp - VIL *VertexShaderModule::CreateVIL(const VILConfig *cfg) { VkVertexInputBindingDescription *binding_list=new VkVertexInputBindingDescription[attr_count]; @@ -80,7 +78,7 @@ VIL *VertexShaderModule::CreateVIL(const VILConfig *cfg) VkVertexInputBindingDescription *bind=binding_list; VkVertexInputAttributeDescription *attr=attribute_list; - ShaderAttribute **si=ssi_list; + const ShaderAttribute *si=attr_list; VAConfig vac; for(uint i=0;ibinding =i; - attr->location =(*si)->location; //此值对应shader中的layout(location= + attr->location =si->location; //此值对应shader中的layout(location= attr->offset =0; bind->binding =i; //binding对应在vkCmdBindVertexBuffer中设置的缓冲区的序列号,所以这个数字必须从0开始,而且紧密排列。 //在Renderable类中,buffer_list必需严格按照本此binding为序列号排列 - if(!cfg||!cfg->Get((*si)->name,vac)) + if(!cfg||!cfg->Get(si->name,vac)) { - attr->format =GetVulkanFormat(VATBaseType((*si)->basetype),(*si)->vec_size); + attr->format =GetVulkanFormat(si); //if(memcmp((*si)->name.c_str(),"Inst_",5)==0) //不可以使用CaseComp("Inst_",5)会被认为是比较一个5字长的字符串,而不是只比较5个字符 // bind->inputRate =VK_VERTEX_INPUT_RATE_INSTANCE; @@ -112,7 +110,7 @@ VIL *VertexShaderModule::CreateVIL(const VILConfig *cfg) if(vac.format!=PF_UNDEFINED) attr->format =vac.format; else - attr->format =GetVulkanFormat(VATBaseType((*si)->basetype),(*si)->vec_size); + attr->format =GetVulkanFormat(si); bind->inputRate =vac.instance?VK_VERTEX_INPUT_RATE_INSTANCE:VK_VERTEX_INPUT_RATE_VERTEX; } diff --git a/src/SceneGraph/Vulkan/VKShaderResource.cpp b/src/SceneGraph/Vulkan/VKShaderResource.cpp index 57d7ae81..9eb910ee 100644 --- a/src/SceneGraph/Vulkan/VKShaderResource.cpp +++ b/src/SceneGraph/Vulkan/VKShaderResource.cpp @@ -10,7 +10,7 @@ VK_NAMESPACE_BEGIN { ObjectMap shader_resource_by_filename; - const bool LoadShaderStageAttributes(ShaderAttributeList &ss_list,io::ConstBufferReader &cbr) + const bool LoadShaderStageAttributes(ShaderAttributeArray &ss_list,io::ConstBufferReader &cbr) { uint count; @@ -19,19 +19,19 @@ VK_NAMESPACE_BEGIN if(count<=0) return(false); - ShaderAttribute *ss; + Init(ss_list,count); + + ShaderAttribute *ss=ss_list.items; for(uint i=0;ilocation); cbr.CastRead(ss->basetype); cbr.CastRead(ss->vec_size); cbr.ReadTinyString(ss->name); - ss_list.Add(ss); + ++ss; } return true; @@ -42,18 +42,26 @@ VK_NAMESPACE_BEGIN { stage_flag=flag; spv_data=sd; - spv_size=size; + spv_size=size; + + Init(stage_io); + } + + ShaderResource::~ShaderResource() + { + Clear(stage_io); } const ShaderAttribute *ShaderResource::GetInput(const AnsiString &name) const { - const int count=stage_io.input.GetCount(); - ShaderAttribute **ss=stage_io.input.GetData(); + if(stage_io.input.count<=0)return(nullptr); - for(int i=0;iname) - return *ss; + if(name==ss->name) + return ss; ++ss; } @@ -63,12 +71,13 @@ VK_NAMESPACE_BEGIN const int ShaderResource::GetInputBinding(const AnsiString &name) const { - const int count=stage_io.input.GetCount(); - ShaderAttribute **ss=stage_io.input.GetData(); + if(stage_io.input.count<=0)return(-1); - for(int i=0;iname) + if(name==ss->name) return i; ++ss; diff --git a/src/ShaderGen/GLSLCompiler.h b/src/ShaderGen/GLSLCompiler.h index 2329e1ad..1d256827 100644 --- a/src/ShaderGen/GLSLCompiler.h +++ b/src/ShaderGen/GLSLCompiler.h @@ -4,6 +4,7 @@ #include #include #include +#include namespace hgl { @@ -17,6 +18,7 @@ namespace hgl namespace glsl_compiler { using namespace hgl; + using namespace hgl::graph; enum class DescriptorType //等同VkDescriptorType { @@ -35,22 +37,6 @@ namespace glsl_compiler ENUM_CLASS_RANGE(SAMPLER,INPUT_ATTACHMENT) }; - constexpr size_t SHADER_RESOURCE_NAME_MAX_LENGTH=32; - - struct ShaderAttribute - { - char name[SHADER_RESOURCE_NAME_MAX_LENGTH]; - uint8_t location; - uint8_t basetype; //现在改对应hgl/graph/VertexAttrib.h中的enum class VertexAttribType::BaseType - uint8_t vec_size; - };// - - struct ShaderStageData - { - uint32_t count; - ShaderAttribute *items; - }; - struct Descriptor { char name[SHADER_RESOURCE_NAME_MAX_LENGTH]; @@ -90,8 +76,7 @@ namespace glsl_compiler uint32_t *spv_data; uint32_t spv_length; - ShaderStageData input, - output; + ShaderStageIO stage_io; ShaderDescriptorResource resource; ShaderResourceData push_constant; ShaderResourceData subpass_input; diff --git a/src/ShaderGen/MaterialCreateInfo.cpp b/src/ShaderGen/MaterialCreateInfo.cpp index 3ffeeee4..7409ccce 100644 --- a/src/ShaderGen/MaterialCreateInfo.cpp +++ b/src/ShaderGen/MaterialCreateInfo.cpp @@ -5,8 +5,10 @@ using namespace hgl; using namespace hgl::graph; SHADERGEN_NAMESPACE_BEGIN -MaterialCreateInfo::MaterialCreateInfo(const uint rc,const bool rd,const uint32 ss) +MaterialCreateInfo::MaterialCreateInfo(const AnsiString &n,const uint rc,const bool rd,const uint32 ss) { + shader_name=n; + rt_color_count=rc; rt_depth=rd; diff --git a/src/ShaderGen/ShaderCreateInfo.cpp b/src/ShaderGen/ShaderCreateInfo.cpp index 61596545..3ea87a67 100644 --- a/src/ShaderGen/ShaderCreateInfo.cpp +++ b/src/ShaderGen/ShaderCreateInfo.cpp @@ -89,20 +89,24 @@ bool ShaderCreateInfo::ProcOutput() { output_struct.Clear(); - const ShaderAttributeList &ssl=sdm->GetShaderStageIO().output; + const ShaderAttributeArray &ssd=sdm->GetShaderStageIO().output; - if(ssl.GetCount()<=0)return(true); + if(ssd.count<=0)return(true); output_struct=GetShaderStageName(shader_stage); output_struct+="_Output\n{\n"; - for(auto *ss:ssl) + const ShaderAttribute *ss=ssd.items; + + for(uint i=0;iname; output_struct+=";\n"; + + ++ss; } output_struct+="}"; diff --git a/src/ShaderGen/ShaderCreateInfoFragment.cpp b/src/ShaderGen/ShaderCreateInfoFragment.cpp index ccbbf6da..64224eb9 100644 --- a/src/ShaderGen/ShaderCreateInfoFragment.cpp +++ b/src/ShaderGen/ShaderCreateInfoFragment.cpp @@ -11,15 +11,14 @@ void ShaderCreateInfoFragment::UseDefaultMain() const auto &output_list=sdm->GetShaderStageIO().output; - const uint count=output_list.GetCount(); - ShaderAttribute **o=output_list.GetData(); + const ShaderAttribute *o=output_list.items; - for(uint i=0;iname; + main_codes+=o->name; main_codes+="=Get"; - main_codes+=(*o)->name; + main_codes+=o->name; main_codes+="();\n"; ++o; @@ -32,17 +31,16 @@ bool ShaderCreateInfoFragment::ProcOutput() { const auto &output_list=sdm->GetShaderStageIO().output; - const uint count=output_list.GetCount(); - ShaderAttribute **o=output_list.GetData(); + const ShaderAttribute *o=output_list.items; - for(uint i=0;iname; + final_shader+=o->name; final_shader+=";\n"; ++o; diff --git a/src/ShaderGen/ShaderCreateInfoVertex.cpp b/src/ShaderGen/ShaderCreateInfoVertex.cpp index e78bf664..2c6499ec 100644 --- a/src/ShaderGen/ShaderCreateInfoVertex.cpp +++ b/src/ShaderGen/ShaderCreateInfoVertex.cpp @@ -34,26 +34,27 @@ bool ShaderCreateInfoVertex::ProcInput(ShaderCreateInfo *) { const auto &input=sdm->GetShaderStageIO().input; - if(input.IsEmpty()) + if(input.count<=0) { //no input ? this isn't a bug. //maybe position info from UBO/SBBO/Texture. return(true); } - if(!input.IsEmpty()) - { - final_shader+="\n"; + final_shader+="\n"; - for(auto *ss:input) - { - final_shader+="layout(location="; - final_shader+=AnsiString::numberOf(ss->location); - final_shader+=") in "; - final_shader+=GetShaderAttributeTypename(ss); - final_shader+=" "+AnsiString(ss->name); - final_shader+=";\n"; - } + const ShaderAttribute *ss=input.items; + + for(uint i=0;ilocation); + final_shader+=") in "; + final_shader+=GetShaderAttributeTypename(ss); + final_shader+=" "+AnsiString(ss->name); + final_shader+=";\n"; + + ++ss; } return(true); diff --git a/src/ShaderGen/ShaderDescriptorInfo.cpp b/src/ShaderGen/ShaderDescriptorInfo.cpp index c436195b..19cbd753 100644 --- a/src/ShaderGen/ShaderDescriptorInfo.cpp +++ b/src/ShaderGen/ShaderDescriptorInfo.cpp @@ -4,16 +4,21 @@ SHADERGEN_NAMESPACE_BEGIN ShaderDescriptorInfo::ShaderDescriptorInfo(VkShaderStageFlagBits flag_bit) { stage_flag=flag_bit; + + Init(stage_io); hgl_zero(push_constant); } namespace { - bool Find(ObjectList &ol,const ShaderAttribute *ss) + bool Find(ShaderAttributeArray &sad,const ShaderAttribute *ss) { - for(int i=0;iname,ss->name)==0) + if(sad.count<=0) + return(false); + + for(uint i=0;iname)==0) return(true); return(false); @@ -26,8 +31,9 @@ bool ShaderDescriptorInfo::AddInput(ShaderAttribute *ss) if(Find(stage_io.input,ss))return(false); - ss->location=stage_io.input.GetCount(); - stage_io.input.Add(ss); + ss->location=stage_io.input.count; + + Append(stage_io.input,ss); return(true); } @@ -37,8 +43,9 @@ bool ShaderDescriptorInfo::AddOutput(ShaderAttribute *ss) if(Find(stage_io.output,ss))return(false); - ss->location=stage_io.output.GetCount(); - stage_io.output.Add(ss); + ss->location=stage_io.output.count; + + Append(stage_io.output,ss); return(true); } @@ -105,20 +112,30 @@ void ShaderDescriptorInfo::DebugOutput(int index) LOG_INFO(UTF8String::numberOf(index)+": "+name+" shader"); - if(stage_io.input.GetCount()>0) + if(stage_io.input.count>0) { - LOG_INFO("\tStage Input "+UTF8String::numberOf(stage_io.input.GetCount())); + LOG_INFO("\tStage Input "+UTF8String::numberOf(stage_io.input.count)); - for(auto *ss:stage_io.input) + const ShaderAttribute *ss=stage_io.input.items; + + for(uint i=0;iname)); + ++ss; + } } - if(stage_io.output.GetCount()>0) + if(stage_io.output.count>0) { - LOG_INFO("\tStage Output "+UTF8String::numberOf(stage_io.output.GetCount())); + LOG_INFO("\tStage Output "+UTF8String::numberOf(stage_io.output.count)); - for(auto *ss:stage_io.output) + const ShaderAttribute *ss=stage_io.output.items; + + for(uint i=0;iname)); + ++ss; + } } if(ubo_list.GetCount()>0)