在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_utils
由ash::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();
}
加载一个扩展将加载与该扩展相关联的所有函数。
您仍然需要提前枚举可用的扩展,因为加载不支持的扩展不会返回错误。相反,调用该扩展的任何函数都会在运行时导致死机。