你没有包括消息来源和签名
CreateCommandBuffers
从中进行内部调用的函数
CreateCommandBuffersUnique
. 但是,假设它返回
std::vector<vk::CommandBuffer>
vk::UniqueCommandBuffer
实例。但是,您正在通过cb(假设这里是一个
vk::CommandBuffer
和一个
vk::Device
到
UniqueCommandBuffer
此处为构造函数
u_command_buffers.push_back(vk::UniqueCommandBuffer(cb, device));
实际上我不清楚它是如何编译的,除非
有一个
operator ()()
. 不管怎样,第二个参数
唯一命令缓冲区
应该是deleter对象。
所以事实证明
UniqueXXX
UniqueHandle<>
,这反过来又源于
UniqueHandleTraits<...>
它专门用于每种类型,以便为其提供默认值
deleter
类型。大部分
唯一手柄<&燃气轮机;
专门化使用
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 ) );
}
要修复代码,您需要
或者复制它的行为,特别是创建一个
删除程序
对象或lambda,并将其作为第二个参数传递给
唯一命令缓冲区
克托。
根据我对
UniqueHandleTraits
,看起来您只需更改以下行就可以修复代码:
u_framebuffers.push_back(vk::UniqueFramebuffer(fb, device));
u_framebuffers.push_back(vk::UniqueFramebuffer(fb, { device, command_pool }));