2017-03-24 6 views
1

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

私は非常に簡単にデバイスのバージョンを呼び出すことができますが、これが失敗した場合、余分な派遣費用を避けるために、(インスタンスのバージョンを呼び出し、可能であれば)、これが予想される動作か、ドライバのバグかどうか疑問に思っていますか?

答えて

0

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

代わりにVulkan specを引用する必要があります(この問題では、IMOの指定パワーが高いはずです)。

追加の要件が1つあります。の場合はdeviceで特定の拡張機能を有効にする必要があります。それ以外の場合はドライバのバグのようです。

実際、in-spec Example 2vkGetDeviceProcAddrを使用します。

関連する問題