[英]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.