writed ProcSubpassInput,ProcStruct,ProcUBO,ProcConst,ProcSampler at ShaderCreater

This commit is contained in:
hyzboy 2023-03-10 02:15:26 +08:00
parent 68b24903bb
commit ece7fa5f32
No known key found for this signature in database
GPG Key ID: 067EE4525D4FB6D3
4 changed files with 146 additions and 9 deletions

View File

@ -32,6 +32,7 @@ protected:
virtual bool ProcUBO(); virtual bool ProcUBO();
virtual bool ProcSSBO(); virtual bool ProcSSBO();
virtual bool ProcConst(); virtual bool ProcConst();
virtual bool ProcSampler();
public: public:

View File

@ -5,7 +5,7 @@
SHADERGEN_NAMESPACE_BEGIN SHADERGEN_NAMESPACE_BEGIN
class ShaderCreaterVertex:public ShaderCreater class ShaderCreaterVertex:public ShaderCreater
{ {
virtual void ProcInput() override; bool ProcInput(ShaderCreater *) override;
public: public:

View File

@ -28,22 +28,46 @@ int ShaderCreater::AddOutput(const AnsiString &type,const AnsiString &name)
bool ShaderCreater::ProcSubpassInput() 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;i<si_count;i++)
{
final_shader+="layout(input_attachment_index=";
final_shader+=AnsiString::numberOf((*si)->input_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) bool ShaderCreater::ProcInput(ShaderCreater *last_sc)
{ {
if(!last_sc) if(!last_sc)
return; return(false);
AnsiString last_output=last_sc->GetOutputStruct(); AnsiString last_output=last_sc->GetOutputStruct();
if(last_output.IsEmpty()) if(last_output.IsEmpty())
return; return(true);
final_shader+="layout(location=0) in "; final_shader+="layout(location=0) in ";
final_shader+=last_output; final_shader+=last_output;
final_shader+="Input;\n\n"; final_shader+="Input;\n\n";
return(true);
} }
bool ShaderCreater::ProcOutput() bool ShaderCreater::ProcOutput()
@ -68,6 +92,8 @@ bool ShaderCreater::ProcOutput()
final_shader+=output_struct; final_shader+=output_struct;
final_shader+="Output;\n\n"; final_shader+="Output;\n\n";
return(true);
} }
bool ShaderCreater::ProcStruct() bool ShaderCreater::ProcStruct()
@ -76,11 +102,16 @@ bool ShaderCreater::ProcStruct()
AnsiString codes; 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); return(false);
final_shader+="struct ";
final_shader+=*str;
final_shader+="\n{\n";
final_shader+=codes;
final_shader+="};\n\n";
} }
return(true); return(true);
@ -88,23 +119,120 @@ bool ShaderCreater::ProcStruct()
bool ShaderCreater::ProcUBO() 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;i<count;i++)
{
final_shader+="layout(set=";
final_shader+=AnsiString::numberOf((*ubo)->set);
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() bool ShaderCreater::ProcSSBO()
{ {
return(false);
} }
bool ShaderCreater::ProcConst() 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;i<count;i++)
{
final_shader+="layout(constant_id=";
final_shader+=AnsiString::numberOf((*const_data)->constant_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;i<count;i++)
{
final_shader+="layout(set=";
final_shader+=AnsiString::numberOf((*sampler)->set);
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) bool ShaderCreater::CreateShader(ShaderCreater *last_sc)
{ {
final_shader="#version 460 core\n"; 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(); ProcOutput();
return(true);
} }
bool ShaderCreater::CompileToSPV() bool ShaderCreater::CompileToSPV()

View File

@ -23,11 +23,17 @@ int ShaderCreaterVertex::AddInput(const AnsiString &type,const AnsiString &name)
return AddInput(vat,name); return AddInput(vat,name);
} }
void ShaderCreaterVertex::ProcInput() bool ShaderCreaterVertex::ProcInput(ShaderCreater *)
{ {
const auto &io=sdm.GetShaderStageIO(); 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) for(auto *ss:io.input)
{ {
@ -41,5 +47,7 @@ void ShaderCreaterVertex::ProcInput()
final_shader+="\n"; final_shader+="\n";
} }
return(true);
} }
SHADERGEN_NAMESPACE_END SHADERGEN_NAMESPACE_END