2017-01-12 17 views
0

Я только начинаю изучать Вулкана. У меня есть книга «Руководство по программированию Vulkan» от Graham Sellers и RX 480 с драйверами AMDGPU pro в моей системе. Я запускаю Arch Linux, и мне удалось запустить некоторые демо-версии Vulkan в моей системе.vkCreateInstance, вызывающий ошибку сегментации

У меня есть минимальный код, который вызывает ошибку сегментации. Как ни странно, на моем пути к генерации этого блока, чтобы задать этот вопрос, у меня есть он работает с вызовом vkCreateInstance() из конструктора и впервые заметил ошибку сегментации, когда я добавил 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) 
+1

Назначенные инициализаторы не являются (пока) функцией C++. Таким образом, ваш код использует некоторый гибрид C и C++. –

ответ

2

vkCreateInstance ожидает указатель выделенного объекта, который будет заполнить, вы даете это просто указатель на никуда (может быть 0 в отладке, будет мусор в выпуске), чтобы проверить его - создать объект в стеке и указать его адрес:

VkInstance instance; 
    ... 
    VkResult result = vkCreateInstance(&createInfo, NULL, &instance); 

, но имейте в виду, что этот объект умрет после завершения действия вашей функции (main).

+1

Это, по сути, правильно, но VkInstance - это typedef VkInstance_t *. Таким образом, в коде плаката у нас есть VkInstance_t **, который не был инициализирован. В вашем правильном коде вы получаете адрес VkInstance_t *, таким образом передавая действительный адрес vkCreateInstance. Однако, поскольку указатель на динамически созданный экземпляр возвращен, он не будет выходить из области действия при выходе функции (VkInstance_t * будет). –

 Смежные вопросы

  • Нет связанных вопросов^_^