SIGSEGV при вызове vrapi_SubmitFrame2()

Я переношу игру на 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().


person Pedro Boechat    schedule 12.03.2021    source источник


Ответы (1)


Позвольте мне начать с вопроса: как вы думаете, кто победит, 18 лет опыта в разработке программного обеспечения или этот плохой мальчик здесь '&'?

Загадка поднятия SIGSEGV из vrapi_SubmitFrame2() была не чем иным, как глупой ошибкой при настройке очереди синхронизации OVR:

vpapi_DefaultModeParmsVulkan(&m_java, (long long)&queueHandle);

Эта строка должна была быть написана так:

vpapi_DefaultModeParmsVulkan(&m_java, (long long)queueHandle);
person Pedro Boechat    schedule 15.03.2021