微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Vulkan-hpp:不能毫无例外地分配命令缓冲区

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

vk::UniqueHandle<:commandbuffer> &vk::UniqueHandle<:commandbuffer>::operator =(const vk::UniqueHandle<:commandbuffer ::dispatchloaderstatic> &)': 试图引用已删除函数

这是我的代码

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 环境中,结果只是 structvalueresult。所以:

    const vk::CommandBufferAllocateInfo alloc_info( command_pool.value.get(),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 repo 上报告了它。

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

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

Vulkan-Hpp 最近有一些 style change。他们现在建议改用 vulkan_raii.hpp,尽管它还没有冒泡到 Vulkan SDK。要使用 Create*Unique 访问官方示例,您必须转到 older version of the repo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。