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 结构中最重要的两个 hinstance 和 hwnd VkWin32SurfaceCreateInfoKHR.
所以请密切注意这两个论点,它骗了我几次。
不确定为什么在提供无效参数时 returning VK_SUCCESS,可能有一些内部相关的事情,上帝知道为什么。
我正在尝试对 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 结构中最重要的两个 hinstance 和 hwnd VkWin32SurfaceCreateInfoKHR. 所以请密切注意这两个论点,它骗了我几次。 不确定为什么在提供无效参数时 returning VK_SUCCESS,可能有一些内部相关的事情,上帝知道为什么。