LINUX.ORG.RU

Vulkan Api — undefined reference to `vkAcquireXlibDisplayEXT'

 


0

1

имеется archlinux, nvidia gtx1650, nvidia-465 drivers.
в данных дровах доступно VK_EXT_acquire_xlib_display расширение, однако при вызове vkAcquireXlibDisplayEXT() выдает ошибку undefined reference to `vkAcquireXlibDisplayEXT'
линкую прогу с -lvulkan

не могу понять в чем проблема. — само расширение подключаю

пытаюсь юзать (раскоментирую)

решение тут

★★

Последнее исправление: safocl (всего исправлений: 2)

Ответ на: комментарий от anonymous

так указывается в выводе vulkaninfo что поддерживается

safocl ★★
() автор топика
Ответ на: комментарий от anonymous

и кстати попробовал все же таким способом без cpp обертки — работает... но говорит чо Display is not allowed — но енто уже мелочи...
очень странно, что оно не подхватывается автоматом, хотя я указываю VK_USE_PLATFORM_XLIB_XRANDR_EXT перед инклудом vulkan.hpp — где в свою очередь сказано:

#if defined( VK_USE_PLATFORM_XLIB_XRANDR_EXT )
      vkAcquireXlibDisplayEXT =
        PFN_vkAcquireXlibDisplayEXT( vkGetInstanceProcAddr( instance, "vkAcquireXlibDisplayEXT" ) );
#endif /*VK_USE_PLATFORM_XLIB_XRANDR_EXT*/

safocl ★★
() автор топика

похоже данная проблема была из-за того, что у меня в main.cpp были тоже подключения системных хедеров vulkan до подключения моего хедера, в котором указываются макросы.

safocl ★★
() автор топика
Ответ на: комментарий от safocl

оказывается все немного глубже — в vulkan-hpp существует такая сущность как диспетчер — и делает он по сути одну вещь — инициализирует функции vulkan api их адресами.
По умолчанию включен статический диспетчер, который содержит только функции из core api и несколько из расширений. Остальные необходимо инициализировать самому вручную, либо создав динамический диспетчер. Тут указаны шаги как сделать полноценно заполненный динамический диспетчер:

vk::DynamicLoader dl;
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = dl.getProcAddress<PFN_vkGetInstanceProcAddr>("vkGetInstanceProcAddr");
VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr);

vk::Instance instance = vk::createInstance({}, nullptr);
VULKAN_HPP_DEFAULT_DISPATCHER.init(instance);

std::vector<vk::PhysicalDevice> physicalDevices = instance.enumeratePhysicalDevices();
assert(!physicalDevices.empty());
vk::Device device = physicalDevices[0].createDevice({}, nullptr);
VULKAN_HPP_DEFAULT_DISPATCHER.init(device);


А чуть выше рассказано как подключить сам динамический диспетчер:
//.cpp

#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1
#include <vulkan/vulkan.hpp>

VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 1)

Мне просто интересно, что ты будешь делать с VK_EXT_acquire_xlib_display? Какой юзкейс, так сказать?

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

ну я хотел прямо на дисплее поверхность создать — но вроде мне там выдавало анноу еррор

safocl ★★
() автор топика
Ответ на: комментарий от safocl

VK_EXT_acquire_xlib_display

This extension allows an application to take exclusive control on a display currently associated with an X11 screen. When control is acquired, the display will be deassociated from the X11 screen until control is released or the specified display connection is closed. Essentially, the X11 screen will behave as if the monitor has been unplugged until control is released.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.