Vulkan 错误 vkCreateDevice:VK_ERROR_EXTENSION_NOT_PRESENT
Vulkan error vkCreateDevice : VK_ERROR_EXTENSION_NOT_PRESENT
我开始使用 Vulkan,并在 Youtube 上关注 Niko Kauppi 的教程。
我在使用 vkCreateDevice 创建设备时出错,它 returns VK_ERROR_EXTENSION_NOT_PRESENT
这里是我的部分代码:
调用vkCreateDevice
_gpu_count = 0;
vkEnumeratePhysicalDevices(instance, &_gpu_count, nullptr);
std::vector<VkPhysicalDevice> gpu_list(_gpu_count);
vkEnumeratePhysicalDevices(instance, &_gpu_count, gpu_list.data());
_gpu = gpu_list[0];
vkGetPhysicalDeviceProperties(_gpu, &_gpu_properties);
VkDeviceCreateInfo device_create_info = _CreateDeviceInfo();
vulkanCheckError(vkCreateDevice(_gpu, &device_create_info, nullptr, &_device));
_gpu_count = 1 和 _gpu_properties 似乎能很好地识别我的 nvidia gpu(不是最新的)
device_create_info
VkDeviceCreateInfo _createDeviceInfo;
_createDeviceInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
_createDeviceInfo.queueCreateInfoCount = 1;
VkDeviceQueueCreateInfo _queueInfo = _CreateDeviceQueueInfo();
_createDeviceInfo.pQueueCreateInfos = &_queueInfo;
我不明白错误的含义:"A requested extension is not supported" 根据 Khronos 的文档。
感谢您的帮助
VK_ERROR_EXTENSION_NOT_PRESENT
当驱动程序不支持您提供的 [enabledExtensionCount
、ppEnabledExtensionNames
] 向量中的扩展之一时返回(由 vkEnumerateDeviceExtensionProperties()
查询) .
扩展也可以有依赖,所以当列表中的扩展的扩展依赖也丢失时,也会返回VK_ERROR_EXTENSION_NOT_PRESENT
。
如果您不需要设备扩展,请确保 VkDeviceCreateInfo
的 enabledExtensionCount
是 0
(而不是某些未初始化的值)。
我假设 2. 是 _CreateDeviceInfo()
的整体,这将证实 "uninitialized value" 的怀疑。
通常你会希望交换链扩展能够直接呈现到屏幕上。
首先,确保你的 VkDeviceCreateInfo
是零填充的,否则它可能会给你的 VkCreateDevice()
调用带来垃圾。
在声明 VkDeviceCreateInfo 后添加以下行:
memset ( &_createDeviceInfo, 0, sizeof(VkDeviceCreateInfo) );
一些扩展是绝对必要的,例如交换链。
要检索可用的扩展程序,请执行以下操作:
// Available extensions and layers names
const char* const* _ppExtensionNames = NULL;
// get extension names
uint32 _extensionCount = 0;
vkEnumerateDeviceExtensionProperties( _gpu, NULL, &_extensionCount, NULL);
std::vector<const char *> extNames;
std::vector<VkExtensionProperties> extProps(_extensionCount);
vkEnumerateDeviceExtensionProperties(_gpu, NULL, &_extensionCount, extProps.data());
for (uint32_t i = 0; i < _extensionCount; i++) {
extNames.push_back(extProps[i].extensionName);
}
_ppExtensionNames = extNames.data();
在 _ppExtensionNames
中拥有所有扩展名后,将其传递给您的 deviceCreateInfo 结构:
VkDeviceCreateInfo device_create_info ...
[...]
device_create_info.enabledExtensionCount = _extensionCount;
device_create_info.ppEnabledExtensionNames = _ppExtensionNames;
[...]
vulkanCheckError(vkCreateDevice(_gpu, &device_create_info, nullptr, &_device));
希望对您有所帮助。
请仔细检查上面的代码,因为我是用心写的。
我开始使用 Vulkan,并在 Youtube 上关注 Niko Kauppi 的教程。
我在使用 vkCreateDevice 创建设备时出错,它 returns VK_ERROR_EXTENSION_NOT_PRESENT
这里是我的部分代码:
调用vkCreateDevice
_gpu_count = 0; vkEnumeratePhysicalDevices(instance, &_gpu_count, nullptr); std::vector<VkPhysicalDevice> gpu_list(_gpu_count); vkEnumeratePhysicalDevices(instance, &_gpu_count, gpu_list.data()); _gpu = gpu_list[0]; vkGetPhysicalDeviceProperties(_gpu, &_gpu_properties); VkDeviceCreateInfo device_create_info = _CreateDeviceInfo(); vulkanCheckError(vkCreateDevice(_gpu, &device_create_info, nullptr, &_device));
_gpu_count = 1 和 _gpu_properties 似乎能很好地识别我的 nvidia gpu(不是最新的)
device_create_info
VkDeviceCreateInfo _createDeviceInfo; _createDeviceInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; _createDeviceInfo.queueCreateInfoCount = 1; VkDeviceQueueCreateInfo _queueInfo = _CreateDeviceQueueInfo(); _createDeviceInfo.pQueueCreateInfos = &_queueInfo;
我不明白错误的含义:"A requested extension is not supported" 根据 Khronos 的文档。
感谢您的帮助
VK_ERROR_EXTENSION_NOT_PRESENT
当驱动程序不支持您提供的 [enabledExtensionCount
、ppEnabledExtensionNames
] 向量中的扩展之一时返回(由 vkEnumerateDeviceExtensionProperties()
查询) .
扩展也可以有依赖,所以当列表中的扩展的扩展依赖也丢失时,也会返回VK_ERROR_EXTENSION_NOT_PRESENT
。
如果您不需要设备扩展,请确保 VkDeviceCreateInfo
的 enabledExtensionCount
是 0
(而不是某些未初始化的值)。
我假设 2. 是 _CreateDeviceInfo()
的整体,这将证实 "uninitialized value" 的怀疑。
通常你会希望交换链扩展能够直接呈现到屏幕上。
首先,确保你的 VkDeviceCreateInfo
是零填充的,否则它可能会给你的 VkCreateDevice()
调用带来垃圾。
在声明 VkDeviceCreateInfo 后添加以下行:
memset ( &_createDeviceInfo, 0, sizeof(VkDeviceCreateInfo) );
一些扩展是绝对必要的,例如交换链。
要检索可用的扩展程序,请执行以下操作:
// Available extensions and layers names
const char* const* _ppExtensionNames = NULL;
// get extension names
uint32 _extensionCount = 0;
vkEnumerateDeviceExtensionProperties( _gpu, NULL, &_extensionCount, NULL);
std::vector<const char *> extNames;
std::vector<VkExtensionProperties> extProps(_extensionCount);
vkEnumerateDeviceExtensionProperties(_gpu, NULL, &_extensionCount, extProps.data());
for (uint32_t i = 0; i < _extensionCount; i++) {
extNames.push_back(extProps[i].extensionName);
}
_ppExtensionNames = extNames.data();
在 _ppExtensionNames
中拥有所有扩展名后,将其传递给您的 deviceCreateInfo 结构:
VkDeviceCreateInfo device_create_info ...
[...]
device_create_info.enabledExtensionCount = _extensionCount;
device_create_info.ppEnabledExtensionNames = _ppExtensionNames;
[...]
vulkanCheckError(vkCreateDevice(_gpu, &device_create_info, nullptr, &_device));
希望对您有所帮助。 请仔细检查上面的代码,因为我是用心写的。