Configuración y relleno de los montones de descriptores

Los tipos de montón de descriptores que se pueden establecer en una lista de comandos son aquellos que contienen descriptores para los que se pueden usar las tablas de descriptores (como máximo una de cada una de ellas).

Configuración de montones de descriptores

Los tipos de montón de descriptores que se pueden establecer en una lista de comandos son:

D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV
D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER

Los montones que se establecen en la lista de comandos también deben haberse creado como sombreador visibles. Hay tres tipos de lista de comandos: DIRECT, BUNDLE y COMPUTE.

Después de establecer un montón de descriptores en una lista de comandos, las llamadas posteriores que definen tablas descriptores hacen referencia al montón de descriptores actual. El estado de la tabla de descriptores no está definido al principio de una lista de comandos y después de cambiar los montones de descriptores en una lista de comandos. Establecer redundantemente el mismo montón de descriptores no hace que la configuración de la tabla de descriptores no esté definida.

En un lote, por el contrario, los montones de descriptores solo se pueden establecer una vez (las llamadas redundantes establecen el mismo montón dos veces no producen un error); de lo contrario, el comportamiento no está definido. Los montones de descriptores establecidos deben coincidir con el estado cuando cualquier lista de comandos llama a la agrupación; de lo contrario, el comportamiento no está definido. Esto permite que los conjuntos hereden y editen la configuración de la tabla descriptor de la lista de comandos. Los conjuntos que no cambian las tablas de descriptores (solo heredan) no necesitan establecer un montón de descriptores en absoluto y simplemente heredarán de la lista de comandos que llama.

Cuando se establecen montones de descriptores (mediante ID3D12GraphicsCommandList::SetDescriptorHeaps), todos los montones que se usan se establecen en una sola llamada (y todos los montones establecidos anteriormente no se establecen mediante la llamada). Como máximo, se puede establecer un montón de cada tipo enumerado anteriormente en la llamada.

Rellenar montones de descriptores

Una vez que una aplicación ha creado un montón de descriptores, puede usar métodos en el dispositivo para generar descriptores directamente en el montón o copiar descriptores de un lugar a otro.

El contenido inicial de la memoria del montón de descriptores no está definido, por lo que pedir al controlador o GPU que haga referencia a la memoria no inicializada para la representación puede provocar resultados indefinidos, como un restablecimiento del dispositivo.

Si la aplicación configura un montón de descriptores para que sea visible para la CPU, la CPU puede llamar a métodos para crear descriptores en el montón y copiar de un lugar a otro (incluido entre montones) de forma inmediata y libre. Si el montón se ha configurado como SHADER_VISIBLE, no se permite la lectura por parte de la CPU.

Montones de descriptores