2016-11-22 8 views
1

Я попробовал использовать вторичные буферы команд и столкнулся с проблемой. После изменения размера моего окна перезагружаются как первичные, так и вторичные буферы команд.
Если буфера вторичных команд обновляются и первичные буфера команд, что те содержат, не были еще представлены, слои проверки вызывает ошибкуПовторная запись вторичных буферов команд

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

. Чтобы исправить это, я в настоящее время гарантирую, что все первичные командные буферы, по крайней мере, однажды отправлены, перед обновлением вторичных буферов команд.

Есть ли более простой способ избежать этой проблемы, поскольку я теряю рендеринг до 7 кадров (количество фреймов в моей swapchain) с помощью этого решения?

ответ

1

Командный буфер не должен использоваться, когда вы пытаетесь его перезаписать. Вам необходимо использовать VkFence (или некоторый эквивалент: vkDeviceWaitIdle() или vkQueueWaitIdle()), чтобы убедиться, что это не так.

Там, как правило, много делать при изменении размеров и не ожидаются частая операция, так:

Просто используйте vkDeviceWaitIdle(), реагируя на событие изменения размера (то воссоздать все объекты, которые нуждаются в ней).

Что касается вторичных командных буферов, то это нелогичным утверждение в спецификации:

Буфер вторичной команды считается ожидании исполнения с момента его исполнение записывается в первичный буфер (с помощью vkCmdExecuteCommands) до окончательного завершения подачи первичного буфера в очередь.

Так что, читая его буквально, оно «ожидает выполнения», как только оно записывается в первичный буфер.

(Может быть непредсказуемые интерпретации по спецификации производителей ... Я поднял его как #414 Issue.)

+0

Это не точка. Проблема возникает после выполнения операций изменения размера. Это похоже на resize-> submit 1 первичные командные буферы (6 слева) -> vkDeviceIdle -> обновить вторичные командные буфферы: сообщение об ошибке.I вызвал vkDeviceWaitIdle() непосредственно перед vkBeginCommandBuffer(), но проблема в том, что другие первичные командные буферы командные буферы никогда не были представлены. – camelCase

+0

Понимаю, я был в середине внесения некоторых изменений, которые, вероятно, также охватывают этот случай. (Я также получаю некоторые дежавю от этого - я должен немного исследовать, где я видел аналогичную проблему, написанную о ...) – krOoze

+0

Хорошо, пропустил эту деталь. Поскольку vkDeviceWaitIdle не будет работать здесь, и отправка всех первичных буферов команд является очень дорогостоящей: существует ли способ снова добавить вторичный буфер команд из состояния ожидания до состояния записи? – camelCase

 Смежные вопросы

  • Нет связанных вопросов^_^