在我决定启用 VK_KHR_SWAPCHAIN_EXTENSION_NAME 扩展后,我开始收到错误“在地址 0xFFFFFFFFFFFFFFFF 读取时发生访问权限冲突”。在 vkCreateInstance 执行行中。
调试后,我注意到问题在于填充VkInstanceCreateInfo结构体的ppEnabledExtensionNames值。我决定将 glfw 扩展包装到一个向量中,并使用它来填充结构。 这是填充此结构的函数的代码。
VkInstanceCreateInfo VulkanManager::paste_create_info(VkApplicationInfo* app_info)
{
VkInstanceCreateInfo create_info{};
vector<const char*> device_extensions = {
VK_KHR_SWAPCHAIN_EXTENSION_NAME,
};
uint32_t glfw_extensions_count = 0;
const char** glfw_extensions;
create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
create_info.pApplicationInfo = app_info;
glfw_extensions = glfwGetRequiredInstanceExtensions(&glfw_extensions_count);
for (int i = 0; i < glfw_extensions_count; i++)
device_extensions.push_back(glfw_extensions[i]);
create_info.enabledExtensionCount = (uint32_t) device_extensions.size();
create_info.ppEnabledExtensionNames = device_extensions.data();
create_info.enabledLayerCount = 0;
return create_info;
}
填充VkApplicationInfo结构的代码:
{
VkApplicationInfo app_info{};
app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
app_info.pApplicationName = "Triangle";
app_info.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
app_info.pEngineName = "No Engine";
app_info.engineVersion = VK_MAKE_VERSION(1, 0, 0);
app_info.apiVersion = VK_API_VERSION_1_0;
return app_info;
}
以及创建vulkan实例的代码:
void VulkanManager::create_vulkan()
{
VkApplicationInfo app_info = VulkanManager::paste_app_info();
VkInstanceCreateInfo create_info = VulkanManager::paste_create_info(&app_info);
这很可能是与指针相关的错误;指针在转移到向量时可能会丢失其值
返回
device_extensions
后,VulkanManager::paste_create_info()
中的create_info
将超出范围,因此当您在某处调用vkCreateInstance(create_info)
时,create_info.ppEnabledExtensionNames
将指向无效地址,导致内存访问冲突。
作为旁注,您应该将
device_extensions
重命名为 instance_extensions
,因为这是两个不同的概念,如此处所述。