improved MaterialCreateInfo::AddUBO

This commit is contained in:
HuYingzhuo(hugo/hyzboy) 2023-05-12 20:30:29 +08:00
parent f8ff6d9cf0
commit 7f3132236f
3 changed files with 49 additions and 15 deletions

View File

@ -30,7 +30,7 @@ protected:
MaterialDescriptorInfo mdi; ///<材质描述符管理器
AnsiString mi_codes; ///<MaterialInstance代码
uint32_t mi_length; ///<MaterialInstance长度
uint32_t mi_length; ///<MaterialInstance数据长度
ShaderCreateInfoMap shader_map; ///<着色器列表
@ -85,13 +85,7 @@ public:
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 DescriptorSetType &set_type,const ShaderBufferSource &ss)
{
if(!mdi.hasStruct(ss.struct_name))
mdi.AddStruct(ss.struct_name,ss.codes);
return AddUBO(flag_bits,set_type,ss.struct_name,ss.name);
}
bool AddUBO(const uint32_t flag_bits,const DescriptorSetType &set_type,const ShaderBufferSource &ss);
bool CreateShader();

View File

@ -134,14 +134,23 @@ Material *GPUDevice::CreateMaterial(const UTF8String &mtl_name,ShaderModuleMap *
// 一、分多次渲染使用UBO Offset偏移UBO数据区。
// 二、使用SSBO但这样会导致性能下降所以不推荐使用。
// 但只要我们限制一个MI数据不超过64/256字节一次渲染不超过256种材质实例就无需解决此问题。
// 但我们不解决这个问题
// 我们天然要求将材质实例数据分为两个等级同时要求一次渲染不能超过256种材质实例。
// 所以 UBO Range为16k时实例数据不能超过64字节。UBO Range为64k时实例数据不能超过256字节。
//if(desc_manager->hasSet(DescriptorSetType::PerMaterial))
//{
// data->mi_size
// data->mi_data=new uint8[data->mi_size*256];
//}
//else
if(desc_manager->hasSet(DescriptorSetType::PerMaterial))
{
uint size;
if(ubo_range>=64*1024)
size=64*1024;
else
size=ubo_range;
data->mi_size=0;
data->mi_data=new uint8[size];
}
else
{
data->mi_size=0;
data->mi_data=nullptr;

View File

@ -16,6 +16,8 @@ MaterialCreateInfo::MaterialCreateInfo(const AnsiString &n,const RenderTargetOut
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;
mi_length=0;
}
bool MaterialCreateInfo::AddStruct(const AnsiString &struct_name,const AnsiString &codes)
@ -97,11 +99,40 @@ bool MaterialCreateInfo::AddSampler(const VkShaderStageFlagBits flag_bit,const D
}
}
bool MaterialCreateInfo::AddUBO(const uint32_t flag_bits,const DescriptorSetType &set_type,const ShaderBufferSource &ss)
{
if(flag_bits==0)return(false); //没有任何SHADER用
if(!mdi.hasStruct(ss.struct_name))
mdi.AddStruct(ss.struct_name,ss.codes);
uint result=0;
VkShaderStageFlagBits bit;
for(uint i=0;i<shader_map.GetCount();i++)
{
shader_map.GetKey(i,bit);
if(flag_bits&bit)
if(AddUBO(bit,set_type,ss.struct_name,ss.name))
++result;
}
return(result==shader_map.GetCount());
}
bool MaterialCreateInfo::CreateShader()
{
if(shader_map.IsEmpty())
return(false);
if(mi_length>0)
{
AddUBO( shader_stage,
DescriptorSetType::Global,
mtl::SBS_MaterialInstance);
}
mdi.Resort();
ShaderCreateInfo *sc,*last=nullptr;