Compartir a través de


Diseño de la filosofía de las colas y las listas de comandos

Los objetivos de habilitar la reutilización del trabajo de representación y del escalado multiproceso, requerían cambios fundamentales en el modo en que las aplicaciones direct3D envían el trabajo de representación a la GPU. En Direct3D 12, el proceso de envío del trabajo de representación difiere de las versiones anteriores de tres maneras importantes:

  1. Eliminación del contexto inmediato. Esto habilita el multiproceso.
  2. Las aplicaciones ahora poseen cómo se agrupan las llamadas de representación en elementos de trabajo de la unidad de procesamiento de gráficos (GPU). Esto permite volver a usar.
  3. Las aplicaciones ahora controlan explícitamente cuándo se envía el trabajo a la GPU. Esto habilita los elementos 1 y 2.

Eliminación del contexto inmediato

El cambio más grande de Microsoft Direct3D 11 a Microsoft Direct3D 12 es que ya no hay un único contexto inmediato asociado a un dispositivo. En su lugar, para representar, las aplicaciones crean listas de comandos en las que se puede llamar a las API de representación tradicionales. Una lista de comandos es similar al método render de una aplicación de Direct3D 11 que usó el contexto inmediato en que contiene llamadas que dibujan primitivos o cambian el estado de representación. Al igual que los contextos inmediatos, cada lista de comandos no está libre; sin embargo, se pueden grabar varias listas de comandos simultáneamente, lo que aprovecha los procesadores modernos y de varios núcleos.

Normalmente, las listas de comandos se ejecutan una vez. Sin embargo, una lista de comandos se puede ejecutar varias veces si la aplicación garantiza que las ejecuciones anteriores se completen antes de enviar nuevas ejecuciones. Para obtener más información sobre la sincronización de listas de comandos, vea Ejecución y sincronización de listas de comandos.

Agrupación de elementos de trabajo de GPU

Además de las listas de comandos, Direct3D 12 aprovecha las ventajas de la funcionalidad presente en todo el hardware hoy mediante la adición de un segundo nivel de listas de comandos, que se denominan agrupaciones. Para ayudar a distinguir estos dos tipos, las listas de comandos de primer nivel se pueden denominar listas de comandos directos. El propósito de las agrupaciones es permitir que las aplicaciones agrupe un pequeño número de comandos de API para la ejecución repetida más adelante desde listas de comandos directos. En el momento de crear una agrupación, el controlador realizará tanto procesamiento previo como sea posible para que la ejecución posterior sea eficaz. A continuación, las agrupaciones se pueden ejecutar desde varias listas de comandos y varias veces dentro de la misma lista de comandos.

La reutilización de agrupaciones es un gran controlador de eficacia mejorada con subprocesos de CPU únicos. Dado que los paquetes se procesan previamente y se pueden enviar varias veces, hay ciertas restricciones en las operaciones que se pueden realizar dentro de una agrupación. Para obtener más información, consulte Creación y grabación de listas y agrupaciones de comandos.

Envío de trabajo de GPU

Para ejecutar el trabajo en la GPU, una aplicación debe enviar explícitamente una lista de comandos a una cola de comandos asociada al dispositivo Direct3D. Se puede enviar una lista de comandos directos para su ejecución varias veces, pero la aplicación es responsable de garantizar que la lista de comandos directos haya terminado de ejecutarse en la GPU antes de enviarlo de nuevo. Los conjuntos no tienen restricciones de uso simultáneo y se pueden ejecutar varias veces en varias listas de comandos, pero los conjuntos no se pueden enviar directamente a una cola de comandos para su ejecución.

Cualquier subproceso puede enviar una lista de comandos a cualquier cola de comandos en cualquier momento y el tiempo de ejecución serializará automáticamente el envío de la lista de comandos en la cola de comandos mientras conserva el orden de envío.