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.
我正在尝试创建一个 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 requestedapiVersion
it must returnVK_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.