vkCreateWin32SurfaceKHR 不写入表面

vkCreateWin32SurfaceKHR not writing to surface

我正在尝试对 Vulkan 的工作进行简单测试。我一直在关注 LunarG 教程,但是 运行 遇到了 vkCreateWin32SurfaceKHR 似乎什么也没做的问题。即,surface 没有被写入。函数 vkCreateWin32SurfaceKHR returns 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));

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

除了乔在他的回答中添加的内容外,我还要说的是,如果提供无效参数,对 vkCreateWin32SurfaceKHR() 的调用不会失败,并且 return VK_SUCCESS。如果情况仍然如此,我不确定其他平台。 当我说无效参数时,我指的是 vulkan 结构中最重要的两个 hinstancehwnd VkWin32SurfaceCreateInfoKHR. 所以请密切注意这两个论点,它骗了我几次。 不确定为什么在提供无效参数时 returning VK_SUCCESS,可能有一些内部相关的事情,上帝知道为什么。