繁体   English   中英

Vulkan-hpp:无法毫无例外地分配命令缓冲区

[英]Vulkan-hpp: cant allocate command buffers with no exceptions

首先,我用独特的句柄在 vulkan-hpp 中重写了 Vulkan 教程三角形。 关闭程序时,我得到以下断言: Assertion: m_dispatch && m_owner查看代码,我发现启用VULKAN_HPP_NO_EXCEPTIONS可以解决此问题,但现在我收到此错误:

vk::UniqueHandle<vk::CommandBuffer,vk::DispatchLoaderStatic> &vk::UniqueHandle<vk::CommandBuffer,vk::DispatchLoaderStatic>::operator =(const vk::UniqueHandle<vk::CommandBuffer,vk::DispatchLoaderStatic > &)': 试图引用已删除的 function

这是我的代码:

std::tie(res, commandBuffers) = device->allocateCommandBuffersUnique(allocInfo);

正确的使用方法是什么?

device->allocateCommandBuffersUnique();

这似乎对我有用:

#include <iostream>
#include <utility>
#include <vulkan/vulkan.hpp>

int main() try{
    const auto instance = vk::createInstanceUnique( {} );
    const auto physical_devices = instance->enumeratePhysicalDevices();

    const uint32_t q_family = 0;
    const uint32_t q_count = 1;
    const float q_prio[] = {1.0f};
    const vk::DeviceQueueCreateInfo queue_info( vk::DeviceQueueCreateFlags(), q_family, q_count, q_prio );
    const vk::DeviceCreateInfo device_info( vk::DeviceCreateFlags(), 1, &queue_info );
    const auto device = physical_devices[0].createDeviceUnique( device_info );

    const vk::CommandPoolCreateInfo cmd_pool_info( vk::CommandPoolCreateFlags(), q_family );
    const auto command_pool = device->createCommandPoolUnique( cmd_pool_info );

    const vk::CommandBufferAllocateInfo alloc_info( command_pool.get(), vk::CommandBufferLevel::ePrimary, 1 );
    const auto cmd_buffers = device->allocateCommandBuffersUnique( alloc_info );
}
catch ( ... ){
    std::cout << "error\n";
}

VULKAN_HPP_NO_EXCEPTIONS环境中,结果只是valueresultstruct 所以:

    const vk::CommandBufferAllocateInfo alloc_info( command_pool.value.get(), vk::CommandBufferLevel::ePrimary, 1 );
    const auto cmd_buffers = device.value->allocateCommandBuffersUnique( alloc_info );
    if( cmd_buffers.result != vk::Result::eSuccess ) panic();

如果你想使用std::tie ,通常这应该工作:

vk::Result res;
vk::UniqueInstance instance;
std::tie(res, instance) = vk::createInstanceUnique( {} ).asTuple();

但是对于allocateCommandBuffersUnique (可能还有所有std::vector类型)似乎存在一些问题。 我已经在Vulkan-Hpp回购中报告了它。

虽然如果您可以访问 C++17,那么结构化绑定似乎可以工作:

    const vk::CommandBufferAllocateInfo alloc_info( command_pool.value.get(), vk::CommandBufferLevel::ePrimary, 1 );
    auto [res, cmd_buffers] = device.value->allocateCommandBuffersUnique( alloc_info );
    if( res != vk::Result::eSuccess ) panic();

Vulkan-Hpp 最近有一些风格变化 他们现在建议改用vulkan_raii.hpp ,尽管它还没有冒泡到 Vulkan SDK。 要使用Create*Unique获取官方示例,您必须将 go 转换为旧版本的 repo

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM