updated few codes.but it can't run for the new material writer.

This commit is contained in:
hyzboy 2021-06-21 20:49:25 +08:00
parent 538b69cb45
commit 15a9c8cb38
6 changed files with 109 additions and 86 deletions

2
CMCore

@ -1 +1 @@
Subproject commit f42fd8a5b8fb5e67df0a37ed95ed798e268fb9ca
Subproject commit 468aa4462224a722b334d7140723b169556ba368

View File

@ -72,11 +72,12 @@ private:
sampler=db->CreateSampler();
{
MaterialParameters *mp_texture=material_instance->GetMP(DescriptorSetsType::Value);
MaterialParameters *mp_texture=material_instance->GetMP(DescriptorSetsType::Material);
if(!mp_texture)
return(false);
if(!mp_texture->BindUBO("tex",ubo_camera_info))return(false);
if(!mp_texture->BindSampler("m_tex",texture,sampler))return(false);
mp_texture->Update();
}

View File

@ -11,7 +11,7 @@ class DescriptorSets
VkDevice device;
int layout_binding_count;
VkDescriptorSet desc_set;
const BindingMapping *index_by_binding;
// const BindingMapping *index_by_binding;
VkPipelineLayout pipeline_layout;
@ -23,10 +23,10 @@ private:
friend class DescriptorSetLayoutCreater;
DescriptorSets(VkDevice dev,const int c,VkPipelineLayout pl,VkDescriptorSet ds,const BindingMapping *bi):index_by_binding(bi)
DescriptorSets(VkDevice dev,const int lbc,VkPipelineLayout pl,VkDescriptorSet ds)//,const BindingMapping *bi):index_by_binding(bi)
{
device=dev;
layout_binding_count=c;
layout_binding_count=lbc;
desc_set=ds;
pipeline_layout=pl;
}

2
res

@ -1 +1 @@
Subproject commit 27da09e0b6027a5651a030334d5026adef2aaff7
Subproject commit 179d904193cfbd0a3292fd7e7d0ed034011ed15d

View File

@ -13,86 +13,106 @@ DescriptorSetLayoutCreater::~DescriptorSetLayoutCreater()
if(pipeline_layout)
vkDestroyPipelineLayout(device,pipeline_layout,nullptr);
if(dsl)
vkDestroyDescriptorSetLayout(device,dsl,nullptr);
for(ShaderDescriptorSet s:sds)
if(s.layout)
vkDestroyDescriptorSetLayout(device,s.layout,nullptr);
}
void DescriptorSetLayoutCreater::Bind(const ShaderDescriptorList *sd_list,VkDescriptorType desc_type,VkShaderStageFlagBits stageFlags)
{
if(!sd_list||sd_list->GetCount()<=0)return;
const uint32_t binding_count=sd_list->GetCount();
uint32_t binding_count[size_t(DescriptorSetsType::RANGE_SIZE)],
old_count[size_t(DescriptorSetsType::RANGE_SIZE)],
fin_count[size_t(DescriptorSetsType::RANGE_SIZE)];
VkDescriptorSetLayoutBinding *p[size_t(DescriptorSetsType::RANGE_SIZE)];
const uint old_count=layout_binding_list.GetCount();
hgl_zero(binding_count);
hgl_zero(old_count);
hgl_zero(fin_count);
hgl_zero(p);
layout_binding_list.PreMalloc(old_count+binding_count);
for(const ShaderDescriptor &sd:*sd_list)
{
all_set.Add(sd.set);
VkDescriptorSetLayoutBinding *p=layout_binding_list.GetData()+old_count;
++binding_count[sd.set];
}
uint fin_count=0;
ENUM_CLASS_FOR(DescriptorSetsType,int,i)
if(binding_count[i]>0)
{
old_count[i]=sds[i].binding_list.GetCount();
sds[i].binding_list.PreMalloc(old_count[i]+binding_count[i]);
p[i]=sds[i].binding_list.GetData()+old_count[i];
}
for(const ShaderDescriptor &sd:*sd_list)
{
//重复的绑定点是有可能存在的比如CameraInfo在vs/fs中同时存在
if(!all_index_by_binding.KeyExist(sd.binding))
if(!all_binding.IsMember(sd.binding))
{
p->binding = sd.binding;
p->descriptorType = desc_type;
p->descriptorCount = 1;
p->stageFlags = stageFlags;
p->pImmutableSamplers = nullptr;
p[sd.set]->binding = sd.binding;
p[sd.set]->descriptorType = desc_type;
p[sd.set]->descriptorCount = 1;
p[sd.set]->stageFlags = stageFlags;
p[sd.set]->pImmutableSamplers = nullptr;
if(sd.name[0]=='r'
&&sd.name[1]=='_')
index_by_binding[(size_t)DescriptorSetsType::Renderable].Add(sd.binding,fin_count+old_count);
else
if(sd.name[0]=='g'
&&sd.name[1]=='_')
index_by_binding[(size_t)DescriptorSetsType::Global].Add(sd.binding,fin_count+old_count);
else
index_by_binding[(size_t)DescriptorSetsType::Value].Add(sd.binding,fin_count+old_count);
all_binding.Add(sd.binding);
all_index_by_binding.Add(sd.binding,fin_count+old_count);
++p;
++fin_count;
++p[sd.set];
++fin_count[sd.set];
}
}
layout_binding_list.SetCount(old_count+fin_count);
ENUM_CLASS_FOR(DescriptorSetsType,int,i)
if(binding_count[i]>0)
sds[i].binding_list.SetCount(old_count[i]+fin_count[i]);
}
bool DescriptorSetLayoutCreater::CreatePipelineLayout()
{
const int count=layout_binding_list.GetCount();
fin_dsl_count=0;
ENUM_CLASS_FOR(DescriptorSetsType,int,i)
{
const int count=sds[i].binding_list.GetCount();
if(count<=0)
return(false);
continue;
DescriptorSetLayoutCreateInfo descriptor_layout;
descriptor_layout.bindingCount = count;
descriptor_layout.pBindings = layout_binding_list.GetData();
descriptor_layout.pBindings = sds[i].binding_list.GetData();
if(dsl)
vkDestroyDescriptorSetLayout(device,dsl,nullptr);
if(sds[i].layout)
vkDestroyDescriptorSetLayout(device,sds[i].layout,nullptr);
if(vkCreateDescriptorSetLayout(device,&descriptor_layout,nullptr,&dsl)!=VK_SUCCESS)
if(vkCreateDescriptorSetLayout(device,&descriptor_layout,nullptr,&(sds[i].layout))!=VK_SUCCESS)
return(false);
VkPushConstantRange push_constant_range;
fin_dsl[fin_dsl_count]=sds[i].layout;
++fin_dsl_count;
}
push_constant_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
push_constant_range.size = MAX_PUSH_CONSTANT_BYTES;
push_constant_range.offset = 0;
if(fin_dsl_count<=0)
return(false);
//VkPushConstantRange push_constant_range;
//push_constant_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
//push_constant_range.size = MAX_PUSH_CONSTANT_BYTES;
//push_constant_range.offset = 0;
PipelineLayoutCreateInfo pPipelineLayoutCreateInfo;
pPipelineLayoutCreateInfo.setLayoutCount = 1;
pPipelineLayoutCreateInfo.pSetLayouts = &dsl;
pPipelineLayoutCreateInfo.pushConstantRangeCount = 1;
pPipelineLayoutCreateInfo.pPushConstantRanges = &push_constant_range;
pPipelineLayoutCreateInfo.setLayoutCount = fin_dsl_count;
pPipelineLayoutCreateInfo.pSetLayouts = fin_dsl;
pPipelineLayoutCreateInfo.pushConstantRangeCount = 0;//1;
pPipelineLayoutCreateInfo.pPushConstantRanges = nullptr;//&push_constant_range;
if(vkCreatePipelineLayout(device,&pPipelineLayoutCreateInfo,nullptr,&pipeline_layout)!=VK_SUCCESS)
return(false);
@ -102,43 +122,28 @@ bool DescriptorSetLayoutCreater::CreatePipelineLayout()
DescriptorSets *DescriptorSetLayoutCreater::Create(const DescriptorSetsType &type)const
{
if(!pipeline_layout||!dsl)
if(!pipeline_layout)
return(nullptr);
const int count=layout_binding_list.GetCount();
ENUM_CLASS_RANGE_ERROR_RETURN_NULLPTR(DescriptorSetsType,type);
if(count<=0)
return(nullptr);
const uint32_t count=sds[(size_t)type].binding_list.GetCount();
const BindingMapping *bm=nullptr;
if(type==DescriptorSetsType::Material
// ||type==DescriptorSetsType::Texture
||type==DescriptorSetsType::Value) //未来会区分开
bm=&index_by_binding[(size_t)DescriptorSetsType::Value];
else
if(type==DescriptorSetsType::Renderable)
bm=&index_by_binding[(size_t)DescriptorSetsType::Renderable];
else
if(type==DescriptorSetsType::Global)
bm=&index_by_binding[(size_t)DescriptorSetsType::Global];
else
return(nullptr);
if(bm->GetCount()==0)
if(!count)
return(nullptr);
DescriptorSetAllocateInfo alloc_info;
alloc_info.descriptorPool = pool;
alloc_info.descriptorSetCount = 1;
alloc_info.pSetLayouts = &dsl;
alloc_info.pSetLayouts = &(sds[(size_t)type].layout);
VkDescriptorSet desc_set;
if(vkAllocateDescriptorSets(device,&alloc_info,&desc_set)!=VK_SUCCESS)
return(nullptr);
return(new DescriptorSets(device,count,pipeline_layout,desc_set,bm));
return(new DescriptorSets(device,count,pipeline_layout,desc_set));//,bm));
}
VK_NAMESPACE_END

View File

@ -3,6 +3,7 @@
#include<hgl/graph/VK.h>
#include<hgl/graph/shader/ShaderResource.h>
#include<hgl/type/Map.h>
#include<hgl/type/Sets.h>
VK_NAMESPACE_BEGIN
class DescriptorSets;
@ -14,17 +15,33 @@ class DescriptorSetLayoutCreater
VkDevice device;
VkDescriptorPool pool;
List<VkDescriptorSetLayoutBinding> layout_binding_list;
VkDescriptorSetLayout dsl=VK_NULL_HANDLE;
Sets<uint32_t> all_set;
Sets<uint32_t> all_binding;
BindingMapping all_index_by_binding;
BindingMapping index_by_binding[size_t(DescriptorSetsType::RANGE_SIZE)];
struct ShaderDescriptorSet
{
List<VkDescriptorSetLayoutBinding> binding_list;
VkDescriptorSetLayout layout;
};
ShaderDescriptorSet sds[size_t(DescriptorSetsType::RANGE_SIZE)];
VkDescriptorSetLayout fin_dsl[size_t(DescriptorSetsType::RANGE_SIZE)];
uint32_t fin_dsl_count;
VkPipelineLayout pipeline_layout=VK_NULL_HANDLE;
public:
DescriptorSetLayoutCreater(VkDevice dev,VkDescriptorPool dp){device=dev;pool=dp;}
DescriptorSetLayoutCreater(VkDevice dev,VkDescriptorPool dp)
{
ENUM_CLASS_FOR(DescriptorSetsType,int,i)
sds[i].layout=nullptr;
hgl_zero(fin_dsl);
fin_dsl_count=0;
device=dev;pool=dp;
}
~DescriptorSetLayoutCreater();
void Bind(const ShaderDescriptorList *sd_list,VkDescriptorType type,VkShaderStageFlagBits stage);