used newly ShaderAttributeArray

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-03-17 21:06:05 +08:00
parent f748301787
commit 529d6b7939
18 changed files with 141 additions and 103 deletions

2
CMCore

@ -1 +1 @@
Subproject commit 41a2f9af7287765835d6b8b72a2a567be6eb17e0
Subproject commit 2f4a583b9c6eb71b752deb3f85674feb22b3cd08

@ -1 +1 @@
Subproject commit d4999fb44535f0aa3d52295bad9a3f931d09f3a9
Subproject commit 17790c141d4a2a7e9c15a90216c3060469c40258

View File

@ -6,7 +6,7 @@ using namespace hgl::shadergen;
bool PureColor2DMaterial()
{
MaterialCreateInfo mc(1,false); //一个新材质1个RT输出默认使用Vertex/Fragment shader
MaterialCreateInfo mc("PureColor2D",1,false); //一个新材质1个RT输出默认使用Vertex/Fragment shader
//vertex部分
{
@ -68,7 +68,7 @@ void main()
bool VertexColor2DMaterial()
{
MaterialCreateInfo mc(1,false);
MaterialCreateInfo mc("VertexColor2D",1,false);
//vertex部分
{

View File

@ -14,6 +14,7 @@
#include<hgl/graph/VKRenderable.h>
#include<hgl/graph/font/TextPrimitive.h>
#include<hgl/type/ResManage.h>
#include<hgl/shadergen/MaterialCreateInfo.h>
VK_NAMESPACE_BEGIN
using MaterialID =int;
using MaterialInstanceID =int;
@ -90,6 +91,8 @@ public: //Material
const ShaderModule *CreateShaderModule(const OSString &filename,ShaderResource *shader_resource);
Material * CreateMaterial(const OSString &);
Material * CreateMaterial(const hgl::shadergen::MaterialCreateInfo *);
MaterialInstance * CreateMaterialInstance(Material *,const VILConfig *vil_cfg=nullptr);
MaterialInstance * CreateMaterialInstance(const OSString &,const VILConfig *vil_cfg=nullptr);

View File

@ -60,7 +60,7 @@ class VertexShaderModule:public ShaderModule
uint32_t attr_count;
VAT *type_list;
const char **name_list;
ShaderAttribute **ssi_list;
ShaderAttribute *attr_list;
private:
@ -77,7 +77,7 @@ public:
const int GetInputBinding(const AnsiString &name)const{return shader_resource->GetInputBinding(name);}
const ShaderAttribute * GetInput (const AnsiString &name)const{return shader_resource->GetInput(name);}
const uint GetInputCount () const{return shader_resource->GetInputCount();}
const ShaderAttributeList & GetInputs () const{return shader_resource->GetInputs();}
const ShaderAttributeArray & GetInputs () const{return shader_resource->GetInputs();}
//const uint32_t GetAttrCount()const{return attr_count;}

View File

@ -21,7 +21,7 @@ class ShaderResource
public:
ShaderResource(const VkShaderStageFlagBits &,const void *,const uint32);
virtual ~ShaderResource()=default;
virtual ~ShaderResource();
const VkShaderStageFlagBits GetStage ()const {return stage_flag;}
const char * GetStageName ()const {return GetShaderStageName(stage_flag);}
@ -29,11 +29,11 @@ public:
const uint32_t * GetCode ()const {return (uint32_t *)spv_data;}
const uint32_t GetCodeSize ()const {return spv_size;}
ShaderAttributeList & GetInputs () {return stage_io.input;}
// ShaderAttributeList & GetOutputs () {return stage_io.output;}
ShaderAttributeArray & GetInputs () {return stage_io.input;}
// ShaderAttributeArray & GetOutputs () {return stage_io.output;}
const uint GetInputCount ()const {return stage_io.input.GetCount();}
// const uint GetOutputCount ()const {return stage_io.output.GetCount();}
const uint GetInputCount ()const {return stage_io.input.count;}
// const uint GetOutputCount ()const {return stage_io.output.count;}
const ShaderAttribute * GetInput (const AnsiString &)const;
const int GetInputBinding (const AnsiString &)const;

View File

@ -10,6 +10,8 @@
SHADERGEN_NAMESPACE_BEGIN
class MaterialCreateInfo
{
AnsiString shader_name;
protected:
uint rt_color_count; ///<输出的RT数量
@ -27,6 +29,10 @@ protected:
public:
const AnsiString &GetName()const{return shader_name;}
const uint32 GetShaderStage()const{return shader_stage;}
bool hasShader(const VkShaderStageFlagBits ss)const{return shader_stage&ss;}
bool hasVertex ()const{return hasShader(VK_SHADER_STAGE_VERTEX_BIT);}
@ -42,7 +48,7 @@ public:
public:
MaterialCreateInfo(const uint rc,const bool rd,const uint32 ss=VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT);
MaterialCreateInfo(const AnsiString &,const uint rc,const bool rd,const uint32 ss=VK_SHADER_STAGE_VERTEX_BIT|VK_SHADER_STAGE_FRAGMENT_BIT);
~MaterialCreateInfo()=default;
bool AddStruct(const AnsiString &ubo_typename,const AnsiString &codes);

View File

@ -25,7 +25,7 @@ class ShaderDescriptorInfo
AnsiStringList struct_list; //用到的结构列表
//ubo/object在这里以及MaterialDescriptorInfo中均有一份mdm中的用于产生set/binding号这里的用于产生shader
//ubo/object在这里以及MaterialDescriptorInfo中均有一份mdi中的用于产生set/binding号这里的用于产生shader
UBODescriptorList ubo_list;
SamplerDescriptorList sampler_list;

View File

@ -7,6 +7,7 @@
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/io/ConstBufferReader.h>
#include<hgl/shadergen/MaterialCreateInfo.h>
VK_NAMESPACE_BEGIN
@ -185,5 +186,19 @@ Material *RenderResource::CreateMaterial(const OSString &filename)
material_by_name.Add(filename,mtl);
return(mtl);
}
Material *RenderResource::CreateMaterial(const hgl::shadergen::MaterialCreateInfo *mci)
{
SHADERGEN_NAMESPACE_USING
if(!mci)
return(nullptr);
const uint count=GetShaderCountByBits(mci->GetShaderStage());
ShaderModuleMap *smm=new ShaderModuleMap;
}
VK_NAMESPACE_END

View File

@ -44,18 +44,18 @@ ShaderModule::~ShaderModule()
VertexShaderModule::VertexShaderModule(VkDevice dev,VkPipelineShaderStageCreateInfo *pssci,ShaderResource *sr):ShaderModule(dev,pssci,sr)
{
const ShaderAttributeList &stage_input_list=sr->GetInputs();
const ShaderAttributeArray &stage_input_list=sr->GetInputs();
attr_count=stage_input_list.GetCount();
ssi_list=stage_input_list.GetData();
attr_count=stage_input_list.count;
attr_list=stage_input_list.items;
name_list=new const char *[attr_count];
type_list=new VAT[attr_count];
for(uint i=0;i<attr_count;i++)
{
name_list[i] =ssi_list[i]->name;
type_list[i].basetype =VATBaseType(ssi_list[i]->basetype);
type_list[i].vec_size =ssi_list[i]->vec_size;
name_list[i] =attr_list[i].name;
type_list[i].basetype =VATBaseType(attr_list[i].basetype);
type_list[i].vec_size =attr_list[i].vec_size;
}
}
@ -70,8 +70,6 @@ VertexShaderModule::~VertexShaderModule()
delete[] name_list;
}
const VkFormat GetVulkanFormat(const VATBaseType &base_type,const uint vec_size); //VertexAttrib.cpp
VIL *VertexShaderModule::CreateVIL(const VILConfig *cfg)
{
VkVertexInputBindingDescription *binding_list=new VkVertexInputBindingDescription[attr_count];
@ -80,7 +78,7 @@ VIL *VertexShaderModule::CreateVIL(const VILConfig *cfg)
VkVertexInputBindingDescription *bind=binding_list;
VkVertexInputAttributeDescription *attr=attribute_list;
ShaderAttribute **si=ssi_list;
const ShaderAttribute *si=attr_list;
VAConfig vac;
for(uint i=0;i<attr_count;i++)
@ -91,16 +89,16 @@ VIL *VertexShaderModule::CreateVIL(const VILConfig *cfg)
//但在我们的设计中仅支持一个流传递一个attrib
attr->binding =i;
attr->location =(*si)->location; //此值对应shader中的layout(location=
attr->location =si->location; //此值对应shader中的layout(location=
attr->offset =0;
bind->binding =i; //binding对应在vkCmdBindVertexBuffer中设置的缓冲区的序列号所以这个数字必须从0开始而且紧密排列。
//在Renderable类中buffer_list必需严格按照本此binding为序列号排列
if(!cfg||!cfg->Get((*si)->name,vac))
if(!cfg||!cfg->Get(si->name,vac))
{
attr->format =GetVulkanFormat(VATBaseType((*si)->basetype),(*si)->vec_size);
attr->format =GetVulkanFormat(si);
//if(memcmp((*si)->name.c_str(),"Inst_",5)==0) //不可以使用CaseComp("Inst_",5)会被认为是比较一个5字长的字符串而不是只比较5个字符
// bind->inputRate =VK_VERTEX_INPUT_RATE_INSTANCE;
@ -112,7 +110,7 @@ VIL *VertexShaderModule::CreateVIL(const VILConfig *cfg)
if(vac.format!=PF_UNDEFINED)
attr->format =vac.format;
else
attr->format =GetVulkanFormat(VATBaseType((*si)->basetype),(*si)->vec_size);
attr->format =GetVulkanFormat(si);
bind->inputRate =vac.instance?VK_VERTEX_INPUT_RATE_INSTANCE:VK_VERTEX_INPUT_RATE_VERTEX;
}

View File

@ -10,7 +10,7 @@ VK_NAMESPACE_BEGIN
{
ObjectMap<OSString,ShaderResource> shader_resource_by_filename;
const bool LoadShaderStageAttributes(ShaderAttributeList &ss_list,io::ConstBufferReader &cbr)
const bool LoadShaderStageAttributes(ShaderAttributeArray &ss_list,io::ConstBufferReader &cbr)
{
uint count;
@ -19,19 +19,19 @@ VK_NAMESPACE_BEGIN
if(count<=0)
return(false);
ShaderAttribute *ss;
Init(ss_list,count);
ShaderAttribute *ss=ss_list.items;
for(uint i=0;i<count;i++)
{
ss=new ShaderAttribute;
cbr.Read(ss->location);
cbr.CastRead<uint8>(ss->basetype);
cbr.CastRead<uint8>(ss->vec_size);
cbr.ReadTinyString(ss->name);
ss_list.Add(ss);
++ss;
}
return true;
@ -43,17 +43,25 @@ VK_NAMESPACE_BEGIN
stage_flag=flag;
spv_data=sd;
spv_size=size;
Init(stage_io);
}
ShaderResource::~ShaderResource()
{
Clear(stage_io);
}
const ShaderAttribute *ShaderResource::GetInput(const AnsiString &name) const
{
const int count=stage_io.input.GetCount();
ShaderAttribute **ss=stage_io.input.GetData();
if(stage_io.input.count<=0)return(nullptr);
for(int i=0;i<count;i++)
const ShaderAttribute *ss=stage_io.input.items;
for(uint i=0;i<stage_io.input.count;i++)
{
if(name==(*ss)->name)
return *ss;
if(name==ss->name)
return ss;
++ss;
}
@ -63,12 +71,13 @@ VK_NAMESPACE_BEGIN
const int ShaderResource::GetInputBinding(const AnsiString &name) const
{
const int count=stage_io.input.GetCount();
ShaderAttribute **ss=stage_io.input.GetData();
if(stage_io.input.count<=0)return(-1);
for(int i=0;i<count;i++)
const ShaderAttribute *ss=stage_io.input.items;
for(uint i=0;i<stage_io.input.count;i++)
{
if(name==(*ss)->name)
if(name==ss->name)
return i;
++ss;

View File

@ -4,6 +4,7 @@
#include<hgl/type/String.h>
#include<hgl/type/Map.h>
#include<stdint.h>
#include<hgl/graph/VKShaderStage.h>
namespace hgl
{
@ -17,6 +18,7 @@ namespace hgl
namespace glsl_compiler
{
using namespace hgl;
using namespace hgl::graph;
enum class DescriptorType //等同VkDescriptorType
{
@ -35,22 +37,6 @@ namespace glsl_compiler
ENUM_CLASS_RANGE(SAMPLER,INPUT_ATTACHMENT)
};
constexpr size_t SHADER_RESOURCE_NAME_MAX_LENGTH=32;
struct ShaderAttribute
{
char name[SHADER_RESOURCE_NAME_MAX_LENGTH];
uint8_t location;
uint8_t basetype; //现在改对应hgl/graph/VertexAttrib.h中的enum class VertexAttribType::BaseType
uint8_t vec_size;
};//
struct ShaderStageData
{
uint32_t count;
ShaderAttribute *items;
};
struct Descriptor
{
char name[SHADER_RESOURCE_NAME_MAX_LENGTH];
@ -90,8 +76,7 @@ namespace glsl_compiler
uint32_t *spv_data;
uint32_t spv_length;
ShaderStageData input,
output;
ShaderStageIO stage_io;
ShaderDescriptorResource resource;
ShaderResourceData<PushConstant> push_constant;
ShaderResourceData<SubpassInput> subpass_input;

View File

@ -5,8 +5,10 @@ using namespace hgl;
using namespace hgl::graph;
SHADERGEN_NAMESPACE_BEGIN
MaterialCreateInfo::MaterialCreateInfo(const uint rc,const bool rd,const uint32 ss)
MaterialCreateInfo::MaterialCreateInfo(const AnsiString &n,const uint rc,const bool rd,const uint32 ss)
{
shader_name=n;
rt_color_count=rc;
rt_depth=rd;

View File

@ -89,20 +89,24 @@ bool ShaderCreateInfo::ProcOutput()
{
output_struct.Clear();
const ShaderAttributeList &ssl=sdm->GetShaderStageIO().output;
const ShaderAttributeArray &ssd=sdm->GetShaderStageIO().output;
if(ssl.GetCount()<=0)return(true);
if(ssd.count<=0)return(true);
output_struct=GetShaderStageName(shader_stage);
output_struct+="_Output\n{\n";
for(auto *ss:ssl)
const ShaderAttribute *ss=ssd.items;
for(uint i=0;i<ssd.count;i++)
{
output_struct+="\t";
output_struct+=GetShaderAttributeTypename(ss);
output_struct+=" ";
output_struct+=ss->name;
output_struct+=";\n";
++ss;
}
output_struct+="}";

View File

@ -11,15 +11,14 @@ void ShaderCreateInfoFragment::UseDefaultMain()
const auto &output_list=sdm->GetShaderStageIO().output;
const uint count=output_list.GetCount();
ShaderAttribute **o=output_list.GetData();
const ShaderAttribute *o=output_list.items;
for(uint i=0;i<count;i++)
for(uint i=0;i<output_list.count;i++)
{
main_codes+="\t";
main_codes+=(*o)->name;
main_codes+=o->name;
main_codes+="=Get";
main_codes+=(*o)->name;
main_codes+=o->name;
main_codes+="();\n";
++o;
@ -32,17 +31,16 @@ bool ShaderCreateInfoFragment::ProcOutput()
{
const auto &output_list=sdm->GetShaderStageIO().output;
const uint count=output_list.GetCount();
ShaderAttribute **o=output_list.GetData();
const ShaderAttribute *o=output_list.items;
for(uint i=0;i<count;i++)
for(uint i=0;i<output_list.count;i++)
{
final_shader+="layout(location=";
final_shader+=AnsiString::numberOf(i);
final_shader+=") out ";
final_shader+=GetShaderAttributeTypename(*o);
final_shader+=GetShaderAttributeTypename(o);
final_shader+=" ";
final_shader+=(*o)->name;
final_shader+=o->name;
final_shader+=";\n";
++o;

View File

@ -34,18 +34,18 @@ bool ShaderCreateInfoVertex::ProcInput(ShaderCreateInfo *)
{
const auto &input=sdm->GetShaderStageIO().input;
if(input.IsEmpty())
if(input.count<=0)
{
//no input ? this isn't a bug.
//maybe position info from UBO/SBBO/Texture.
return(true);
}
if(!input.IsEmpty())
{
final_shader+="\n";
for(auto *ss:input)
const ShaderAttribute *ss=input.items;
for(uint i=0;i<input.count;i++)
{
final_shader+="layout(location=";
final_shader+=AnsiString::numberOf(ss->location);
@ -53,7 +53,8 @@ bool ShaderCreateInfoVertex::ProcInput(ShaderCreateInfo *)
final_shader+=GetShaderAttributeTypename(ss);
final_shader+=" "+AnsiString(ss->name);
final_shader+=";\n";
}
++ss;
}
return(true);

View File

@ -5,15 +5,20 @@ ShaderDescriptorInfo::ShaderDescriptorInfo(VkShaderStageFlagBits flag_bit)
{
stage_flag=flag_bit;
Init(stage_io);
hgl_zero(push_constant);
}
namespace
{
bool Find(ObjectList<ShaderAttribute> &ol,const ShaderAttribute *ss)
bool Find(ShaderAttributeArray &sad,const ShaderAttribute *ss)
{
for(int i=0;i<ol.GetCount();i++)
if(hgl::strcmp(ol[i]->name,ss->name)==0)
if(sad.count<=0)
return(false);
for(uint i=0;i<sad.count;i++)
if(hgl::strcmp(sad.items[i].name,ss->name)==0)
return(true);
return(false);
@ -26,8 +31,9 @@ bool ShaderDescriptorInfo::AddInput(ShaderAttribute *ss)
if(Find(stage_io.input,ss))return(false);
ss->location=stage_io.input.GetCount();
stage_io.input.Add(ss);
ss->location=stage_io.input.count;
Append(stage_io.input,ss);
return(true);
}
@ -37,8 +43,9 @@ bool ShaderDescriptorInfo::AddOutput(ShaderAttribute *ss)
if(Find(stage_io.output,ss))return(false);
ss->location=stage_io.output.GetCount();
stage_io.output.Add(ss);
ss->location=stage_io.output.count;
Append(stage_io.output,ss);
return(true);
}
@ -105,20 +112,30 @@ void ShaderDescriptorInfo::DebugOutput(int index)
LOG_INFO(UTF8String::numberOf(index)+": "+name+" shader");
if(stage_io.input.GetCount()>0)
if(stage_io.input.count>0)
{
LOG_INFO("\tStage Input "+UTF8String::numberOf(stage_io.input.GetCount()));
LOG_INFO("\tStage Input "+UTF8String::numberOf(stage_io.input.count));
for(auto *ss:stage_io.input)
const ShaderAttribute *ss=stage_io.input.items;
for(uint i=0;i<stage_io.input.count;i++)
{
LOG_INFO("\t\tlayout(location="+UTF8String::numberOf(ss->location)+") in "+GetShaderAttributeTypename(ss)+"\t"+UTF8String(ss->name));
++ss;
}
}
if(stage_io.output.GetCount()>0)
if(stage_io.output.count>0)
{
LOG_INFO("\tStage Output "+UTF8String::numberOf(stage_io.output.GetCount()));
LOG_INFO("\tStage Output "+UTF8String::numberOf(stage_io.output.count));
for(auto *ss:stage_io.output)
const ShaderAttribute *ss=stage_io.output.items;
for(uint i=0;i<stage_io.output.count;i++)
{
LOG_INFO("\t\tlayout(location="+UTF8String::numberOf(ss->location)+") out "+GetShaderAttributeTypename(ss)+"\t"+UTF8String(ss->name));
++ss;
}
}
if(ubo_list.GetCount()>0)