【问题标题】:Strange OpenXR Behaviour on xrEndFramexrEndFrame 上的奇怪 OpenXR 行为
【发布时间】:2021-08-24 07:24:57
【问题描述】:

首先:上下文是带有 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, Type:D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, SubresourceIndex:0}, pSrcBox:{left:0, top:0, front:0, right:2088, bottom:2036, back:1})      
6   8066    CopyTextureRegion(pDst:{pResource:obj#4083, Type:D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, SubresourceIndex:1}, DstX:0, DstY:0, DstZ:0, pSrc:{pResource:obj#4085, Type:D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, SubresourceIndex:0}, pSrcBox:{left:0, top:0, front:0, right:2088, bottom:2036, 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, 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,所以现在我们不能交换运行时。

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

【问题讨论】:

  • 此问题是否会在另一台不同品牌的设备上重现?如果确实重现,请提供 MVCE(stackoverflow.com/help/minimal-reproducible-example),以便我们定位问题或找到解决方案。
  • 感谢@Hernando-MSFT - 我们已经在另一个 WMR 设备和品牌上进行了复制,现在只是将一些代码放在一起。提交给你们看的最佳地点在哪里?
  • 建议通过此链接打开支持票:support.serviceshub.microsoft.com/supportforbusiness/… 然后选择“混合现实”、“沉浸式耳机编程”、“调试”和“崩溃或停止响应”来帮助我们快速路由并解决您的请求。

标签: directx-12 windows-mixed-reality openxr


【解决方案1】:

所以这最终被追查到我们的错误。 在我们的例子中,我们使用 xrGetD3D12GraphicsRequirementsKHR 来获得 openxr 的最低图形要求。

这在结构 XrGraphicsRequirementsD3D12KHR 中有一个 adapterLuid 标识符,我们应该在图形 API 中使用它来选择 GPU,但没有。

【讨论】:

    猜你喜欢
    • 2013-09-24
    • 1970-01-01
    • 2020-12-26
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多