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;
ShaderCreaterFragment *frag;
private:
void SetContext();
public:
bool hasShader(const VkShaderStageFlagBits ss)const{return shader_stage&ss;}

View File

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

View File

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

View File

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

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()
{
if(shader_map.IsEmpty())
return(false);
SetContext(); //设定上下文
ShaderCreater *sc;
ShaderCreater *sc,*last=nullptr;
for(int i=0;i<shader_map.GetCount();i++)
{
if(!shader_map.GetValue(i,sc))
return(false);
if(!sc->CompileToSPV())
return(false);
sc->CreateShader(last);
//if(!sc->CompileToSPV())
//return(false);
last=sc;
}
return(true);
}
SHADERGEN_NAMESPACE_END

View File

@ -17,12 +17,48 @@ int ShaderCreater::AddOutput(const AnsiString &type,const AnsiString &name)
{
VAT vat;
if(name.IsEmpty())
return -1;
if(!ParseVertexAttribType(&vat,type))
return(-2);
return -2;
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()
{
if(shader_codes.IsEmpty())

View File

@ -22,4 +22,24 @@ int ShaderCreaterVertex::AddInput(const AnsiString &type,const AnsiString &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

View File

@ -1,11 +1,9 @@
#include<hgl/shadergen/ShaderDescriptorManager.h>
SHADERGEN_NAMESPACE_BEGIN
ShaderDescriptorManager::ShaderDescriptorManager(VkShaderStageFlagBits cur)
ShaderDescriptorManager::ShaderDescriptorManager(VkShaderStageFlagBits flag_bit)
{
stage_io.cur=cur;
stage_io.prev=(VkShaderStageFlagBits)0;
stage_io.next=(VkShaderStageFlagBits)0;
shader_stage=flag_bit;
hgl_zero(push_constant);
}
@ -101,13 +99,9 @@ void ShaderDescriptorManager::SetPushConstant(const UTF8String name,uint8_t offs
#ifdef _DEBUG
void ShaderDescriptorManager::DebugOutput(int index)
{
UTF8String name=GetShaderStageName(stage_io.cur);
UTF8String prev_name=GetShaderStageName(stage_io.prev);
UTF8String next_name=GetShaderStageName(stage_io.next);
UTF8String name=GetStageName();
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)
{