Я переношу игру на Quest, поэтому часть моей работы заключается в том, чтобы связать рендерер Vulkan движка с Oculus Mobile SDK.
Я считаю, что правильно настраиваю SDK (я следую примерам и рекомендациям из документации Oculus), но все равно получаю неприятную ошибку при попытке отправить кадр.
Вот общий список того, чем я сейчас занимаюсь:
- Я инициализирую API.
- Я создаю экземпляр и устройство Vulkan с ожидаемыми расширениями.
- Я приобретаю цепочки обмена для каждого глаза и получаю обработчики Vulkan для каждого из их изображений.
- Я настраиваю фреймбуферы и рендерпассы, используя эти изображения.
- Я приобретаю родное окно Android.
- Я вхожу в режим VR (убедившись, что приложение возобновлено).
Затем в конце цикла рендеринга я устанавливаю ovrSubmitFrameDesc
, а затем вызываю vrapi_SubmitFrame2()
. Я также удостоверяюсь, что вызываю vrapi_SubmitFrame2()
только после того, как вся работа будет отправлена в GPU (в настоящее время я использую забор для своих рабочих очередей).
Однако, как я упоминал ранее, вызов vrapi_SubmitFrame2()
терпит неудачу. В настоящее время он вызывает SIGSEGV внутри драйвера Quest Vulkan:
backtrace:
#00 pc 000000000010b2d8 /vendor/lib64/hw/vulkan.kona.so (!!!0000!b78ad09fc24eab751708d0a80613cf!09c6a36!+24) (BuildId: cc478ff923cc27b87607fb1f1a3b87ef)
#01 pc 00000000000c3b04 /vendor/lib64/hw/vulkan.kona.so (qglinternal::vkQueueSubmit(VkQueue_T*, unsigned int, VkSubmitInfo const*, VkFence_T*)+4468) (BuildId: cc478ff923cc27b87607fb1f1a3b87ef)
#02 pc 000000000018a608 /system/priv-app/VrDriver/VrDriver.apk!libvrapiimpl.so (offset 0x8cd000) (BuildId: aa2c28d3d4127c2e2e9a5125be000207dcc27ebd)
#03 pc 0000000000160a2c /system/priv-app/VrDriver/VrDriver.apk!libvrapiimpl.so (offset 0x8cd000) (BuildId: aa2c28d3d4127c2e2e9a5125be000207dcc27ebd)
#04 pc 0000000000162b6c /system/priv-app/VrDriver/VrDriver.apk!libvrapiimpl.so (offset 0x8cd000) (vrapi_SubmitFrame2+7564) (BuildId: aa2c28d3d4127c2e2e9a5125be000207dcc27ebd)
#05 pc 00000000048a85fc /data/app/myapp-Y6tT_vtGWj8JJ1PwgxheNA==/base.apk!libgrid.so (offset 0x6a9b000) (MyEngine::endVrFrame(unsigned int)+160) (BuildId: c9933f7ea0ad0c36a592bc4316e499e9db767d60)
Тот факт, что ошибка возникает при внутреннем вызове vkQueueSubmit()
, заставляет меня думать, что это как-то связано с тем, как я использую очереди команд. Но даже если я установлю отдельную очередь в качестве очереди синхронизации и ничего с ней не сделаю (т. е. не отправлю ей никакой команды), я все равно получаю ту же ошибку.
Кто-нибудь знает, что я могу делать неправильно?
PS (1), я пытался использовать пустой слой вместо правильного слоя проекции, просто чтобы посмотреть, смогу ли я пройти эту точку, но это не помогло.
PS (2), я не получаю ошибок на уровне проверки.
PS (3), поток, в котором я вхожу в режим VR, - это тот же поток, в котором я звоню vrapi_SubmitFrame2()
.