调用 vrapi_SubmitFrame2() 时的 SIGSEGV

SIGSEGV when calling vrapi_SubmitFrame2()

我正在将游戏移植到 Quest,因此我的部分工作是将引擎的 Vulkan 渲染器与 Oculus Mobile SDK 连接。

我相信我正确设置了 SDK(我正在遵循 Oculus 文档中的示例和指南),但在尝试提交框架时我仍然遇到严重错误。

这是我目前正在做的事情的高级列表:

然后在我的渲染循环结束时我设置了一个 ovrSubmitFrameDesc 然后调用 vrapi_SubmitFrame2()。我还确保在所有工作都提交给 GPU 后才调用 vrapi_SubmitFrame2()(我目前在我的工作队列上使用栅栏)。

但是,正如我之前提到的,对 vrapi_SubmitFrame2() 的调用失败了。它目前在 Quest 的 Vulkan 驱动程序中引发了一个 SIGSEGV:

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().

的线程相同

首先让我问:您认为谁会赢,18 年的软件开发经验还是这里的“&”这个坏人?

vrapi_SubmitFrame2()引发的SIGSEGV之谜无非是在设置OVR的同步队列时犯了一个愚蠢的错误:

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

那一行应该写成:

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