Vulkan,你能直接公开扩展吗?
Vulkan, can you expose extensions directly?
获取 Vulkan 扩展中定义的函数的一种方法是使用:vkGetInstanceProcAddr
查询我们要查找的函数的字符串名称。如果一切顺利,我们将获得指向正确方法的函数指针。
我想知道是否可以 link 直接针对文件公开扩展名。
例如,启用此函数中注释掉的调用:
VkResult CreateDebugUtilsMessengerEXT(VkInstance instance,
const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkDebugUtilsMessengerEXT* pDebugMessenger)
{
auto func = (PFN_vkCreateDebugUtilsMessengerEXT) vkGetInstanceProcAddr(instance,
"vkCreateDebugUtilsMessengerEXT");
if (func != nullptr)
{
return func(instance, pCreateInfo, pAllocator, pDebugMessenger); //comment
//return vkCreateDebugUtilsMessengerEXT(instance, pCreateInfo, pAllocator, pDebugMessenger); //uncomment
}
else
{
return VK_ERROR_EXTENSION_NOT_PRESENT;
}
}
I want to know if it is possible to link against a file directly to expose the extension.
问题是您link针对的运行时库是平台 Vulkan 驱动程序。驱动程序可能不会实现扩展,因为它是可选的,因此尝试直接解析 link 只会导致您的应用程序无法启动,并且在没有扩展的平台上出现动态 linker 符号解析错误。
通常,您会在加载时将通过扩展加载机制加载的扩展缓存到本地函数指针中,并且该本地函数指针可以具有您想要的任何好听的名称。
获取 Vulkan 扩展中定义的函数的一种方法是使用:vkGetInstanceProcAddr
查询我们要查找的函数的字符串名称。如果一切顺利,我们将获得指向正确方法的函数指针。
我想知道是否可以 link 直接针对文件公开扩展名。
例如,启用此函数中注释掉的调用:
VkResult CreateDebugUtilsMessengerEXT(VkInstance instance,
const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkDebugUtilsMessengerEXT* pDebugMessenger)
{
auto func = (PFN_vkCreateDebugUtilsMessengerEXT) vkGetInstanceProcAddr(instance,
"vkCreateDebugUtilsMessengerEXT");
if (func != nullptr)
{
return func(instance, pCreateInfo, pAllocator, pDebugMessenger); //comment
//return vkCreateDebugUtilsMessengerEXT(instance, pCreateInfo, pAllocator, pDebugMessenger); //uncomment
}
else
{
return VK_ERROR_EXTENSION_NOT_PRESENT;
}
}
I want to know if it is possible to link against a file directly to expose the extension.
问题是您link针对的运行时库是平台 Vulkan 驱动程序。驱动程序可能不会实现扩展,因为它是可选的,因此尝试直接解析 link 只会导致您的应用程序无法启动,并且在没有扩展的平台上出现动态 linker 符号解析错误。
通常,您会在加载时将通过扩展加载机制加载的扩展缓存到本地函数指针中,并且该本地函数指针可以具有您想要的任何好听的名称。