Vulkan рендер завершил синхронизацию без vkQueuePresentKHR () - PullRequest
0 голосов
/ 24 января 2020

В Oculus mobile VrApi у нас нет доступа к vkQueuePresentKHR (), мы предоставляем слой для каждого глаза для vrapi_SubmitFrame2 ().

В примере vulkan используются заборы для синхронизации с vkQueueSubmit () и vkWaitForFence (). Он работает с простым рендерингом, но если я использую более длинный рендеринг, он не завершается, когда он отображается на экране.

Насколько я понимаю, это нормально, поскольку заборы позволяют синхронизацию на уровне ЦП, но синхронизация с графическим процессором выполняется с семафорами.

Я могу сигнализировать, что рендеринг завершен семафором в vkQueueSubmit (), но я не могу дождаться, чтобы этот семафор получил сигнал, потому что vrapi_SubmitFrame2 () этого не делает используйте поле «.pWaitSemaphores».

Как ждать рендеринга до фини sh?

Для информации, версия Vulkan - 1.0, но я думаю, что могу использовать v1 0,1.

1 Ответ

0 голосов
/ 27 января 2020

vrapi_SubmitFrame2 принимает CompletionFence, который является EGLsync объектом, поскольку VrApi предназначен для работы с OpenGL ES, а не с Vulkan. Поэтому не существует одношагового способа синхронизации без пузырьков.

Самое простое решение - убедиться, что ваш рендеринг завершен до вызова vrapi_SubmitFrame2. Пройдите через забор в vkQueueSubmit, подождите, пока он подаст сигнал, а затем позвоните vrapi_SubmitFrame2 Однако это увеличит задержку и снизит производительность (за счет уменьшения параллелизма между работой процессора и графического процессора), что может быть неприемлемо, особенно для VR.

Более сложным решением будет создание внешнего семафора Vulkan с использованием дескриптора VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT тип. Передайте это как семафор сигнала в vkQueueSubmit. Затем вы можете извлечь базовый синтаксис c fd с помощью vkGetSemaphoreFdKHR. Создайте EGLsyncKHR из этого, используя расширение EGL_ANDROID_native_fence_syn c, и передайте его в vrapi_SubmitFrame2 в качестве CompletionFence. Это много шагов, но базовая синхронизация (рендеринг завершен -> запуск timewarp) должна быть такой же эффективной, как та, которую вы получите, выполняя рендеринг с GLES, или если VrApi изначально поддерживает Vulkan.

...