updated ShaderGen->ShaderCreater.
This commit is contained in:
parent
26f7c915c8
commit
6ee832c39f
@ -33,7 +33,7 @@ void main()
|
|||||||
vec4 color;
|
vec4 color;
|
||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
mc.AddUBOStruct("ColorMaterial","vec4 color;");
|
mc.AddStruct("ColorMaterial","vec4 color;");
|
||||||
|
|
||||||
//添加一个UBO,该代码会被展开为
|
//添加一个UBO,该代码会被展开为
|
||||||
/*
|
/*
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
@ -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
|
@ -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);
|
||||||
|
@ -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;}
|
||||||
|
|
||||||
|
@ -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];
|
||||||
|
@ -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()
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user