Compartir a través de


Uso de descriptores directamente en la firma raíz

Para evitar la necesidad de pasar por un montón de descriptores, puede colocar un descriptor directamente en la firma raíz. Estos descriptores ocupan mucho espacio en la firma raíz (consulte Límites de firma raíz), por lo que se recomienda usarlos con moderación.

Un ejemplo de uso sería colocar en el diseño raíz una vista de búfer de constantes (CBV) que cambia por dibujo. De este modo, la aplicación no tiene que asignar el espacio del montón de descriptores por dibujo (y guarda apuntando una tabla descriptor en la nueva ubicación del montón del descriptor). Al colocar algo en la firma raíz, la aplicación simplemente entrega la responsabilidad de control de versiones al controlador; pero esa es la infraestructura que ya tienen los controladores.

Para la representación que usa muy pocos recursos, es posible que no se necesite el uso de la tabla o montón de descriptores si todos los descriptores necesarios se pueden colocar directamente en la firma raíz.

Estos son los únicos tipos de descriptores admitidos en la firma raíz.

  • Vista de búfer de constantes (CBV).
  • Vistas de recursos de sombreador (SRV) / vistas de acceso desordenadas (UAV) de recursos de búfer en los que no se requiere la conversión de formato (búferes sin tipo). Algunos ejemplos de búferes sin tipo que se pueden enlazar con descriptores raíz incluyen StructuredBuffer<type>, RWStructuredBuffer<type>ByteAddressBuffer y RWByteAddressBuffer. Búferes con tipo, como Buffer<uint> y Buffer<float2> no.
  • SMV de estructuras de aceleración raytracing, en firmas raíz locales o globales.

Un UAV en la raíz no puede tener contadores asociados. Los descriptores de la firma raíz aparecen cada uno como descriptores independientes individuales; no se pueden indexar dinámicamente.

struct SceneData
{
   uint foo;
   float bar[2];
   int moo;
};
ConstantBuffer<SceneData> mySceneData : register(b6);

En el ejemplo anterior, mySceneData no se puede declarar como una matriz, como en cbuffer mySceneData[2] si se asignara a un descriptor en la firma raíz. Esto se debe a que la indexación entre descriptores no se admite en la firma raíz. Si lo desea, puede definir búferes de constantes individuales independientes y definirlos como una entrada independiente en la firma raíz. Tenga en cuenta que, dentro de mySceneData lo anterior, hay una matriz bar[2]. La indexación dinámica dentro del búfer de constantes es válida: un descriptor de la firma raíz se comporta igual que el mismo descriptor si se accediera a él a través de un montón de descriptores. Esto contrasta con la inserción de constantes directamente en la firma raíz, que también aparece como un búfer de constantes, excepto con la restricción que no se permite la indexación dinámica dentro de las constantes insertadas, por lo que bar[2] no se permitirá allí.

Estas API (de la interfaz ID3D12GraphicsCommandList ) son para establecer descriptores directamente en la firma raíz.

Nota

No hay ningún concepto de una matriz de descriptores raíz en Direct3D 12. Las matrices de descriptores solo se admiten en montones de descriptores.