Estágio do Assembler de Entrada

A IA (assembler de entrada) introduz triângulos, linhas ou pontos no pipeline de renderização extraindo dados de geometria de origem de buffers 1D.

Os dados de vértice podem vir de vários buffers e podem ser acessados de forma de matriz de estruturas de cada buffer. Os buffers são associados a um slot de entrada individual e recebem um passo a passo da estrutura. O layout dos dados em todos os buffers é especificado por uma declaração de entrada, na qual cada entrada define um elemento. O elemento contém um slot de entrada, um deslocamento de estrutura, um tipo de dados e um registro de destino (para o primeiro sombreador ativo no pipeline).

Uma determinada sequência de vértices é construída a partir de dados que são buscados de buffers. Os dados são buscados em uma passagem que é direcionada por uma combinação de estado de função fixa e várias chamadas DDI Draw*(). Várias topologias primitivas (por exemplo, point-list, line-list, triangle-list e triangle-strip) estão disponíveis para tornar a sequência de dados de vértice uma sequência de primitivos.

Os dados de vértice podem ser produzidos de duas maneiras. A primeira maneira de produzir dados de vértice é a renderização não indexada , que é a passagem sequencial de buffers que contêm dados de vértice. Os dados de vértice se originam em um deslocamento inicial em cada associação de buffer. A segunda maneira de produzir dados de vértice é a renderização indexada , que é a passagem sequencial de um único buffer que contém índices inteiros escalares. Os índices se originam em um deslocamento inicial para o buffer. Cada índice indica onde buscar dados de um buffer que contém dados de vértice. Os valores de índice são independentes das características dos buffers aos quais se referem. Os buffers são descritos por declarações. A renderização não indexada e indexada, cada uma à sua maneira, produz endereços dos quais buscar dados de vértice na memória e, posteriormente, montar os resultados em vértices e primitivos.

A renderização de geometria em instâncias é habilitada permitindo que a passagem sequencial, em renderização não indexada ou indexada, faça loop sobre um intervalo dentro de cada buffer de vértice (caso não indexado) ou buffer de índice (caso indexado). As associações de buffer podem ser identificadas como dados de instância ou dados de vértice. Essa identificação especifica como usar o buffer associado ao executar a renderização em instâncias. O endereço gerado pela renderização não indexada ou indexada é usado para buscar dados de vértice, que também são responsáveis pelo loop quando o runtime executa a renderização em instâncias. Os dados da instância, por outro lado, são sempre atravessados sequencialmente a partir de um deslocamento por buffer, em uma frequência igual a uma etapa por instância (por exemplo, um passo à frente depois que o número de vértices em uma instância é percorrido). A taxa de etapas para dados de instância também pode ser escolhida para ser uma sub harmônica da frequência da instância (ou seja, um passo à frente a cada outra instância, a cada terceira instância e assim por diante).

Outro caso especial da IA é que ele pode ler buffers nos quais o estágio de saída do fluxo foi escrito. Esse cenário permite um novo tipo de operação de desenho, DrawAuto. DrawAuto permite que uma quantidade dinâmica de saída que foi gravada em buffers de saída de fluxo seja reutilizado, sem o envolvimento da CPU, para determinar quantos dados foram realmente gravados.

Além de produzir dados de vértice de buffers, a IA pode gerar automaticamente três valores de contador escalar: VertexID, PrimitiveID e InstanceID, para entrada em estágios de sombreador no pipeline de renderização.

Na renderização indexada de topologias de faixa, como tiras de triângulo, um mecanismo é fornecido para desenhar várias faixas com uma única chamada *Draw*() (ou seja, o comando *cut para cortar tiras).

O runtime do Direct3D chama as seguintes funções de driver para criar, configurar e destruir a IA:

CalcPrivateElementLayoutSize

CreateElementLayout

DestroyElementLayout

IaSetIndexBuffer

IaSetInputLayout

IaSetTopology

IaSetVertexBuffers