如果启用的调试扩展和验证层已经添加到实例中,是否需要在创建时将其添加到设备中?

Do enabled debug extensions and validation layers need to be added to the device when created if are already added to the instance?

最近再次查看 Vulkan Tutorial 后,我发现我的一些项目偏离了它。 vulkan 教程所做的其中一件事是在实例级别添加调试扩展和验证层,然后在设备级别执行相同的操作。在创建新项目的过程中,我意识到我忘记设置

VkDeviceCreateInfo::enabledExtensionCount, 
VkDeviceCreateInfo::ppEnabledExtensionNames, 
VkDeviceCreateInfo::enabledLayerCount, and 
VkDeviceCreateInfo::ppEnabledLayerNames

使用调试扩展和验证层。编译不仅在没有它们的情况下工作正常,而且验证层和调试扩展似乎也不受此影响(并且工作得很好,我能够设置对象名称并查看设备错误)。这让我想知道为设备再次包含此信息的意义何在。我知道设备可能有特定的扩展,但我真的需要在每次创建新的 VkDevice 时设置完全相同的验证层标志和扩展名称吗?

VK_EXT_debug_utils(还有 VK_EXT_debug_report)是一个 instance extension。您也不应该为设备启用它们。如果您尝试驱动程序应该失败 VK_ERROR_EXTENSION_NOT_PRESENT.

至于层,设备层很久以前就被弃用了。实例层现在也可以在设备级别工作。在规范中使用此兼容性说明:

In order to maintain compatibility with implementations released prior to device-layer deprecation, applications should still enumerate and enable device layers. The behavior of vkEnumerateDeviceLayerProperties and valid usage of the ppEnabledLayerNames member of VkDeviceCreateInfo maximizes compatibility with applications written to work with the previous requirements.

了解更改的更新驱动程序的行为如下:

The list of layers enumerated by vkEnumerateDeviceLayerProperties must be exactly the sequence of layers enabled for the instance.

但是如果你懒惰(或检查驱动程序版本),你可以简单地提供你从 vkEnumerateDeviceLayerPropertiesnullptr 获得的列表。两者都应该适用于更新的驱动程序。