xrEndFrame 上的奇怪 OpenXR 行为

问题描述

首先:上下文是带有 HP Reverb G2、WMR 运行时、DX12 的 VR。

在使用 OpenXR 时,我们发现开发人员机器上出现了一些无法解释的行为。看起来 OpenXR 运行时正在改变其呈现方式,具体取决于首选 GPU 的机器设置。

更具体地说,我们注意到根据首选 GPU 的机器设置,我们看到调用 XrEndFrame 时使用了不同的方法。这很重要,因为不同的方法会导致在我们当前的 rendertarget 中绘制一个空白屏幕!

不同之处在于,当首选设备是 Nvidia GPU 时,xrEndFrame 在 PIX 中看起来像这样(在与主渲染分开的图形队列中):

Index   Global ID   Name    EOP to EOP Duration (ns)    Execution Start Time (ns)
2   8063    Signal(pFence:obj#20,Value:62)     
3   8064    Wait(pFence:obj#36,Value:31)       
5   8065    copyTextureRegion(pDst:{pResource:obj#4083,Type:D3D12_TEXTURE_copY_TYPE_SUBRESOURCE_INDEX,SubresourceIndex:0},DstX:0,DstY:0,DstZ:0,pSrc:{pResource:obj#4084,pSrcBox:{left:0,top:0,front:0,right:2088,bottom:2036,back:1})      
6   8066    copyTextureRegion(pDst:{pResource:obj#4083,SubresourceIndex:1},pSrc:{pResource:obj#4085,back:1})      
8   8067    Signal(pFence:obj#20,Value:63)     
9   8068    Signal(pFence:obj#21,Value:31)     

如果不是,(即不知何故可能在板载英特尔?)它看起来像这样:

Index   Global ID   Name    EOP to EOP Duration (ns)    Execution Start Time (ns)
0   8064    Wait(pFence:obj#45,Value:21)       
2   8065    ClearrendertargetView(rendertargetView:res#4008,ColorRGBA:{Element:0,Element:0,Element:0},NumRects:0,pRects:nullptr)        
15  8066    DrawIndexedInstanced(IndexCountPerInstance:4,InstanceCount:2,StartIndexLocation:0,BaseVertexLocation:0,StartInstanceLocation:0)     
17  8067    Signal(pFence:obj#22,Value:23)     
18  8068    Signal(pFence:obj#23,Value:21)     

后者正在清除当前的 rendertargetView 并在顶部绘制一个四边形,即耳机显示器的尺寸。

然而 - 我们已经检查了渲染代码,它绝对没有选择英特尔图形设备。但是,如果我们在 nvidia 控制面板中将“首选图形处理器”设置为 nvidia gpu,则第二种行为就会消失。

我们还可以看到上述行为是调用 XrEndFrame 的结果,否则我们的渲染代码是相同的。

关于运行时的哪一部分可能会查看或受此设置影响的任何线索?

不幸的是(偶然?)我们发现我们需要处理渲染代码,以便能够将运行时交换为 SteamVR,所以现在我们无法交换运行时。

显然我们有一个解决方法,那就是设置首选设备。但是了解这个问题是如何/为什么会发生会很棒。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...