Vulkan: AMD vkCmdDebugMarkerBeginEXT обнаруживается только с vkGetInstanceProcAddr

Я столкнулся с некоторым странным поведением с получением ручки vkCmdDebugMarkerBeginEXT с помощью vkGetDeviceProcAddr, который отличается между AMD и Nvidia. Однако, используя vkGetInstanceProcAddr работает.

VkDevice device = ...; // valid initialized device
VkInstance instance = ...; // valid initialized instance

PFN_vkVoidFunction fnDevice = vkGetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT");
// fnDevice == nullptr on AMD. Non-null on Nvidia
PFN_vkVoidFunction fnInstance = vkGetInstanceProcAddr(instance, "vkCmdDebugMarkerBeginEXT");
// fnInstance == Non-null on both

От интерфейс слоя документация:

vkGetDeviceProcAddr может использоваться только для запроса расширения устройства или
точки входа основного устройства. Точки входа устройства включают любую команду, которая
использует VkDevice в качестве первого параметра или отправляемого объекта, который
является потомком VkDevice (в настоящее время это включает VkQueue и
VkCommandBuffer). vkGetInstanceProcAddr может использоваться для запроса
точки входа устройства или экземпляра в дополнение ко всему ядру
точки входа

Прототип для vkCmdDebugMarkerBeginEXT кажется, соответствует этому описанию:

VKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerBeginEXT(
VkCommandBuffer                             commandBuffer,
VkDebugMarkerMarkerInfoEXT*                 pMarkerInfo);

Хотя я могу довольно легко назвать версию устройства и, если это не удастся, вызвать версию экземпляра (чтобы избежать дополнительных затрат на отправку, если это возможно), мне интересно, является ли это ожидаемым поведением или ошибкой драйвера?

1

Решение

Да, vkCmdDebugMarkerBeginEXT соответствует этому описанию.

Вы должны процитировать Вулкан спец вместо этого (какая ИМО должна иметь более высокую спецификацию в этом вопросе).

Существует одно дополнительное требование: конкретное расширение должно быть включено на этом device за vkGetDeviceProcAddr работать. В противном случае похоже на ошибку драйвера.

На самом деле, Пример 2 в спецификации действительно использует vkGetDeviceProcAddr,

0

Другие решения

Других решений пока нет …