A Interface de hardware de renderização (RHI) agora é compatível com a computação assíncrona (AsyncCompute) para Xbox One. Essa é uma boa maneira de utilizar recursos não utilizados da GPU (unidades de computação (CUs), registros e largura de banda), executando chamadas dispatch() de forma assíncrona com a renderização. A computação assíncrona usa um contexto separado, e fornecemos funções da RHI para sincronizar os contextos de renderização e computação. O Dr. PIX é útil para identificar áreas que podem se beneficiar com a computação assíncrona. Por exemplo, se metade das CUs não for usada durante uma etapa de renderização específica, elas poderão ser utilizadas por um trabalho de computação assíncrono.
A computação assíncrona tem algumas restrições:
Buffers com contadores de UAV não são compatíveis (isso é uma limitação do XDK e gerará um aviso D3D).
Trabalhos de computação assíncrona não aparecem em capturas PIX de GPU (embora apareçam em capturas de tempo), o PIX captura apenas o contexto imediato dos gráficos (isso é uma limitação da plataforma).
Liberações automáticas de pipeline não são fornecidas pelo driver. Você precisa chamar explicitamente RHICSManualGpuFlush se forem necessárias limpezas (por exemplo, se um despacho depender do anterior).
API
RHIBeginAsyncComputeJob_DrawThread (EAsyncComputePriority Priority)
Inicia um trabalho de computação assíncrona a partir do thread de renderização. A prioridade é usada para determinar o número de recursos de shader a serem alocados ao trabalho (via ID3D11XComputeContext::SetLimits). No momento, há duas prioridades disponíveis: AsyncComputePriority_High e AsyncComputePriority_Default.
RHIEndAsyncComputeJob_DrawThread
Conclui um trabalho de computação assíncrona. Retorna um índice de 32 bits que pode ser usado para sincronização ou -1 se a computação estiver desabilitada ou se não houver um trabalho de computação ativo.
RHIGraphicsWaitOnAsyncComputeJob
Insere o comando n no contexto imediato dos gráficos para bloquear até que um trabalho assíncrono seja concluído. Passar -1 faz com que isso seja antecipado.
Entre chamadas para RHIBeginAsyncComputeJob_DrawThread e RHIEndAsyncComputeJob_DrawThread, a RHI estará no estado de computação assíncrona. Durante esse período, os comandos de RHI com suporte serão executados pelo contexto de computação assíncrona. As funções de RHI sem suporte serão habilitadas.
Desabilitando/habilitando
A computação assíncrona pode ser habilitada ou desabilitado no tempo de compilar com #define USE_ASYNC_COMPUTE_CONTEXT. Ele pode ser desabilitado em tempo de execução com r.rdg.asynccompute variável de console. Quando a computação assíncrona está desabilitada, os envios dentro dos blocos de computação assíncrona são executados sincronicamente no buffer de comando gráfico. USE_ASYNC_COMPUTE_CONTEXT é definido como 0 no PC, pois não tem suporte em D3D11.1.
PIX
Trabalhos de contexto de computação assíncrona não são capturados em capturas de GPU. Portanto, essas capturas podem fornecer uma imagem enganosa do desempenho da GPU quando a computação assíncrona estiver habilitada. Para fins de depuração gráfica, a computação assíncrona deve ser desabilitada usando a cvar acima. A computação assíncrona tem suporte com capturas de tempo PIX. Elas aparecem na linha do tempo assim:
Crédito
Essa funcionalidade foi implementada pela Lionhead Studios. Nós a integramos e pretendemos usá-la como uma ferramenta para otimizar a renderização do XboxOne.