我使用vkEnumerateInstanceVersion获取vulkan版本并将其传递给VkApplicationInfo结构。我可以很容易地区分VK_VERSION_1_0和VK_VERSION_1_1
//query the api version in order to use the correct vulkan functionality
PFN_vkEnumerateInstanceVersion FN_vkEnumerateInstanceVersion =
PFN_vkEnumerateInstanceVersion(vkGetInstanceProcAddr(nullptr, "vkEnumerateInstanceVersion"));
uint32_t *instanceVersion = (uint32_t*)malloc(sizeof(uint32_t));
VkResult result = FN_vkEnumerateInstanceVersion(instanceVersion);
//check what is returned
if(result == VK_SUCCESS){
std::cout<<"RESULT(vkEnumerateInstanceVersion) : Intance version enumeration successful"<<std::endl;
if(instanceVersion!=nullptr){
std::cout<<"API_VERSION : VK_API_VERSION_1_1"<<std::endl;
appInfo.apiVersion = VK_API_VERSION_1_1;
}
else{
std::cout<<"API_VERSION : VK_API_VERSION_1_0"<<std::endl;
}
std::cout<<"Version number returned : "<<*instanceVersion<<std::endl;
}else if(result == VK_ERROR_OUT_OF_HOST_MEMORY){
std::cerr<<"RESULT(vkEnumerateInstanceVersion) : VK_ERROR_HOST_OUT_OF_MEMORY"<<std::endl;
}else{
std::cerr<<"RESULT(vkEnumerateInstanceVersion) : Something else returned while enumerating instance version"<<std::endl;
}我使用上面的代码来获得api版本。vulkan规范规定:
要查询实现支持的实例级功能的版本,请调用: //由VK_VERSION_1_1 VkResult vkEnumerateInstanceVersion( uint32_t* pApiVersion)提供;
上述块中的注释意味着这是由VK_VERSION_1_1而不是VK_VERSION_1_0提供的。现在,当我打开终端并键入:
vulkaninfo | head -n 5我得到以下信息:
ERROR: [Loader Message] Code 0 : /usr/lib32/libvulkan_intel.so: wrong ELF class: ELFCLASS32
ERROR: [Loader Message] Code 0 : /usr/lib32/libvulkan_radeon.so: wrong ELF class: ELFCLASS32
==========
VULKANINFO
==========
Vulkan Instance Version: 1.2.159这意味着我有VK_API_VERSION_1_2,我想要做的就是得到确切的api版本。在执行第一个代码块时,我得到:
RESULT(vkEnumerateInstanceVersion) : Intance version enumeration successful
API_VERSION : VK_API_VERSION_1_1
Version number returned : 4202655是否有任何方法确定程序中的VK_VERSION_1_1或VK_VERSION_1_2。另外,我正在查看版本1.2.165的vulkan参考指南。
发布于 2020-12-20 17:23:36
我使用
vkEnumerateInstanceVersion获取vulkan版本并将其传递给VkApplicationInfo结构。
这不是vkEnumerateInstanceVersion的目的。
VkApplicationInfo::apiVersion指定编写代码所针对的Vulkan版本。此版本意味着是一个固定值,因为您的代码不能针对尚未存在的Vulkan版本编写。也就是说,如果您正在编写一个针对1.1的应用程序,则需要指定VK_VERSION_1_1。
您可能仍然会得到一个1.2版本,但这是可以的,因为Vulkan主要版本都是向后兼容的,与较低的次要版本号兼容。因此,如果您使用Vulkan 1.1编写代码,那么它将适用于任何1.2实现。
您也在滥用实例版本。实例版本是Vulkan实例机制的版本,而不是整个Vulkan实现的版本。您可能连接到1.2实例机器,但Vulkan设备实现可能只为您提供1.1。对Vulkan来说,这很好。
至于你的守则的详情:
实际上,这段代码没有正确区分Vulkan 1.0和Vulkan 1.1。事实上,它包含了许多错误和令人困惑的部分。
第一个未解决的潜在问题是实例实现太老,无法支持vkEnumerateInstanceVersion。由于这个函数不是由Vulkan 1.0实例实现提供的,所以首先应该确保该函数确实存在。也就是说,在调用FN_vkEnumerateInstanceVersion之前,您应该检查它的值。如果函数不存在,则实例版本必须为1.0。
接下来,调用该函数。但是函数不能失败;它只能返回错误代码VK_SUCCESS。所以没有必要检查它的结果代码。
一旦你去检查有关的实际价值,你就会做一些奇怪的事情。你测试instanceVersion!=nullptr。但是这样做是没有意义的,因为它总是指向有效的内存。因此,由此得出实例实现版本为1.1的结论是完全错误的。
Vulkan中版本号值的含义是在说明书中有明确规定。在你的例子中,如果你只是在寻找主版本号和次要版本号,你可以砍掉补丁版本号。
因此,获得实例版本的正确代码是:
auto FN_vkEnumerateInstanceVersion = PFN_vkEnumerateInstanceVersion(vkGetInstanceProcAddr(nullptr, "vkEnumerateInstanceVersion"));
if(FN_vkEnumerateInstanceVersion == nullptr)
return VK_API_VERSION_1_0;
else
{
uint32_t instanceVersion;
auto result = FN_vkEnumerateInstanceVersion(&instanceVersion);
return instanceVersion & 0xFFFFF000; //Remove the patch version.
}发布于 2021-05-12 13:40:17
您可以从vkEnumerateInstanceVersion返回的实例版本中获得Vulkan版本信息,其中包含在vulkan头中定义的3个宏。
下面是一段代码片段,可以实现这一功能:
uint32 instanceVersion = VK_API_VERSION_1_0;
auto FN_vkEnumerateInstanceVersion = PFN_vkEnumerateInstanceVersion(vkGetInstanceProcAddr(nullptr, "vkEnumerateInstanceVersion"));
if(vkEnumerateInstanceVersion){
vkEnumerateInstanceVersion(&instanceVersion );
}
// 3 macros to extract version info
uint32_t major = VK_VERSION_MAJOR(instanceVersion);
uint32_t minor = VK_VERSION_MINOR(instanceVersion);
uint32_t patch = VK_VERSION_PATCH(instanceVersion);
cout << "Vulkan Version:" << major << "." << minor << "." << patch << endl;它将打印出以下内容:
Vulkan Version:1.1.121https://stackoverflow.com/questions/65382288
复制相似问题