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;
|
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;}
|
||||||
|
@ -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
|
||||||
|
@ -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){}
|
||||||
|
@ -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:
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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())
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user