我使用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
来自layer interface文档:
vkGetDeviceProcAddr只能用于查询设备扩展名或 核心设备入口点。设备入口点包括任何命令 使用VkDevice作为第一个参数或可调度对象 是一个VkDevice的孩子(目前这包括VkQueue和 VkCommandBuffer)。 vkGetInstanceProcAddr可用于查询 除了所有核心之外的设备或实例扩展入口点 切入点。
vkCmdDebugMarkerBeginEXT
的原型似乎符合此描述:
VKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerBeginEXT(
VkCommandBuffer commandBuffer,
VkDebugMarkerMarkerInfoEXT* pMarkerInfo);
虽然我可以很容易地调用设备版本,如果失败,请调用实例版本(以避免额外的调度成本,如果可能的话),我想知道这是预期的行为还是驱动程序错误?< / p>
答案 0 :(得分:0)
是的,vkCmdDebugMarkerBeginEXT
符合该说明。
你应引用Vulkan spec代替(IMO应该在这个问题上具有更高的指定能力)。
还有一项要求:必须在device
上启用特定扩展程序才能使vkGetDeviceProcAddr
生效。否则看起来像是一个驱动程序错误。
事实上,in-spec Example 2确实使用了vkGetDeviceProcAddr
。