1

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

デバイスのバージョンを簡単に呼び出すことができますが、これが失敗した場合はインスタンスのバージョンを呼び出します (可能であれば、追加のディスパッチ コストを回避するため)。

4

1 に答える 1

0

はい、vkCmdDebugMarkerBeginEXTその説明に適合します。

代わりにVulkan の仕様を引用する必要があります(IMO はこの問題でより高い指定力を持つべきです)。

追加の要件が 1 つあります。特定の拡張機能を有効にする必要がありdeviceますvkGetDeviceProcAddr。そうでなければ、ドライバーのバグのようです。

実際、仕様内の例 2では を使用していますvkGetDeviceProcAddr

于 2017-03-24T17:34:43.290 に答える