La interfaz de hardware de renderizado (RHI) ahora es compatible con la computación asíncrona (AsyncCompute) para Xbox One. Esta es una buena manera de utilizar los recursos de la GPU sin usar (unidades de cálculo (CU), registros y ancho de banda), ejecutando llamadas a dispatch() de forma asíncrona con el renderizado. La computación asíncrona usa un contexto independiente y proporcionamos funciones RHI para sincronizar los contextos de renderizado y de computación. Dr PIX es útil para identificar áreas que podrían beneficiarse de la computación asíncrona. Por ejemplo, si la mitad de las UC quedan sin usar durante un pase de renderizado concreto, esas UC podrían utilizarse en un trabajo de computación asíncrona.
La computación asíncrona tiene algunas restricciones:
Los búferes con contadores de UAV no son compatibles (esta es una limitación del XDK y generará una advertencia de D3D).
Los trabajos de computación asíncrona no aparecen en las capturas de GPU de PIX (aunque sí aparecen en las capturas de sincronización). PIX solo captura el contexto inmediato de los gráficos (esto es una limitación de la plataforma).
El controlador no realiza vaciados automáticos de los procesos. Tienes que llamar explícitamente a RHICSManualGpuFlush si se necesitan vaciados (p. ej. si un envío depende del anterior).
API
RHIBeginAsyncComputeJob_DrawThread (EAsyncComputePriority Priority)
Inicia un trabajo de computación asíncrona desde el subproceso de renderizado. La prioridad se usa para determinar el número de recursos de sombreadores que asignar al trabajo (a través de ID3D11XComputeContext::SetLimits). Actualmente, hay dos prioridades disponibles, AsyncComputePriority_High y AsyncComputePriority_Default.
RHIEndAsyncComputeJob_DrawThread
Finaliza un trabajo de cálculo asíncrono. Devuelve un índice de valla de 32 bits que puedes usar para la sincronización, o -1 si el cálculo está desactivado o no hay ningún trabajo de cálculo activo.
RHIGraphicsWaitOnAsyncComputeJob
Inserta el comando n en el contexto inmediato del gráfico para bloquear hasta que finalice una tarea asíncrona. Pasar -1 provoca que se agote antes de tiempo.
Entre llamadas a RHIBeginAsyncComputeJob_DrawThread y RHIEndAsyncComputeJob_DrawThread, la RHI estará en estado de computación asíncrona. Durante este tiempo, los comandos RHI compatibles se ejecutarán a través del contexto de computación asíncrona. Se afirmarán las funciones de RHI no compatibles.
Activación y desactivación
La computación asíncrona puede activarse o desactivarse durante la compilación con #define USE_ASYNC_COMPUTE_CONTEXT. Se puede desactivar en tiempo de ejecución con la variable de consola r.rdg.asynccompute . Cuando la computación asíncrona está desactivada, los envíos dentro de los bloques de computación asíncrona se ejecutan de forma síncrona en el búfer de comandos gráficos. USE_ASYNC_COMPUTE_CONTEXT se define como 0 en PC, ya que no es compatible con D3D11.1.
PIX
Las tareas de contexto de computación asíncrona no se registran en las capturas de GPU, por lo que estas capturas pueden dar una imagen engañosa del rendimiento de la GPU cuando la computación asíncrona está activa. Para la depuración de gráficos, deberías desactivar la computación asíncrona con la cvar de arriba. La computación asíncrona es compatible con las capturas de sincronización de PIX. Se muestran así en la cronología:
Crédito
Lionhead Studios ha implementado esta función. La integramos y tenemos intención de usarla como herramienta para optimizar el renderizado de Xbox One.