Compartilhar via


Predicação

A predicação é um recurso que permite que a GPU, em vez da CPU, determine não desenhar, copiar ou despachar um objeto.

Visão geral

O uso típico da predicação é com oclusão; Se uma caixa delimitadora for desenhada e estiver ocluída, obviamente não há sentido em desenhar o objeto em si. Nessa situação, o desenho do objeto pode ser "predicado", permitindo sua remoção da renderização real pela GPU.

A princípio, isso pode parecer redundante além do teste de profundidade padrão mais uma passagem de profundidade inicial. Mas a predicação pode remover a sobrecarga do próprio estado do comando draw, além da rasterização. Embora uma passagem de profundidade antecipada remova pixels desnecessários, ela ainda pode executar sombreadores de vértice, casco, domínio e geometria e invocar o assembler de entrada de função fixa, o tesselator e o rasterizador. Ao desenhar uma caixa delimitadora simples ou um volume delimitador semelhante, que é mais simples de processar e rasterizar do que o modelo real, você evita rasterização e processamento desnecessários.

Ao contrário do Direct3D 11, a predicação é desacoplada das consultas e é expandida no Direct3D 12 para permitir que um aplicativo predice objetos com base em qualquer raciocínio que o desenvolvedor do aplicativo possa decidir (não apenas a oclusão).

SetPredication

A predicação pode ser definida com base no valor de 64 bits dentro de um buffer (consulte D3D12_PREDICATION_OP).

Quando a GPU executa um comando SetPredication , ela ajusta o valor no buffer. Alterações futuras nos dados no buffer não afetam retroativamente o estado de predicação.

Se o parâmetro de entrada Buffer for NULL, a predicação será desabilitada.

As dicas de predicação não estão presentes na API do Direct3D 12; e a predicação é permitida em listas de comandos diretos, de computação e de cópia. O buffer de origem pode estar em qualquer tipo de heap (padrão, upload, readback, personalizado).

O runtime principal validará o seguinte:

  • AlignedBufferOffset é um múltiplo de 8 bytes
  • O recurso é um buffer
  • A operação é um membro válido da enumeração
  • SetPredication não pode ser chamado de dentro de um pacote
  • O tipo de lista de comandos dá suporte à predicação
  • O deslocamento não excede o tamanho do buffer

A camada de depuração emitirá um erro se o buffer de origem não estiver no estado D3D12_RESOURCE_STATE_PREDICATION (que é o mesmo que D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT e simplesmente um alias).

O conjunto de operações que podem ser predicadas é:

ExecuteBundle não é predicado em si. Em vez disso, as operações individuais da lista acima que estão contidas no lado do pacote configurável são predicadas.

Os métodos ID3D12GraphicsCommandList ResolveQueryData, BeginQuery e EndQuery não são predicados.

Contadores e consultas

Medição de desempenho

Passo a passo de consultas de predicação