diff --git a/inc/hgl/graph/vulkan/VKDescriptorSets.h b/inc/hgl/graph/vulkan/VKDescriptorSets.h index 6a7fa4ad..67e70111 100644 --- a/inc/hgl/graph/vulkan/VKDescriptorSets.h +++ b/inc/hgl/graph/vulkan/VKDescriptorSets.h @@ -14,17 +14,20 @@ class DescriptorSetLayout VkDescriptorSet *desc_set_list; Map index_by_binding; + VkPipelineLayout pipeline_layout; + private: friend class DescriptorSetLayoutCreater; - DescriptorSetLayout(Device *dev,const int c,VkDescriptorSetLayout *dsl_list,VkDescriptorSet *desc_set,Map &bi) + DescriptorSetLayout(Device *dev,const int c,VkDescriptorSetLayout *dsl_list,VkPipelineLayout pl,VkDescriptorSet *desc_set,Map &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 /** diff --git a/inc/hgl/graph/vulkan/VKMaterial.h b/inc/hgl/graph/vulkan/VKMaterial.h index 96716b0a..7456befc 100644 --- a/inc/hgl/graph/vulkan/VKMaterial.h +++ b/inc/hgl/graph/vulkan/VKMaterial.h @@ -29,21 +29,20 @@ class Material List *shader_stage_list; DescriptorSetLayoutCreater *dsl_creater; DescriptorSetLayout *desc_set_layout; - VkPipelineLayout pipeline_layout; VertexAttributeBinding *vab; public: - Material(Device *dev,ShaderModuleMap *smm,VertexShaderModule *vsm,List *,DescriptorSetLayoutCreater *dslc,DescriptorSetLayout *dsl,VkPipelineLayout pl,VertexAttributeBinding *v); + Material(Device *dev,ShaderModuleMap *smm,VertexShaderModule *vsm,List *,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; diff --git a/src/RenderDevice/Vulkan/VKDescriptorSets.cpp b/src/RenderDevice/Vulkan/VKDescriptorSets.cpp index 78b3d71e..439f0c40 100644 --- a/src/RenderDevice/Vulkan/VKDescriptorSets.cpp +++ b/src/RenderDevice/Vulkan/VKDescriptorSets.cpp @@ -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 diff --git a/src/RenderDevice/Vulkan/VKMaterial.cpp b/src/RenderDevice/Vulkan/VKMaterial.cpp index a82b8cbf..3b7b818f 100644 --- a/src/RenderDevice/Vulkan/VKMaterial.cpp +++ b/src/RenderDevice/Vulkan/VKMaterial.cpp @@ -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 *psci_list,DescriptorSetLayoutCreater *dslc,DescriptorSetLayout *dsl,VkPipelineLayout pl,VertexAttributeBinding *v) +Material::Material(Device *dev,ShaderModuleMap *smm,VertexShaderModule *vsm,List *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();