ULRE/src/RenderDevice/VKDescriptorSets.cpp

119 lines
3.5 KiB
C++
Raw Normal View History

#include<hgl/graph/VKDescriptorSets.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKBuffer.h>
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/VKSampler.h>
VK_NAMESPACE_BEGIN
2020-10-29 16:50:19 +08:00
namespace
{
struct WriteDescriptorSet:public vkstruct<VkWriteDescriptorSet,VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET>
{
public:
WriteDescriptorSet(VkDescriptorSet desc_set,const uint32_t binding,const VkDescriptorType desc_type)
{
dstSet = desc_set;
dstBinding = binding;
dstArrayElement = 0;
descriptorCount = 1;
descriptorType = desc_type;
}
WriteDescriptorSet(VkDescriptorSet desc_set,const uint32_t binding,const VkDescriptorBufferInfo *buf_info,const VkDescriptorType desc_type=VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER):WriteDescriptorSet(desc_set,binding,desc_type)
{
pImageInfo = nullptr;
pBufferInfo = buf_info;
pTexelBufferView = nullptr;
}
WriteDescriptorSet(VkDescriptorSet desc_set,const uint32_t binding,const VkDescriptorImageInfo *img_info):WriteDescriptorSet(desc_set,binding,VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
{
pImageInfo = img_info;
pBufferInfo = nullptr;
pTexelBufferView= nullptr;
}
};//struct WriteDescriptorSet
2020-10-29 21:19:50 +08:00
struct DescriptorBufferInfo:public VkDescriptorBufferInfo
{
public:
DescriptorBufferInfo(const GPUBuffer *buf,const VkDeviceSize off,const VkDeviceSize rng)
{
buffer=buf->GetBuffer();
offset=off;
range=rng;
}
};//struct DescriptorBufferInfo:public VkDescriptorBufferInfo
struct DescriptorImageInfo:public VkDescriptorImageInfo
{
public:
DescriptorImageInfo(Texture *tex,Sampler *sam)
{
sampler=*sam;
imageView=tex->GetVulkanImageView();
imageLayout=VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
}
};//struct DescriptorImageInfo:public VkDescriptorImageInfo
2020-10-29 16:50:19 +08:00
}//namespace
void DescriptorSets::Clear()
{
2020-10-29 16:50:19 +08:00
buffer_list.ClearData();
image_list.ClearData();
2020-09-07 20:07:08 +08:00
wds_list.ClearData();
}
2020-10-21 12:09:15 +08:00
bool DescriptorSets::BindUBO(const int binding,const GPUBuffer *buf)
{
2019-08-01 15:37:03 +08:00
if(binding<0||!buf)
return(false);
2020-10-29 21:19:50 +08:00
wds_list.Add(WriteDescriptorSet(desc_set,binding,buf->GetBufferInfo()));
2020-10-29 16:50:19 +08:00
return(true);
}
bool DescriptorSets::BindUBO(const int binding,const GPUBuffer *buf,const VkDeviceSize offset,const VkDeviceSize range)
{
if(binding<0||!buf)
return(false);
2020-10-29 21:19:50 +08:00
DescriptorBufferInfo *buf_info=new DescriptorBufferInfo(buf,offset,range);
2020-10-29 16:50:19 +08:00
buffer_list.Add(buf_info);
2020-10-29 21:19:50 +08:00
wds_list.Add(WriteDescriptorSet(desc_set,binding,buf_info));
return(true);
}
2020-10-21 12:09:15 +08:00
bool DescriptorSets::BindUBODynamic(const int binding,const GPUBuffer *buf)
{
2019-08-01 15:37:03 +08:00
if(binding<0||!buf)
return(false);
2020-09-27 20:58:25 +08:00
2020-10-29 21:19:50 +08:00
wds_list.Add(WriteDescriptorSet(desc_set,binding,buf->GetBufferInfo(),VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC));
return(true);
}
2019-08-01 15:37:03 +08:00
bool DescriptorSets::BindSampler(const int binding,Texture *tex,Sampler *sampler)
{
2019-08-01 15:37:03 +08:00
if(binding<0||!tex||!sampler)
return(false);
2020-10-29 21:19:50 +08:00
DescriptorImageInfo *image_info=new DescriptorImageInfo(tex,sampler);
2020-10-29 16:50:19 +08:00
image_list.Add(image_info);
2020-10-29 21:19:50 +08:00
wds_list.Add(WriteDescriptorSet(desc_set,binding,image_info));
return(true);
}
void DescriptorSets::Update()
{
vkUpdateDescriptorSets(device,wds_list.GetCount(),wds_list.GetData(),0,nullptr);
}
VK_NAMESPACE_END