我正在将一款游戏移植到Quest,因此我的部分工作是将引擎的Vulkan渲染器与Oculus Mobile SDK对接。
我相信我正确地设置了SDK(我遵循了Oculus文档中的示例和指南(,但在尝试提交框架时仍然遇到了一个严重的错误。
以下是我目前正在做的事情的高级列表:
- 我初始化API
- 我创建了一个带有预期扩展的Vulkan实例和设备
- 我获取每只眼睛的交换链,并为它们的每一张图像获取Vulkan处理程序
- 我使用这些图像设置帧缓冲区和渲染过程
- 我获得了一个原生的android窗口
- 我进入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年的软件开发经验,还是这个糟糕的boi?
在设置OVR的同步队列时,从vrapi_SubmitFrame2()
引发的SIGSEGV之谜只不过是一个愚蠢的错误
vpapi_DefaultModeParmsVulkan(&m_java, (long long)&queueHandle);
那行应该写为:
vpapi_DefaultModeParmsVulkan(&m_java, (long long)queueHandle);