update Input/Output
This commit is contained in:
parent
2ac91b80ac
commit
26f7c915c8
@ -1 +1 @@
|
||||
Subproject commit 809fa8d4c73a810233e3ba6dd8c42a421a3ca9e9
|
||||
Subproject commit b7789d3b190855d3af0146b34af84f0247b5d242
|
@ -22,10 +22,6 @@ class MaterialCreater
|
||||
ShaderCreaterGeometry *geom;
|
||||
ShaderCreaterFragment *frag;
|
||||
|
||||
private:
|
||||
|
||||
void SetContext();
|
||||
|
||||
public:
|
||||
|
||||
bool hasShader(const VkShaderStageFlagBits ss)const{return shader_stage&ss;}
|
||||
|
@ -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
|
||||
|
@ -5,6 +5,8 @@
|
||||
SHADERGEN_NAMESPACE_BEGIN
|
||||
class ShaderCreaterVertex:public ShaderCreater
|
||||
{
|
||||
virtual void ProcInput() override;
|
||||
|
||||
public:
|
||||
|
||||
ShaderCreaterVertex():ShaderCreater(VK_SHADER_STAGE_VERTEX_BIT){}
|
||||
|
@ -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;}
|
||||
|
@ -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
|
||||
|
@ -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())
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user