1

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);

虽然我可以很容易地调用设备版本,如果失败,调用实例版本(如果可能的话,避免额外的调度成本),我想知道这是预期的行为,还是驱动程序错误?

4

1 回答 1

0

是的,vkCmdDebugMarkerBeginEXT符合这个描述。

您应该引用Vulkan 规范(IMO 在这件事上应该具有更高的指定能力)。

还有一个额外的要求:必须启用特定的扩展device才能vkGetDeviceProcAddr工作。否则似乎是驱动程序错误。

事实上,符合规范的示例 2确实使用了vkGetDeviceProcAddr.

于 2017-03-24T17:34:43.290 回答