2016-07-30 8 views
3

Vulkanは、複数の入力記述を許可します。私の使用例では、2セットの特定のオブジェクトをレンダリングします。 2つの異なるオフセット位置のフレームデータとオブジェクトデータを含む動的バッファに2つのオフセットを設定して0を設定します。オブジェクトごとに変更するテクスチャで1を設定します。だから私の最初のパスの後、私は2セットをバインドしています。私は次のサブパスを開始し、別のパイプラインをバインドするとき、これらの2つのセットはまだバインドされています。次に、セット0をバインドしようとすると(今は1に設定する必要はありません)、互換性に関するパフォーマンス警告が表示されます。パフォーマンス警告を与える前のパイプラインからのVkDescriptorSet

DescriptorSetDS 0x10 previously bound as set #0 is incompatible with set 0x668cec8 newly bound as set #0 so set #1 and any subsequent sets were disturbed by newly bound pipelineLayout (0x64)

今、これは私には明らかである、と私はセット1が「邪魔」していることを理解しています。しかし、私はどのようにすればよいか分からないのは、これが正しいことをvulkanに伝えることです。警告はもう出されません(このエラーが常に発生するソフトウェアを設計するのは間違っています)。私はバインドされているセットのリセット、セットのバインド解除のようなものを期待しています。しかし、私は何かが見当たらないので何かが欠けていると思う。もちろん

は多分私が完了するので、私の単純化されたコールのため、何か間違ったこと、またはいくつかの関連するコマンドが欠落しています:

vkCmdBeginRenderPass vkCmdBindPipeline vkCmdBindDescriptorSets -> bind sets: 0, 1 vkCmdBindVertexBuffers vkCmdDraw vkCmdNextSubpass vkCmdBindPipeline (different pipeline) vkCmdBindDescriptorSets -> bind set: 0 -> error about set disturbance

+0

「このエラーが常に発生するソフトウェアを設計するのは間違っているようです」「エラーではありません。それは警告です。あなたのケースでは正当なものですが、誰かがそれを期待していると、エラーを検出することがあります。空のセットを他のセットのインデックスにバインドすることで、おそらく警告を止めることができます。 –

+1

代わりに最後のセットを変更することでシャットダウンできると思います。レイヤーは、最後のセットが最も変更され、最初のセットが最も変更されるべきであることを示唆します。それとも、別のCBに移動して状態を「リセット」します。 – krOoze

+0

パイプラインレイアウトでセット1の使用方法のみを指定しますか? VkPipelineLayoutCreateInfoのpSetLayoutsの順番によって、常に0から始まるセットのレイアウトが暗黙的に決定されたようです。次に、実際に気にするセット1の前のpipelinelayoutからセット0をバインドできますが、それはちょっとひどいようです設計。 – Aedoro

答えて

0

現時点では、これに何の本当に良い答えがありません。あなたが現在やっていることは、パフォーマンスに関して賢明なものでなければなりません。あなたの意図をデバッグ層に適切に伝達する方法がないことだけです。

Vulkan APIには、「私は設定0を設定していますが、後のいずれの設定も気にしません」と言う方法はありません。したがって、検証レイヤーは、「設定0を設定していて、後のセットを保持したい」との違いを認識できません。実際のドライバは気にしませんが、検証層はあなたの意図を知る必要があります。

私はただの警告を思いつくことを提案します。 make 1やset 2を使うようなことをしようとすると、あなた自身が難しいものになってしまいます。 set 0が空のセットであるパイプラインレイアウトを作成する必要がありますが、空のセットを実際にバインドして0を設定する必要があります。つまり、そこにバインドする空のデスクリプタセットを作成する必要があります。

偽陽性です。

関連する問題