问题描述
首先:上下文是带有 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 (将#修改为@)