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