繁体   English   中英

vulkan.hpp扩展的唯一句柄

[英]vulkan.hpp unique handles for extensions

我正在尝试为vk::DebugUtilsMessengerEXT对象创建唯一的句柄。

为此,我已将VkCreateDebugUtilsMessenger()加载到函数指针中,然后调用它以创建纯C结构,然后通过以下方法将其转换为唯一的vulkan.hpp对象。

vk::UniqueDebugUtilsMessengerEXT(messenger, instance);

这是问题的开始。 这种对象隐式调用析构函数,也就是说,当变量离开作用域时,它将尝试调用vkDestroyDebugUtilsMessengerEXT 但是,不能将此函数加载到具有相同名称的指针中。

即定义一个函数指针为vkDestroyDebugUtilsMessengerEXT

然后将其设置为

vkDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT) instance.getProcAddr(
        "vkDestroyDebugUtilsMessengerEXT");

重新定义符号时将导致编译错误。

error: ‘void (* vkDestroyDebugUtilsMessengerEXT)(VkInstance, VkDebugUtilsMessengerEXT, VkAllocationCallbacks)’ redeclared as different kind of symbol

但是,未定义它会导致链接器错误,因为链接器找不到链接的符号以破坏唯一句柄。

/usr/bin/ld: obj/Debug/main.o: in function `vk::DispatchLoaderStatic::vkDestroyDebugUtilsMessengerEXT(VkInstance_T*, VkDebugUtilsMessengerEXT_T*, VkAllocationCallbacks const*) const':
/home/kronos/Desktop/Vulkan/Generated/../libraries/vulkansdk-linux/1.1.97.0/x86_64/include/vulkan/vulkan.hpp:1770: undefined reference to `vkDestroyDebugUtilsMessengerEXT'

我该如何解决? 如何公开该符号以进行编译?

除了向上的答案,最好像下面的代码:

using unique_debug_utils_messenger_ext = UniqueHandle<DebugUtilsMessengerEXT, DispatchLoaderDynamic>;
...
UniqueInstance instance_{nullptr};
UniqueDevice device_;
unique_debug_utils_messenger_ext debug_messenger_;
DebugUtilsMessengerCreateInfoEXT debug_messenger_create_info;
DispatchLoaderDynamic dispatch_loader_dynamic_;
...
dispatch_loader_dynamic_ = {*instance_, *device_};
debug_messenger_ = instance_->createDebugUtilsMessengerEXTUnique(
            debug_messenger_create_info,
            nullptr,
            dispatch_loader_dynamic_);

该代码使您仍然可以使用智能指针功能。 vulkan.hpp中的DispatchLoaderDynamic实现中提供了更多详细信息。

我找到了解决方案。

定义与所请求函数同名的函数并在其中调用指针可以进行​​编译和链接。

在本质上:

void (*vkDestroyDebugUtilsMessenger)(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator);
void vkDestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator)
{
    vkDestroyDebugUtilsMessenger(instance, debugMessenger, pAllocator);
}

创建linikng和编译所需的符号,并:

vkDestroyDebugUtilsMessenger =
        (PFN_vkDestroyDebugUtilsMessengerEXT) vkGetInstanceProcAddr(
            instance, "vkDestroyDebugUtilsMessengerEXT");

将正确初始化指针。

暂无
暂无

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

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