AMD と Nvidia で異なるをvkCmdDebugMarkerBeginEXT
使用するためのハンドルを取得するときに、奇妙な動作に遭遇しました。vkGetDeviceProcAddr
ただし、使用すると機能し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);
デバイスのバージョンを簡単に呼び出すことができますが、これが失敗した場合はインスタンスのバージョンを呼び出します (可能であれば、追加のディスパッチ コストを回避するため)。