refactor ShaderDescriptorList.

This commit is contained in:
hyzboy 2021-06-15 17:43:06 +08:00
parent 983202966e
commit 0ad2c96645
5 changed files with 66 additions and 61 deletions

2
CMUtil

@ -1 +1 @@
Subproject commit 863293fbc8e900688773f3724a53f1c99f67c6fd Subproject commit 9982ca25af1a52981054af8636dfc5f3e2ea59c9

View File

@ -44,13 +44,15 @@ using ShaderStageList =ObjectList<ShaderStage>;
using DescriptorSetList =List<uint32_t>; using DescriptorSetList =List<uint32_t>;
using DescriptorBindingList =List<uint32_t>; using DescriptorBindingList =List<uint32_t>;
struct ShaderDescriptorList struct ShaderDescriptor
{ {
AnsiStringList name_list; char name[128];
DescriptorSetList set_list; uint32_t set;
DescriptorBindingList binding_list; uint32_t binding;
}; };
using ShaderDescriptorList=List<ShaderDescriptor>;
#ifndef VK_DESCRIPTOR_TYPE_BEGIN_RANGE #ifndef VK_DESCRIPTOR_TYPE_BEGIN_RANGE
constexpr size_t VK_DESCRIPTOR_TYPE_BEGIN_RANGE=VK_DESCRIPTOR_TYPE_SAMPLER; constexpr size_t VK_DESCRIPTOR_TYPE_BEGIN_RANGE=VK_DESCRIPTOR_TYPE_SAMPLER;
#endif//VK_DESCRIPTOR_TYPE_BEGIN_RANGE #endif//VK_DESCRIPTOR_TYPE_BEGIN_RANGE
@ -109,13 +111,13 @@ public:
ShaderDescriptorList &GetSampler(){return descriptor_list[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER];} ShaderDescriptorList &GetSampler(){return descriptor_list[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER];}
const int GetBinding (VkDescriptorType desc_type,const AnsiString &name)const; const int GetBinding (VkDescriptorType desc_type,const AnsiString &name)const;
const DescriptorBindingList * GetBindingList (VkDescriptorType desc_type)const //const DescriptorBindingList * GetBindingList (VkDescriptorType desc_type)const
{ //{
if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE // if(desc_type<VK_DESCRIPTOR_TYPE_BEGIN_RANGE
||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE)return nullptr; // ||desc_type>VK_DESCRIPTOR_TYPE_END_RANGE)return nullptr;
return &(descriptor_list[desc_type].binding_list); // return &(descriptor_list[desc_type].binding_list);
} //}
};//class ShaderResource };//class ShaderResource
ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize,bool include_file_header); ShaderResource *LoadShaderResource(const uint8 *origin_filedata,const int64 filesize,bool include_file_header);

View File

@ -17,30 +17,33 @@ DescriptorSetLayoutCreater::~DescriptorSetLayoutCreater()
vkDestroyDescriptorSetLayout(device,dsl,nullptr); vkDestroyDescriptorSetLayout(device,dsl,nullptr);
} }
void DescriptorSetLayoutCreater::Bind(const uint32_t binding,VkDescriptorType desc_type,VkShaderStageFlagBits stageFlags) //单个版本,暂时用不到
//void DescriptorSetLayoutCreater::Bind(const uint32_t binding,VkDescriptorType desc_type,VkShaderStageFlagBits stageFlags)
//{
// if(index_by_binding.KeyExist(binding))
// {
// //重复的绑定点有可能存在的比如CameraMatrix在vs/fs中同时存在
// return;
// }
//
// VkDescriptorSetLayoutBinding layout_binding;
//
// layout_binding.binding = binding;
// layout_binding.descriptorType = desc_type;
// layout_binding.descriptorCount = 1;
// layout_binding.stageFlags = stageFlags;
// layout_binding.pImmutableSamplers = nullptr;
//
// const int index=layout_binding_list.Add(layout_binding);
//
// index_by_binding.Add(binding,index);
//}
void DescriptorSetLayoutCreater::Bind(const ShaderDescriptorList *sd_list,VkDescriptorType desc_type,VkShaderStageFlagBits stageFlags)
{ {
if(index_by_binding.KeyExist(binding)) if(!sd_list||sd_list->GetCount()<=0)return;
{
//重复的绑定点有可能存在的比如CameraMatrix在vs/fs中同时存在
return;
}
VkDescriptorSetLayoutBinding layout_binding; const uint32_t binding_count=sd_list->GetCount();
layout_binding.binding = binding;
layout_binding.descriptorType = desc_type;
layout_binding.descriptorCount = 1;
layout_binding.stageFlags = stageFlags;
layout_binding.pImmutableSamplers = nullptr;
const int index=layout_binding_list.Add(layout_binding);
index_by_binding.Add(binding,index);
}
void DescriptorSetLayoutCreater::Bind(const uint32_t *binding,const uint32_t binding_count,VkDescriptorType desc_type,VkShaderStageFlagBits stageFlags)
{
if(!binding||binding_count<=0)return;
const uint old_count=layout_binding_list.GetCount(); const uint old_count=layout_binding_list.GetCount();
@ -50,23 +53,22 @@ void DescriptorSetLayoutCreater::Bind(const uint32_t *binding,const uint32_t bin
uint fin_count=0; uint fin_count=0;
for(uint i=old_count;i<old_count+binding_count;i++) for(const ShaderDescriptor &sd:*sd_list)
{ {
if(!index_by_binding.KeyExist(*binding)) if((!index_by_binding.KeyExist(sd.binding))
&&(!index_by_binding_ri.KeyExist(sd.binding)))
{ {
p->binding = *binding; p->binding = sd.binding;
p->descriptorType = desc_type; p->descriptorType = desc_type;
p->descriptorCount = 1; p->descriptorCount = 1;
p->stageFlags = stageFlags; p->stageFlags = stageFlags;
p->pImmutableSamplers = nullptr; p->pImmutableSamplers = nullptr;
index_by_binding.Add(*binding,i); index_by_binding.Add(sd.binding,fin_count+old_count);
++p; ++p;
++fin_count; ++fin_count;
} }
++binding;
} }
layout_binding_list.SetCount(old_count+fin_count); layout_binding_list.SetCount(old_count+fin_count);

View File

@ -17,6 +17,7 @@ class DescriptorSetLayoutCreater
List<VkDescriptorSetLayoutBinding> layout_binding_list; List<VkDescriptorSetLayoutBinding> layout_binding_list;
VkDescriptorSetLayout dsl=VK_NULL_HANDLE; VkDescriptorSetLayout dsl=VK_NULL_HANDLE;
BindingMapping index_by_binding; BindingMapping index_by_binding;
BindingMapping index_by_binding_ri;
VkPipelineLayout pipeline_layout=VK_NULL_HANDLE; VkPipelineLayout pipeline_layout=VK_NULL_HANDLE;
@ -25,20 +26,20 @@ public:
DescriptorSetLayoutCreater(VkDevice dev,VkDescriptorPool dp){device=dev;pool=dp;} DescriptorSetLayoutCreater(VkDevice dev,VkDescriptorPool dp){device=dev;pool=dp;}
~DescriptorSetLayoutCreater(); ~DescriptorSetLayoutCreater();
void Bind(const uint32_t binding,VkDescriptorType,VkShaderStageFlagBits); // void Bind(const uint32_t binding,VkDescriptorType,VkShaderStageFlagBits); //单个版本,暂时用不到
void Bind(const uint32_t *binding,const uint32_t count,VkDescriptorType type,VkShaderStageFlagBits stage); void Bind(const ShaderDescriptorList *sd_list,VkDescriptorType type,VkShaderStageFlagBits stage);
void Bind(const DescriptorBindingList &dbl,VkDescriptorType type,VkShaderStageFlagBits stage) //void Bind(const DescriptorBindingList &dbl,VkDescriptorType type,VkShaderStageFlagBits stage)
{ //{
if(dbl.GetCount()>0) // if(dbl.GetCount()>0)
Bind(dbl.GetData(),dbl.GetCount(),type,stage); // Bind(dbl.GetData(),dbl.GetCount(),type,stage);
} //}
void Bind(const ShaderDescriptorList *sdl,VkShaderStageFlagBits stage) void Bind(const ShaderDescriptorList *sdl,VkShaderStageFlagBits stage)
{ {
for(uint32_t i=VK_DESCRIPTOR_TYPE_BEGIN_RANGE;i<=VK_DESCRIPTOR_TYPE_END_RANGE;i++) for(uint32_t i=VK_DESCRIPTOR_TYPE_BEGIN_RANGE;i<=VK_DESCRIPTOR_TYPE_END_RANGE;i++)
{ {
if(sdl->binding_list.GetCount()>0) if(sdl->GetCount()>0)
Bind(sdl->binding_list.GetData(),sdl->binding_list.GetCount(),(VkDescriptorType)i,stage); Bind(sdl,(VkDescriptorType)i,stage);
++sdl; ++sdl;
} }

View File

@ -64,19 +64,22 @@ VK_NAMESPACE_BEGIN
uint str_len; uint str_len;
sd_list->binding_list.PreMalloc(count); sd_list->SetCount(count);
sd_list->set_list.PreMalloc(count);
ShaderDescriptor *sd=sd_list->GetData();
for(uint i=0;i<count;i++) for(uint i=0;i<count;i++)
{ {
if(version>=1) if(version>=1)
sd_list->set_list.Add(*data++); sd->set=*data++;
else else
sd_list->set_list.Add(0); sd->set=0;
sd_list->binding_list.Add(*data++); sd->binding=*data++;
str_len=*data++; str_len=*data++;
sd_list->name_list.Add(AnsiString((char *)data,str_len));
memcpy(sd->name,(char *)data,str_len);
sd->name[str_len]=0;
data+=str_len; data+=str_len;
} }
@ -158,13 +161,10 @@ VK_NAMESPACE_BEGIN
const ShaderDescriptorList *sdl=descriptor_list+(size_t)desc_type; const ShaderDescriptorList *sdl=descriptor_list+(size_t)desc_type;
const int index=sdl->name_list.Find(name); for(const ShaderDescriptor &sd:*sdl)
if(name==sd.name)
return sd.binding;
uint binding;
if(sdl->binding_list.Get(index,binding))
return binding;
else
return -1; return -1;
} }