我刚开始学习Vulkan。我有Graham Sellers的书“Vulkan Programming Guide”,以及我系统中带有AMDGPU pro驱动程序的RX 480。我正在运行Arch Linux,我已经能够在我的系统上运行一些Vulkan演示。
我有一个最小的代码块,导致分段错误。奇怪的是,在我生成这个块以便提出这个问题的过程中,我确实让它运行时从构造函数中调用了vkCreateInstance(),并且在我向代码添加try / catch时首先注意到了分段错误。 p>
现在,即使没有try / catch,也会导致分段错误:
#include <iostream>
#include <vulkan/vulkan.h>
int main(int argv, char* argc[])
{
VkInstance* instance;
VkApplicationInfo appInfo = { .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
.pNext = NULL,
.pApplicationName = "Step 1",
.applicationVersion = 1,
.pEngineName = NULL,
.engineVersion = 0,
.apiVersion = VK_MAKE_VERSION(1, 0, 26) }; //This is what vulkanCapsViewer says my API version is.
VkInstanceCreateInfo createInfo = { .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
.pNext = NULL,
.flags = 0 };
createInfo.pApplicationInfo = &appInfo;
createInfo.enabledExtensionCount = 0;
createInfo.ppEnabledExtensionNames = NULL;
createInfo.enabledLayerCount = 0;
createInfo.ppEnabledLayerNames = NULL;
std::cout << "1\n";
VkResult result = vkCreateInstance(&createInfo, NULL, instance);
std::cout << "2\n";
if(result != VK_SUCCESS) std::cout << "Failed to create a Vulkan instance: " << result << std::endl;
std::cout << "3\n";
return 0;
}
输出结果为:
93> ./create_seg_fault
1
Segmentation fault (core dumped)
答案 0 :(得分:2)
vkCreateInstance期望指向它将填充的已分配对象的指针,你只给它指向无处的指针(在调试中可能是0,在发布时可能是垃圾),测试它 - 在堆栈上创建对象并提供地址:
VkInstance instance;
...
VkResult result = vkCreateInstance(&createInfo, NULL, &instance);
但请记住,一旦你的函数范围结束,这个对象就会死掉(在这种情况下为main
)。