finished auto bound GlobalDescriptor

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-03-22 15:58:59 +08:00
parent e1c3b95de7
commit ac42dcdb26
14 changed files with 136 additions and 49 deletions

@ -1 +1 @@
Subproject commit f207c0b844e4c8474cdd4a94cd276251025f23ed
Subproject commit ba9b1936f65e37c4852f2c59e6adb5d694a4a573

View File

@ -8,7 +8,7 @@
#include<hgl/graph/SceneInfo.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/VKRenderablePrimitiveCreater.h>
#include<hgl/graph/mtl/2d/VertexColor2DNDC.h>
#include<hgl/graph/mtl/2d/VertexColor2D.h>
using namespace hgl;
using namespace hgl::graph;
@ -98,7 +98,7 @@ private:
bool InitAutoMaterial()
{
MaterialCreateInfo *mci=mtl::CreateVertexColor2DNDC();
MaterialCreateInfo *mci=mtl::CreateVertexColor2D(CoordinateSystem2D::NDC);
material_instance=db->CreateMaterialInstance(mci,&vil_config);

View File

@ -5,6 +5,7 @@
#include<hgl/math/Math.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/SceneInfo.h>
#include<hgl/graph/mtl/2d/VertexColor2D.h>
using namespace hgl;
using namespace hgl::graph;
@ -41,7 +42,13 @@ private:
bool InitMaterial()
{
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2D"));
MaterialCreateInfo *mci=mtl::CreateVertexColor2D(CoordinateSystem2D::Ortho);
//material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2D"));
material_instance=db->CreateMaterialInstance(mci);
delete mci;
if(!material_instance)
return(false);

View File

@ -116,7 +116,7 @@ public:
cili.lunarg.standard_validation = true;
cili.khronos.validation = true;
//cili.RenderDoc.Capture = true;
cili.RenderDoc.Capture = true;
inst=CreateInstance("VulkanTest",nullptr,&cili);
@ -142,7 +142,7 @@ public:
ubo_vp_info=db->CreateUBO(sizeof(ViewportInfo),&vp_info);
db->SetGlobal(GlobalShaderUBO::ViewportInfo,ubo_vp_info);
db->SetGlobal(GlobalDescriptor::ViewportInfo.name,ubo_vp_info);
}
return(true);

View File

@ -1,4 +1,4 @@
#ifndef HGL_GRAPH_VULKAN_MATERIAL_PARAMETERS_INCLUDE
#ifndef HGL_GRAPH_VULKAN_MATERIAL_PARAMETERS_INCLUDE
#define HGL_GRAPH_VULKAN_MATERIAL_PARAMETERS_INCLUDE
#include<hgl/graph/VK.h>
@ -27,10 +27,10 @@ public:
DescriptorSet * GetDescriptorSet (){return descriptor_set;}
const VkDescriptorSet GetVkDescriptorSet ()const{return descriptor_set->GetDescriptorSet();}
const uint32_t GetDescriptorCount ()const{return desc_manager->GetBindCount(set_type);} ///<获取总共需要绑定的描述符数量
const uint32_t GetDescriptorCount ()const{return desc_manager->GetBindCount(set_type);} ///<获取总共需要绑定的描述符数量
const uint32_t GetBoundCount ()const{return descriptor_set->GetCount();} ///<获取已经绑好的数量
const bool IsReady ()const{return descriptor_set->IsReady();} ///<是否全部绑好了
const uint32_t GetBoundCount ()const{return descriptor_set->GetCount();} ///<获取已经绑好的数量
const bool IsReady ()const{return descriptor_set->IsReady();} ///<是否全部绑好了
public:

View File

@ -12,8 +12,50 @@ enum class CoordinateSystem2D
Ortho //左上角为0,0右下角为(width-1),(height-1)
};
namespace GlobalShaderUBO
namespace GlobalDescriptor
{
constexpr const char ViewportInfo[]="ViewportInfo";
constexpr const char CameraInfo[]="CameraInfo";
struct ShaderStruct
{
const char *struct_name;
const char *name;
const char *codes;
};
constexpr const ShaderStruct ViewportInfo=
{
"ViewportInfo",
"viewport",
R"(
mat4 ortho_matrix;
vec2 canvas_resolution;
vec2 viewport_resolution;
vec2 inv_viewport_resolution;
)"
};
constexpr const ShaderStruct CameraInfo=
{
"CameraInfo",
"camera",
R"(
mat4 projection;
mat4 inverse_projection;
mat4 view;
mat4 inverse_view;
mat4 vp;
mat4 inverse_vp;
mat4 sky;
vec3 pos; //eye
vec3 view_line; //pos-target
vec3 world_up;
float znear,zfar;)"
};
}

View File

@ -5,6 +5,7 @@
#include<hgl/shadergen/ShaderCreateInfoGeometry.h>
#include<hgl/shadergen/ShaderCreateInfoFragment.h>
#include<hgl/shadergen/ShaderCreateInfoMap.h>
#include<hgl/graph/mtl/StdMaterial.h>
#include<hgl/graph/VKSamplerType.h>
namespace hgl{namespace graph{
@ -19,7 +20,7 @@ protected:
uint32_t shader_stage; ///<着色器阶段
MaterialDescriptorInfo mdm; ///<材质描述符管理器
MaterialDescriptorInfo mdi; ///<材质描述符管理器
ShaderCreateInfoMap shader_map; ///<着色器列表
@ -52,12 +53,24 @@ public:
~MaterialCreateInfo()=default;
bool AddStruct(const AnsiString &ubo_typename,const AnsiString &codes);
bool AddStruct(const GlobalDescriptor::ShaderStruct &ss)
{
return AddStruct(ss.struct_name,ss.codes);
}
bool AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name);
bool AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name);
bool AddUBO(const VkShaderStageFlagBits flag_bits,const GlobalDescriptor::ShaderStruct &ss)
{
if(!mdi.hasStruct(ss.struct_name))
mdi.AddStruct(ss.struct_name,ss.codes);
return AddUBO(flag_bits,DescriptorSetType::Global,ss.struct_name,ss.name);
}
bool CreateShader();
const MaterialDescriptorInfo &GetMDI()const{return mdm;}
const MaterialDescriptorInfo &GetMDI()const{return mdi;}
};//class MaterialCreateInfo
}}//namespace hgl::graph

View File

@ -17,7 +17,7 @@ protected:
VkShaderStageFlagBits shader_stage; ///<着色器阶段
MaterialDescriptorInfo *mdm;
MaterialDescriptorInfo *mdi;
protected:

View File

@ -125,7 +125,7 @@ bool RenderCmdBuffer::BindDescriptorSets(Renderable *ri)
if((DescriptorSetType)i==DescriptorSetType::PerObject)
{
dynamic_count=mp->GetCount();
dynamic_count=mp->GetBoundCount();
dynamic_offset=hgl_zero_new<uint32_t>(dynamic_count);
}

View File

@ -97,7 +97,7 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *
data->name =mtl_name;
data->shader_maps =shader_maps;
data->desc_manager =desc_manager;
data->desc_manager =desc_manager;
data->vertex_input =vi;
CreateShaderStageList(data->shader_stage_list,shader_maps);

View File

@ -7,22 +7,32 @@
STD_MTL_NAMESPACE_BEGIN
MaterialCreateInfo *CreateVertexColor2D(const CoordinateSystem2D &cs)
{
AnsiString mtl_name="VertexColor2D";
AnsiString mtl_name;
if(cs==CoordinateSystem2D::NDC)mtl_name+="NDC";else
if(cs==CoordinateSystem2D::ZeroToOne)mtl_name+="ZeroToOne";else
if(cs==CoordinateSystem2D::Ortho)mtl_name+="Ortho";else
if(cs==CoordinateSystem2D::NDC )mtl_name="VertexColor2DNDC";else
if(cs==CoordinateSystem2D::ZeroToOne)mtl_name="VertexColor2DZeroToOne";else
if(cs==CoordinateSystem2D::Ortho )mtl_name="VertexColor2DOrtho";else
return(nullptr);
MaterialCreateInfo *mci=new MaterialCreateInfo( mtl_name, ///<名称
1, ///<最终一个RT输出
false); ///<无深度输出
AnsiString sfGetPosition;
if(cs==CoordinateSystem2D::Ortho)
{
mci->AddStruct(GlobalShaderUBO::ViewportInfo,"");
// mci->AddStruct(GlobalDescriptor::ViewportInfo);
mci->AddUBO(VK_SHADER_STAGE_VERTEX_BIT,GlobalDescriptor::ViewportInfo);
sfGetPosition="vec4 GetPosition(){return viewport.ortho_matrix*vec4(Position,0,1);}";
}
else
if(cs==CoordinateSystem2D::ZeroToOne)
sfGetPosition="vec4 GetPosition(){return vec4(Position*2-1,0,1);}";
else
sfGetPosition="vec4 GetPosition(){return vec4(Position,0,1);}";
//vertex部分
{
@ -33,12 +43,14 @@ MaterialCreateInfo *CreateVertexColor2D(const CoordinateSystem2D &cs)
vsc->AddOutput(VAT_VEC4,"Color");
vsc->SetShaderCodes(R"(
vsc->SetShaderCodes(
sfGetPosition+
R"(
void main()
{
Output.Color=Color;
gl_Position=vec4(Position,0,1);
gl_Position=GetPosition();
})");
}

View File

@ -42,7 +42,8 @@ SET(STD_MTL_2D_HEADER_PATH ${STD_MTL_HEADER_PATH}/2d)
SET(STD_MTL_2D_SOURCE_FILES ${STD_MTL_2D_HEADER_PATH}/VertexColor2D.h
2d/VertexColor2D.cpp)
SET(STANDARD_MATERIAL_SOURCE ${STD_MTL_HEADER_PATH}/StdMaterial.h)
SET(STANDARD_MATERIAL_SOURCE ${STD_MTL_HEADER_PATH}/StdMaterial.h
GlobalShaderUBO.cpp)
SOURCE_GROUP("Standard Material" FILES ${STANDARD_MATERIAL_SOURCE})
SOURCE_GROUP("Standard Material\\2D" FILES ${STD_MTL_2D_SOURCE_FILES})

View File

@ -14,9 +14,9 @@ MaterialCreateInfo::MaterialCreateInfo(const AnsiString &n,const uint rc,const b
shader_stage=ss;
if(hasVertex ())shader_map.Add(vert=new ShaderCreateInfoVertex (&mdm));else vert=nullptr;
if(hasGeometry ())shader_map.Add(geom=new ShaderCreateInfoGeometry(&mdm));else geom=nullptr;
if(hasFragment ())shader_map.Add(frag=new ShaderCreateInfoFragment(&mdm));else frag=nullptr;
if(hasVertex ())shader_map.Add(vert=new ShaderCreateInfoVertex (&mdi));else vert=nullptr;
if(hasGeometry ())shader_map.Add(geom=new ShaderCreateInfoGeometry(&mdi));else geom=nullptr;
if(hasFragment ())shader_map.Add(frag=new ShaderCreateInfoFragment(&mdi));else frag=nullptr;
}
bool MaterialCreateInfo::AddStruct(const AnsiString &struct_name,const AnsiString &codes)
@ -24,7 +24,7 @@ bool MaterialCreateInfo::AddStruct(const AnsiString &struct_name,const AnsiStrin
if(struct_name.IsEmpty()||codes.IsEmpty())
return(false);
return mdm.AddStruct(struct_name,codes);
return mdi.AddStruct(struct_name,codes);
}
bool MaterialCreateInfo::AddUBO(const VkShaderStageFlagBits flag_bit,const DescriptorSetType set_type,const AnsiString &type_name,const AnsiString &name)
@ -32,7 +32,7 @@ bool MaterialCreateInfo::AddUBO(const VkShaderStageFlagBits flag_bit,const Descr
if(!shader_map.KeyExist(flag_bit))
return(false);
if(!mdm.hasStruct(type_name))
if(!mdi.hasStruct(type_name))
return(false);
ShaderCreateInfo *sc=shader_map[flag_bit];
@ -40,7 +40,7 @@ bool MaterialCreateInfo::AddUBO(const VkShaderStageFlagBits flag_bit,const Descr
if(!sc)
return(false);
UBODescriptor *ubo=mdm.GetUBO(name);
UBODescriptor *ubo=mdi.GetUBO(name);
if(ubo)
{
@ -56,9 +56,9 @@ bool MaterialCreateInfo::AddUBO(const VkShaderStageFlagBits flag_bit,const Descr
ubo=new UBODescriptor();
ubo->type=type_name;
ubo->name=name;
hgl::strcpy(ubo->name,DESCRIPTOR_NAME_MAX_LENGTH,name);
return sc->sdm->AddUBO(set_type,mdm.AddUBO(flag_bit,set_type,ubo));
return sc->sdm->AddUBO(set_type,mdi.AddUBO(flag_bit,set_type,ubo));
}
}
@ -74,7 +74,7 @@ bool MaterialCreateInfo::AddSampler(const VkShaderStageFlagBits flag_bit,const D
if(!sc)
return(false);
SamplerDescriptor *sampler=mdm.GetSampler(name);
SamplerDescriptor *sampler=mdi.GetSampler(name);
AnsiString st_name=GetSamplerTypeName(st);
@ -92,9 +92,9 @@ bool MaterialCreateInfo::AddSampler(const VkShaderStageFlagBits flag_bit,const D
sampler=new SamplerDescriptor();
sampler->type=st_name;
sampler->name=name;
hgl::strcpy(sampler->name,DESCRIPTOR_NAME_MAX_LENGTH,name);
return sc->sdm->AddSampler(set_type,mdm.AddSampler(flag_bit,set_type,sampler));
return sc->sdm->AddSampler(set_type,mdi.AddSampler(flag_bit,set_type,sampler));
}
}
@ -103,7 +103,7 @@ bool MaterialCreateInfo::CreateShader()
if(shader_map.IsEmpty())
return(false);
mdm.Resort();
mdi.Resort();
ShaderCreateInfo *sc,*last=nullptr;

View File

@ -6,7 +6,7 @@ namespace hgl{namespace graph{
ShaderCreateInfo::ShaderCreateInfo(VkShaderStageFlagBits ss,MaterialDescriptorInfo *m)
{
shader_stage=ss;
mdm=m;
mdi=m;
sdm=new ShaderDescriptorInfo(ss);
spv_data=nullptr;
@ -81,7 +81,10 @@ bool ShaderCreateInfo::ProcInput(ShaderCreateInfo *last_sc)
AnsiString last_output=last_sc->GetOutputStruct();
if(last_output.IsEmpty())
{
final_shader+="\n";
return(true);
}
final_shader+="layout(location=0) in ";
final_shader+=last_output;
@ -131,14 +134,14 @@ bool ShaderCreateInfo::ProcStruct()
for(auto &str:struct_list)
{
if(!mdm->GetStruct(*str,codes))
if(!mdi->GetStruct(*str,codes))
return(false);
final_shader+="struct ";
final_shader+=*str;
final_shader+="\n{\n";
final_shader+="\n{";
final_shader+=codes;
final_shader+="\n};\n\n";
final_shader+="};\n\n";
}
return(true);
@ -154,6 +157,8 @@ bool ShaderCreateInfo::ProcUBO()
auto ubo=ubo_list.GetData();
AnsiString struct_codes;
for(int i=0;i<count;i++)
{
final_shader+="layout(set=";
@ -162,9 +167,16 @@ bool ShaderCreateInfo::ProcUBO()
final_shader+=AnsiString::numberOf((*ubo)->binding);
final_shader+=") uniform ";
final_shader+=(*ubo)->type;
final_shader+=" ";
final_shader+="{\n";
if(!mdi->GetStruct((*ubo)->type,struct_codes))
return(false);
final_shader+=struct_codes;
final_shader+="\n}";
final_shader+=(*ubo)->name;
final_shader+="\n";
final_shader+=";\n";
++ubo;
}
@ -244,8 +256,8 @@ bool ShaderCreateInfo::CreateShader(ShaderCreateInfo *last_sc)
return(false);
if(!ProcInput(last_sc))
return(false);
if(!ProcStruct())
return(false);
// if(!ProcStruct())
// return(false);
if(!ProcUBO())
return(false);