Странное поведение OpenXR на xrEndFrame
Во-первых: контекст - это VR с HP Reverb G2, среда выполнения WMR, DX12.
Мы наблюдаем необъяснимое поведение на машинах разработчиков при работе с OpenXR. Похоже, что среда выполнения OpenXR меняет свое представление в зависимости от настроек компьютера для предпочтительного графического процессора.
В частности, мы заметили, что в зависимости от настроек машины для предпочтительного графического процессора мы видим, что при вызове используется другой метод. Это большое дело, поскольку другой метод приводит к тому, что в нашем текущем renderTarget отображается пустой экран!
Разница в том, что, когда предпочтительным устройством является графический процессор Nvidia, 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)
а когда это не так (то есть, может быть, как-то забрать Intel на борту?), это выглядит так:
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 и рисует сверху четырехугольник с размерами дисплея гарнитуры.
Тем не менее, мы проверили код рендеринга, и он определенно не выбирает графическое устройство Intel. Однако второе поведение исчезнет, если мы установим «предпочтительный графический процессор» на nvidia gpu в панели управления nvidia.
Мы также можем видеть, что указанное выше поведение является результатом вызова
XrEndFrame
, и что наш код рендеринга в остальном идентичен.
Есть какие-нибудь подсказки относительно того, на какую часть среды выполнения может влиять этот параметр?
К сожалению (случайно?) Мы обнаружили, что нам нужно поработать над кодом рендеринга, чтобы иметь возможность поменять местами среды выполнения, чтобы сказать SteamVR, поэтому сейчас мы не можем поменять местами среду выполнения.
Очевидно, у нас есть обходной путь - установить предпочтительное устройство. Но было бы здорово понять, как / почему возникает эта проблема.
1 ответ
Итак, наконец, мы обнаружили ошибку. В нашем случае мы использовали
xrGetD3D12GraphicsRequirementsKHR
чтобы получить минимальные требования к графике для openxr.
Это имеет
adapterLuid
идентификатор в структуре
XrGraphicsRequirementsD3D12KHR
который мы должны были использовать для выбора графического процессора в графическом API, но этого не произошло.