我从Vulkan开始,我在Youtube上关注Niko Kauppi的教程。
使用vkCreateDevice创建设备时出错,返回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;
根据Khronos的文档,我不明白错误的含义:“不支持请求的扩展名。”
感谢您的帮助
答案 0 :(得分:1)
VK_ERROR_EXTENSION_NOT_PRESENT
,enabledExtensionCount
]向量中的某个扩展程序(由ppEnabledExtensionNames
查询),则会返回 vkEnumerateDeviceExtensionProperties()
。< / p>
扩展也可以有依赖项,因此当列表中的扩展名的扩展依赖项也缺失时,也会返回VK_ERROR_EXTENSION_NOT_PRESENT
。
如果您不想要设备扩展程序,请确保enabledExtensionCount
的{{1}}为VkDeviceCreateInfo
(而不是某些未初始化的值)。
我假设2.是0
的整个主体,它将确认&#34;未初始化的值&#34;怀疑。
通常你会想要一个交换链扩展,以便能够直接渲染到屏幕。
答案 1 :(得分:1)
首先,请确保您的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));
我希望它有所帮助。 请仔细检查上面的代码,因为我正在写它。