什么会导致 vkCreateDevice() 在没有给出失败原因的情况下失败?
What could cause vkCreateDevice() to fail without giving a reason for failure?
我正在使用 vulkan 食谱学习 vulkan,现在我发现自己陷入了僵局:
如果我尝试传递扩展名,即我发送到 vkCreateDevice
的 VkDeviceCreateInfo
结构的扩展名列表中的 VK_KHR_SURFACE_EXTENSION_NAME
和 VK_KHR_WIN32_SURFACE_EXTENSION_NAME
,函数没有任何错误地失败(它没有 return VK_SUCCESS
)
我已经检查过,我知道我的显卡支持我尝试通过的所有扩展。我尝试读取验证层的输出,但它们似乎没有发现失败的原因(我启用了 VK_LAYER_LUNARG_api_dump
和标准验证层)。
我创建逻辑设备的函数如下所示-
bool create_logical_device(VkPhysicalDevice &physDev, VkDevice &device,
std::vector<char const *> &desExts,
std::vector<queueInfo> &qInfos,
VkPhysicalDeviceFeatures &physDevFtrs)
{
std::vector<VkDeviceQueueCreateInfo> qCreateInfo;
std::vector<VkExtensionProperties> physDevExtProps;
if (!get_avl_phys_dev_exts(physDev, physDevExtProps))
return false;
for (auto &ext : desExts)
{
if (!is_ext_available(physDevExtProps, ext))
return false;
}
for (auto &i : qInfos)
{
qCreateInfo.push_back(
{VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
nullptr,
0,
i.FamilyIndex,
(uint32_t)i.Priorities.size(),
i.Priorities.size() > 0 ? i.Priorities.data() : nullptr
});
}
VkDeviceCreateInfo devCreateInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
nullptr,
0,
(uint32_t)qCreateInfo.size(),
qCreateInfo.size() > 0 ? qCreateInfo.data() : nullptr,
0,
nullptr,
(uint32_t)desExts.size(),
desExts.size() > 0 ? desExts.data() : nullptr,
&physDevFtrs
};
#ifdef ENABLE_VALIDATION
devCreateInfo.enabledLayerCount = (uint32_t)valLayers.size();
devCreateInfo.ppEnabledLayerNames = valLayers.data();
#endif
if (vkCreateDevice(physDev, &devCreateInfo, nullptr, &device) != VK_SUCCESS)
{
std::cout << "Could not create logical device!" << std::endl;
return false;
}
std::cout << "Succesfully created logical device" << std::endl;
return true;
}
valLayers
是全局范围内的常量向量。
windows和linux都出现了这种故障,只能是我这边的问题。 运行 通过调试器的代码没有向我透露任何信息。我做错了什么?
您确定您提供的是有效的扩展名吗? VK_KHR_SURFACE_EXTENSION_NAME 是实例扩展,因此不应在设备创建期间提供。
感谢 using/reading/learning 来自 Vulkan Cookbook ;-)。
我正在使用 vulkan 食谱学习 vulkan,现在我发现自己陷入了僵局:
如果我尝试传递扩展名,即我发送到 vkCreateDevice
的 VkDeviceCreateInfo
结构的扩展名列表中的 VK_KHR_SURFACE_EXTENSION_NAME
和 VK_KHR_WIN32_SURFACE_EXTENSION_NAME
,函数没有任何错误地失败(它没有 return VK_SUCCESS
)
我已经检查过,我知道我的显卡支持我尝试通过的所有扩展。我尝试读取验证层的输出,但它们似乎没有发现失败的原因(我启用了 VK_LAYER_LUNARG_api_dump
和标准验证层)。
我创建逻辑设备的函数如下所示-
bool create_logical_device(VkPhysicalDevice &physDev, VkDevice &device,
std::vector<char const *> &desExts,
std::vector<queueInfo> &qInfos,
VkPhysicalDeviceFeatures &physDevFtrs)
{
std::vector<VkDeviceQueueCreateInfo> qCreateInfo;
std::vector<VkExtensionProperties> physDevExtProps;
if (!get_avl_phys_dev_exts(physDev, physDevExtProps))
return false;
for (auto &ext : desExts)
{
if (!is_ext_available(physDevExtProps, ext))
return false;
}
for (auto &i : qInfos)
{
qCreateInfo.push_back(
{VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
nullptr,
0,
i.FamilyIndex,
(uint32_t)i.Priorities.size(),
i.Priorities.size() > 0 ? i.Priorities.data() : nullptr
});
}
VkDeviceCreateInfo devCreateInfo =
{
VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
nullptr,
0,
(uint32_t)qCreateInfo.size(),
qCreateInfo.size() > 0 ? qCreateInfo.data() : nullptr,
0,
nullptr,
(uint32_t)desExts.size(),
desExts.size() > 0 ? desExts.data() : nullptr,
&physDevFtrs
};
#ifdef ENABLE_VALIDATION
devCreateInfo.enabledLayerCount = (uint32_t)valLayers.size();
devCreateInfo.ppEnabledLayerNames = valLayers.data();
#endif
if (vkCreateDevice(physDev, &devCreateInfo, nullptr, &device) != VK_SUCCESS)
{
std::cout << "Could not create logical device!" << std::endl;
return false;
}
std::cout << "Succesfully created logical device" << std::endl;
return true;
}
valLayers
是全局范围内的常量向量。
windows和linux都出现了这种故障,只能是我这边的问题。 运行 通过调试器的代码没有向我透露任何信息。我做错了什么?
您确定您提供的是有效的扩展名吗? VK_KHR_SURFACE_EXTENSION_NAME 是实例扩展,因此不应在设备创建期间提供。
感谢 using/reading/learning 来自 Vulkan Cookbook ;-)。