VK_ERROR_INCOMPATIBLE_DRIVER 将 apiVersion 参数设置为 0 时

VK_ERROR_INCOMPATIBLE_DRIVER when setting apiVersion parameter to 0

我正在尝试创建一个 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;

然而这returnsVK_ERROR_INCOMPATIBLE_DRIVER.

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

specification 中写着

If apiVersion is 0 the implementation must ignore it, otherwise if the implementation does not support the requested apiVersion it must return VK_ERROR_INCOMPATIBLE_DRIVER

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

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

编辑:

specification 的 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());

我认为您正在查看的 html 规范已过时:

Revision 0.9 Provisional Wed Nov 11 18:11:51 PST 2015

这里有关于 apiVersion 的引用 https://www.khronos.org/registry/vulkan/specs/1.0/pdf/vkspec.pdf and here https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html 这些是 1.0 版

至于结果,可能是个bug。 driver/platform 你在用什么?

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

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

那只是说:"Finally, apiVersion is the version of the Vulkan API that the application expects to use."

您提出的问题:

Is this a bug or am I forgetting something or thinking wrong?

由于规范是规范的,所以它是一个错误。 The specification 说了这两个相关的事情:

apiVersion is the version of the Vulkan API against which the application expects to run, encoded as described in the API Version Numbers and Semantics section. If apiVersion is 0 the implementation must ignore it, otherwise if the implementation does not support the requested apiVersion it must return VK_ERROR_INCOMPATIBLE_DRIVER.

apiVersion must be zero, or otherwise it must be a version that the implementation supports, or supports an effective substitute for

现在,您可以继续做您正在做的事情,并请求一个既是 <= 您正在构建的 SDK 中的版本又是 <= 您想要的驱动程序版本的版本能够 运行 on.