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

时间:2019-07-14 06:25:34

标签: gpu vulkan gpu-programming

最近再次查看Vulkan Tutorial后,我注意到我的一些项目与之不同。 vulkan教程要做的一件事是在实例级别添加debugextensions和验证层,然后在设备级别执行相同的操作。在创建新项目的过程中,我意识到我忘记设置

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

使用调试扩展和验证层。编译不仅可以很好地解决这些问题,而且验证层和调试扩展似乎也不受此影响(并且工作正常,我能够设置对象名称并查看设备错误)。这让我想知道再次为设备包含此信息的意义是什么。我了解设备可能具有特定的扩展名,但是每次创建新的VkDevice时,是否真的需要设置完全相同的验证层标志和扩展名吗?

1 个答案:

答案 0 :(得分:2)

VK_EXT_debug_utils(还有VK_EXT_debug_report)也是instance extension。您也不应为设备启用它们。如果尝试使用驱动程序,则驱动程序应失败,并显示VK_ERROR_EXTENSION_NOT_PRESENT

关于层,很久以前不建议使用设备层。实例层现在也可以在设备级别工作。在规范中使用此兼容性说明:

  

为了保持与设备层弃用之前发布的实现兼容,应用程序应该仍应枚举并启用设备层。 vkEnumerateDeviceLayerProperties的行为和ppEnabledLayerName的{​​{1}} s成员的有效用法最大程度地提高了与为满足先前要求而编写的应用程序的兼容性。

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

  

VkDeviceCreateInfo列举的层列表必须必须完全是为实例启用的层顺序。

但是,如果您懒惰(或检查驱动程序版本),则只需提供从vkEnumerateDeviceLayerPropertiesvkEnumerateDeviceLayerProperties获得的列表。两者都应该使用更新的驱动程序。