Compartilhar via


Contadores de saída de fluxo

A saída de fluxo é a capacidade da GPU de gravar vértices em um buffer. Os contadores de saída de fluxo monitoram o progresso.

Diferenças nos contadores de fluxo do Direct3D 11 para o Direct3D 12

Como parte do processo de saída do fluxo, a GPU precisa saber o local atual no buffer no qual está gravando. No Direct3D 11, a memória para armazenar esse local é alocada pelo driver e a única maneira de os aplicativos manipularem esse valor é por meio do método SOSetTargets . No Direct3D 12, os aplicativos alocam memória para armazenar esse local atual. Não há maneiras especiais de manipular esse valor e os aplicativos são livres para ler/gravar o valor com a CPU ou GPU.

BufferFilledSize

O aplicativo é responsável por alocar armazenamento para uma quantidade de 32 bits chamada BufferFilledSize. Isso contém o número de bytes de dados no buffer de saída de fluxo. Esse armazenamento pode ser colocado no mesmo recurso ou em um recurso diferente daquele que contém os dados de saída de fluxo. Esse valor é acessado pela GPU no estágio de saída de fluxo para determinar onde acrescentar novos dados de vértice no buffer. Além disso, esse valor é acessado pela GPU para determinar quando ocorreu o estouro.

Consulte a estrutura D3D12_STREAM_OUTPUT_DESC.

A camada de depuração validará o seguinte em ID3D12GraphicsCommandList::SOSetTargets:

  • BufferFilledSize cai no intervalo implícito por {OffsetInBytes, SizeInBytes}, se um recurso não NULL for especificado.
  • BufferFilledSizeOffsetInBytes é um múltiplo de 4.
  • BufferFilledSizeOffsetInBytes está dentro do intervalo do recurso que o contém.
  • O recurso especificado é um buffer.

O runtime não validará o tipo de heap associado ao buffer de saída de fluxo, pois há suporte para a saída de fluxo em todos os tipos de heap.

As assinaturas raiz devem especificar se a saída de fluxo será usada usando os sinalizadores de D3D12_ROOT_SIGNATURE_FLAGS .

D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT pode ser especificado para assinaturas raiz criadas no HLSL, de maneira semelhante à forma como os outros sinalizadores são especificados.

CreateGraphicsPipelineState falhará se o sombreador de geometria contiver saída de fluxo, mas a assinatura raiz não tiver o sinalizador D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT definido.

Quando um recurso é usado como um destino de saída de fluxo, os recursos usados devem estar no estado D3D12_RESOURCE_STATE_STREAM_OUT. Isso se aplica aos dados de vértice e ao BufferFilledSize (que podem estar nos mesmos recursos ou em recursos separados).

Não há APIs especiais para definir deslocamentos de buffer de saída de fluxo porque os aplicativos podem gravar no BufferFilledSize diretamente com a CPU ou GPU.

Contadores e consultas