Совместимость компоновки трубопровода вулкан - PullRequest
0 голосов
/ 24 октября 2019

Два макета конвейера определены как «совместимые для констант 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, но этот набор не привязан.

Почему возникает ошибка? Где я ошибся?

...