【问题标题】:Validation error on device extension on M1 macM1 mac 上的设备扩展验证错误
【发布时间】:2022-06-20 05:46:36
【问题描述】:

因此,我尝试在具有 M1 处理器的 Mac 上遵循 Vulkan 教程,但在创建设备时遇到了问题。

所以按照the tutorial,我正在设置启用设备的扩展,如下所示:

const std::vector<const char*> deviceExtensions = {
    VK_KHR_SWAPCHAIN_EXTENSION_NAME,
};

VkDeviceCreateInfo createInfo = {};
createInfo.enabledExtensionCount = static_cast<uint32_t>(deviceExtensions.size());
createInfo.ppEnabledExtensionNames = deviceExtensions.data();

当我运行它时,我收到以下验证错误:

验证层:验证错误:[VUID-VkDeviceCreateInfo-pProperties-04451] 对象 0:句柄 = 0x11bd84d40,类型 = VK_OBJECT_TYPE_PHYSICAL_DEVICE; |消息 ID = 0x3a3b6ca0 | vkCreateDevice:必须启用 VK_KHR_portability_subset,因为物理设备 VkPhysicalDevice 0x11bd84d40[] 支持它 Vulkan 规范指出:如果 vkEnumerateDeviceExtensionProperties 的 pProperties 中包含 VK_KHR_portability_subset 扩展,则 ppEnabledExtensionNames 必须包含“VK_KHR_portability_subset”(https://vulkan.lunarg.com/doc/view/1.3.211.0/mac/1.3-extensions/vkspec.html#VUID-VkDeviceCreateInfo-pProperties-04451

验证层:vkCreateDevice:尝试从来自可移植性驱动程序的 VkPhysicalDevice 创建 VkDevice,但未设置 VkInstanceCreateInfo 标志中的 VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR 位并启用 VK_KHR_portability_enumeration 扩展。在加载器的未来版本中,将不会枚举此 VkPhysicalDevice。

所以我尝试添加第一个错误中提到的VK_KHR_portability_subset 扩展:

const std::vector<const char*> deviceExtensions = {
    VK_KHR_SWAPCHAIN_EXTENSION_NAME,
    "VK_KHR_portability_subset",
};

然后我收到以下验证错误:

验证层:验证错误:[VUID-vkCreateDevice-ppEnabledExtensionNames-01387] 对象 0:句柄 = 0x106849800,类型 = VK_OBJECT_TYPE_INSTANCE; |消息 ID = 0x12537a2c |缺少设备扩展 VK_KHR_portability_subset 所需的扩展:VK_KHR_get_physical_device_properties2。 Vulkan 规范规定:VkDeviceCreateInfo::ppEnabledExtensionNames 列表中每个扩展的所有必需设备扩展也必须存在于该列表中 (https://vulkan.lunarg.com/doc/view/1.3.211.0/mac/1.3-extensions/vkspec.html#VUID-vkCreateDevice-ppEnabledExtensionNames-01387)

验证层:vkCreateDevice:尝试从来自可移植性驱动程序的 VkPhysicalDevice 创建 VkDevice,但未设置 VkInstanceCreateInfo 标志中的 VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR 位并启用 VK_KHR_portability_enumeration 扩展。在加载器的未来版本中,将不会枚举此 VkPhysicalDevice。

验证层:vkGetPhysicalDeviceProperties2KHR:仿真在 pProperties->pNext 中发现无法识别的结构类型 - 此结构将被忽略

所以看起来它缺少VK_KHR_get_physical_device_properties2,我也尝试添加它:

const std::vector<const char*> deviceExtensions = {
    VK_KHR_SWAPCHAIN_EXTENSION_NAME,
    "VK_KHR_portability_subset",
    "VK_KHR_get_physical_device_properties2"
};

添加后,设备创建实际上失败并出现此错误:

验证层:loader_validate_device_extensions:所选物理设备或启用的层不支持设备扩展 VK_KHR_get_physical_device_properties2。

所以似乎不可能满足验证层。在 M1 mac 上初始化逻辑设备的正确方法是什么?

【问题讨论】:

    标签: macos moltenvk vulcan


    【解决方案1】:

    它确实对我有用,但是...

    首先创建 Vulkan 实例(调用 vkCreateInstance)时,您必须在 VkInstanceCreateInfo.ppEnabledExtensionNames 中添加 VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,然后再创建设备,以及您正在使用的任何其他扩展:

    VkInstanceCreateInfo createInfo{};
    
    ...
    
    const std::vector<const char*> exts =
    {
        ...
        VK_KHR_SURFACE_EXTENSION_NAME,
        VK_EXT_METAL_SURFACE_EXTENSION_NAME,
        VK_MVK_MACOS_SURFACE_EXTENSION_NAME,    
        VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME, // <--
        ...
    };
    
    ppEnabledExtensionNames = exts.data();
    
    ...
    

    并添加验证层也告诉您的标志位:

    createInfo.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
    

    创建实例,然后不要包含 VK_KHR_get_physical_device_properties2,而是在创建设备时添加 VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME 并完成。

    从 1.3.216.0 Vulkan SDK 开始似乎需要所有这些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      相关资源
      最近更新 更多