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.
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).
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 é:
- DrawInstanced
- DrawIndexedInstanced
- Dispatch
- CopyTextureRegion
- CopyBufferRegion
- CopyResource
- Blocos de cópia
- ResolveSub-recurso
- ClearDepthStencilView
- ClearRenderTargetView
- ClearUnorderedAccessViewUint
- ClearUnorderedAccessViewFloat
- ExecutarIndireto
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.