D lang GLFW error: X11: Vulkan instance missing VK_KHR_xcb_surface extension
Пытаюсь запустить вулкан на языке D. Знаю что язык не популярный, но лично мне очень понравился, поэтому в личных интересах изучаю его, а за одно пытаюсь разобраться как работает вулкан. Может найдется тот, кто сможет мне помочь.
Написал минимальный код. В GLFW сделал callback на вывод ошибки при помощи метода glfwSetErrorCallback и там получаю ошибку под номером 65542:
X11: Vulkan instance missing VK_KHR_xcb_surface extension
Получаю ее на этапе вызова метода glfwCreateWindowSurface.
P.S. Сам метод отрабатывает без ошибок, но возвращает null, а в консоли выводит сообщение выше.
Пишу на linux. Для компиляции использую dub. Вот настройки из dub.json
{
"dependencies": {
"bindbc-glfw": "~>1.1.0",
"erupted": "~>2.1.98",
"xcb-d": "~>2.1.1"
},
"libs": [
"glfw3",
"xcb-ewmh"
],
"versions": [
"GLFW_33",
"BindBC_Static"
]
}
Сначала подумал, что чтото с импортами начудил, но вроде все нормально должно быть. Вот импорты:
import xcb.xcb;
import bindbc.glfw;
import erupted;
import erupted.vulkan_lib_loader;
import erupted.platform_extensions;
mixin Platform_Extensions!KHR_xcb_surface;
mixin(bindGLFW_Vulkan);
Проверил vulcan info. Вроде как расширение у меня установлено. Может быть я какуюто библиотеку забыл добавить или в коде что забыл?
==========
VULKANINFO
==========
Vulkan Instance Version: 1.3.250
Instance Extensions: count = 22
===============================
VK_EXT_acquire_drm_display : extension revision 1
VK_EXT_acquire_xlib_display : extension revision 1
VK_EXT_debug_report : extension revision 10
VK_EXT_debug_utils : extension revision 2
VK_EXT_direct_mode_display : extension revision 1
VK_EXT_display_surface_counter : extension revision 1
VK_EXT_swapchain_colorspace : extension revision 4
VK_KHR_device_group_creation : extension revision 1
VK_KHR_display : extension revision 23
VK_KHR_external_fence_capabilities : extension revision 1
VK_KHR_external_memory_capabilities : extension revision 1
VK_KHR_external_semaphore_capabilities : extension revision 1
VK_KHR_get_display_properties2 : extension revision 1
VK_KHR_get_physical_device_properties2 : extension revision 2
VK_KHR_get_surface_capabilities2 : extension revision 1
VK_KHR_portability_enumeration : extension revision 1
VK_KHR_surface : extension revision 25
VK_KHR_surface_protected_capabilities : extension revision 1
VK_KHR_wayland_surface : extension revision 6
VK_KHR_xcb_surface : extension revision 6
VK_KHR_xlib_surface : extension revision 6
VK_LUNARG_direct_driver_loading : extension revision 1
Ответы (1 шт):
Проблема решена. Оказалось, что я забыл про метод glfwGetRequiredInstanceExtensions. Как только его корректно реализовал - проблема ушла
P.S. По просьбе добавляю более развернутый ответ. У glfw существует следующий метод glfwGetRequiredInstanceExtensions.
Обращу внимание, что для доступности этой функции необходимы следующие импорты:
import bindbc.glfw;
import erupted;
import erupted.vulkan_lib_loader;
import erupted.platform_extensions;
mixin Platform_Extensions!KHR_xcb_surface;
mixin(bindGLFW_Vulkan);
Как написано в документации
This function returns an array of names of Vulkan instance extensions required by GLFW for creating Vulkan surfaces for GLFW windows. If successful, the list will always contain VK_KHR_surface, so if you don't require any additional extensions you can pass this list directly to the VkInstanceCreateInfo struct.
Тоесть она выводит список расширений, необходимый для вулкана. А в данном случае в ней будет содержаться VK_KHR_surface. Поэтому в данном случае в мой код просто необходимо было добавить
uint required_extension_count;
const(char)** required_extensions = glfwGetRequiredInstanceExtensions(&required_extension_count);
if (!required_extensions) {
throw new Exception("glfwGetRequiredInstanceExtensions failed");
}
for (uint i = 0; i < required_extension_count; i++) {
extensions_names[extensions_enabled++] = required_extensions[i];
}
Перменная extensions_names в моем случае содержит в себе список расширений, которые после будут добавлены в структуру VkInstanceCreateInfo, который после будет передан в vkCreateInstance.
Тоесть этот код должен быть до того как вы создаете vulcan instance.
Вот пример структуры VkInstanceCreateInfo в моем случае:
VkInstanceCreateInfo inst_info = VkInstanceCreateInfo(
VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
null,
0,
&app,
0,
null,
extensions_enabled,
cast(const(char*)*)extensions_names,
);