updated ShaderGen->ShaderCreater.

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-03-09 23:21:52 +08:00
parent 26f7c915c8
commit 6ee832c39f
11 changed files with 98 additions and 31 deletions

View File

@ -33,7 +33,7 @@ void main()
vec4 color; vec4 color;
}; };
*/ */
mc.AddUBOStruct("ColorMaterial","vec4 color;"); mc.AddStruct("ColorMaterial","vec4 color;");
//添加一个UBO该代码会被展开为 //添加一个UBO该代码会被展开为
/* /*

View File

@ -42,7 +42,7 @@ public:
MaterialCreater(const uint rc,const uint32 ss=VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT); MaterialCreater(const uint rc,const uint32 ss=VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT);
~MaterialCreater()=default; ~MaterialCreater()=default;
bool AddUBOStruct(const AnsiString &ubo_typename,const AnsiString &codes); bool AddStruct(const AnsiString &ubo_typename,const AnsiString &codes);
bool AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name); bool AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name);
bool AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name); bool AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name);

View File

@ -33,7 +33,7 @@ class MaterialDescriptorManager
ShaderDescriptorSetArray desc_set_array; ShaderDescriptorSetArray desc_set_array;
Map<AnsiString,AnsiString> ubo_struct_map; Map<AnsiString,AnsiString> struct_map;
Map<AnsiString,UBODescriptor *> ubo_map; Map<AnsiString,UBODescriptor *> ubo_map;
Map<AnsiString,SamplerDescriptor *> sampler_map; Map<AnsiString,SamplerDescriptor *> sampler_map;
@ -42,23 +42,23 @@ public:
MaterialDescriptorManager(); MaterialDescriptorManager();
~MaterialDescriptorManager()=default; ~MaterialDescriptorManager()=default;
bool AddUBOStruct(const AnsiString &name,const AnsiString &code) bool AddStruct(const AnsiString &name,const AnsiString &code)
{ {
if(ubo_struct_map.KeyExist(name)) if(struct_map.KeyExist(name))
return(false); return(false);
ubo_struct_map.Add(name,code); struct_map.Add(name,code);
return(true); return(true);
} }
bool GetUBOStruct(const AnsiString &name,AnsiString &code) const bool GetStruct(const AnsiString &name,AnsiString &code) const
{ {
return(ubo_struct_map.Get(name,code)); return(struct_map.Get(name,code));
} }
bool hasUBOStruct(const AnsiString &name) const bool hasStruct(const AnsiString &name) const
{ {
return(ubo_struct_map.KeyExist(name)); return(struct_map.KeyExist(name));
} }
const UBODescriptor *AddUBO(VkShaderStageFlagBits ssb,DescriptorSetType set_type,UBODescriptor *sd); const UBODescriptor *AddUBO(VkShaderStageFlagBits ssb,DescriptorSetType set_type,UBODescriptor *sd);

View File

@ -6,8 +6,12 @@
SHADERGEN_NAMESPACE_BEGIN SHADERGEN_NAMESPACE_BEGIN
class ShaderCreater class ShaderCreater
{ {
protected:
VkShaderStageFlagBits shader_stage; ///<着色器阶段 VkShaderStageFlagBits shader_stage; ///<着色器阶段
MaterialDescriptorManager *mdm;
protected: protected:
AnsiString shader_codes; AnsiString shader_codes;
@ -18,9 +22,16 @@ protected:
protected: protected:
virtual void ProcHeader(){} virtual bool ProcHeader(){return(true);}
virtual void ProcInput(); virtual bool ProcSubpassInput();
virtual void ProcOutput(); virtual bool ProcInput(ShaderCreater *);
virtual bool ProcOutput();
virtual bool ProcStruct();
virtual bool ProcUBO();
virtual bool ProcSSBO();
virtual bool ProcConst();
public: public:
@ -30,9 +41,10 @@ public:
public: public:
ShaderCreater(VkShaderStageFlagBits ss):sdm(ss) ShaderCreater(VkShaderStageFlagBits ss,MaterialDescriptorManager *m):sdm(ss)
{ {
shader_stage=ss; shader_stage=ss;
mdm=m;
} }
virtual ~ShaderCreater()=default; virtual ~ShaderCreater()=default;

View File

@ -12,7 +12,7 @@ class ShaderCreaterFragment:public ShaderCreater
{ {
public: public:
ShaderCreaterFragment():ShaderCreater(VK_SHADER_STAGE_FRAGMENT_BIT){} ShaderCreaterFragment(MaterialDescriptorManager *m):ShaderCreater(VK_SHADER_STAGE_FRAGMENT_BIT,m){}
~ShaderCreaterFragment()=default; ~ShaderCreaterFragment()=default;
void UseDefaultMain(); void UseDefaultMain();

View File

@ -7,7 +7,7 @@ class ShaderCreaterGeometry:public ShaderCreater
{ {
public: public:
ShaderCreaterGeometry():ShaderCreater(VK_SHADER_STAGE_GEOMETRY_BIT){} ShaderCreaterGeometry(MaterialDescriptorManager *m):ShaderCreater(VK_SHADER_STAGE_GEOMETRY_BIT,m){}
~ShaderCreaterGeometry()=default; ~ShaderCreaterGeometry()=default;
}; };
SHADERGEN_NAMESPACE_END SHADERGEN_NAMESPACE_END

View File

@ -9,7 +9,7 @@ class ShaderCreaterVertex:public ShaderCreater
public: public:
ShaderCreaterVertex():ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT){} ShaderCreaterVertex(MaterialDescriptorManager *m):ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT,m){}
~ShaderCreaterVertex()=default; ~ShaderCreaterVertex()=default;
int AddInput(const VAT &type,const AnsiString &name); int AddInput(const VAT &type,const AnsiString &name);

View File

@ -2,6 +2,7 @@
#include<hgl/shadergen/ShaderGenNamespace.h> #include<hgl/shadergen/ShaderGenNamespace.h>
#include<hgl/type/Map.h> #include<hgl/type/Map.h>
#include<hgl/type/StringList.h>
#include<hgl/graph/VKShaderStage.h> #include<hgl/graph/VKShaderStage.h>
#include<hgl/graph/VKDescriptorSetType.h> #include<hgl/graph/VKDescriptorSetType.h>
#include<hgl/shadergen/MaterialDescriptorManager.h> #include<hgl/shadergen/MaterialDescriptorManager.h>
@ -20,6 +21,8 @@ class ShaderDescriptorManager
ShaderStageIO stage_io; ShaderStageIO stage_io;
AnsiStringList struct_list; //用到的结构列表
//ubo/object在这里以及MaterialDescriptorManager中均有一份mdm中的用于产生set/binding号这里的用于产生shader //ubo/object在这里以及MaterialDescriptorManager中均有一份mdm中的用于产生set/binding号这里的用于产生shader
ConstUBODescriptorList ubo_list; ConstUBODescriptorList ubo_list;
ConstSamplerDescriptorList sampler_list; ConstSamplerDescriptorList sampler_list;
@ -41,6 +44,8 @@ public:
const ShaderStageIO & GetShaderStageIO()const{return stage_io;} const ShaderStageIO & GetShaderStageIO()const{return stage_io;}
const AnsiStringList & GetStructList()const{return struct_list;}
const ConstUBODescriptorList & GetUBOList()const{return ubo_list;} const ConstUBODescriptorList & GetUBOList()const{return ubo_list;}
const ConstSamplerDescriptorList & GetSamplerList()const{return sampler_list;} const ConstSamplerDescriptorList & GetSamplerList()const{return sampler_list;}

View File

@ -9,17 +9,17 @@ MaterialCreater::MaterialCreater(const uint rc,const uint32 ss)
rt_count=rc; rt_count=rc;
shader_stage=ss; shader_stage=ss;
if(hasVertex ())shader_map.Add(vert=new ShaderCreaterVertex );else vert=nullptr; if(hasVertex ())shader_map.Add(vert=new ShaderCreaterVertex (&mdm));else vert=nullptr;
if(hasGeometry ())shader_map.Add(geom=new ShaderCreaterGeometry);else geom=nullptr; if(hasGeometry ())shader_map.Add(geom=new ShaderCreaterGeometry(&mdm));else geom=nullptr;
if(hasFragment ())shader_map.Add(frag=new ShaderCreaterFragment);else frag=nullptr; if(hasFragment ())shader_map.Add(frag=new ShaderCreaterFragment(&mdm));else frag=nullptr;
} }
bool MaterialCreater::AddUBOStruct(const AnsiString &ubo_typename,const AnsiString &codes) bool MaterialCreater::AddStruct(const AnsiString &struct_name,const AnsiString &codes)
{ {
if(ubo_typename.IsEmpty()||codes.IsEmpty()) if(struct_name.IsEmpty()||codes.IsEmpty())
return(false); return(false);
return mdm.AddUBOStruct(ubo_typename,codes); return mdm.AddStruct(struct_name,codes);
} }
bool MaterialCreater::AddUBO(const VkShaderStageFlagBits flag_bit,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name) bool MaterialCreater::AddUBO(const VkShaderStageFlagBits flag_bit,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name)
@ -27,7 +27,7 @@ bool MaterialCreater::AddUBO(const VkShaderStageFlagBits flag_bit,const Descript
if(!shader_map.KeyExist(flag_bit)) if(!shader_map.KeyExist(flag_bit))
return(false); return(false);
if(!mdm.hasUBOStruct(type_name)) if(!mdm.hasStruct(type_name))
return(false); return(false);
ShaderCreater *sc=shader_map[flag_bit]; ShaderCreater *sc=shader_map[flag_bit];

View File

@ -26,19 +26,35 @@ int ShaderCreater::AddOutput(const AnsiString &type,const AnsiString &name)
return AddOutput(vat,name); return AddOutput(vat,name);
} }
void ShaderCreater::ProcInput() bool ShaderCreater::ProcSubpassInput()
{ {
} }
void ShaderCreater::ProcOutput() bool ShaderCreater::ProcInput(ShaderCreater *last_sc)
{
if(!last_sc)
return;
AnsiString last_output=last_sc->GetOutputStruct();
if(last_output.IsEmpty())
return;
final_shader+="layout(location=0) in ";
final_shader+=last_output;
final_shader+="Input;\n\n";
}
bool ShaderCreater::ProcOutput()
{ {
final_shader+="layout(location=0) out "; final_shader+="layout(location=0) out ";
final_shader+=GetShaderStageName(shader_stage);
final_shader+="_Output\n{";
output_struct.Clear(); output_struct.Clear();
output_struct=GetShaderStageName(shader_stage);
output_struct+="_Output\n{\n";
for(auto *ss:sdm.GetShaderStageIO().output) for(auto *ss:sdm.GetShaderStageIO().output)
{ {
output_struct+="\t"; output_struct+="\t";
@ -48,15 +64,47 @@ void ShaderCreater::ProcOutput()
output_struct+=";\n"; output_struct+=";\n";
} }
output_struct+="}";
final_shader+=output_struct; final_shader+=output_struct;
final_shader+="}Output;\n\n"; final_shader+="Output;\n\n";
}
bool ShaderCreater::ProcStruct()
{
const AnsiStringList struct_list=sdm.GetStructList();
AnsiString codes;
for(const AnsiString &str:struct_list)
{
if(!mdm->GetStruct(str,codes))
return(false);
}
return(true);
}
bool ShaderCreater::ProcUBO()
{
}
bool ShaderCreater::ProcSSBO()
{
}
bool ShaderCreater::ProcConst()
{
} }
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);
ProcOutput();
} }
bool ShaderCreater::CompileToSPV() bool ShaderCreater::CompileToSPV()

View File

@ -47,6 +47,8 @@ bool ShaderDescriptorManager::AddUBO(DescriptorSetType type,const UBODescriptor
if(!ubo) if(!ubo)
return(false); return(false);
struct_list.AddUnique(ubo->type);
ubo_list.Add(ubo); ubo_list.Add(ubo);
return true; return true;
} }