vkCreateWin32SurfaceKHR не пишет на поверхность

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

    // 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));

2 ответа

Решение

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

    // 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));

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

Другие вопросы по тегам