将PipelineLayout的创建从Material创建移到DescriptorSets创建,并且PipelineLayout属性也从Material移到DescriptorSets

This commit is contained in:
hyzboy 2019-05-05 18:00:26 +08:00
parent 29252ca0b1
commit 14fe3c7629
4 changed files with 38 additions and 30 deletions

View File

@ -14,17 +14,20 @@ class DescriptorSetLayout
VkDescriptorSet *desc_set_list;
Map<uint32_t,int> index_by_binding;
VkPipelineLayout pipeline_layout;
private:
friend class DescriptorSetLayoutCreater;
DescriptorSetLayout(Device *dev,const int c,VkDescriptorSetLayout *dsl_list,VkDescriptorSet *desc_set,Map<uint32_t,int> &bi)
DescriptorSetLayout(Device *dev,const int c,VkDescriptorSetLayout *dsl_list,VkPipelineLayout pl,VkDescriptorSet *desc_set,Map<uint32_t,int> &bi)
{
device=dev;
count=c;
desc_set_layout_list=dsl_list;
desc_set_list=desc_set;
index_by_binding=bi;
pipeline_layout=pl;
}
public:
@ -35,6 +38,7 @@ public:
const VkDescriptorSetLayout * GetLayouts ()const{return desc_set_layout_list;}
const VkDescriptorSet * GetDescriptorSets ()const{return desc_set_list;}
VkDescriptorSet GetDescriptorSet (const uint32_t binding);
const VkPipelineLayout GetPipelineLayout ()const{return pipeline_layout;}
};//class DescriptorSetLayout
/**

View File

@ -29,21 +29,20 @@ class Material
List<VkPipelineShaderStageCreateInfo> *shader_stage_list;
DescriptorSetLayoutCreater *dsl_creater;
DescriptorSetLayout *desc_set_layout;
VkPipelineLayout pipeline_layout;
VertexAttributeBinding *vab;
public:
Material(Device *dev,ShaderModuleMap *smm,VertexShaderModule *vsm,List<VkPipelineShaderStageCreateInfo> *,DescriptorSetLayoutCreater *dslc,DescriptorSetLayout *dsl,VkPipelineLayout pl,VertexAttributeBinding *v);
Material(Device *dev,ShaderModuleMap *smm,VertexShaderModule *vsm,List<VkPipelineShaderStageCreateInfo> *,DescriptorSetLayoutCreater *dslc,DescriptorSetLayout *dsl,VertexAttributeBinding *v);
~Material();
const int GetUBOBinding(const UTF8String &)const;
const int GetVBOBinding(const UTF8String &)const;
const VkPipelineLayout GetPipelineLayout ()const{return pipeline_layout;}
const uint32_t GetStageCount ()const{return shader_stage_list->GetCount();}
const VkPipelineShaderStageCreateInfo * GetStages ()const{return shader_stage_list->GetData();}
const VkPipelineLayout GetPipelineLayout ()const;
const uint32_t GetDescriptorSetCount ()const;
const VkDescriptorSet * GetDescriptorSets ()const;

View File

@ -32,6 +32,9 @@ DescriptorSetLayout::~DescriptorSetLayout()
//if(count>0)
// vkFreeDescriptorSets(device->GetDevice(),device->GetDescriptorPool(),count,desc_set_list);
if(pipeline_layout)
vkDestroyPipelineLayout(*device,pipeline_layout,nullptr);
delete[] desc_set_list;
DestroyDescriptorSetLayout(*device,count,desc_set_layout_list);
delete[] desc_set_layout_list;
@ -89,7 +92,23 @@ DescriptorSetLayout *DescriptorSetLayoutCreater::Create()
VkDescriptorSetLayout *dsl_list=new VkDescriptorSetLayout[count];
if(vkCreateDescriptorSetLayout(device->GetDevice(),&descriptor_layout, nullptr, dsl_list)!=VK_SUCCESS)
if(vkCreateDescriptorSetLayout(*device,&descriptor_layout, nullptr, dsl_list)!=VK_SUCCESS)
{
delete[] dsl_list;
return(nullptr);
}
VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = {};
pPipelineLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
pPipelineLayoutCreateInfo.pNext = nullptr;
pPipelineLayoutCreateInfo.pushConstantRangeCount = 0;
pPipelineLayoutCreateInfo.pPushConstantRanges = nullptr;
pPipelineLayoutCreateInfo.setLayoutCount = count;
pPipelineLayoutCreateInfo.pSetLayouts = dsl_list;
VkPipelineLayout pipeline_layout;
if(vkCreatePipelineLayout(*device, &pPipelineLayoutCreateInfo, nullptr, &pipeline_layout)!=VK_SUCCESS)
{
delete[] dsl_list;
return(nullptr);
@ -104,14 +123,15 @@ DescriptorSetLayout *DescriptorSetLayoutCreater::Create()
VkDescriptorSet *desc_set=new VkDescriptorSet[count];
if(vkAllocateDescriptorSets(device->GetDevice(),&alloc_info,desc_set)!=VK_SUCCESS)
if(vkAllocateDescriptorSets(*device,&alloc_info,desc_set)!=VK_SUCCESS)
{
vkDestroyPipelineLayout(*device,pipeline_layout,nullptr);
delete[] desc_set;
DestroyDescriptorSetLayout(*device,count,dsl_list);
delete[] dsl_list;
return(nullptr);
}
return(new DescriptorSetLayout(device,count,dsl_list,desc_set,index_by_binding));
return(new DescriptorSetLayout(device,count,dsl_list,pipeline_layout,desc_set,index_by_binding));
}
VK_NAMESPACE_END

View File

@ -45,29 +45,13 @@ Material *CreateMaterial(Device *dev,ShaderModuleMap *shader_maps)
if(dsl)
{
const uint32_t layout_count=dsl->GetCount();
const VkDescriptorSetLayout *layouts=(layout_count>0?dsl->GetLayouts():nullptr);
VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = {};
pPipelineLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
pPipelineLayoutCreateInfo.pNext = nullptr;
pPipelineLayoutCreateInfo.pushConstantRangeCount = 0;
pPipelineLayoutCreateInfo.pPushConstantRanges = nullptr;
pPipelineLayoutCreateInfo.setLayoutCount = layout_count;
pPipelineLayoutCreateInfo.pSetLayouts = layouts;
VkPipelineLayout pipeline_layout;
if(vkCreatePipelineLayout(dev->GetDevice(), &pPipelineLayoutCreateInfo, nullptr, &pipeline_layout)==VK_SUCCESS)
{
return(new Material(dev,shader_maps,vertex_sm,shader_stage_list,dsl_creater,dsl,pipeline_layout,vab));
}
return(new Material(dev,shader_maps,vertex_sm,shader_stage_list,dsl_creater,dsl,vab));
}
return(nullptr);
}
Material::Material(Device *dev,ShaderModuleMap *smm,VertexShaderModule *vsm,List<VkPipelineShaderStageCreateInfo> *psci_list,DescriptorSetLayoutCreater *dslc,DescriptorSetLayout *dsl,VkPipelineLayout pl,VertexAttributeBinding *v)
Material::Material(Device *dev,ShaderModuleMap *smm,VertexShaderModule *vsm,List<VkPipelineShaderStageCreateInfo> *psci_list,DescriptorSetLayoutCreater *dslc,DescriptorSetLayout *dsl,VertexAttributeBinding *v)
{
device=*dev;
shader_maps=smm;
@ -75,17 +59,13 @@ Material::Material(Device *dev,ShaderModuleMap *smm,VertexShaderModule *vsm,List
shader_stage_list=psci_list;
dsl_creater=dslc;
desc_set_layout=dsl;
pipeline_layout=pl;
vab=v;
}
Material::~Material()
{
delete vab;
if(pipeline_layout)
vkDestroyPipelineLayout(device,pipeline_layout,nullptr);
delete desc_set_layout;
delete dsl_creater;
@ -132,6 +112,11 @@ const int Material::GetVBOBinding(const UTF8String &name)const
return vertex_sm->GetBinding(name);
}
const VkPipelineLayout Material::GetPipelineLayout()const
{
return desc_set_layout->GetPipelineLayout();
}
const uint32_t Material::GetDescriptorSetCount()const
{
return desc_set_layout->GetCount();