From ece7fa5f32a082c32b2d17796f308f9ae5ef69c4 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 10 Mar 2023 02:15:26 +0800 Subject: [PATCH] writed ProcSubpassInput,ProcStruct,ProcUBO,ProcConst,ProcSampler at ShaderCreater --- inc/hgl/shadergen/ShaderCreater.h | 1 + inc/hgl/shadergen/ShaderCreaterVertex.h | 2 +- src/ShaderGen/ShaderCreater.cpp | 140 +++++++++++++++++++++++- src/ShaderGen/ShaderCreaterVertex.cpp | 12 +- 4 files changed, 146 insertions(+), 9 deletions(-) diff --git a/inc/hgl/shadergen/ShaderCreater.h b/inc/hgl/shadergen/ShaderCreater.h index 1b5668f4..d51edc75 100644 --- a/inc/hgl/shadergen/ShaderCreater.h +++ b/inc/hgl/shadergen/ShaderCreater.h @@ -32,6 +32,7 @@ protected: virtual bool ProcUBO(); virtual bool ProcSSBO(); virtual bool ProcConst(); + virtual bool ProcSampler(); public: diff --git a/inc/hgl/shadergen/ShaderCreaterVertex.h b/inc/hgl/shadergen/ShaderCreaterVertex.h index 9ed819d2..f93a22f0 100644 --- a/inc/hgl/shadergen/ShaderCreaterVertex.h +++ b/inc/hgl/shadergen/ShaderCreaterVertex.h @@ -5,7 +5,7 @@ SHADERGEN_NAMESPACE_BEGIN class ShaderCreaterVertex:public ShaderCreater { - virtual void ProcInput() override; + bool ProcInput(ShaderCreater *) override; public: diff --git a/src/ShaderGen/ShaderCreater.cpp b/src/ShaderGen/ShaderCreater.cpp index 87c4b53b..b4a730f3 100644 --- a/src/ShaderGen/ShaderCreater.cpp +++ b/src/ShaderGen/ShaderCreater.cpp @@ -28,22 +28,46 @@ int ShaderCreater::AddOutput(const AnsiString &type,const AnsiString &name) bool ShaderCreater::ProcSubpassInput() { + auto sil=sdm.GetSubpassInputList(); + + if(sil.IsEmpty()) + return(true); + + const auto si=sil.GetData(); + const int si_count=sil.GetCount(); + + for(int i=0;iinput_attachment_index); + final_shader+=", binding="; + final_shader+=AnsiString::numberOf((*si)->binding); + final_shader+=") uniform subpassInput "; + final_shader+=(*si)->name; + final_shader+=";\n"; + } + + final_shader+="\n"; + + return(true); } bool ShaderCreater::ProcInput(ShaderCreater *last_sc) { if(!last_sc) - return; + return(false); AnsiString last_output=last_sc->GetOutputStruct(); if(last_output.IsEmpty()) - return; + return(true); final_shader+="layout(location=0) in "; final_shader+=last_output; final_shader+="Input;\n\n"; + + return(true); } bool ShaderCreater::ProcOutput() @@ -68,6 +92,8 @@ bool ShaderCreater::ProcOutput() final_shader+=output_struct; final_shader+="Output;\n\n"; + + return(true); } bool ShaderCreater::ProcStruct() @@ -76,11 +102,16 @@ bool ShaderCreater::ProcStruct() AnsiString codes; - for(const AnsiString &str:struct_list) + for(auto &str:struct_list) { - if(!mdm->GetStruct(str,codes)) + if(!mdm->GetStruct(*str,codes)) return(false); - + + final_shader+="struct "; + final_shader+=*str; + final_shader+="\n{\n"; + final_shader+=codes; + final_shader+="};\n\n"; } return(true); @@ -88,23 +119,120 @@ bool ShaderCreater::ProcStruct() bool ShaderCreater::ProcUBO() { + auto ubo_list=sdm.GetUBOList(); + + const int count=ubo_list.GetCount(); + + if(count<=0)return(true); + + auto ubo=ubo_list.GetData(); + + for(int i=0;iset); + final_shader+=",binding="; + final_shader+=AnsiString::numberOf((*ubo)->binding); + final_shader+=") uniform "; + final_shader+=(*ubo)->type; + final_shader+=" "; + final_shader+=(*ubo)->name; + final_shader+="\n"; + + ++ubo; + } + + final_shader+="\n"; + return(true); } bool ShaderCreater::ProcSSBO() { + return(false); } bool ShaderCreater::ProcConst() +{auto const_list=sdm.GetConstList(); + + const int count=const_list.GetCount(); + + if(count<=0)return(true); + + auto const_data=const_list.GetData(); + + for(int i=0;iconstant_id); + final_shader+=") const "; + final_shader+=(*const_data)->type; + final_shader+=" "; + final_shader+=(*const_data)->name; + final_shader+="="; + final_shader+=(*const_data)->value; + final_shader+=";\n"; + + ++const_data; + } + + final_shader+="\n"; + return(true); +} + +bool ShaderCreater::ProcSampler() { + auto sampler_list=sdm.GetSamplerList(); + + const int count=sampler_list.GetCount(); + + if(count<=0)return(true); + + auto sampler=sampler_list.GetData(); + + for(int i=0;iset); + final_shader+=",binding="; + final_shader+=AnsiString::numberOf((*sampler)->binding); + final_shader+=") uniform "; + final_shader+=(*sampler)->type; + final_shader+=" "; + final_shader+=(*sampler)->name; + final_shader+="\n"; + + ++sampler; + } + + final_shader+="\n"; + return(true); } bool ShaderCreater::CreateShader(ShaderCreater *last_sc) { final_shader="#version 460 core\n"; - ProcInput(last_sc); + if(!ProcSubpassInput()) + return(false); + if(!ProcInput(last_sc)) + return(false); + if(!ProcStruct()) + return(false); + + if(!ProcUBO()) + return(false); + //if(!ProcSSBO()) + //return(false); + if(!ProcConst()) + return(false); + if(!ProcSampler()) + return(false); ProcOutput(); + + + + return(true); } bool ShaderCreater::CompileToSPV() diff --git a/src/ShaderGen/ShaderCreaterVertex.cpp b/src/ShaderGen/ShaderCreaterVertex.cpp index 1a74d0e5..c2640d77 100644 --- a/src/ShaderGen/ShaderCreaterVertex.cpp +++ b/src/ShaderGen/ShaderCreaterVertex.cpp @@ -23,11 +23,17 @@ int ShaderCreaterVertex::AddInput(const AnsiString &type,const AnsiString &name) return AddInput(vat,name); } -void ShaderCreaterVertex::ProcInput() +bool ShaderCreaterVertex::ProcInput(ShaderCreater *) { const auto &io=sdm.GetShaderStageIO(); - if(!io.input.IsEmpty()) + if(io.input.IsEmpty()) + { + //no input ? this isn't a bug. + //maybe position info from UBO/SBBO/Texture. + return(true); + } + { for(auto *ss:io.input) { @@ -41,5 +47,7 @@ void ShaderCreaterVertex::ProcInput() final_shader+="\n"; } + + return(true); } SHADERGEN_NAMESPACE_END