首先,上下文为VR,其中包含G2、WMR运行时、DX12。
在使用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,所以现在我们不能交换运行时。
显然,我们有一个解决办法,就是设置首选的设备。但是,了解这个问题是如何/为什么发生的将是很好的。
发布于 2021-08-20 10:03:02
因此,这最终被追踪到我们的错误。在我们的例子中,我们使用xrGetD3D12GraphicsRequirementsKHR来获得openxr的最低图形要求。
它在结构adapterLuid中有一个XrGraphicsRequirementsD3D12KHR标识符,我们应该使用它来选择图形API中的GPU,但是没有。
https://stackoverflow.com/questions/67867743
复制相似问题