ULRE/src/RenderDevice/VKDescriptorSetLayoutCreater.cpp

135 lines
3.9 KiB
C++
Raw Normal View History

#include"VKDescriptorSetLayoutCreater.h"
#include<hgl/graph/VKDescriptorSets.h>
#include<hgl/graph/VKDevice.h>
VK_NAMESPACE_BEGIN
DescriptorSetLayoutCreater *Device::CreateDescriptorSetLayoutCreater()
{
return(new DescriptorSetLayoutCreater(attr->device,attr->desc_pool));
}
DescriptorSetLayoutCreater::~DescriptorSetLayoutCreater()
{
if(pipeline_layout)
vkDestroyPipelineLayout(device,pipeline_layout,nullptr);
if(dsl)
vkDestroyDescriptorSetLayout(device,dsl,nullptr);
}
void DescriptorSetLayoutCreater::Bind(const uint32_t binding,VkDescriptorType desc_type,VkShaderStageFlagBits stageFlags)
{
if(index_by_binding.KeyExist(binding))
{
//重复的绑定点有可能存在的比如WorldMatrix在vs/fs中同时存在
return;
}
2019-07-01 19:25:07 +08:00
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 uint32_t *binding,const uint32_t count,VkDescriptorType desc_type,VkShaderStageFlagBits stageFlags)
{
if(!binding||count<=0)return;
const uint old_count=layout_binding_list.GetCount();
layout_binding_list.PreMalloc(old_count+count);
VkDescriptorSetLayoutBinding *p=layout_binding_list.GetData()+old_count;
uint fin_count=0;
for(uint i=old_count;i<old_count+count;i++)
{
if(!index_by_binding.KeyExist(*binding))
{
p->binding = *binding;
p->descriptorType = desc_type;
p->descriptorCount = 1;
p->stageFlags = stageFlags;
p->pImmutableSamplers = nullptr;
index_by_binding.Add(*binding,i);
++p;
++fin_count;
}
++binding;
}
layout_binding_list.SetCount(old_count+fin_count);
}
bool DescriptorSetLayoutCreater::CreatePipelineLayout()
{
const int count=layout_binding_list.GetCount();
if(count<=0)
return(false);
2020-09-27 20:58:25 +08:00
DescriptorSetLayoutCreateInfo descriptor_layout;
2019-07-01 19:25:07 +08:00
descriptor_layout.bindingCount = count;
descriptor_layout.pBindings = layout_binding_list.GetData();
if(dsl)
vkDestroyDescriptorSetLayout(device,dsl,nullptr);
if(vkCreateDescriptorSetLayout(device,&descriptor_layout,nullptr,&dsl)!=VK_SUCCESS)
return(false);
2020-06-09 19:40:08 +08:00
VkPushConstantRange push_constant_range;
2020-06-09 19:40:08 +08:00
push_constant_range.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
push_constant_range.size = MAX_PUSH_CONSTANT_BYTES;
push_constant_range.offset = 0;
2020-09-27 20:58:25 +08:00
PipelineLayoutCreateInfo pPipelineLayoutCreateInfo;
2019-07-01 19:25:07 +08:00
pPipelineLayoutCreateInfo.setLayoutCount = 1;
pPipelineLayoutCreateInfo.pSetLayouts = &dsl;
pPipelineLayoutCreateInfo.pushConstantRangeCount = 1;
2020-06-09 19:40:08 +08:00
pPipelineLayoutCreateInfo.pPushConstantRanges = &push_constant_range;
if(vkCreatePipelineLayout(device,&pPipelineLayoutCreateInfo,nullptr,&pipeline_layout)!=VK_SUCCESS)
return(false);
return(true);
}
DescriptorSets *DescriptorSetLayoutCreater::Create()
{
if(!pipeline_layout||!dsl)
return(nullptr);
const int count=layout_binding_list.GetCount();
if(count<=0)
return(nullptr);
2020-09-27 20:58:25 +08:00
DescriptorSetAllocateInfo alloc_info;
alloc_info.descriptorPool = pool;
2019-07-01 19:25:07 +08:00
alloc_info.descriptorSetCount = 1;
alloc_info.pSetLayouts = &dsl;
VkDescriptorSet desc_set;
if(vkAllocateDescriptorSets(device,&alloc_info,&desc_set)!=VK_SUCCESS)
return(nullptr);
return(new DescriptorSets(device,count,pipeline_layout,desc_set,&index_by_binding));
}
VK_NAMESPACE_END