Повторное использование запросов окклюзии Vulkan сразу после их сброса приводит к странному поведению - PullRequest
0 голосов
/ 30 апреля 2020

В настоящее время я реализую метод отбора окклюзии (CHC ++) в Vulkan и столкнулся с довольно странной проблемой при использовании запросов окклюзии. Чтобы указать c, некоторые сетки не отображаются полностью при представлении фрейма, но все правильно при попытке отладки с помощью Nvidia Nsight или RenderDo c. Это происходит при низкой частоте кадров и вызывает много «мерцания».

Это также происходит только в том случае, если у меня есть более одного кадра в полете. У меня есть пул запросов для каждого кадра в полете с 5000 запросов окклюзии каждый. В каждом фрейме я сначала сбрасываю все запросы пула запросов фрейма. Затем я пересекаю сцену спереди назад, отрисовываю ее часть и запрашиваю некоторые объекты. Затем я отрисовываю следующую часть и снова запрашиваю, пока не отрендерю / протестирую все. Между тем я проверяю, выполнен ли запрос уже, и обрабатываю его результат. В конце кадра я обрабатываю оставшиеся запросы и отрисовываю прозрачные объекты. Рендеринг и запросы выполняются в нескольких отправках командного буфера и синхронизируются семафорами (этап ожидания не имеет значения для этой проблемы), поскольку буферы команд генерируются во время выполнения и различаются для каждого кадра.

Вот как выглядит мой конвейер рендеринга как в принципе:

Start of frame
Reset queries of the frame
Render skybox
Submit commandbuffer
Traverse scene front-to-back
    if my number of objects to test for occlusion exceed a batch limit
         render objects that I already traversed
         submit
         query objects that need testing
         submit
    handle completed queries
handle remaining queries
render transparent objects
submit
present frame

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

Я не получаю никаких ошибок проверки, мои запросы окклюзии не сбрасываются. Я получаю только ошибки проверки VK_ERROR_VALIDATION_FAILED_EXT при отладке с помощью Nsight Graphics при проверке, завершен ли запрос, но еще не завершен. Но эта ошибка проверки не выдается при нормальном выполнении, поэтому, вероятно, что-то связано с отладкой фреймов.

У кого-нибудь еще были подобные проблемы при использовании запросов окклюзии? Или кто-нибудь знает, можно ли на самом деле выполнить синхронизацию на графическом процессоре для запросов окклюзии или мне нужно подождать на хосте, чтобы они были сброшены, прежде чем я смогу их использовать?

...