L'interface matérielle de rendu (RHI) prend désormais en charge le calcul asynchrone (AsyncCompute) sur Xbox One. C'est un bon moyen d'utiliser les ressources inutilisées du processeur graphique [unités de calcul (UC), registres et bande passante], en exécutant des appels asynchrones de dispatch() avec le rendu. Async Compute utilise un contexte distinct, et nous fournissons des fonctions de RHI pour synchroniser les contextes de rendu et de calcul. Dr PIX permet d'identifier les zones qui peuvent bénéficier du calcul asynchrone. Par exemple, si la moitié des UC ne sont pas utilisées pendant une passe de rendu donnée, ces UC peuvent être utilisées par une tâche de calcul asynchrone.
Async Compute comporte des restrictions :
Les tampons avec compteurs d'UAV ne sont pas pris en charge (il s'agit d'une limitation de XDK, qui génère un avertissement D3D).
Les tâches Async Compute n'apparaissent pas dans les captures de GPU de PIX (bien qu'elles apparaissent dans les captures de synchronisation). PIX ne capture que le contexte graphique immédiat (il s'agit d'une limitation de la plateforme).
Les vidages automatiques du pipeline ne sont pas assurés par le pilote. Vous devez appeler explicitement RHICSManualGpuFlush si des vidages sont nécessaires (par exemple lorsqu'un envoi dépend du précédent).
API
RHIBeginAsyncComputeJob_DrawThread (EAsyncComputePriority Priority)
Lancer une tâche de calcul asynchrone à partir du thread de rendu. La priorité permet de déterminer le nombre de ressources de shader à allouer à la tâche (via ID3D11XComputeContext::SetLimits). Actuellement, deux priorités sont disponibles : AsyncComputePriority_High et AsyncComputePriority_Default.
RHIEndAsyncComputeJob_DrawThread
Mettre fin à une tâche de calcul asynchrone. Renvoyer un index de barrière 32 bits qui peut être utilisé pour la synchronisation, ou -1 si le calcul est désactivé ou s'il n'y a pas de tâche de calcul active.
RHIGraphicsWaitOnAsyncComputeJob
Insérer la commande n dans le contexte graphique immédiat pour bloquer jusqu'à la fin d'une tâche asynchrone. Transmettre la valeur -1 entraîne un arrêt anticipé.
Entre les appels de RHIBeginAsyncComputeJob_DrawThread et RHIEndAsyncComputeJob_DrawThread, la RHI sera à l'état de calcul asynchrone. Pendant ce temps, les commandes de RHI prises en charge sont exécutées via le contexte de calcul asynchrone. Les fonctions de RHI non prises en charge génèrent une assertion.
Désactivation/Activation
Le calcul asynchrone peut être activé ou désactivé au moment de la compilation à l'aide de la commande #define USE_ASYNC_COMPUTE_CONTEXT. Il peut être désactivé au moment de l'exécution à l'aide de la variable de console r.rdg.asynccompute . Lorsque le calcul asynchrone est désactivé, les envois au sein des blocs de calcul asynchrone sont exécutés de manière synchrone sur le tampon de commande graphique. La fonction USE_ASYNC_COMPUTE_CONTEXT est définie sur 0 sur PC, car elle n'est pas prise en charge dans D3D11.1.
PIX
Les tâches de contexte de calcul asynchrone ne sont pas capturées dans les captures de GPU. Ces captures peuvent donc donner une image trompeuse des performances du GPU lorsque le calcul asynchrone est activé. À des fins de débogage graphique, il convient de désactiver l'exécution asynchrone à l'aide de la cvar ci-dessus. Le calcul asynchrone est pris en charge par les captures de synchronisation PIX. Elles apparaissent comme suit dans la chronologie :
Crédit
Cette fonctionnalité a été implémentée par Lionhead Studios. Nous l'avons intégré et nous avons l'intention de l'utiliser comme un outil pour optimiser le rendu de XboxOne.