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;
};
*/
mc.AddUBOStruct("ColorMaterial","vec4 color;");
mc.AddStruct("ColorMaterial","vec4 color;");
//添加一个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()=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 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;
Map<AnsiString,AnsiString> ubo_struct_map;
Map<AnsiString,AnsiString> struct_map;
Map<AnsiString,UBODescriptor *> ubo_map;
Map<AnsiString,SamplerDescriptor *> sampler_map;
@ -42,23 +42,23 @@ public:
MaterialDescriptorManager();
~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);
ubo_struct_map.Add(name,code);
struct_map.Add(name,code);
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);

View File

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

View File

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

View File

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

View File

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

View File

@ -2,6 +2,7 @@
#include<hgl/shadergen/ShaderGenNamespace.h>
#include<hgl/type/Map.h>
#include<hgl/type/StringList.h>
#include<hgl/graph/VKShaderStage.h>
#include<hgl/graph/VKDescriptorSetType.h>
#include<hgl/shadergen/MaterialDescriptorManager.h>
@ -20,6 +21,8 @@ class ShaderDescriptorManager
ShaderStageIO stage_io;
AnsiStringList struct_list; //用到的结构列表
//ubo/object在这里以及MaterialDescriptorManager中均有一份mdm中的用于产生set/binding号这里的用于产生shader
ConstUBODescriptorList ubo_list;
ConstSamplerDescriptorList sampler_list;
@ -41,6 +44,8 @@ public:
const ShaderStageIO & GetShaderStageIO()const{return stage_io;}
const AnsiStringList & GetStructList()const{return struct_list;}
const ConstUBODescriptorList & GetUBOList()const{return ubo_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;
shader_stage=ss;
if(hasVertex ())shader_map.Add(vert=new ShaderCreaterVertex );else vert=nullptr;
if(hasGeometry ())shader_map.Add(geom=new ShaderCreaterGeometry);else geom=nullptr;
if(hasFragment ())shader_map.Add(frag=new ShaderCreaterFragment);else frag=nullptr;
if(hasVertex ())shader_map.Add(vert=new ShaderCreaterVertex (&mdm));else vert=nullptr;
if(hasGeometry ())shader_map.Add(geom=new ShaderCreaterGeometry(&mdm));else geom=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 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)
@ -27,7 +27,7 @@ bool MaterialCreater::AddUBO(const VkShaderStageFlagBits flag_bit,const Descript
if(!shader_map.KeyExist(flag_bit))
return(false);
if(!mdm.hasUBOStruct(type_name))
if(!mdm.hasStruct(type_name))
return(false);
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);
}
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+=GetShaderStageName(shader_stage);
final_shader+="_Output\n{";
output_struct.Clear();
output_struct=GetShaderStageName(shader_stage);
output_struct+="_Output\n{\n";
for(auto *ss:sdm.GetShaderStageIO().output)
{
output_struct+="\t";
@ -48,15 +64,47 @@ void ShaderCreater::ProcOutput()
output_struct+=";\n";
}
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)
{
final_shader="#version 460 core\n";
ProcInput(last_sc);
ProcOutput();
}
bool ShaderCreater::CompileToSPV()

View File

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