sak*_*sak 5 macos vulkan moltenvk
因此,我尝试在配备 M1 处理器的 Mac 上遵循 Vulkan 教程,但遇到了设备创建问题。
因此,根据教程,我设置设备启用的扩展,如下所示:
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();
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到以下验证错误:
验证层:验证错误:[VUID-VkDeviceCreateInfo-pProperties-04451]对象0:句柄= 0x11bd84d40,类型= VK_OBJECT_TYPE_PHYSICAL_DEVICE;| 消息 ID = 0x3a3b6ca0 | vkCreateDevice:必须启用 VK_KHR_portability_subset,因为物理设备 VkPhysicalDevice 0x11bd84d40[] 支持它 Vulkan 规范规定:如果 VK_KHR_portability_subset 扩展包含在 vkEnumerateDeviceExtensionProperties 的 pProperties 中,则 ppEnabledExtensionNames 必须包含“VK_KHR_portability_subset”( https://vulkan.lunarg.com/doc/查看/1.3.211.0/mac/1.3-extensions/vkspec.html#VUID-VkDeviceCreateInfo-pProperties-04451)
验证层: vkCreateDevice:尝试从 VkPhysicalDevice 创建 VkDevice,该 VkPhysicalDevice 来自可移植性驱动程序,但未设置 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",
};
Run Code Online (Sandbox Code Playgroud)
然后我收到以下验证错误:
验证层:验证错误:[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,该 VkPhysicalDevice 来自可移植性驱动程序,但未设置 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"
};
Run Code Online (Sandbox Code Playgroud)
添加此内容后,设备创建实际上失败并出现以下错误:
验证层:loader_validate_device_extensions:所选物理设备或启用层不支持设备扩展 VK_KHR_get_physical_device_properties2。
所以看起来不可能满足验证层的要求。在 M1 mac 上初始化逻辑设备的正确方法是什么?
小智 3
它确实对我有用,但是......
在创建设备以及您正在使用的任何其他扩展之前,首先创建 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();
...
Run Code Online (Sandbox Code Playgroud)
并添加验证层还告诉您的标志位:
createInfo.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
Run Code Online (Sandbox Code Playgroud)
创建实例,然后不要包含 VK_KHR_get_physical_device_properties2,但在创建设备时添加 VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME 并完成。
所有这些似乎都是从 1.3.216.0 Vulkan SDK 开始需要的。
| 归档时间: |
|
| 查看次数: |
2276 次 |
| 最近记录: |