Вулкан, можешь ли ты выставить расширения напрямую? - PullRequest
2 голосов
/ 17 марта 2019

Одним из способов получения функций, определенных в расширениях Vulkan, является использование: vkGetInstanceProcAddr для запроса имени строки функции, которую мы ищем. Если все пойдет хорошо, мы получим указатель на функцию для правильного метода.

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

например, чтобы включить закомментированный вызов в этой функции:

VkResult CreateDebugUtilsMessengerEXT(VkInstance instance,
    const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
    const VkAllocationCallbacks* pAllocator,
    VkDebugUtilsMessengerEXT* pDebugMessenger)
    {
    auto func = (PFN_vkCreateDebugUtilsMessengerEXT) vkGetInstanceProcAddr(instance,
        "vkCreateDebugUtilsMessengerEXT");
    if (func != nullptr)
    {
        return func(instance, pCreateInfo, pAllocator, pDebugMessenger); //comment
        //return vkCreateDebugUtilsMessengerEXT(instance, pCreateInfo, pAllocator, pDebugMessenger); //uncomment
    }
    else
    {
        return VK_ERROR_EXTENSION_NOT_PRESENT;
    }
}

1 Ответ

4 голосов
/ 17 марта 2019

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

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

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

...