创建逻辑设备时出现访问冲突
Getting access violation while creating logical devices
我收到以下错误:
Exception thrown at VkLayer_khronos_validation.dll
Exception thrown at 0x00007FFA5252DD05 (VkLayer_khronos_validation.dll) Access violation reading location 0xFFFFFFFFFFFFFFFF.
我的代码:
void LogicalDevice::createLogicalDevice(VkPhysicalDevice pDevice){
VkDeviceQueueCreateInfo qcreateInfo;
qcreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
QueueFamiliesIndices indices = PhysicalDevice::findQueueFamilies(pDevice);
qcreateInfo.queueFamilyIndex = indices.graphicsFamily.value();
qcreateInfo.queueCount = 1;
float queuePriority = 1.0f;
qcreateInfo.pQueuePriorities = &queuePriority;
VkPhysicalDeviceFeatures deviceFeatures = {};
VkDeviceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
createInfo.pQueueCreateInfos = &qcreateInfo;
createInfo.queueCreateInfoCount = 1;
createInfo.pEnabledFeatures = &deviceFeatures;
createInfo.enabledExtensionCount = 0;
if (ValidationLayers::enableValidationLayers){
createInfo.enabledLayerCount = static_cast<uint32_t>(ValidationLayers::validationLayers.size());
createInfo.ppEnabledLayerNames = ValidationLayers::validationLayers.data();
}
else{
createInfo.enabledLayerCount = 0;
createInfo.pNext = nullptr;
}
createInfo.flags = 0;
if (vkCreateDevice(pDevice, &createInfo ,nullptr, &device) != VK_SUCCESS){
std::cout << "Failed to create Logical Device";
}
}
未初始化VkDeviceQueueCreateInfo
。初始化指针 (pNext
) 导致错误的指针取消引用。它发生在调试模式下,因为它使用调试内存模式。在 Release 模式下,未初始化的值通常恰好为 0。
在 Vulkan 的 C 绑定中处理此问题的典型方法之一是使用 {}
对 struct
进行零初始化。例如。 VkDeviceQueueCreateInfo dqci = {};
。或者在 C99 和 C++20 中有指定的初始化程序。对于大多数 Vulkan 参数,零是一个不错的默认值。
我收到以下错误:
Exception thrown at VkLayer_khronos_validation.dll Exception thrown at 0x00007FFA5252DD05 (VkLayer_khronos_validation.dll) Access violation reading location 0xFFFFFFFFFFFFFFFF.
我的代码:
void LogicalDevice::createLogicalDevice(VkPhysicalDevice pDevice){
VkDeviceQueueCreateInfo qcreateInfo;
qcreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
QueueFamiliesIndices indices = PhysicalDevice::findQueueFamilies(pDevice);
qcreateInfo.queueFamilyIndex = indices.graphicsFamily.value();
qcreateInfo.queueCount = 1;
float queuePriority = 1.0f;
qcreateInfo.pQueuePriorities = &queuePriority;
VkPhysicalDeviceFeatures deviceFeatures = {};
VkDeviceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
createInfo.pQueueCreateInfos = &qcreateInfo;
createInfo.queueCreateInfoCount = 1;
createInfo.pEnabledFeatures = &deviceFeatures;
createInfo.enabledExtensionCount = 0;
if (ValidationLayers::enableValidationLayers){
createInfo.enabledLayerCount = static_cast<uint32_t>(ValidationLayers::validationLayers.size());
createInfo.ppEnabledLayerNames = ValidationLayers::validationLayers.data();
}
else{
createInfo.enabledLayerCount = 0;
createInfo.pNext = nullptr;
}
createInfo.flags = 0;
if (vkCreateDevice(pDevice, &createInfo ,nullptr, &device) != VK_SUCCESS){
std::cout << "Failed to create Logical Device";
}
}
未初始化VkDeviceQueueCreateInfo
。初始化指针 (pNext
) 导致错误的指针取消引用。它发生在调试模式下,因为它使用调试内存模式。在 Release 模式下,未初始化的值通常恰好为 0。
在 Vulkan 的 C 绑定中处理此问题的典型方法之一是使用 {}
对 struct
进行零初始化。例如。 VkDeviceQueueCreateInfo dqci = {};
。或者在 C99 和 C++20 中有指定的初始化程序。对于大多数 Vulkan 参数,零是一个不错的默认值。