vkCmdDebugMarkerBeginEXT
へのハンドルを取得すると、奇妙な動作に陥りました。これは、AMDとNvidiaで異なるvkGetDeviceProcAddr
です。ただし、vkGetInstanceProcAddr
を使用してください。Vulkan:AMD vkCmdDebugMarkerBeginEXTは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);
私は非常に簡単にデバイスのバージョンを呼び出すことができますが、これが失敗した場合、余分な派遣費用を避けるために、(インスタンスのバージョンを呼び出し、可能であれば)、これが予想される動作か、ドライバのバグかどうか疑問に思っていますか?