update Input/Output

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-03-08 21:41:57 +08:00
parent 2ac91b80ac
commit 26f7c915c8
9 changed files with 88 additions and 60 deletions

@ -1 +1 @@
Subproject commit 809fa8d4c73a810233e3ba6dd8c42a421a3ca9e9 Subproject commit b7789d3b190855d3af0146b34af84f0247b5d242

View File

@ -22,10 +22,6 @@ class MaterialCreater
ShaderCreaterGeometry *geom; ShaderCreaterGeometry *geom;
ShaderCreaterFragment *frag; ShaderCreaterFragment *frag;
private:
void SetContext();
public: public:
bool hasShader(const VkShaderStageFlagBits ss)const{return shader_stage&ss;} bool hasShader(const VkShaderStageFlagBits ss)const{return shader_stage&ss;}

View File

@ -12,6 +12,16 @@ protected:
AnsiString shader_codes; AnsiString shader_codes;
AnsiString output_struct;
AnsiString final_shader;
protected:
virtual void ProcHeader(){}
virtual void ProcInput();
virtual void ProcOutput();
public: public:
ShaderDescriptorManager sdm; ShaderDescriptorManager sdm;
@ -35,6 +45,10 @@ public:
shader_codes=str; shader_codes=str;
} }
const AnsiString &GetOutputStruct()const{return output_struct;}
bool CreateShader(ShaderCreater *);
bool CompileToSPV(); bool CompileToSPV();
};//class ShaderCreater };//class ShaderCreater
SHADERGEN_NAMESPACE_END SHADERGEN_NAMESPACE_END

View File

@ -5,6 +5,8 @@
SHADERGEN_NAMESPACE_BEGIN SHADERGEN_NAMESPACE_BEGIN
class ShaderCreaterVertex:public ShaderCreater class ShaderCreaterVertex:public ShaderCreater
{ {
virtual void ProcInput() override;
public: public:
ShaderCreaterVertex():ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT){} ShaderCreaterVertex():ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT){}

View File

@ -16,6 +16,8 @@ using ConstSamplerDescriptorList=List<const SamplerDescriptor *>;
*/ */
class ShaderDescriptorManager class ShaderDescriptorManager
{ {
VkShaderStageFlagBits shader_stage;
ShaderStageIO stage_io; ShaderStageIO stage_io;
//ubo/object在这里以及MaterialDescriptorManager中均有一份mdm中的用于产生set/binding号这里的用于产生shader //ubo/object在这里以及MaterialDescriptorManager中均有一份mdm中的用于产生set/binding号这里的用于产生shader
@ -32,11 +34,8 @@ public:
ShaderDescriptorManager(VkShaderStageFlagBits); ShaderDescriptorManager(VkShaderStageFlagBits);
~ShaderDescriptorManager()=default; ~ShaderDescriptorManager()=default;
const VkShaderStageFlagBits GetStageBits()const { return stage_io.cur; } const VkShaderStageFlagBits GetStageBits()const { return shader_stage; }
const AnsiString GetStageName()const { return AnsiString(GetShaderStageName(stage_io.cur)); } const AnsiString GetStageName()const { return AnsiString(GetShaderStageName(shader_stage)); }
void SetPrevShader(VkShaderStageFlagBits prev) { stage_io.prev=prev; }
void SetNextShader(VkShaderStageFlagBits next) { stage_io.next=next; }
public: public:

View File

@ -93,59 +93,26 @@ bool MaterialCreater::AddSampler(const VkShaderStageFlagBits flag_bit,const Desc
} }
} }
void MaterialCreater::SetContext()
{
//ShaderMap使用ObjectMap保存,ObjectMap本质附带排序功能所以这里无需再排序直接设定prev,next即可
LOG_INFO("Resort Shader.");
ShaderCreater *prev,*cur,*next;
auto *it=shader_map.GetDataList();
const int count=shader_map.GetCount();
for(int i=0; i<count; i++)
{
cur=(*it)->right;
++it;
if(i>0)
cur->sdm.SetPrevShader(prev->GetShaderStage());
if(i<count-1)
{
next=(*it)->right;
cur->sdm.SetNextShader(next->GetShaderStage());
}
#ifdef _DEBUG
cur->sdm.DebugOutput(i);
#endif//_DEBUG
prev=cur;
}
}
bool MaterialCreater::CompileShader() bool MaterialCreater::CompileShader()
{ {
if(shader_map.IsEmpty()) if(shader_map.IsEmpty())
return(false); return(false);
SetContext(); //设定上下文 ShaderCreater *sc,*last=nullptr;
ShaderCreater *sc;
for(int i=0;i<shader_map.GetCount();i++) for(int i=0;i<shader_map.GetCount();i++)
{ {
if(!shader_map.GetValue(i,sc)) if(!shader_map.GetValue(i,sc))
return(false); return(false);
if(!sc->CompileToSPV()) sc->CreateShader(last);
return(false);
//if(!sc->CompileToSPV())
//return(false);
last=sc;
} }
return(true); return(true);
} }
SHADERGEN_NAMESPACE_END SHADERGEN_NAMESPACE_END

View File

@ -17,12 +17,48 @@ int ShaderCreater::AddOutput(const AnsiString &type,const AnsiString &name)
{ {
VAT vat; VAT vat;
if(name.IsEmpty())
return -1;
if(!ParseVertexAttribType(&vat,type)) if(!ParseVertexAttribType(&vat,type))
return(-2); return -2;
return AddOutput(vat,name); return AddOutput(vat,name);
} }
void ShaderCreater::ProcInput()
{
}
void ShaderCreater::ProcOutput()
{
final_shader+="layout(location=0) out ";
final_shader+=GetShaderStageName(shader_stage);
final_shader+="_Output\n{";
output_struct.Clear();
for(auto *ss:sdm.GetShaderStageIO().output)
{
output_struct+="\t";
output_struct+=GetShaderStageTypeName(ss);
output_struct+=" ";
output_struct+=ss->name;
output_struct+=";\n";
}
final_shader+=output_struct;
final_shader+="}Output;\n\n";
}
bool ShaderCreater::CreateShader(ShaderCreater *last_sc)
{
final_shader="#version 460 core\n";
}
bool ShaderCreater::CompileToSPV() bool ShaderCreater::CompileToSPV()
{ {
if(shader_codes.IsEmpty()) if(shader_codes.IsEmpty())

View File

@ -22,4 +22,24 @@ int ShaderCreaterVertex::AddInput(const AnsiString &type,const AnsiString &name)
return AddInput(vat,name); return AddInput(vat,name);
} }
void ShaderCreaterVertex::ProcInput()
{
const auto &io=sdm.GetShaderStageIO();
if(!io.input.IsEmpty())
{
for(auto *ss:io.input)
{
final_shader+="layout(location=";
final_shader+=UTF8String::numberOf(ss->location);
final_shader+=") in ";
final_shader+=UTF8String(GetShaderStageTypeName(ss));
final_shader+="\t"+UTF8String(ss->name);
final_shader+=";\n";
}
final_shader+="\n";
}
}
SHADERGEN_NAMESPACE_END SHADERGEN_NAMESPACE_END

View File

@ -1,11 +1,9 @@
#include<hgl/shadergen/ShaderDescriptorManager.h> #include<hgl/shadergen/ShaderDescriptorManager.h>
SHADERGEN_NAMESPACE_BEGIN SHADERGEN_NAMESPACE_BEGIN
ShaderDescriptorManager::ShaderDescriptorManager(VkShaderStageFlagBits cur) ShaderDescriptorManager::ShaderDescriptorManager(VkShaderStageFlagBits flag_bit)
{ {
stage_io.cur=cur; shader_stage=flag_bit;
stage_io.prev=(VkShaderStageFlagBits)0;
stage_io.next=(VkShaderStageFlagBits)0;
hgl_zero(push_constant); hgl_zero(push_constant);
} }
@ -101,13 +99,9 @@ void ShaderDescriptorManager::SetPushConstant(const UTF8String name,uint8_t offs
#ifdef _DEBUG #ifdef _DEBUG
void ShaderDescriptorManager::DebugOutput(int index) void ShaderDescriptorManager::DebugOutput(int index)
{ {
UTF8String name=GetShaderStageName(stage_io.cur); UTF8String name=GetStageName();
UTF8String prev_name=GetShaderStageName(stage_io.prev);
UTF8String next_name=GetShaderStageName(stage_io.next);
LOG_INFO(UTF8String::numberOf(index)+": "+name+" shader"); LOG_INFO(UTF8String::numberOf(index)+": "+name+" shader");
LOG_INFO("\tprev next is "+prev_name);
LOG_INFO("\tnext next is "+next_name);
if(stage_io.input.GetCount()>0) if(stage_io.input.GetCount()>0)
{ {