Graphics vkCreateWin32SurfaceKHR未写入表面

Graphics vkCreateWin32SurfaceKHR未写入表面,graphics,vulkan,Graphics,Vulkan,我想做一个简单的Vulkan测试。我一直在学习LunarG教程,但遇到了一个问题,vkCreateWin32SurfaceKHR似乎什么也做不了。即,surface未被写入。函数vkCreateWin32SurfaceKHR返回0,因此不报告故障。感谢您的帮助 // create window sdlWindow = SDL_CreateWindow(APP_SHORT_NAME, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, w

我想做一个简单的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));

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));
//创建一个实例
支持向量的持久性扩展;
enabledInstanceExtensions.push_back(VK_KHR_SURFACE_Extensions_NAME);
enabledInstanceExtensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
#ifdef VALIDATE_VULKAN
enabledInstanceExtensions.push_back(“VK_EXT_debug_report”);
#恩迪夫
矢量使能标准层;
#ifdef VALIDATE_VULKAN
启用Stancelayers。推回(“VK\u层\u LUNARG\u标准验证”);
#恩迪夫
VkInstanceCreateInfo inst_info={};
inst_info.sType=VK_结构_类型_实例_创建_信息;
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();
健全性(!vkCreateInstance(&inst_info,NULL,&instance));

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

“也就是说,surface没有被写入。”我看不到您正在写入surface的位置。请尝试启用验证层。如果函数返回一个有效的错误代码,那么验证层也会显示一条消息,提示您发生错误的原因。SDK甚至包含用于swapchain验证的特殊层。@Nicolas我应该澄清我所说的写入
surface
是什么意思,函数的最后一个参数是输出参数。
&surface
中的值应该被覆盖。@SaschaWillems今晚我将不得不查看验证层,但我在教程中还没有走那么远!:-)@也许我误解了你的评论。函数未返回错误代码。它不会触发我的
理智
断言。它只是在未初始化的曲面上轻松地继续运行。我想知道我是否需要做一些特别的事情来启用Win32平台扩展,但是在教程中没有提到这一点。