4

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

3 回答 3

3

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

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

这只是说明:“最后,apiVersion 是应用程序期望使用的 Vulkan API 版本。”

于 2016-02-17T16:55:01.770 回答
2

我相信您正在查看的 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 版

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

于 2016-02-17T15:34:59.950 回答
1

你问这个问题:

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

由于规范是规范的,是的,这是一个错误。规范说明了这两个相关的事情:

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

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

现在,您可以继续做您正在做的事情并请求一个版本,该版本既是<=您正在构建的 SDK 中<=的版本,也是您希望能够在其上运行的驱动程序的版本。

于 2016-02-20T22:21:11.727 回答