Странное поведение 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, но этого не произошло.

Другие вопросы по тегам