Warm tip: This article is reproduced from stackoverflow.com, please click
vulkan

Getting access violation while creating logical devices

发布于 2020-05-02 18:35:13

I get the following error:

Exception thrown at VkLayer_khronos_validation.dll Exception thrown at 0x00007FFA5252DD05 (VkLayer_khronos_validation.dll) Access violation reading location 0xFFFFFFFFFFFFFFFF.

My code:

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";
}

}

Questioner
Subash Tiwari
Viewed
23
krOoze 2020-02-14 00:13

Uninitialized VkDeviceQueueCreateInfo. Unitialized pointer (pNext) leads to bad pointer dereference. It happens in the Debug mode, because it uses debug memory pattern. In Release mode an uninitialized value often happens to be 0.

One of the typical ways to deal with this in C bindings of Vulkan is to zero-initialize structs with {}. E.g. VkDeviceQueueCreateInfo dqci = {};. Or there are designated initializers in C99 and C++20. Zero is a decent default value for majority of Vulkan parameters.