-
Notifications
You must be signed in to change notification settings - Fork 59
Closed
Labels
Description
Example:
auto dsgInfos = std::vector<std::unique_ptr<Anvil::DescriptorSetInfo>>{};
auto descSetInfo = Anvil::DescriptorSetInfo::create();
const auto numBindings = 5u;
for(auto i=0u;i<numBindings;++i)
{
descSetInfo->add_binding(
i, /* binding */
static_cast<VkDescriptorType>(vk::DescriptorType::eCombinedImageSampler),
1u, /* n_elements */
static_cast<VkShaderStageFlags>(vk::ShaderStageFlagBits::eFragment)
);
}
dsgInfos.push_back(std::move(descSetInfo));
auto dsg = Anvil::DescriptorSetGroup::create(dev,dsgInfos,false);
auto ds = dsg->get_descriptor_set(0u);
for(auto i=0u;i<5u;++i)
{
ds->set_binding_item(i,Anvil::DescriptorSet::CombinedImageSamplerBindingElement{
static_cast<VkImageLayout>(vk::ImageLayout::eShaderReadOnlyOptimal),
imgView,sampler
});
}
drawCmd->record_bind_descriptor_sets(
static_cast<VkPipelineBindPoint>(vk::PipelineBindPoint::eGraphics),
GetPipelineLayout(),
0u, /* first set */
1u, /* set count */
&ds,
0u, /* dynamic offset count */
nullptr
);
The code above works fine, both baking and binding run without issues.
However, if you change the second loop so it only binds 4 elements (i.e. one of the bindings is NULL):
for(auto i=0u;i<4u;++i)
{
ds->set_binding_item(i,Anvil::DescriptorSet::CombinedImageSamplerBindingElement{
static_cast<VkImageLayout>(vk::ImageLayout::eShaderReadOnlyOptimal),
imgView,sampler
});
}
then you get an exception during the baking process when trying to bind the descriptor set. The exception is caused in src/wrappers/descriptor_set.cpp (Anvil::DescriptorSet::bake()), in the vkUpdateDescriptorSets-call of this code block:
/* Issue the Vulkan call */
if (m_cached_ds_write_items_vk.size() > 0)
{
std::shared_ptr<Anvil::BaseDevice> device_locked_ptr(m_device_ptr);
lock();
{
vkUpdateDescriptorSets(device_locked_ptr->get_device_vk(),
static_cast<uint32_t>(m_cached_ds_write_items_vk.size() ),
&m_cached_ds_write_items_vk[0],
0, /* copyCount */
nullptr); /* pDescriptorCopies */
}
unlock();
}
I'm not actually sure if it is valid to have NULL bindings in a descriptor set when binding it, but I can't find anything in the vulkan specification that says otherwise.
Reactions are currently unavailable