Compartilhar via


Consultas

No Direct3D 12, as consultas são agrupadas em matrizes de consultas chamadas de heap de consultas. Um heap de consulta tem um tipo que define os tipos válidos de consultas que podem ser usadas com esse heap.

Diferenças nas consultas do Direct3D 11 para o Direct3D 12

Os seguintes tipos de consulta não estão mais presentes no Direct3D 12, sua funcionalidade sendo incorporada a outros processos:

  • consultas de evento – o evento funcionalmente agora é tratado por cercas.
  • Consultas de carimbo de data/hora desarticuladas - os relógios de GPU podem ser definidos como um estado estável no Direct3D 12 (consulte a seção de Tempo). As comparações de relógio de GPU não serão significativas se a GPU estiver ociosa entre os carimbos de data/hora (conhecidos como uma consulta desarticulada). Com a potência estável, duas consultas de carimbo de data/hora emitidas de listas de comandos diferentes são confiáveis comparáveis. Dois carimbos de data/hora dentro da mesma lista de comandos são sempre confiáveis comparáveis.
  • Consultas de estatísticas de saída do Stream - no Direct3D 12 não há nenhuma consulta de estouro de saída de fluxo único (SO) para todos os fluxos de saída. Os aplicativos precisam emitir várias consultas de fluxo único e correlacionar os resultados.
  • Predicado de estatísticas de saída de fluxo e consultas de predicado de oclusão - consultas (que gravam na memória) e de precatório (que lê da memória) não são mais acoplados e, portanto, esses tipos de consulta não são necessários.

Um novo tipo de consulta de oclusão binária foi adicionado ao Direct3D 12. Isso permite estratégias de precatório que se importam apenas se um objeto foi totalmente ccluded ou não (em vez de quantos pixels foram occluded) para indicar isso para o dispositivo, que pode ser capaz de executar as consultas com mais eficiência.

Heaps de consulta

As consultas podem ser uma de vários tipos (D3D12_QUERY_HEAP_TYPE) e são agrupadas em heaps de consulta antes de serem enviadas para a GPU.

Um novo tipo de consulta D3D12_QUERY_TYPE_BINARY_OCCLUSION está disponível e atua como D3D12_QUERY_TYPE_OCCLUSION exceto que retorna um resultado binário de 0/1: 0 indica que nenhuma amostra passou profundidade e teste de estêncil, 1 indica que pelo menos uma amostra passou por testes de profundidade e estêncil. Isso permite que as consultas de oclusão não interfiram em nenhuma otimização de desempenho de GPU associada ao teste de profundidade/estêncil.

Criando heaps de consulta

As APIs relevantes para a criação de heaps de consulta são a D3D12_QUERY_HEAP_TYPEde enumeração, o struct D3D12_QUERY_HEAP_DESCe o método CreateQueryHeap.

O runtime principal validará se o tipo de heap de consulta é um membro válido da enumeração D3D12_HEAP_TYPE e que a contagem é maior que 0.

Cada elemento de consulta individual em um heap de consulta pode ser iniciado e interrompido separadamente.

As APIs para usar os heaps de consulta são a D3D12_QUERY_TYPEde enumeração e os métodos BeginQuery e EndQuery.

D3D12_QUERY_TYPE_TIMESTAMP é a única consulta que dá suporte apenas ao EndQuery. Todos os outros tipos de consulta exigem BeginQuery e EndQuery.

A camada de depuração validará o seguinte:

  • É ilegal iniciar uma consulta de carimbo de data/hora– você só pode acabar com ela
  • É ilegal iniciar uma consulta duas vezes sem acabar com ela (para um determinado elemento). Para consultas que exigem início e término, é ilegal encerrar uma consulta antes do início correspondente (para um determinado elemento).
  • O tipo de consulta passado para BeginQuery deve corresponder ao tipo de consulta passado para EndQuery.

O runtime principal validará o seguinte:

  • BeginQuery não pode ser chamado em uma consulta de carimbo de data/hora.

  • Para os tipos de consulta que dão suporte a BeginQuery e endQuery (todos exceto o carimbo de data/hora), uma consulta para um determinado elemento não deve abranger os limites da lista de comandos.

  • ElementIndex deve estar dentro do intervalo.

  • O tipo de consulta é um membro válido da enumeração D3D12_QUERY_TYPE.

  • O tipo de consulta deve ser compatível com o heap de consulta. A tabela a seguir mostra o tipo de heap de consulta necessário para cada tipo de consulta:

    Tipo de consulta Tipo de heap de consulta
    D3D12_QUERY_TYPE_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION
    D3D12_QUERY_TYPE_BINARY_OCCLUSION D3D12_QUERY_HEAP_TYPE_OCCLUSION
    D3D12_QUERY_TYPE_TIMESTAMP D3D12_QUERY_HEAP_TYPE_TIMESTAMP
    D3D12_QUERY_TYPE_PIPELINE_STATISTICS D3D12_QUERY_HEAP_TYPE_PIPELINE_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 D3D12_QUERY_HEAP_TYPE_SO_STATISTICS

     

  • O tipo de consulta é compatível com o tipo de lista de comandos. A tabela a seguir mostra quais consultas têm suporte em quais tipos de lista de comandos.

    Tipo de consulta Tipos de lista de comandos com suporte
    D3D12_QUERY_TYPE_OCCLUSION Directo
    D3D12_QUERY_TYPE_BINARY_OCCLUSION Directo
    D3D12_QUERY_TYPE_TIMESTAMP Direta, Computacional e, opcionalmente, Copiar
    D3D12_QUERY_TYPE_PIPELINE_STATISTICS Directo
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM0 Directo
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM1 Directo
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM2 Directo
    D3D12_QUERY_TYPE_SO_STATISTICS_STREAM3 Directo

     

Extraindo dados de uma consulta

A maneira de extrair dados de uma consulta é usar o método ResolveQueryData. ResolveQueryData funciona com todos os tipos de memória (sejam eles memória do sistema ou memória local do dispositivo), mas exige que o recurso de destino esteja em D3D12_RESOURCE_STATE_COPY_DEST.