Montones de descriptores visibles por el sombreador

Los montones visibles del descriptor de sombreador son montones de descriptores a los que pueden hacer referencia los sombreadores a través de tablas de descriptores.

Información general

Los montones de descriptores a los que pueden hacer referencia los sombreadores a través de tablas de descriptores vienen en un par de tipos: un tipo de montón, D3D12_SRV_UAV_CBV_DESCRIPTOR_HEAP, puede contener vistas de recursos de sombreador, vistas de acceso sin ordenar y vistas de búfer de constantes, todas mezcladas. Cualquier ubicación determinada del montón puede ser cualquiera de los tipos enumerados de descriptores. Otro tipo de montón, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER, solo almacena muestreadores, lo que refleja el hecho de que, para la mayoría de hardware, los muestreadores se administran por separado de srVs, UAV, CBV.

Es posible que los montones de descriptores de estos tipos sean visibles o no cuando se cree el montón (el último , que no es visible, pueden ser útiles para descriptores de almacenamiento provisional en la CPU). Cuando se solicita que sea visible el sombreador, cada uno de los tipos de montón anteriores puede tener un límite de tamaño de hardware para cualquier asignación de montón de descriptores individuales.

Las aplicaciones pueden crear cualquier número de montones de descriptores y los montones de descriptores visibles que no sean sombreador no están restringidos en tamaño. Si un montón de descriptores visibles de sombreador creado por la aplicación es menor que el límite de tamaño de hardware, el controlador puede optar por subasignar el montón del descriptor fuera de un montón de descriptores subyacentes más grande para que varios montones de descriptores de API se ajusten a un montón de descriptores de hardware. La razón por la que esto puede ocurrir es que, para algún hardware, el cambio entre montones de descriptores de hardware durante la ejecución requiere una espera de GPU para estar inactiva (para asegurarse de que las referencias de GPU al montón de descriptores anteriores han finalizado). Si todos los montones de descriptores que crea una aplicación encajan en las capacidades máximas del montón de hardware aplicables, no se producirán estas esperas al cambiar los montones del descriptor de API durante la representación. Sin embargo, las aplicaciones deben permitir la posibilidad de que el cambio del montón de descriptores actual incurra en una espera de inactividad.

Para evitar verse afectado por esta posible espera de inactividad en el modificador de montón de descriptores, las aplicaciones pueden aprovechar las interrupciones en la representación que provocarían que la GPU se inactiva por otros motivos, ya que el tiempo para realizar los conmutadores del montón de descriptores, ya que una espera de inactividad se está produciendo de todos modos.

El mecanismo y la semántica para identificar montones de descriptores en sombreadores durante la grabación de lista de comandos o agrupación se describen en la referencia de API.

Un ejemplo

En la imagen siguiente se muestran dos montones de descriptores que hacen referencia a dos texturas 2D independientes que se almacenan en dos ranuras de un montón predeterminado grande. La canalización de gráficos puede acceder al montón de descriptores visible para el sombreador (incluidos los sombreadores) y, por tanto, la textura 2D está disponible para la canalización.

montones de descriptores visibles y no visibles

Nota

A menudo hay un límite en el hardware de GPU de la cantidad de memoria local de GPU que puede escribir la CPU (denominada memoria combinada de escritura) para montones de descriptores. Normalmente, este límite es de aproximadamente 96 MB para todos los procesos. Un montón de descriptores de un millón de miembros, con descriptores de 32 bytes, usaría hasta 32 MB, por ejemplo. El controlador revertirá a la memoria del sistema si es necesario, aunque es recomendable no crear grandes cantidades de montones de descriptores grandes.

 

Montones de descriptores