rust-ash(vulkan),如何加载指向扩展函数的指针



在C++中,加载扩展函数如下:

VkResult (*vkCreateDebugUtilsMessengerEXT_NE)(
VkInstance, const VkDebugUtilsMessengerCreateInfoEXT*,
const VkAllocationCallbacks*, VkDebugUtilsMessengerEXT*);
VkResult vkCreateDebugUtilsMessengerEXT(VkInstance instance,
const VkDebugUtilsMessengerCreateInfoEXT* info,
const VkAllocationCallbacks* callbacks, VkDebugUtilsMessengerEXT* messenger)
{
return vkCreateDebugUtilsMessengerEXT_NE(instance, info, callbacks, messenger);
}
void LoadeFunctions()
{
vkCreateDebugUtilsMessengerEXT_NE = (PFN_vkCreateDebugUtilsMessengerEXT) 
instance.getProcAddr(
"vkCreateDebugUtilsMessengerEXT");
Assert(vkCreateDebugUtilsMessengerEXT_NE,
"Failed to find extension function: vkCreateDebugUtilsMessengerEXT");
}

我想知道如何使用灰胶在防锈方面达到同样的效果。

ash支持的每个扩展都由ash::extensions模块中的一个结构提供。例如,VK_EXT_debug_utilsash::extensions::ext::DebugUtils提供。

use ash::{extensions::ext::DebugUtils, Entry, Instance};
unsafe {
let entry = ash::Entry::load().unwrap();
let instance = entry.create_instance(/* ... */).unwrap();
// Load `VK_EXT_debug_utils` extension.
let debug_utils = DebugUtils::new(&entry, &instance);
// Create a debug messenger.
let debug_messenger = debug_utils
.create_debug_utils_messenger(/* ... */)
.unwrap();
}

加载一个扩展将加载与该扩展相关联的所有函数。

您仍然需要提前枚举可用的扩展,因为加载不支持的扩展不会返回错误。相反,调用该扩展的任何函数都会在运行时导致死机。

最新更新