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