vulkan.hpp уникальные ручки для расширений - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь создать уникальный дескриптор для объекта vk::DebugUtilsMessengerEXT.

Для этого я загрузил VkCreateDebugUtilsMessenger() в указатель функции, а затем вызвал его, чтобы создать простую структуру C, которую я затем превращаю в уникальный объект vulkan.hpp через

vk::UniqueDebugUtilsMessengerEXT(messenger, instance);

Вот тут и начинается проблема. Этот тип объекта неявно вызывает деструктор, то есть он пытается вызвать vkDestroyDebugUtilsMessengerEXT, когда переменная покидает область действия. Однако эту функцию нельзя загрузить в указатель с тем же именем.

т.е. определение указателя функции как vkDestroyDebugUtilsMessengerEXT

А затем установить его как

vkDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT) instance.getProcAddr(
        "vkDestroyDebugUtilsMessengerEXT");

Приводит к ошибке компиляции, поскольку я переопределяю символ.

error: ‘void (* vkDestroyDebugUtilsMessengerEXT)(VkInstance, VkDebugUtilsMessengerEXT, VkAllocationCallbacks)’ redeclared as different kind of symbol

Однако его определение не вызывает ошибку компоновщика, так как компоновщик не может найти символ, с которым нужно связать для уничтожения уникального дескриптора.

/usr/bin/ld: obj/Debug/main.o: in function `vk::DispatchLoaderStatic::vkDestroyDebugUtilsMessengerEXT(VkInstance_T*, VkDebugUtilsMessengerEXT_T*, VkAllocationCallbacks const*) const':
/home/kronos/Desktop/Vulkan/Generated/../libraries/vulkansdk-linux/1.1.97.0/x86_64/include/vulkan/vulkan.hpp:1770: undefined reference to `vkDestroyDebugUtilsMessengerEXT'

Как мне обойти это? Как я могу выставить этот символ для компиляции?

1 Ответ

0 голосов
/ 19 марта 2019

Я нашел решение.

Определение функции с тем же именем, что и у запрашиваемой функции, и вызов указателя внутри нее позволяет компилировать и связывать.

По существу:

void (*vkDestroyDebugUtilsMessenger)(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator);
void vkDestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, const VkAllocationCallbacks* pAllocator)
{
    vkDestroyDebugUtilsMessenger(instance, debugMessenger, pAllocator);
}

Создает символы, необходимые для linikng и компиляции и:

vkDestroyDebugUtilsMessenger =
        (PFN_vkDestroyDebugUtilsMessengerEXT) vkGetInstanceProcAddr(
            instance, "vkDestroyDebugUtilsMessengerEXT");

Будет правильно инициализировать указатель.

...