2016-08-10 2 views
2

Я просто загрузил общую библиотеку в первый раз во время выполнения. В настоящее время я создаю явный контекст, в котором загружаются все указатели функций.Это хорошая идея, чтобы выставить указатели функций Vulkan глобально?

Было бы примерно выглядеть в C++

auto entry = load_vk(..); 
auto instance = entry.CreateInstance(...); 
VkInstancePointer vk = load_vk_static_fn(instance); 
vk.CreateDevice(...); 

Проблема заключается в том, что я не уверен, о жизни этого. Мне нужно было бы получить доступ к vk по разным потокам, поэтому в настоящее время я обматываю его в shared_ptr<VkInstancePointer>. Я также выгружаю библиотеку в деструктор.

Рода проблемы, которую я имею, что я хочу сделать Vulkan апи немного более удобным, так что я могу написать

physical_device.create_logical_device(...); 

Но это будет означать, что physical_device должен содержать shared_ptr<VkInstancePointer>. Это означает, что многие вещи будут иметь дополнительные накладные расходы на прирост счетчика атомов.

Мне интересно, могу ли я просто загрузить указатели функций vulkan по всему миру?

load_entry(); 
auto instance = CreateInstance(); 
load_instance_fp(instance); 
auto device = CreateDevice(..); 

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

Должен ли я когда-нибудь захотеть выгрузить библиотеку Вулкана?

+2

Вообще говоря, общий объект/DLL, загружаемый динамически во время выполнения, путь _correct_ увеличивает счетчик ссылок. Освобождение от него уменьшает, что счетчик ссылок и библиотека не могут быть удалены из вашего процесса до тех пор, пока не останется 0 ссылок. Вам лучше загружать библиотеку каждый раз, когда вам нужно получить указатель на функцию, чтобы поддерживать постоянный подсчет ссылок или просто не выгружать его. –

+0

"* Это означает, что многие вещи будут иметь дополнительные накладные расходы на прирост счетчика атомов. *« Только операции копирования, связанные с этими объектами. –

+0

@NicolBolas Да и создание этих объектов. Но, как сказал Андон М. Коулман, я теряю способность выгружать библиотеку. Я мог бы хранить weak_ptr, но тогда доступ к нему всегда увеличивал бы атомный счетчик. Я, вероятно, просто сделаю «VkInstancePointer» доступным по всему миру. –

ответ

2

В Vulkan есть два вида указателей на функции: указатели функций экземпляра и указатели функций устройства.

Указатели функции экземпляра извлекаются через vkGetInstanceProcAddr. Эта функция может извлекать указатели функций для функций, которые не зависят от устройства. То есть для функций, связанных с созданием/управлением/уничтожением устройств, в отличие от функций, которые напрямую связаны с устройством (т. Е. Любая функция, которая принимает VkDevice, VkQueue или VkCommandBuffer).

Но он также может извлекать указатели для функций, которые общаются с самим устройством. Эти функции могут разговаривать с любым Устройство Vulkan, независимо от того, было ли оно создано до или после того, как были восстановлены указатели функций.

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

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

Или вы можете просто позволить Vulkan SDK выполнить свою работу и обработать все это для вас.

Должен ли я когда-либо захотеть выгрузить библиотеку Вулкана?

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

+0

Не могли бы вы указать мне на SDK Vulkan, который должен был обработать это для меня? Это один https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers? В частности, эта функция https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/common/vulkan_wrapper.cpp#L24? –

Смежные вопросы