Uso avanzado de tablas de descriptores

En las secciones siguientes se proporciona información sobre el uso avanzado de tablas de descriptores.

Cambio de entradas de tabla descriptor entre llamadas de representación

Después de que se hayan enviado listas de comandos que establecen tablas de descriptores a una cola para su ejecución, la aplicación no debe editar desde la CPU las partes de los montones de descriptores a los que puede hacer referencia la GPU hasta que la aplicación sepa que la GPU ha terminado de usar las referencias.

La finalización del trabajo se puede determinar en un límite estricto mediante barreras de API para realizar un seguimiento del progreso de la GPU, o más mecanismos generales, como esperar a ver que se ha enviado la representación para mostrar: lo que se adapte a la aplicación. Si una aplicación sabe que solo se accederá a un subconjunto de la región a la que apunta una tabla de descriptores (por ejemplo, debido al control de flujo en el sombreador), los otros descriptores sin referencia seguirán sin cambiarse. Si una aplicación necesita cambiar entre tablas de descriptores diferentes entre llamadas de representación, hay algunos enfoques entre los que la aplicación puede elegir:

  • Control de versiones de tabla de descriptores: cree (o reutilice) una tabla de descriptores independiente para cada colección única de descriptores a la que hace referencia una lista de comandos. Al editar y reutilizar áreas previamente rellenadas en montones de descriptores, las aplicaciones deben asegurarse primero de que la GPU haya terminado de usar cualquier parte de un montón de descriptores que se reciclará.
  • Indexación dinámica: las aplicaciones pueden organizar objetos que varían entre draw/dispatch (o incluso variar dentro de un dibujo) en un intervalo de un montón de descriptores, definir una tabla de descriptores que abarque todos ellos y desde el sombreador, use la indexación dinámica de la tabla durante la ejecución del sombreador para seleccionar qué objeto se va a usar.
  • Colocar descriptores directamente en la firma raíz. Solo se puede administrar un número muy pequeño de descriptores de esta manera porque el espacio de firma raíz está limitado.

La implicación del uso del control de versiones de tabla de descriptores es que la memoria de descriptor fuera de un montón de descriptores debe grabarse para cada conjunto único de descriptores a los que hace referencia la canalización de gráficos para cada lista de comandos que pueda estar ejecutándose, poner en cola para su ejecución o grabarse en cualquier momento dado.

D3D12 deja la responsabilidad de administrar el control de versiones en la aplicación para los tipos de objeto administrados a través de montones de descriptores y tablas de descriptores. Una ventaja de esto es que las aplicaciones pueden optar por reutilizar el contenido de la tabla de descriptores tanto como sea posible, en lugar de definir siempre una nueva versión de tabla de descriptores para cada envío de lista de comandos. La firma raíz es un espacio que el controlador D3D12 versiones automáticamente.

La capacidad de enlazar varias tablas de descriptores a la firma raíz (y, por tanto, a la canalización) a la vez permite a las aplicaciones agrupar y cambiar conjuntos de referencias de descriptores con diferentes frecuencias si lo desea. Por ejemplo, una aplicación podría usar un número pequeño (quizás solo uno) de tablas de descriptores estáticos grandes que rara vez cambian o en qué regiones de la memoria del montón del descriptor subyacente se rellenan según sea necesario, con el uso de la indexación dinámica del sombreador para seleccionar texturas. Al mismo tiempo, la aplicación podría mantener otra clase de recursos en la que el conjunto al que hace referencia cada llamada de draw se cambia de la CPU mediante la técnica de control de versiones de tabla de descriptores.

Indexación fuera de límites

La indización fuera de los límites de cualquier tabla de descriptores del sombreador da como resultado un acceso a memoria prácticamente indefinido, incluida la posibilidad de leer memoria arbitraria en proceso como si fuera un descriptor de estado de hardware y vivir con la consecuencia de lo que hace el hardware con eso. Esto podría producir un restablecimiento del dispositivo, pero no se bloqueará Windows.

Derivados del sombreador e indexación divergente

Si las invocaciones del sombreador de píxeles que se ejecutan en una marca de 2x2 (para admitir cálculos derivados) eligen distintos índices de textura para muestrear desde fuera de una tabla de descriptores y si la configuración y textura seleccionadas para cualquier píxel determinado requieren un cálculo loD a partir de derivados de coordenadas de textura, el proceso de cálculo de LOD y muestreo de textura se realiza por el hardware de forma independiente para cada búsqueda de textura en el sello 2x2, que afectará al rendimiento.

Tablas de descriptores