diff --git a/CMSceneGraph b/CMSceneGraph index c4642ea8..ad2504b4 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit c4642ea87cb4abf4b68e94a63d868bdd66666dbe +Subproject commit ad2504b4bd5390b887ef9abfc395552493cd5d0c diff --git a/inc/hgl/graph/VKBuffer.h b/inc/hgl/graph/VKBuffer.h index f886fbd9..33e0b81f 100644 --- a/inc/hgl/graph/VKBuffer.h +++ b/inc/hgl/graph/VKBuffer.h @@ -34,8 +34,8 @@ public: virtual ~GPUBuffer(); - VkBuffer GetBuffer (){return buf.buffer;} - GPUMemory * GetMemory (){return buf.memory;} + VkBuffer GetBuffer ()const{return buf.buffer;} + GPUMemory * GetMemory ()const{return buf.memory;} const VkDescriptorBufferInfo * GetBufferInfo()const{return &buf.info;} void * Map () {return buf.memory->Map();} diff --git a/inc/hgl/graph/VKDescriptorSets.h b/inc/hgl/graph/VKDescriptorSets.h index 363370a9..2be1d9fb 100644 --- a/inc/hgl/graph/VKDescriptorSets.h +++ b/inc/hgl/graph/VKDescriptorSets.h @@ -15,7 +15,8 @@ class DescriptorSets VkPipelineLayout pipeline_layout; - ObjectList desc_image_info; + ObjectList buffer_list; + ObjectList image_list; List wds_list; private: @@ -40,6 +41,7 @@ public: void Clear(); bool BindUBO(const int binding,const GPUBuffer *); + bool BindUBO(const int binding,const GPUBuffer *,const VkDeviceSize offset,const VkDeviceSize range); bool BindUBODynamic(const int binding,const GPUBuffer *); bool BindSampler(const int binding,Texture *,Sampler *); void Update(); diff --git a/src/RenderDevice/VKDescriptorSets.cpp b/src/RenderDevice/VKDescriptorSets.cpp index 642c35f0..0e04fd8f 100644 --- a/src/RenderDevice/VKDescriptorSets.cpp +++ b/src/RenderDevice/VKDescriptorSets.cpp @@ -5,10 +5,42 @@ #include VK_NAMESPACE_BEGIN +namespace +{ + struct WriteDescriptorSet:public vkstruct + { + 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 +}//namespace + void DescriptorSets::Clear() { + buffer_list.ClearData(); + image_list.ClearData(); wds_list.ClearData(); - desc_image_info.ClearData(); } bool DescriptorSets::BindUBO(const int binding,const GPUBuffer *buf) @@ -16,16 +48,26 @@ bool DescriptorSets::BindUBO(const int binding,const GPUBuffer *buf) if(binding<0||!buf) return(false); - WriteDescriptorSet wds; + WriteDescriptorSet wds(desc_set,binding,buf->GetBufferInfo()); - wds.dstSet = desc_set; - wds.dstBinding = binding; - wds.dstArrayElement = 0; - wds.descriptorCount = 1; - wds.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - wds.pImageInfo = nullptr; - wds.pBufferInfo = buf->GetBufferInfo(); - wds.pTexelBufferView = nullptr; + wds_list.Add(wds); + return(true); +} + +bool DescriptorSets::BindUBO(const int binding,const GPUBuffer *buf,const VkDeviceSize offset,const VkDeviceSize range) +{ + if(binding<0||!buf) + return(false); + + VkDescriptorBufferInfo *buf_info=new VkDescriptorBufferInfo; + + buf_info->buffer=buf->GetBuffer(); + buf_info->offset=offset; + buf_info->range=range; + + buffer_list.Add(buf_info); + + WriteDescriptorSet wds(desc_set,binding,buf_info); wds_list.Add(wds); return(true); @@ -36,16 +78,7 @@ bool DescriptorSets::BindUBODynamic(const int binding,const GPUBuffer *buf) if(binding<0||!buf) return(false); - WriteDescriptorSet wds; - - wds.dstSet = desc_set; - wds.dstBinding = binding; - wds.dstArrayElement = 0; - wds.descriptorCount = 1; - wds.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; - wds.pImageInfo = nullptr; - wds.pBufferInfo = buf->GetBufferInfo(); - wds.pTexelBufferView = nullptr; + WriteDescriptorSet wds(desc_set,binding,buf->GetBufferInfo(),VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC); wds_list.Add(wds); return(true); @@ -57,23 +90,15 @@ bool DescriptorSets::BindSampler(const int binding,Texture *tex,Sampler *sampler return(false); VkDescriptorImageInfo *image_info=new VkDescriptorImageInfo; + image_info->imageView =tex->GetVulkanImageView(); - //image_info->imageLayout =tex->GetImageLayout(); +// image_info.imageLayout =tex->GetImageLayout(); image_info->imageLayout =VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; image_info->sampler =*sampler; - desc_image_info.Add(image_info); - - WriteDescriptorSet wds; + image_list.Add(image_info); - wds.dstSet = desc_set; - wds.dstBinding = binding; - wds.dstArrayElement = 0; - wds.descriptorCount = 1; - wds.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - wds.pImageInfo = image_info; - wds.pBufferInfo = nullptr; - wds.pTexelBufferView = nullptr; + WriteDescriptorSet wds(desc_set,binding,image_info); wds_list.Add(wds); return(true);