调用 vrapi_SubmitFrame2() 时的 SIGSEGV
SIGSEGV when calling vrapi_SubmitFrame2()
我正在将游戏移植到 Quest,因此我的部分工作是将引擎的 Vulkan 渲染器与 Oculus Mobile SDK 连接。
我相信我正确设置了 SDK(我正在遵循 Oculus 文档中的示例和指南),但在尝试提交框架时我仍然遇到严重错误。
这是我目前正在做的事情的高级列表:
- 我初始化API.
- 我创建了一个带有预期扩展的 Vulkan 实例和设备。
- 我获得了每只眼睛的交换链,并为它们的每个图像获取了 Vulkan 处理程序。
- 我使用这些图像设置帧缓冲区和渲染通道。
- 我获得了原生android window.
- 我进入 VR 模式(确保应用已恢复)。
然后在我的渲染循环结束时我设置了一个 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);
我正在将游戏移植到 Quest,因此我的部分工作是将引擎的 Vulkan 渲染器与 Oculus Mobile SDK 连接。
我相信我正确设置了 SDK(我正在遵循 Oculus 文档中的示例和指南),但在尝试提交框架时我仍然遇到严重错误。
这是我目前正在做的事情的高级列表:
- 我初始化API.
- 我创建了一个带有预期扩展的 Vulkan 实例和设备。
- 我获得了每只眼睛的交换链,并为它们的每个图像获取了 Vulkan 处理程序。
- 我使用这些图像设置帧缓冲区和渲染通道。
- 我获得了原生android window.
- 我进入 VR 模式(确保应用已恢复)。
然后在我的渲染循环结束时我设置了一个 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);