Compartir a través de


Administración del estado de la canalización de gráficos en Direct3D 12

En este tema se describe cómo se establece el estado de canalización de gráficos en Direct3D 12.

Información general sobre el estado de la canalización

Cuando la geometría se envía a la unidad de procesamiento de gráficos (GPU) que se va a dibujar, hay una amplia gama de configuraciones de hardware que determinan cómo se interpretan y representan los datos de entrada. Colectivamente, estas opciones se denominan estado de canalización de gráficos e incluyen valores comunes, como el estado de rasterizador, el estado de mezcla y el estado de galería de símbolos de profundidad, así como el tipo de topología primitiva de la geometría enviada y los sombreadores que se usarán para la representación. En Microsoft Direct3D 12, la mayoría del estado de la canalización de gráficos se establece mediante el uso de objetos de estado de canalización (NULL). Una aplicación puede crear un número ilimitado de estos objetos, representados por la interfaz ID3D12PipelineState , normalmente en tiempo de inicialización. A continuación, en tiempo de representación, las listas de comandos pueden cambiar rápidamente varias opciones de configuración del estado de la canalización llamando a ID3D12GraphicsCommandList::SetPipelineState en una lista de comandos directa o agrupación para establecer el COMANDO ACTIVO.

En Direct3D 11, el estado de canalización de gráficos se agrupaba en objetos de estado grandes y detallados, como ID3D11BlendState que se podía crear y establecer en tiempo de representación en el contexto inmediato con métodos como ID3D11DeviceContext::OMSetBlendState. La idea de esto era que la GPU podía obtener eficiencias estableciendo la configuración relacionada, como la configuración de estado de mezcla, todo a la vez. Sin embargo, con el hardware gráfico actual, hay dependencias entre las diferentes unidades de hardware. Por ejemplo, el estado de combinación de hardware podría tener dependencias en el estado de trama, así como en el estado de mezcla. Las PPO de Direct3D 12 se diseñaron para permitir que la GPU procese previamente toda la configuración dependiente en cada estado de canalización, normalmente durante la inicialización, para hacer que el cambio entre estados en el tiempo de representación sea lo más eficaz posible.

Tenga en cuenta que, aunque la mayoría de la configuración de estado de la canalización se establecen mediante PSO, hay algunas opciones de configuración de estado que se establecen por separado mediante las API proporcionadas por ID3D12GraphicsCommandList. Esta configuración y las API asociadas se describen en detalle a continuación. Además, hay diferencias en la forma en que el estado de canalización de gráficos se hereda y se conserva en listas de comandos directos y agrupaciones. En este tema se proporcionan detalles sobre ambos siguientes.

Estados de canalización de gráficos establecidos con objetos de estado de canalización

La manera más fácil de ver todos los distintos estados de canalización que se pueden establecer mediante un objeto de estado de canalización es examinar el tema de referencia del D3D12_GRAPHICS_PIPELINE_STATE_DESC que se pasa a ID3D12Device::CreateGraphicsPipelineState al inicializar el objeto. Un resumen rápido de los estados que se pueden establecer incluye:

  • Código de bytes para todos los sombreadores, incluidos los sombreadores de vértice, píxel, dominio, casco y geometría.
  • Formato de vértice de entrada.
  • Tipo de topología primitiva. Tenga en cuenta que el tipo de topología primitiva del ensamblador de entrada (punto, línea, triángulo, revisión) se establece dentro de LA URL mediante la enumeración D3D12_PRIMITIVE_TOPOLOGY_TYPE . La adyacencia y el orden primitivos (lista de líneas, franja de líneas, franja de líneas con datos de adyacencia, etc.) se establece desde dentro de una lista de comandos mediante el método ID3D12GraphicsCommandList::IASetPrimitiveTopology .
  • Estado de mezcla, estado de rasterizador, estado de galería de símbolos de profundidad.
  • La galería de símbolos de profundidad y los formatos de destino de representación, así como el recuento de destinos de representación.
  • Parámetros de muestreo múltiple.
  • Un búfer de salida de streaming.
  • Firma raíz. Para obtener más información, vea Firmas raíz.

Estados de canalización de gráficos establecidos fuera del objeto de estado de la canalización

La mayoría de los estados de canalización de gráficos se establecen mediante SPO. Sin embargo, hay un conjunto de parámetros de estado de canalización que se establecen mediante una llamada a métodos de la interfaz ID3D12GraphicsCommandList desde dentro de una lista de comandos. En la tabla siguiente se muestran los estados que se establecen de esta manera y los métodos correspondientes.

State Método
Enlaces de recursos IASetIndexBuffer
IASetVertexBuffers
SOSetTargets
OMSetRenderTargets
SetDescriptorHeaps
Todos los métodos SetGraphicsRoot...
Todos los métodos SetComputeRoot...
Viewports RSSetViewports
Rects del tijera RSSetScissorRects
Factor de mezcla OMSetBlendFactor
Valor de referencia de galería de símbolos de profundidad OMSetStencilRef
El orden de topología primitiva del ensamblador de entrada y el tipo de adyacencia IASetPrimitiveTopology

Herencia de estado de canalización de gráficos

Dado que las listas de comandos directos están pensadas generalmente para un uso a la vez y los conjuntos están diseñados para usarse varias veces simultáneamente, hay reglas diferentes sobre cómo heredan el estado de canalización de gráficos establecido por listas de comandos o agrupaciones anteriores.

En el caso de los estados de canalización de gráficos que se establecen mediante SPO, ninguno de estos estados se hereda mediante listas de comandos directos o agrupaciones. El estado inicial de la canalización de gráficos para listas de comandos directos y agrupaciones se establece en tiempo de creación con el parámetro ID3D12PipelineState en ID3D12Device::CreateCommandList. Si no se especifica NINGUNA EXCEPCIÓN EN la llamada, se utiliza un estado inicial predeterminado. Puede cambiar el ACTUAL FORMATO dentro de una lista de comandos llamando a ID3D12GraphicsCommandList::SetPipelineState.

Las listas de comandos directos tampoco heredan el estado establecido con métodos de lista de comandos como RSSetViewports. Para obtener más información sobre los valores iniciales predeterminados para estados que no son DE LA PANTALLA, vea ID3D12GraphicsCommandList::ClearState.

Los conjuntos heredan todo el estado de la canalización de gráficos que no se establece con PSO, excepto el tipo de topología primitiva. La topología primitiva siempre se establece en D3D12_PRIMITIVE_TOPOLOGY_TYPE_UNDEFINED cuando una agrupación comienza a ejecutarse. Cualquier estado que se establece dentro de un lote (el propio UDP, el estado no basado en STORAGE y los enlaces de recursos) afecta al estado de su lista de comandos directa primaria. Por ejemplo, si se llama a RSSetViewports desde dentro de una agrupación, las ventanillas especificadas seguirán estando establecidas en la lista de comandos directas primarias para las llamadas posteriores a la llamada ExecuteBundle que establezca las ventanillas.

Los enlaces de recursos que se establecen dentro de una lista de comandos o agrupación se conservan. Por lo tanto, los enlaces de recursos modificados en una lista de comandos directos se establecerán en la ejecución posterior del lote secundario. Y los enlaces de recursos modificados desde dentro de una agrupación se seguirán configurando para las llamadas posteriores dentro de la lista de comandos directas primaria.

Para obtener más información sobre los enlaces, consulte la sección Semántica de agrupación de Uso de una firma raíz.