Вы не включили источник или подпись функции CreateCommandBuffers
, которую вы вызываете из CreateCommandBuffersUnique
. Однако предположим, что он возвращает тип std::vector<vk::CommandBuffer>
Похоже, что вы затем зацикливаетесь на них и оборачиваете их вручную в vk::UniqueCommandBuffer
экземплярах. Тем не менее, вы передаете cb (здесь предполагается, что это vk::CommandBuffer
и vk::Device
конструктору UniqueCommandBuffer
u_command_buffers.push_back(vk::UniqueCommandBuffer(cb, device));
На самом деле я не совсем понимаю, как это компилируется, если только vk::Device
не имеет operator ()()
. В любом случае, второй параметр vk::UniqueCommandBuffer
должен быть объектом удаления.
Таким образом, получается, что все типы UniqueXXX
являются производными от UniqueHandle<>
, который, в свою очередь, происходит от UniqueHandleTraits<...>
, который является специализированным для каждого типа, чтобы придать ему тип deleter
по умолчанию. Большинство UniqueHandleTraits<...>
специализаций используют шаблон ObjectDestroy<...>
, потому что большинству объектов нужно только создать Device
, чтобы уничтожить их. Однако специализации UniqueHandleTraits<CommandBuffer>
и UniqueHandleTraits<DescriptorSet>
используют PoolFree<...>
для своих удалителей.
Следовательно, ваше использование
vk::UniqueCommandBuffer(cb, device));
неявно превращается в
vk::UniqueCommandBuffer(cb,
vk::PoolFree<Device, CommandPool,Dispatch> { device, {}, {} }
)
То, что {}
после device
- это место, где должен быть указан пул.
См. Соответствующий код от vk::Device::allocateCommandBuffersUnique
PoolFree<Device,CommandPool,Dispatch> deleter( *this, allocateInfo.commandPool, d );
for ( size_t i=0 ; i<allocateInfo.commandBufferCount ; i++ )
{
commandBuffers.push_back( UniqueCommandBuffer( buffer[i], deleter ) );
}
Чтобы исправить ваш код, вам нужно либо использовать vk::Device::allocateCommandBuffersUnique
, либо повторить его поведение, в частности, создайте delete object или lambda и передайте его в качестве второго параметра в UniqueCommandBuffer
ctor.
Судя по моему исследованию UniqueHandleTraits
, похоже, что вы сможете исправить свой код, просто изменив эту строку:
u_framebuffers.push_back(vk::UniqueFramebuffer(fb, device));
до
u_framebuffers.push_back(vk::UniqueFramebuffer(fb, { device, command_pool }));