Вулкан: проблемы с пониманием циклических кадровых буферов

В Вулкане

Семафор (A) и забор (X) можно передать vkAcquireNextImageKHR, Этот семафор (A) впоследствии передается vkQueueSubmit, чтобы подождать, пока изображение не будет выпущено Presentation Engine (PE). Забор (Y) можно также передать vkQueueSubmit, Код клиента может проверить, когда отправка завершена, проверив забор (Y).

Когда забор (Y) сигнализирует, это означает, что PE может отображать изображение.

Мой вопрос:

Как я знаю, когда PE закончил использовать изображение после звонка vkQueuePresentKHR? Мне не кажется, что это было бы путем проверки забора (X), потому что это для кода клиента, чтобы знать, когда изображение может быть записано с помощью vkQueueSubmitне так ли? После того, как изображение отправлено vkQueueSubmitКажется, полезность забора (X) готова. Или же можно использовать тот же забор (X) для запроса доступности изображения после вызова vkQueuePresentKHR?

Я не знаю, когда изображение снова станет доступно после звонка vkQueuePresentKHRбез необходимости звонить vkAcquireNextImageKHR,


Причина, по которой это вызывает у меня проблемы, заключается в том, что в асинхронном приложении с частотой 60 кадров в секунду и тройным буферизацией (одноразовый обучающий код) все выходит из-под контроля следующим образом:

  1. Отправьте начальный кадровый буфер в PE. Этот кадровый буфер теперь недоступен в течение 16 миллисекунд.
  2. В течение 16 мс приобретите второй образ / кадровый буфер, отправьте команды, но не представьте.
  3. Сделайте так же, как #2, для третьего изображения. Мы представляем его до 16 мс.
  4. 16 мс прошло, поэтому мы vkQueuePresentKHR второе изображение.
  5. Теперь, если я позвоню vkAcquireNextImageKHRвсе может закончиться неудачей, если изображение № 1 еще не используется, потому что я получил три изображения на данный момент.
  6. Как узнать, что изображение №1 снова доступно без звонка vkAcquireNextImageKHR?

2 ответа

Решение

Как я знаю, когда PE закончил использовать изображение после звонка vkQueuePresentKHR?

Вам обычно не нужно знать.

Либо вам нужно приобрести новый VkImageили нет. Закончил ли PE или нет, даже не принимает это решение.

Единственная причина, по которой вы хотите знать, - это если вы хотите измерить время презентации. Для этого есть специальное расширение: VK_GOOGLE_display_timing,

После того, как изображение отправлено vkQueueSubmitКажется, полезность забора (X) готова.

Ну, вы можете повторно использовать забор. Но Реализация перестала использовать его, как только он получил сигнал, и больше не будет менять свое состояние на что-либо, если это то, о чем вы просите (и поэтому вы можете vkDestroy это или делать другие вещи с этим).

Я не знаю, когда изображение снова станет доступно после звонка vkQueuePresentKHRбез необходимости звонить vkAcquireNextImageKHR,

Надеюсь, я расскажу об этом ниже, но я не совсем уверен, в чем проблема. Я не знаю, как есть суп без ложки. Просто используйте ложку - я имею в виду vkAcquireNextImageKHR,

  1. Теперь, если я позвоню vkAcquireNextImageKHRвсе может закончиться неудачей, если изображение #1 > еще не используется, потому что на данный момент я получил 3 изображения.
  2. Как узнать, что изображение № 1 снова доступно без звонка>vkAcquireNextImageKHR?

Чем он отличается от изображений № 1 и № 2?

Да, возможно, вы уже приобрели все изображения, которые может предложить свопчейн, или ЧП "не готов" выдавать изображение, даже если у него есть два.

В первом случае спецификация советует не звонить vkAcquireNextImageKHR с timeout из UINT64_MAX, Это просто подсчитать успешное vkAcquireNextImageKHR звонки против vkQueuePresentKHRs. Одним из способов может быть просто сделать один vkAcquireNextImageKHR а затем сделать один vkQueuePresentKHR,

Во втором случае вы можете просто позвонить vkAcquireNextImageKHR и вы в конечном итоге получите изображение.

Чтобы использовать образ подкачки, вам необходимо его приобрести. После этого фактическое наличие изображения для целей рендеринга сигнализируется семафором (A) или забором (X). Вы можете использовать семафор (X) во время отправки в качестве семафора ожидания или подождать на процессоре ограждения (X) и отправить его после этого. Из соображений производительности семафор является предпочтительным способом.

Теперь, когда вы представляете изображение, вы возвращаете его в механизм презентаций. Отныне Вы не можете использовать это изображение для каких-либо целей. Невозможно проверить, будет ли это изображение снова доступно для Вас, чтобы Вы могли снова выполнить рендеринг. Тебе этого не сделать. Если вы хотите снова выполнить рендеринг в образ подкачки, вам нужно получить другое изображение. И во время этой операции Вы снова предоставляете семафор или забор (вероятно, отличающийся от тех, которые были предоставлены, когда Вы ранее приобрели образ подкачки). Нет другого способа проверить, когда изображение снова становится доступным, кроме как посредством вызова функции vkAcquireNextImageKHR().

А если вы хотите реализовать тройную буферизацию, вам следует просто выбрать соответствующий режим презентации (режим почтового ящика является наиболее близким). Вам не следует ждать определенного времени, прежде чем представить изображение. Вы просто должны представить его, когда закончите рендеринг. Ваша синхронизация должна быть полностью основана на получении, представлении команд и семафоров или ограждений, предоставленных во время этих операций и во время отправки. Соответствующий настоящий режим должен делать все остальное. Подробное объяснение различных существующих режимов доступно в руководстве Intel.

Другие вопросы по тегам