如何查询指定VkInstance创建时启用的实例扩展?
获取已创建VkInstance的启用实例扩展列表
Vulkan没有直接提供API查询已创建实例启用的扩展列表,但可以通过以下间接方法实现:
枚举系统可用实例扩展
调用vkEnumerateInstanceExtensionProperties并传入NULL作为实例参数,先获取扩展总数,再获取所有扩展的详细信息:uint32_t extensionCount = 0; vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL); std::vector<VkExtensionProperties> availableExtensions(extensionCount); vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, availableExtensions.data());验证扩展是否在目标实例中启用
遍历每个可用扩展,通过vkGetInstanceProcAddr尝试获取该扩展定义的任意函数指针。若返回非空指针,说明该扩展已在目标VkInstance中启用:std::vector<const char*> enabledExtensions; for (const auto& ext : availableExtensions) { const char* targetFunc = nullptr; // 根据扩展名称匹配对应的检测函数 if (strcmp(ext.extensionName, VK_KHR_SURFACE_EXTENSION_NAME) == 0) { targetFunc = "vkCreateSurfaceKHR"; } else if (strcmp(ext.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME) == 0) { targetFunc = "vkCreateDebugUtilsMessengerEXT"; } else if (strcmp(ext.extensionName, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) == 0) { targetFunc = "vkGetPhysicalDeviceProperties2KHR"; } // 可根据需要添加更多扩展的函数映射 if (targetFunc) { PFN_vkVoidFunction funcPtr = vkGetInstanceProcAddr(yourInstanceHandle, targetFunc); if (funcPtr != nullptr) { enabledExtensions.push_back(ext.extensionName); } } }特殊情况处理
极少部分实例扩展仅添加枚举值或创建参数,未定义新函数。这类扩展无法通过函数指针检测,需结合其具体特性(如是否能使用扩展对应的创建参数)间接判断,但此类场景非常罕见。
内容的提问来源于stack exchange,提问作者JesseTG
相关产品推荐
相关产品推荐

