2016-05-18 2 views
2

Я пытаюсь получить простой тест работы Вулкана. Я слежу за учебниками LunarG, но столкнулся с проблемой, что vkCreateWin32SurfaceKHR ничего не делает. А именно, surface не записывается. Функция vkCreateWin32SurfaceKHR возвращает 0, поэтому он не сообщает об ошибке. Любая помощь приветствуется.vkCreateWin32SurfaceKHR не записывается на поверхность

// create window 
    sdlWindow = SDL_CreateWindow(APP_SHORT_NAME, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, 0); 
    struct SDL_SysWMinfo wmInfo; 
    SDL_VERSION(&wmInfo.version); 
    SDL_GetWindowWMInfo(sdlWindow, &wmInfo); 
    hWnd = wmInfo.info.win.window; 
    hInstance = GetModuleHandle(NULL); 

    // create a surface attached to the window 
    VkWin32SurfaceCreateInfoKHR surface_info = {}; 
    surface_info.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; 
    surface_info.pNext = NULL; 
    surface_info.hinstance = hInstance; 
    surface_info.hwnd = hWnd; 
    sanity(!vkCreateWin32SurfaceKHR(inst, &surface_info, NULL, &surface)); 
+0

«* А именно, поверхность не записывается в. *« Я не вижу, где вы пишете поверхность. –

+2

Также попробуйте включить уровни проверки. Если функция возвращает допустимый код ошибки, вы также получаете сообщение с помощью слоев проверки, в которых намекает, почему произошла ошибка. SDK даже содержит специальный слой для проверки swapchain. –

+0

@NicolBolas Я должен уточнить, что я имею в виду, написав на 'surface', последним параметром функции является выходной параметр. Значение в '& surface' должно быть перезаписано. – Joe

ответ

2

Sascha Willems правильно определил, что я не запрашивал расширения, необходимые для создания поверхности. Я изменил свой код, чтобы запросить расширения, как показано ниже, и теперь все работает так, как ожидалось.

// create an instance 
    vector<char*> enabledInstanceExtensions; 
    enabledInstanceExtensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); 
    enabledInstanceExtensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); 
#ifdef VALIDATE_VULKAN 
    enabledInstanceExtensions.push_back("VK_EXT_debug_report"); 
#endif 

    vector<char*> enabledInstanceLayers; 
#ifdef VALIDATE_VULKAN 
    enabledInstanceLayers.push_back("VK_LAYER_LUNARG_standard_validation"); 
#endif 

    VkInstanceCreateInfo inst_info = {}; 
    inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; 
    inst_info.pNext = NULL; 
    inst_info.flags = 0; 
    inst_info.pApplicationInfo = &app_info; 
    inst_info.enabledExtensionCount = (uint32_t)enabledInstanceExtensions.size(); 
    inst_info.ppEnabledExtensionNames = enabledInstanceExtensions.data(); 
    inst_info.enabledLayerCount = (uint32_t)enabledInstanceLayers.size(); 
    inst_info.ppEnabledLayerNames = enabledInstanceLayers.data(); 
    sanity(!vkCreateInstance(&inst_info, NULL, &instance)); 
0

Помимо того, что добавил Джо в своем ответе, я также скажу, что вызов vkCreateWin32SurfaceKHR(), если предоставленные недостоверные аргументы не подведет и возврата VK_SUCCESS. Я не уверен в других платформах, если это все еще так. Когда я говорю недопустимые аргументы, которые я имею в виду два наиболее важных HINSTANCE и HWND от Vulkan структуры VkWin32SurfaceCreateInfoKHR. Так что обратите пристальное внимание на эти два аргумента, он несколько раз обманул меня. Не уверен, зачем возвращать VK_SUCCESS при предоставлении недопустимых аргументов, могут быть некоторые внутренние связанные вещи, которые бог знает почему.

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