Два макета конвейера определены как «совместимые для констант push», если они были созданы с одинаковыми диапазонами констант push. Два конвейерных макета определены как «совместимые для набора N», если они были созданы с одинаково определенными макетами наборов дескрипторов для наборов от нуля до N, и если они были созданы с одинаковыми диапазонами push-констант.
vkCmdBindDescriptorSets заставляет наборы, пронумерованные [firstSet .. firstSet + descriptorSetCount-1], использовать привязки, хранящиеся в pDescriptorSets [0..descriptorSetCount-1], для последующих команд рендеринга (вычислений или графики в соответствии с pipeBindPoint). Любые привязки, которые были ранее применены через эти наборы, больше не действительны.
предположим, что существует две схемы конвейера, первая схема конвейера содержит один набор # 0, вторая схема конвейера содержит два набора # 0 # 1。Первый набор 0 и второй набор 0 являются идентичными макетами набора дескрипторов. Кроме того, они имеют одинаковые диапазоны push-констант, поэтому, как указано выше, оба макета конвейера # 0 совместимы?
// create set 0
...
VkDescriptorSetLayout setLayout0;
...
vkCreateDescriptorSetLayout(logicalDevice,
&layoutInfo,
nullptr,
&setLayout0);
...
VkDescriptorSet set0;
VkDescriptorSetAllocateInfo allocInfo0 = {};
allocInfo0.descriptorSetCount = 1;
allocInfo0.pSetLayouts = &setLayout0;
...
vkAllocateDescriptorSets(logicalDevice,
&allocInfo0,
&set0);
...
// create first pipeline layout
VkPipelineLayoutCreateInfo firstPipelineLayoutInfo = {};
firstPipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
firstPipelineLayoutInfo.setLayoutCount = 1;
firstPipelineLayoutInfo.pSetLayouts = &setLayout0; // <--- use set0
VkPipelineLayout firstPiplineLayout;
vkCreatePipelineLayout(logicalDevice,
&firstPipelineLayoutInfo,
nullptr,
&firstPiplineLayout);
// create set 1
...
VkDescriptorSetLayout setLayout1;
...
vkCreateDescriptorSetLayout(logicalDevice,
&layoutInfo,
nullptr,
&setLayout1);
...
VkDescriptorSet set1;
VkDescriptorSetAllocateInfo allocInfo1 = {};
allocInfo1.descriptorSetCount = 1;
allocInfo1.pSetLayouts = &setLayout1;
...
vkAllocateDescriptorSets(logicalDevice,
&allocInfo1,
&set1);
...
// create second pipeline layout
array<VkDescriptorSetLayout, 2> setLayout0And1 = {setLayout0, setLayout1} // <---use set0 set1
VkPipelineLayoutCreateInfo secondPipelineLayoutInfo = {};
secondPipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
secondPipelineLayoutInfo.setLayoutCount = 2;
secondPipelineLayoutInfo.pSetLayouts = &setLayout0And1;
VkPipelineLayout secondPiplineLayout;
vkCreatePipelineLayout(logicDevice,
&secondPipelineLayoutInfo,
nullptr,
&secondPiplineLayout);
// create pipeline
VkGraphicsPipelineCreateInfo pipelineInfo = {};
...
pipelineInfo.layout = secondPiplineLayout;
VkPipeline pipeline;
vkCreateGraphicsPipelines(logicDevice,
VK_NULL_HANDLE,
1,
&pipelineInfo,
nullptr,
&pipeline);
После этого вызовите vkCmdBindDescriptorSets дляпривязка при рисовании.
...
vkCmdBindDescriptorSets(commandBuffer,
VK_PIPELINE_BIND_POINT_GRAPHICS,
firstPiplineLayout,
0,
1,
&set0,
0,
nullptr);
// When call vkCmdBindDescriptorSets with first set > 0 then the bound descriptor sets index [0 ... firstSet-1] will remain the same.
vkCmdBindDescriptorSets(commandBuffer,
VK_PIPELINE_BIND_POINT_GRAPHICS,
secondPiplineLayout,
1,
1,
&set1,
0,
nullptr);
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
...
vkCmdDrawIndexed(commandBuffer,
indicesCount,
1, 0, 0, 0);
...
После этого слоя проверки: VkPipeline 0x42 использует набор # 0, но этот набор не привязан.
Почему возникает ошибка? Где я ошибся?