diff --git a/CMSceneGraph b/CMSceneGraph index 809fa8d4..b7789d3b 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit 809fa8d4c73a810233e3ba6dd8c42a421a3ca9e9 +Subproject commit b7789d3b190855d3af0146b34af84f0247b5d242 diff --git a/inc/hgl/shadergen/MaterialCreater.h b/inc/hgl/shadergen/MaterialCreater.h index eb6a03a1..acc30f4b 100644 --- a/inc/hgl/shadergen/MaterialCreater.h +++ b/inc/hgl/shadergen/MaterialCreater.h @@ -22,10 +22,6 @@ class MaterialCreater ShaderCreaterGeometry *geom; ShaderCreaterFragment *frag; -private: - - void SetContext(); - public: bool hasShader(const VkShaderStageFlagBits ss)const{return shader_stage&ss;} diff --git a/inc/hgl/shadergen/ShaderCreater.h b/inc/hgl/shadergen/ShaderCreater.h index bed17221..4a5c1420 100644 --- a/inc/hgl/shadergen/ShaderCreater.h +++ b/inc/hgl/shadergen/ShaderCreater.h @@ -12,6 +12,16 @@ protected: AnsiString shader_codes; + AnsiString output_struct; + + AnsiString final_shader; + +protected: + + virtual void ProcHeader(){} + virtual void ProcInput(); + virtual void ProcOutput(); + public: ShaderDescriptorManager sdm; @@ -35,6 +45,10 @@ public: shader_codes=str; } + const AnsiString &GetOutputStruct()const{return output_struct;} + + bool CreateShader(ShaderCreater *); + bool CompileToSPV(); };//class ShaderCreater SHADERGEN_NAMESPACE_END diff --git a/inc/hgl/shadergen/ShaderCreaterVertex.h b/inc/hgl/shadergen/ShaderCreaterVertex.h index c13f7add..d9906f75 100644 --- a/inc/hgl/shadergen/ShaderCreaterVertex.h +++ b/inc/hgl/shadergen/ShaderCreaterVertex.h @@ -5,6 +5,8 @@ SHADERGEN_NAMESPACE_BEGIN class ShaderCreaterVertex:public ShaderCreater { + virtual void ProcInput() override; + public: ShaderCreaterVertex():ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT){} diff --git a/inc/hgl/shadergen/ShaderDescriptorManager.h b/inc/hgl/shadergen/ShaderDescriptorManager.h index 305a8dec..8e1b10a5 100644 --- a/inc/hgl/shadergen/ShaderDescriptorManager.h +++ b/inc/hgl/shadergen/ShaderDescriptorManager.h @@ -16,6 +16,8 @@ using ConstSamplerDescriptorList=List; */ class ShaderDescriptorManager { + VkShaderStageFlagBits shader_stage; + ShaderStageIO stage_io; //ubo/object在这里以及MaterialDescriptorManager中均有一份,mdm中的用于产生set/binding号,这里的用于产生shader @@ -32,12 +34,9 @@ public: ShaderDescriptorManager(VkShaderStageFlagBits); ~ShaderDescriptorManager()=default; - const VkShaderStageFlagBits GetStageBits()const { return stage_io.cur; } - const AnsiString GetStageName()const { return AnsiString(GetShaderStageName(stage_io.cur)); } + const VkShaderStageFlagBits GetStageBits()const { return shader_stage; } + const AnsiString GetStageName()const { return AnsiString(GetShaderStageName(shader_stage)); } - void SetPrevShader(VkShaderStageFlagBits prev) { stage_io.prev=prev; } - void SetNextShader(VkShaderStageFlagBits next) { stage_io.next=next; } - public: const ShaderStageIO & GetShaderStageIO()const{return stage_io;} diff --git a/src/ShaderGen/MaterialCreater.cpp b/src/ShaderGen/MaterialCreater.cpp index d0078e60..56a4d651 100644 --- a/src/ShaderGen/MaterialCreater.cpp +++ b/src/ShaderGen/MaterialCreater.cpp @@ -93,59 +93,26 @@ bool MaterialCreater::AddSampler(const VkShaderStageFlagBits flag_bit,const Desc } } -void MaterialCreater::SetContext() -{ - //ShaderMap使用ObjectMap保存,ObjectMap本质附带排序功能,所以这里无需再排序,直接设定prev,next即可 - - LOG_INFO("Resort Shader."); - - ShaderCreater *prev,*cur,*next; - - auto *it=shader_map.GetDataList(); - - const int count=shader_map.GetCount(); - - for(int i=0; iright; - ++it; - - if(i>0) - cur->sdm.SetPrevShader(prev->GetShaderStage()); - - if(iright; - cur->sdm.SetNextShader(next->GetShaderStage()); - } - -#ifdef _DEBUG - cur->sdm.DebugOutput(i); -#endif//_DEBUG - - prev=cur; - } -} - bool MaterialCreater::CompileShader() { if(shader_map.IsEmpty()) return(false); - SetContext(); //设定上下文 - - ShaderCreater *sc; + ShaderCreater *sc,*last=nullptr; for(int i=0;iCompileToSPV()) - return(false); + sc->CreateShader(last); + + //if(!sc->CompileToSPV()) + //return(false); + + last=sc; } return(true); - } SHADERGEN_NAMESPACE_END diff --git a/src/ShaderGen/ShaderCreater.cpp b/src/ShaderGen/ShaderCreater.cpp index 5dd7a382..a2341bf6 100644 --- a/src/ShaderGen/ShaderCreater.cpp +++ b/src/ShaderGen/ShaderCreater.cpp @@ -17,12 +17,48 @@ int ShaderCreater::AddOutput(const AnsiString &type,const AnsiString &name) { VAT vat; + if(name.IsEmpty()) + return -1; + if(!ParseVertexAttribType(&vat,type)) - return(-2); + return -2; return AddOutput(vat,name); } +void ShaderCreater::ProcInput() +{ + +} + +void ShaderCreater::ProcOutput() +{ + final_shader+="layout(location=0) out "; + final_shader+=GetShaderStageName(shader_stage); + final_shader+="_Output\n{"; + + output_struct.Clear(); + + for(auto *ss:sdm.GetShaderStageIO().output) + { + output_struct+="\t"; + output_struct+=GetShaderStageTypeName(ss); + output_struct+=" "; + output_struct+=ss->name; + output_struct+=";\n"; + } + + final_shader+=output_struct; + final_shader+="}Output;\n\n"; +} + +bool ShaderCreater::CreateShader(ShaderCreater *last_sc) +{ + final_shader="#version 460 core\n"; + + +} + bool ShaderCreater::CompileToSPV() { if(shader_codes.IsEmpty()) diff --git a/src/ShaderGen/ShaderCreaterVertex.cpp b/src/ShaderGen/ShaderCreaterVertex.cpp index a988d2d5..1a74d0e5 100644 --- a/src/ShaderGen/ShaderCreaterVertex.cpp +++ b/src/ShaderGen/ShaderCreaterVertex.cpp @@ -22,4 +22,24 @@ int ShaderCreaterVertex::AddInput(const AnsiString &type,const AnsiString &name) return AddInput(vat,name); } + +void ShaderCreaterVertex::ProcInput() +{ + const auto &io=sdm.GetShaderStageIO(); + + if(!io.input.IsEmpty()) + { + for(auto *ss:io.input) + { + final_shader+="layout(location="; + final_shader+=UTF8String::numberOf(ss->location); + final_shader+=") in "; + final_shader+=UTF8String(GetShaderStageTypeName(ss)); + final_shader+="\t"+UTF8String(ss->name); + final_shader+=";\n"; + } + + final_shader+="\n"; + } +} SHADERGEN_NAMESPACE_END diff --git a/src/ShaderGen/ShaderDescriptorManager.cpp b/src/ShaderGen/ShaderDescriptorManager.cpp index 9c963b6e..46b54b58 100644 --- a/src/ShaderGen/ShaderDescriptorManager.cpp +++ b/src/ShaderGen/ShaderDescriptorManager.cpp @@ -1,11 +1,9 @@ #include SHADERGEN_NAMESPACE_BEGIN -ShaderDescriptorManager::ShaderDescriptorManager(VkShaderStageFlagBits cur) +ShaderDescriptorManager::ShaderDescriptorManager(VkShaderStageFlagBits flag_bit) { - stage_io.cur=cur; - stage_io.prev=(VkShaderStageFlagBits)0; - stage_io.next=(VkShaderStageFlagBits)0; + shader_stage=flag_bit; hgl_zero(push_constant); } @@ -101,13 +99,9 @@ void ShaderDescriptorManager::SetPushConstant(const UTF8String name,uint8_t offs #ifdef _DEBUG void ShaderDescriptorManager::DebugOutput(int index) { - UTF8String name=GetShaderStageName(stage_io.cur); - UTF8String prev_name=GetShaderStageName(stage_io.prev); - UTF8String next_name=GetShaderStageName(stage_io.next); + UTF8String name=GetStageName(); LOG_INFO(UTF8String::numberOf(index)+": "+name+" shader"); - LOG_INFO("\tprev next is "+prev_name); - LOG_INFO("\tnext next is "+next_name); if(stage_io.input.GetCount()>0) {