Synchronization Vulkan render在没有vkQueuePresentKHR()的情况下完成同步

Synchronization Vulkan render在没有vkQueuePresentKHR()的情况下完成同步,synchronization,semaphore,vulkan,Synchronization,Semaphore,Vulkan,在Oculus mobile VrApi中,我们无法访问vkQueuePresentKHR(),我们为VrApi_SubmitFrame2()的每只眼睛提供了一个层 vulkan示例使用fence与vkQueueSubmit()和vkWaitForFence()同步。 它适用于简单渲染,但如果使用较长的渲染,则在屏幕上显示时,渲染尚未完成 据我所知,这是正常的,因为围栏允许在CPU级别进行同步,但与GPU的同步是通过信号量完成的 我可以用vkQueueSubmit()中的一个信号量发出渲染完成的

在Oculus mobile VrApi中,我们无法访问vkQueuePresentKHR(),我们为VrApi_SubmitFrame2()的每只眼睛提供了一个层

vulkan示例使用fence与vkQueueSubmit()和vkWaitForFence()同步。 它适用于简单渲染,但如果使用较长的渲染,则在屏幕上显示时,渲染尚未完成

据我所知,这是正常的,因为围栏允许在CPU级别进行同步,但与GPU的同步是通过信号量完成的

我可以用vkQueueSubmit()中的一个信号量发出渲染完成的信号,但我不能等待这个信号量发出信号,因为vrapi_SubmitFrame2()不使用“.pWaitSemaphores”字段

如何等待渲染完成


关于信息,Vulkan版本是1.0,但我想我可以使用v1.1。

vrapi_SubmitFrame2接受一个
CompletionFence
,这是一个
EGLsync
对象,因为vrapi是设计用于OpenGL ES的,而不是Vulkan。因此,没有一种单步方法可以实现无气泡同步

最简单的解决方案是确保在调用vrapi_SubmitFrame2之前已完成渲染。将围栏传递到
vkQueueSubmit
,等待它发出信号,然后调用
vrapi\u SubmitFrame2
。然而,这将增加延迟并降低性能(通过减少CPU和GPU工作之间的并发性),这对于VR来说可能是不可接受的


更复杂的解决方案是使用
VK\u external\u semaphore\u HANDLE\u TYPE\u SYNC\u FD\u BIT
句柄类型创建Vulkan外部信号量。将其作为信号量传递给
vkQueueSubmit
。然后,您可以使用
vkGetSemaphoreFdKHR
提取底层同步fd。使用扩展名从中创建一个
EGLsyncKHR
,并将其作为
CompletionFence
传递到
vrapi\u SubmitFrame2
中。这是很多步骤,但是底层同步(render complete->timewarp start)应该和使用GLES渲染或者VrApi本机支持Vulkan一样高效。

这对Oculus API来说不是比Vulkan更重要吗?在某种程度上,我认为其他移动vr API或web vr API,可能共享相同的同步/演示规则。谢谢。我不知道如何用EGL_ANDROID_native_fence_sync创建一个EGLSyncKHR,你能帮我吗?我找不到vrapi_SubmitFence2(),我猜你是指vrapi_SubmitFrame2(),但我看不到任何越过围栏的方法。对不起,是的,我的意思是
vrapi_SubmitFrame2
(答案已编辑)。您要通过的围栏是您在
ovrSubmitFrameDescription::CompletionFence
字段中创建的EGLsyncKHR。Oculus在他们的文档中谈到了ovrSubmitFrameDescription,但我在VrApi中找不到该结构。啊,不知道该告诉您什么——我也在查看文档。