2016-11-22 12 views
1

セカンダリコマンドバッファの使用を試みて問題に遭遇しました。ウィンドウのサイズを変更すると、プライマリとセカンダリの両方のコマンドバッファが再記録されます。二次コマンドバッファが更新され、主要なコマンドバッファは、それらが含まれていることが、まだ提出されていない場合
は、検証層がセカンダリコマンドバッファの再書き込み

Calling vkBeginCommandBuffer() on active CB 0x0x166dbc0 before it has completed. You must check CB fence before this call. 

エラーをスローします。これを修正するために、私は現在、セカンダリコマンドバッファを更新する前に、すべてのプライマリコマンドバッファが少なくとも一度はサブミットされていることを確認しています。

このソリューションでは、最大7フレーム(スワップチェーンのフレームバッファ数)のレンダリングが浪費されるため、この問題を回避する簡単な方法はありますか?

答えて

1

コマンドバッファは、再録音しようとするときには使用してはいけません。 VkFence(または同等のもの:vkDeviceWaitIdle()またはvkQueueWaitIdle())を使用して、そうでないことを確認する必要があります。

ので、リサイズ、頻繁に操作することが期待されていない場合にやるべきことがたくさん通常あります:

をresizeイベントに反応するときだけ(それを必要とするすべてのエンティティを再作成)vkDeviceWaitIdle()を使用するには。

、スペックでこの反直感的なステートメントがある二次コマンドバッファ用として二次コマンドバッファがその実行を一次バッファ(VIAに記録された時点から実行を保留していると考えられる

vkCmdExecuteCommands)を使用して、プライマリバッファのキューへのサブミットが完了するまでの時間を指定します。

これをリテラルに読むと、プライマリバッファに記録されるとすぐに「実行待ち」となります。

(スペックメーカーによって意図しない解釈することかもしれません...私は#414問題としてそれを提起した。)

+0

ポイントされていないこと。問題は、サイズ変更操作が完了した後に発生します。それはresize->第1のプライマリコマンドバッファを提出する(6左) - > vkDeviceIdle - >セカンダリコマンドバッファを更新する:エラーメッセージ。vkBeginCommandBuffer()の直前でvkDeviceWaitIdle()を呼び出したが、問題は、コマンドバッファは決して提出されていませんでした。 – camelCase

+0

私は、おそらくこのケースもカバーしている編集をしていたことが分かりました。 (私はこれからいくつかのデジャヴを手に入れています - 私は同じ問題が書かれているのを見たところで少し調べるべきです...) – krOoze

+0

申し訳ありませんが、この詳細を逃した。 vkDeviceWaitIdleはここでは動作しないので、すべてのプライマリコマンドバッファを送信するのは非常にコストがかかります。セカンダリコマンドバッファを実行状態が保留状態から記録状態に戻す方法はありますか? – camelCase

関連する問題