Skip to content
Snippets Groups Projects

Resolve "Descriptor in multiple shader stages"

Merged Ghost User requested to merge 76-descriptor-in-multiple-shader-stages into develop
+ 19
7
@@ -138,12 +138,6 @@ namespace vkcv {
m_VertexAttachments.emplace_back(attachment_loc, attachment_name, attachment_format);
}
}
ShaderStages stages;
stages |= ShaderStage::VERTEX;
stages |= ShaderStage::FRAGMENT;
vk::ShaderStageFlags flags = vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment;
//reflect descriptor sets (uniform buffer, storage buffer, sampler, sampled image, storage image)
std::vector<std::pair<uint32_t, DescriptorBinding>> bindings;
@@ -201,7 +195,25 @@ namespace vkcv {
if (maxSetID != -1) {
if((int32_t)m_DescriptorSets.size() <= maxSetID) m_DescriptorSets.resize(maxSetID + 1);
for (const auto &binding : bindings) {
m_DescriptorSets[binding.first].push_back(binding.second);
//checking if descriptor has already been reflected in another shader stage
bool bindingFound = false;
uint32_t pos = 0;
for (const auto& descriptor : m_DescriptorSets[binding.first]) {
if (binding.second.bindingID == descriptor.bindingID) {
if (binding.second.descriptorType == descriptor.descriptorType && binding.second.descriptorCount == descriptor.descriptorCount) {
//updating descriptor binding with another shader stage
ShaderStages updatedShaders = descriptor.shaderStages | shaderStage;
DescriptorBinding newBinding = DescriptorBinding(binding.second.bindingID, binding.second.descriptorType, binding.second.descriptorCount, updatedShaders);
m_DescriptorSets[binding.first][pos] = newBinding;
bindingFound = true;
break;
}
else vkcv_log(LogLevel::ERROR, "Included shaders contain resources with same identifier but different type or count");
}
pos++;
}
//append new descriptor if it has not been reflected yet
if(!bindingFound) m_DescriptorSets[binding.first].push_back(binding.second);
}
}
Loading