Vulkan:仅使用vkGetInstanceProcAddr找到AMD vkCmdDebugMarkerBeginEXT

时间:2017-03-24 17:00:31

标签: c++ vulkan amd-gpu

我使用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>

1 个答案:

答案 0 :(得分:0)

是的,vkCmdDebugMarkerBeginEXT符合该说明。

你应引用Vulkan spec代替(IMO应该在这个问题上具有更高的指定能力)。

还有一项要求:必须在device上启用特定扩展程序才能使vkGetDeviceProcAddr生效。否则看起来像是一个驱动程序错误。

事实上,in-spec Example 2确实使用了vkGetDeviceProcAddr