vkCreateWin32SurfaceKHR不写入曲面

时间:2016-05-18 17:01:11

标签: graphics vulkan

我试图对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 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

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