将 apiVersion 参数设置为 0 时VK_ERROR_INCOMPATIBLE_DRIVER

VK_ERROR_INCOMPATIBLE_DRIVER when setting apiVersion parameter to 0

本文关键字:VK ERROR INCOMPATIBLE DRIVER apiVersion 参数 设置      更新时间:2023-10-16

我正在尝试创建一个 vulkan 实例。这是我的代码:

vk::ApplicationInfo appInfo("Test", 1, nullptr, 0, 0);
vk::InstanceCreateInfo info;
info.pApplicationInfo(&appInfo);
vk::Instance instance;
const auto result = vk::createInstance(&info, nullptr, &instance);
std::cout << vkResultToString(result) << std::endl;

但是,这会返回VK_ERROR_INCOMPATIBLE_DRIVER。

如果我不提供自己的ApplicationInfo而是使用默认构造的,它可以工作。

在规范中它说

如果apiVersion为 0,则实现必须忽略它,否则如果实现不支持请求的apiVersion则必须返回VK_ERROR_INCOMPATIBLE_DRIVER

如您所见,我将apiVersion设置为 0。据我了解,它不应该给我VK_ERROR_INCOMPATIBLE_DRIVER错误。

这是一个错误还是我忘记了什么或想错了什么?

编辑:

在规范的html版本中,关于忽略apiVersion的部分不存在。规范的 pdf 版本是否已经过时?

编辑:

如果我将apiVersion设置为 1.0.3,它也可以工作:

std::bitset<32> apiVersion;
apiVersion.set(22);
apiVersion.set(1);
apiVersion.set(0);
vk::ApplicationInfo appInfo("Test", 1, nullptr, 0, apiVersion.to_ulong());

这听起来完全像是从最终规范中删除的开发选项。 如果您考虑任何图形 API 从一个主要版本到另一个主要版本的变化量,则允许此类行为作为默认值似乎不安全。 话虽如此,完全取决于图形驱动程序制造商的支持,因为他们对是否接受这样的东西有最终决定权。

此外,如果您查看官方 API 规范:https://www.khronos.org/registry/vulkan/specs/1.0/apispec.html。

这仅仅是说:"最后,apiVersion 是应用程序期望使用的 Vulkan API 版本。

我相信

您正在查看的html规范已经过时了:

修订版 0.9 临时 2015 年 11 月 11 日星期三 18:11:51 PST

它有关于apiVersion的报价 这里 https://www.khronos.org/registry/vulkan/specs/1.0/pdf/vkspec.pdf 和这里 https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html 这些是 1.0 版

至于结果,这可能是一个错误。您使用什么驱动程序/平台?

你问这个问题:

这是一个错误还是我忘记了什么或想错了什么?

由于规范是规范的,是的,这是一个错误。该规范说明了以下两个相关内容:

apiVersion 是应用程序期望针对其运行的 Vulkan API 版本,按照 API 版本号和语义部分。如果 apiVersion 为 0,则实现必须忽略它,否则如果 实现不支持请求的 API 版本,它必须返回VK_ERROR_INCOMPATIBLE_DRIVER。

apiVersion 必须为零,否则它必须是实现支持的版本,或者支持有效替代

现在,您可以继续执行您正在执行的操作,并请求一个既<=您正在构建的 SDK 中的版本,又<=您希望能够运行的驱动程序版本的版本。

相关文章: