c++ - 只能在调试中创建 vulkan 设备
问题描述
我正在制作一个 vulkan 渲染器,当我尝试创建一个逻辑设备时,它仅在调试模式下在 vkCreateDevice 上引发以下异常:
在 Game.exe 中的 0x00007FFBA327A34B (vulkan-1.dll) 处引发异常:0xC0000005:访问冲突读取位置 0xFFFFFFFFFFFFFFFF。
这是代码(顺便说一句,这主要是按照 vulkan-tutorial.com 教程制作的):
bool FindQueueFamilies(VkPhysicalDevice device, uint32_t* indices)
{
bool found = false;
uint32_t queueFamilyCount = 0;
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr);
VkQueueFamilyProperties queueFamilies[512];
vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies);
for (uint32_t i = 0; i < queueFamilyCount; i++)
{
const auto& queueFamily = queueFamilies[i];
if (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT)
{
if (indices != nullptr)
{
*indices = i;
}
found = true;
}
}
if (!found)
{
Loggers::Error("Didn't find queue family!");
}
return found;
}
...
void* RenderDevice::CreateVulkan(void* physicalDevice)
{
//Logical device
uint32_t indices = 0;
FindQueueFamilies(*((VkPhysicalDevice*)physicalDevice), &indices);
float queuePriority = 1.0f;
VkDeviceQueueCreateInfo queueCreateInfo{};
queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queueCreateInfo.pNext = nullptr;
queueCreateInfo.flags = 0;
queueCreateInfo.queueFamilyIndex = indices;
queueCreateInfo.queueCount = 1;
queueCreateInfo.pQueuePriorities = &queuePriority;
VkPhysicalDeviceFeatures deviceFeatures{};
VkDeviceCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
createInfo.pNext = nullptr;
createInfo.flags = 0;
createInfo.queueCreateInfoCount = 1;
createInfo.pQueueCreateInfos = &queueCreateInfo;
createInfo.enabledExtensionCount = deviceExtensionsCount;
createInfo.ppEnabledExtensionNames = deviceExtensions;
createInfo.pEnabledFeatures = &deviceFeatures;
VkDevice device;
if (vkCreateDevice(*((VkPhysicalDevice*)physicalDevice), &createInfo, nullptr, &device) != VK_SUCCESS)
{
Loggers::Error("failed to create logical device!");
}
VkQueue graphicsQueue;
vkGetDeviceQueue(device, indices, 0, &graphicsQueue);
return &device;
}
解决方案
对我来说,您的意思似乎physicalDevice
不是*((VkPhysicalDevice*)physicalDevice)
,因为这就是 vulkan-turorial.com 使用的,这也是我在渲染中使用的。那是你的问题吗?还要记住,访问冲突可能是由错误的指针引起的。
推荐阅读
- python - 由于环境设置错误,使用 Keras 进行预测失败
- python - 在某个单词处拆分熊猫数据框列中的文本
- java - 第一个 for 循环需要很多时间
- javascript - 多个 id 和类共享 AddEventListener
- amazon-emr - 通过 sagemaker 将 Livy 连接到 EMR 时出现问题
- angular - 为什么升级到 Angular 7 Ecma6 不起作用?
- winapi - Win32 API TerminateProcess() 返回成功但进程没有被杀死
- c# - 单元测试中的 DeterministicTaskScheduler vs AsyncContext
- mysql - 在 Ubuntu 18.04 中启动 MySQL 社区服务器失败
- python - 在python中计算.wav文件的频谱图