Как правильно проинициализировать vulkan surface в Linux с использованием Qt

Создание vulkan surface в windows с использованием Qt очень простое:

VkWin32SurfaceCreateInfoKHR surfaceCreateInfo{};
surfaceCreateInfo.sType     = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
surfaceCreateInfo.hwnd      = (HWND)winId(); // Запрашиваем дескриптор окна средствами Qt
surfaceCreateInfo.hinstance   = GetModuleHandle(nullptr);
vkCreateWin32SurfaceKHR(VkInstance, &surfaceCreateInfo, nullptr, &surface);

В линуксе всё значительно сложнее, с использованием библиотеки xcb. По найденным мною куцым туториалам получается что-то вроде:

VkXcbSurfaceCreateInfoKHR surfaceCreateInfo{};
surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
 
xcb_connection_t* m_pXCBConnect = xcb_connect(NULL, NULL);
 
if(xcb_connection_has_error(m_pXCBConnect))
    return false;
 
surfaceCreateInfo.connection = m_pXCBConnect;
surfaceCreateInfo.window = xcb_generate_id(m_pXCBConnect);
 
vkCreateXcbSurfaceKHR(VkInstance, &surfaceCreateInfo, nullptr, &surface);

Как ни странно, это даже проходит без ошибок - vkCreateXcbSurfaceKHR возвращает VK_SUCCESS, однако буквально через пару шагов вулкан валится с ошибкой vk_error_initialization_failed при вызове vkGetPhysicalDeviceSurfaceFormatsKHR(...).

Собственно, вопрос: как правильно в линуксе запросить у Qt виджета данные окна для создания surface, по аналогии с тем, как это делается в windows?


Ответы (0 шт):