vkCmdDebugMarkerBeginEXT
我在处理using时遇到了一些奇怪的行为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);
虽然我可以很容易地调用设备版本,如果失败,调用实例版本(如果可能的话,避免额外的调度成本),我想知道这是预期的行为,还是驱动程序错误?