2017-06-15 3 views
0

vkWaitForFencesを呼び出すとき、デバイスハンドルへのアクセスを同期させる必要がありますか?この仕様にはこれに関する必要は言及されていませんが、どちらもフリースレッドであるとは言えません。いくつかの場所、つまりほとんどのvkCreateXXXでは、これを要件として言及しています。スペックの明示的な性質が与えられれば、より正確な言葉遣いが(この場合は全くではなく)期待されます。Vulkan:vkWaitForFencesはVkDeviceへのアクセスを同期化します

答えは「いいえ」と思われますが、私はこのAPIまたは実装の背後にある実装で私の直感を信じることができません。

この関数の呼び出しを守る必要がある場合は、奇妙な(実際は役に立たない)でしょう。

答えて

2

この仕様では、「外部同期」と「ホスト同期」という用語を使用して、アプリケーションが非同時使用を保証する必要があるオブジェクト/パラメータについて説明します。ルールはSection 2.5 "Threading Behavior"に、ほとんどのコマンドの後には "Host Synchronization"ブロックに記述されています。記載されていないものは、同時に使用することができます。

デバイスパラメータが外部でvkCreate*のために同期されていると思われる理由がわかりません。その仕様をサポートするための何かが見つかりませんでした。デバイスオブジェクトはほとんど決して外部同期されません。

vkWaitForFencesのいずれのパラメータもホスト同期としてリストされていません。しかし、vkQueueSubmitvkResetFencesに渡されたフェンスは、ホストが同期しているので、フェンスを待っている別のスレッドがある間に、これらの呼び出しの1つにフェンスを渡すことはできません。しかし、同じフェンスで2つのスレッドが待機しているか、もう1つのスレッドが待機している間にvkGetFenceStatusを呼び出すスレッドが1つある可能性があります。

+0

TBH内部で同期化されたVulkanにはほとんど何もないことを考慮すると、「外部同期」と「ホスト同期」という用語も混乱しています。おそらく、すべてのコマンドパラメータを「読み込みアクセス」とみなし、「ホスト同期」にリストされているすべてのものを「書き込みアクセス」と考えると便利です。 read-readは同期を必要としません。ライト・リードおよびライト・ライトは行いません。 – krOoze

+0

はい、「書き込みアクセス」という考えは参考になりますが、これも私がやっていることです。いくつかの場合を除き、コマンド*がパラメータへの書き込みアクセスを必要とする場合、そのパラメータは外部的に同期されます。しかし、多くの実装では、そのパラメータのAPI可視状態を変更しないパラメータへの付随的な書き込みアクセスが必要な場合があります。したがって、これらは外部同期されておらず(例外はいくつかあります)、インプリメンテーションで順序付けされたアクセスが必要な場合は、内部的に同期化する必要があります。 VkDeviceコマンドの多くは、そのカテゴリに分類されます。 –

関連する問題