You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询指定VkInstance创建时启用的实例扩展?

获取已创建VkInstance的启用实例扩展列表

Vulkan没有直接提供API查询已创建实例启用的扩展列表,但可以通过以下间接方法实现:

  1. 枚举系统可用实例扩展
    调用vkEnumerateInstanceExtensionProperties并传入NULL作为实例参数,先获取扩展总数,再获取所有扩展的详细信息:

    uint32_t extensionCount = 0;
    vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, NULL);
    std::vector<VkExtensionProperties> availableExtensions(extensionCount);
    vkEnumerateInstanceExtensionProperties(NULL, &extensionCount, availableExtensions.data());
    
  2. 验证扩展是否在目标实例中启用
    遍历每个可用扩展,通过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);
            }
        }
    }
    
  3. 特殊情况处理
    极少部分实例扩展仅添加枚举值或创建参数,未定义新函数。这类扩展无法通过函数指针检测,需结合其具体特性(如是否能使用扩展对应的创建参数)间接判断,但此类场景非常罕见。

内容的提问来源于stack exchange,提问作者JesseTG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:20:42