Я столкнулся с некоторым странным поведением с получением ручки 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);
Хотя я могу довольно легко назвать версию устройства и, если это не удастся, вызвать версию экземпляра (чтобы избежать дополнительных затрат на отправку, если это возможно), мне интересно, является ли это ожидаемым поведением или ошибкой драйвера?
Да, vkCmdDebugMarkerBeginEXT
соответствует этому описанию.
Вы должны процитировать Вулкан спец вместо этого (какая ИМО должна иметь более высокую спецификацию в этом вопросе).
Существует одно дополнительное требование: конкретное расширение должно быть включено на этом device
за vkGetDeviceProcAddr
работать. В противном случае похоже на ошибку драйвера.
На самом деле, Пример 2 в спецификации действительно использует vkGetDeviceProcAddr
,
Других решений пока нет …